Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων 9. Εντολές επανάληψηςκαι η εντολή while Ιωάννης Κατάκης
Σήμερα o Εισαγωγή στις δομές επανάληψης o Εντολή while o Τελεστές prefix και postfix
Δομές ελέγχου προγράμματος o Ακολουθιακήεκτέλεση inta=1; b=34; printf( Hello ); o Εκτέλεση με έλεγχο if(a>1) printf( a>1 ); o Εκτέλεση χρησιμοποιώντας δομής επανάληψης Επιτρέπουν στους προγραμματιστές να προσδιορίσουν ενέργειες που θα επαναλαμβάνονται όσο μια συνθήκη παραμένει αληθής Ενώ(α>0)εκτέλεσε αυτές τις εντολές Για(i=0 έως i<5) εκτέλεσε αυτές τις εντολές
Ακολουθιακή εκτέλεση Άσκηση: Να εκτυπωθούν οι αριθμοί από το 0 ως το 5 στην οθόνη intmain() printf( 0 ); printf( 1 ); printf( 2 ); printf( 3 ); printf( 4 ); printf( 5 ); return 0; Προφανώς, η λύση αυτή δεν είναι πρακτική.
Eντολήwhile o Η εντολή whileεπαναλαμβάνει την εκτέλεση μιας πρότασης ενώσω η τιμή μιας λογικής παράστασης είναι αληθής (1) o Η σύνταξη της εντολής είναι: while (παράσταση) Πρόταση1; o Η πρόταση1(απλή ή σύνθετη) θα εκτελείται συνέχεια μέχρι η παράσταση της whileνα πάρει λογική τιμή false (0) o Π.χ. while (5>0) printf( ε θα σταµατήσω ποτέ\n ); while (παράσταση) Πρόταση1; while (παράσταση) Πρόταση1 1 ; Πρόταση1 2 ; Πρόταση1 Ν ; Προηγούµενη Πρόταση Παράσταση true Πρόταση while Επόµενη Πρόταση false 5/31
Παράδειγμα inta = 0; while (a<4) printf( %d,, a); a = a+1; συνθήκη Ενέργειες επανάληψης (iteration), ονομάζεται και βρόχος (loop) Αποτέλεσμα: 0, 1, 2, 3, 9-6
Ροή εκτέλεσης α α<4 output 0 1 0, 1 1 1, 2 1 2, 3 1 3, 4 0 int a=0; while (a<4) printf( %d,, a); a = a+1; 9-7
Παράδειγμα Εκτύπωση σε αντίστροφη σειρά inta = 4; while (a>0) a = a-1; printf( %d,, a); Αποτέλεσμα: 3,2,1,0 Σιγουρευτείτε ότι καταλαβαίνετετη διαφορά του whileκαι if inta = 4; if (a>0) a = a-1; printf( %d,, a); Αποτέλεσμα: 3 9-8
Κατηγορίες βρόχων επανάληψης Α) Counting Loops (Με μετρητή) Προσδιορισμένος αριθμός επαναλήψεων π.χ. inta =0; while (a<2) printf( Hello ); a = a+1; B) Sentinel Loops (Με σημαία) Απροσδιόριστος αριθμός επαναλήψεων. Το loop διακόπτεται όταν δοθεί κάποιος ειδικός χαρακτήρας. π.χ. inta =0; while (a!=-1) scanf( %d, &a); printf( Hello ); 9-9
Άσκηση 9.1 Να αναπτύξετε πρόγραμμα το οποίο τυπώνει τους ακέραιους αριθμούς από το 1 μέχρι το 12. Κάθε αριθμός που διαιρείται με το 3 να τυπώνεται με * δίπλα του. Κάθε αριθμός να τυπώνεται σε ξεχωριστή γραμμή. Παράδειγμα εκτέλεσης: 1 2 3* 4 5 6* 12* 9-10
Λύση H στοίχιση των εντολών του ίδιου μπλοκ με εσοχή προς τα μέσα βοηθάει στην ανάγνωση του προγράμματος int i; /* Μετρητής*/ i = 1; while (i <= 12) printf( %d, i); if((i%3) == 0) printf( * ); printf( \n ); i = i + 1; Καλή πρακτική inti; /* Μετρητής*/ i = 1; while(i<=12) printf( %d, i); if((i%3) == 0) printf( * ); printf( \n ); i = i + 1; Κακή πρακτική 9-11
Τελεστές Prefix καιpostfix Συχνά θέλουμε να αυξήσουμε/μειώσουμε μετρητές κατά 1 Υπάρχει πιο εύκολος τρόπος! o Prefix Operator(προ-θεματικοί τελεστές) ++i; <==> i = i + 1; --i; <==> i = i -1; o Postfix Operator (μετά-θεματικοί τελεστές) i++; <==> i = i + 1; i--; <==> i = i -1; Και οι δυο τελεστές εκτελούν την ίδια πράξη (αφαίρεση / πρόσθεση) αλλά με διαφορετική σειρά Παραδείγματα ακολουθούν 9-12
Prefix καιpostfix τελεστές i = 5; x = ++i; y = i++; Πρώτα αύξησε και μετά ανάθεσε x=6 Πρώτα ανάθεσε και μετά αύξησε y=6 Στο τέλος του προγράμματος, το x είναι 6, το y είναι 6 και το i είναι 7 int my_int = 3; printf ("%d, ", my_int++); printf ("%d, ", my_int++); printf ("%d", my_int); Αποτέλεσµα: 3,4,5 int my_int = 3; printf ("%d, ", ++my_int); printf ("%d, ", ++my_int); printf ("%d ", my_int); Αποτέλεσµα: 4,5,5 9-13
Σύνθετοι τελεστές ανάθεσης Συχνά θέλουμε να αυξήσουμε / μειώσουμε μετρητές κατά κάποιο k (>1). Υπάρχει πιο συνοπτικός τρόπος! o Πρόσθεση: i+=k; <==> i = i + k; o Πολλαπλασιασμός: i*=k; <==> i = i * k; o Διαίρεση: i/=k; <==> i = i /k; o Υπόλοιπο: i%=k; <==> i = i%k; Γενικά: i<τελεστής>= kσημαίνειi = i <τελεστής>k; 9-14
Άσκηση 9.2 o Αναπτύξτε ένα πρόγραμμα το οποίο υπολογίζει το άθροισμα μιας σειράς ακέραιων αριθμών. o Η σειρά εισάγεται από το πληκτρολόγιο και τερματίζεται με την τιμή 0 o Παράδειγμα εκτέλεσης Enterseries: 2 4 236 6 31 23 0 Sum: 302 9-15
Άσκηση 9.2: Σχεδιασμός λύσης α1 α2 α3 α4 Sum= + Sum= + Sum= + Sum 9-16
Άσκηση 9.2: Λύση int number; int sum=0; // κρατά τον αριθμό που προστίθεται κάθε φορά // το τρέχον άθροισμα // διάβασμα πρώτου αριθμού scanf( %d,&number); while(number!= 0) sum += number; // πρόσθεσε τον αριθμό στο τρέχον άθροισμα scanf( %d,&number); //διάβασε τον επόμενο αριθμό printf( \nsum%d\n, sum); 9-17
Άσκηση 9.3 Αναπτύξετε ένα πρόγραμμα που αναγνωρίζει τον πιο μεγάλο αριθμό σε μια σειρά ακέραιων αριθμών. Η σειρά εισάγεται από το πληκτρολόγιο και τερματίζεται με την τιμή 0 Enterseries: 2 4 5236 6 31 978 5555 23 0 Max: 5555 9-18
Άσκηση 9.3 Σχεδιασμός λύσης α1 α2 α3 α4 Maximum= max Maximum= max Maximum= max 9-19
Άσκηση 9.3: Λύση intmain() int number; int maximum; scanf("%d", &number); maximum = number; // Κρατά τον αριθμό που δίνει ο χρήστης // Κρατά το τρέχον μέγιστο // Διάβασε το πρώτο στοιχείο // Αρχικοποίηση μέγιστου while(number!= 0) scanf("%d",&number); // Διάβασε επομενο στοιχειο if (number>maximum) maximum = number; printf( \nmax: %d\n", maximum); return 0; 9-20
Τέλος διάλεξης