Προγραμματισμός σε C - Λύνουμε ασκήσεις

...ασύγχρονα μαθήματα γλώσσας C

Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό M.Jackson » 04 Ιουν 2010, 13:28

Εδώ θα γράφουμε το πρόβλημα και θα τα λύνουμε σε C θα είναι καλό μέρος για νέους αρχάριους της c (και εγώ μέσα, σήμερα έμαθα c :P) για να διαβάζουν κώδικα και να μαθαίνουν!
Ξεκινάω εγώ:
Να γραφεί πρόγραμμα που να διαβάζει διάφορους ακέραιους αριθμούς και να σταματάει η εισαγωγή δεδομένων όταν δοθεί ο αριθμός 0. Το πρόγραμμα να υπολογίζει και να εμφανίζει το μέσο όρο των θετικών και το μέσο όρο των αρνητικών αριθμών.
Κώδικας: Επιλογή όλων
#include <stdio.h>
main ()
{
int x;
printf("Δώσε αριθμό πλην του 0, 0=τερματισμός\t");
scanf("%d", &x);
int suma=0,sumt=0;
int ca=0,ct=0;

while (x!=0){
if (x>0){
sumt=sumt+x;
ct++;}
if (x<0){
suma=suma+x;
ca++;}
printf("Δώσε αριθμό πλην του 0, 0=τερματισμός\t");
scanf("%d", &x);
}
double mot=sumt/ct;
double moa=suma/ca;
printf("Ο μέσος όρος των θετικών αριθμών είναι: %g και των αρνητικών: %g\n", mot, moa);
}
Τελευταία επεξεργασία από M.Jackson και 21 Ιουν 2010, 22:47, έχει επεξεργασθεί 2 φορά/ες συνολικά
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Re: C Progrmming - Λύνουμε ασκησής

Δημοσίευσηαπό Ntelispak » 05 Ιουν 2010, 02:15

Για πρόγραμμα μίας ημέρας είναι πάρα πολύ καλό. Το πρόγραμμα σου,όμως, αθροίζει ξεχωριστά τους περιττούς / άρτιους και όχι τους θετικούς / αρνητικούς. Επίσης αν το τρέξεις και δεν δώσεις καμία τιμή, θα έχεις διαιρέσεις με το μηδέν. Δοκίμασε καλλίτερα αυτό:

Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(){
 
  int x=0, sum[]={0, 0}, cp=0, cn=0;
  do{ //Γλιτώνεις μερικές γραμμές
    printf(">>");
    scanf("%i", &x);
    if(x>0)
      sum[0]+=x, cp++; //Πιάνεται σαν μια εντολή
    else if (x<0)
      sum[1]+=x, cn++;
  }while(x!=0);
 
  if(cp)
    printf("θετικοί: %f\n", (float)sum[0]/cp);
  if(cn)
    printf("αρνητικοί: %f\n", (float)sum[1]/cn);
 
  return 0; //Σχεδόν πάντα
}


Αν του δώσεις μη ακέραια τιμή θα έχεις προβήματα. Ctrl+C Διακόπτει το πρόγραμμα. Ελπίζω να βοήθησα.
Οδηγείες ΧρήσηςΤutorialsΑναζήτηση
⇛ Linux: noob ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Πολύ Καλά
⇛ Xubuntu 9.04 (Jaunty Jackalope) 64bit
⇛ Intel Core2Duo E6600 (2.4GHZ 4MB) ┃ Asus P5B 965 ┃ 2x1GB DDR2 667MHZ ┃ Radeon X1600P 256MB ┃ MAudio Audiophile 192
Άβαταρ μέλους
Ntelispak
babeTUX
babeTUX
 
Δημοσιεύσεις: 36
Εγγραφή: 19 Ιουν 2009, 20:15
Τοποθεσία: Μεταμόρφωση Αττικής
Εκτύπωση

Re: C Progrmming - Λύνουμε ασκησής

Δημοσίευσηαπό M.Jackson » 05 Ιουν 2010, 10:10

απ ναι φίλε μπερδεύτηκα με τους θετικούς νόμιζα πως έψαχνα ζυγούς κ.τ.λ
να σε ρωτήσω κάτι γιατί έβαλε int main () στο βιβλίο που διαβάζω δεν είδα κάτι τετιο πια είναι η διαφορά; επίσης διάβασα και για τους pointers αλλά με μπέρδεψαν τη είναι αυτοί ναι είναι μεταβλητές αλλά για πιο σκοπό;
α και το return 0; τι είναι εκ τες έμαθα και δεν γνωρίζω πολλά..
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Re: C Progrmming - Λύνουμε ασκησής

Δημοσίευσηαπό Ntelispak » 05 Ιουν 2010, 13:50

Σε παλιότερα standard της C η main δεν είχε data type. Μάλλον αυτό που διαβάζεις είναι παλιά πηγή. Πλέον η main ορίζεται σαν int και το πρόγραμμα σου επιστρέφει τιμή 0 (return 0) αν ολοκληρωθεί επιτυχώς, ή μη μεδενική σε άλλη περίπτωση. Η void main έχει διατηρηθεί για λόγους backward compatibility. Οι δείκτες είναι απλά διευθύνσεις μεταβλητών της μνήμης.
Κώδικας: Επιλογή όλων
int x=5; //Πχ αποθηκεύεται στη θέση 3F45A3.
int* pt = &x; //Έτσι ορίζεις τον pt να "δείχνει" την μεταβλητή x, δηλαδή του ορίζεις την θέση 3F45A3
int y =*pt; //Έτσι δίνεις στην y την τιμή που δείχνει ο pt, δηλαδή y=5

Ο τύπος(data type) του δείκτη πρέπει, σε γενικές γραμμές, να είναι ίδιος με τον τύπο της μεταβλητής που θέλεις να δείχνει. Οι δείκτες μειώνουν τις επαναλήψεις δεδομένων στη μνήμη και κάνουν τα προγράμματα να είναι γρηγορότερα αφού μεταφέρονται λιγότερα δεδομένα. Προσοχή όμως είναι
αρκετά επικίνδυνοι. Τίποτα δεν σε σταματά να κάνεις
Κώδικας: Επιλογή όλων
int x=5; //Πχ αποθηκεύεται στη θέση 3F45A3.
int* pt; 
pt[1] = x; // Έτσι γράφεις στην μνήμη σε χώρο που δεν έχεις δεσμεύσει, και μπορεί να
// χρησιμοποιείται από κάποιο άλλο πρόγραμμα.
Οδηγείες ΧρήσηςΤutorialsΑναζήτηση
⇛ Linux: noob ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Πολύ Καλά
⇛ Xubuntu 9.04 (Jaunty Jackalope) 64bit
⇛ Intel Core2Duo E6600 (2.4GHZ 4MB) ┃ Asus P5B 965 ┃ 2x1GB DDR2 667MHZ ┃ Radeon X1600P 256MB ┃ MAudio Audiophile 192
Άβαταρ μέλους
Ntelispak
babeTUX
babeTUX
 
Δημοσιεύσεις: 36
Εγγραφή: 19 Ιουν 2009, 20:15
Τοποθεσία: Μεταμόρφωση Αττικής
Εκτύπωση

Re: C Progrmming - Λύνουμε ασκησής

Δημοσίευσηαπό idomeneas » 05 Ιουν 2010, 15:56

Ntelispak έγραψε:Σε παλιότερα standard της C η main δεν είχε data type. Μάλλον αυτό που διαβάζεις είναι παλιά πηγή. Πλέον η main ορίζεται σαν int και το πρόγραμμα σου επιστρέφει τιμή 0 (return 0) αν ολοκληρωθεί επιτυχώς, ή μη μεδενική σε άλλη περίπτωση. Η void main έχει διατηρηθεί για λόγους backward compatibility.
Έτσι κι αλλιώς αν προσπαθήσει κάποιος να ορίσει τη main() ως void και κάνει compile με ενεργοποιημένα τα -Wall ή -pedantic και -ansi τότε αν έχει τον gcc θα προσέξει ένα warning που αναφέρεται ότι δεν είναι int main(). Επίσης M.Jackson αν προσπαθήσεις να κάνεις το ίδιο compile με g++ θα δεις ότι αυτό θα γίνει σφάλμα. Το return 0 επιστρέφει το NULL στο σύστημα. Αλλιώς (π.χ. μετά από ένα Segmentation fault) επιστρέφει μη μηδενική τιμή για τη διαδικασία του προγράμματος που πήγε να τρέξει.
Λειτουργικό ⇛ Ubuntu 10.04 64 bit σε HP Pavilion dv7-3110ev
Προδιαγραφές φορητού ⇛ Core i3 2.13 GHz │ 3 GB │ nVidia G105M │ Broadcom 4357 │ Bluetooth ? │ Realtek HD Audio │ 17.3"
Λειτουργικό ⇛ Ubuntu 10.04 32 bit/Win XP σε desktop
Προδιαγραφές desktop ⇛ Pentium 4 3 GHz │ 2 GB DDR │ Sapphire ATi Radeon HD3450 512MB AGP │ Μητρική: Asus P5V800-MX
idomeneas
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 738
Εγγραφή: 09 Απρ 2010, 15:47
Εκτύπωση

Re: C Progrmming - Λύνουμε ασκησής

Δημοσίευσηαπό M.Jackson » 05 Ιουν 2010, 16:27

hmm ωριαία..
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Re: C Progrmming - Λύνουμε ασκησής

Δημοσίευσηαπό M.Jackson » 06 Ιουν 2010, 12:47

για να γράψουμε πρόγραμμα σε γραφικό περιβάλλον πιο πρόγραμμα χρησιμοποιούμαι; όπως είναι το netbeans στην java..
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό Ntelispak » 06 Ιουν 2010, 14:26

Δοκίμασε το eclipse - cdt. Μπορείς να γράφεις και Java σε αυτό και να έχεις ένα ide και για τις δυο γλώσσες. Για Java δεν ξέρω αν είναι καλή επιλογή, δεν ξέρω καν Java. Για C πάντως με έχει βολέψει αρκετά. Μπορείς να εγκαταστήσεις το eclipse από synaptics και μετά να το ανοίξεις, να επιλέξεις Help/Install New Software από Menu Strip και να ακολουθήσεις τον οδηγό που εμφανίζεται χρησιμοποιώντας αυτό το link στην επιλογή Work With:
http://download.eclipse.org/tools/cdt/releases/galileo.
Οδηγείες ΧρήσηςΤutorialsΑναζήτηση
⇛ Linux: noob ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Πολύ Καλά
⇛ Xubuntu 9.04 (Jaunty Jackalope) 64bit
⇛ Intel Core2Duo E6600 (2.4GHZ 4MB) ┃ Asus P5B 965 ┃ 2x1GB DDR2 667MHZ ┃ Radeon X1600P 256MB ┃ MAudio Audiophile 192
Άβαταρ μέλους
Ntelispak
babeTUX
babeTUX
 
Δημοσιεύσεις: 36
Εγγραφή: 19 Ιουν 2009, 20:15
Τοποθεσία: Μεταμόρφωση Αττικής
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό M.Jackson » 06 Ιουν 2010, 15:12

Σε ευχαριστώ θα το δοκιμάσω (ήδη το κατεβάζει το Ubuntu Software Center) :)
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό M.Jackson » 07 Ιουν 2010, 20:47

Να γραφεί πρόγραμμα στην c που θα δέχεται έναν άγνωστο αριθμό βαθμών μαθημάτων και να εμφανίζει το μέσο όρο και τον αριθμό των μαθημάτων που δόθηκαν με την έξης μορφή "Ο Μ.Ο των 10 μαθημάτων είναι 18,1". Το τέλος της εισόδου των μαθημάτων θα γίνεται όταν δοθεί για βαθμός το -1. Αν δοθεί μόνο το -1 να εμφανίζεται το μήνυμα "ΔΕΝ ΕΔΩΣΕΣ ΚΑΝΕΝΑ ΜΑΘΗΜΑ".

Κώδικας: Επιλογή όλων
#include <stdio.h>
int main()
{
int x;
printf("Δώσε αριθμό:\t");
scanf("%d", &x);
int sum=0;
int counter=0;
if (x==-1){
printf("ΔΕΝ ΕΔΩΣΕΣ ΚΑΝΕΝΑ ΜΑΘΗΜΑ!\n");}
else{
while (x!=-1){
sum=sum+x;
counter++;
printf("Δώσε αριθμό:\t");
scanf("%d", &x);
}
}
if (counter!=0)
{float mo=sum/counter;
printf("Ο Μ.Ο των %d μαθημάτων είναι %g\n", counter, mo);}
return 0;
}


με τον νέο τρόπο που μου είπατε.
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Επόμενο

Επιστροφή στο Μαθήματα C