5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while) 5.1 Ο βρόχος while Η εντολή while παρέχει έναν μηχανισμό επανάληψης των δηλώσεων όσο μια συνθήκη είναι αληθινή. Χρησιμοποιείται όταν ο αριθμός των επαναλήψεων δεν είναι γνωστός και η γενική σύνταξη της είναι: while( συνθήκη ) δήλωση; Για πολλαπλές οδηγίες χρησιμοποιείται η ακόλουθη σύνταξη: while( συνθήκη ) δήλωση1; δήλωση2; δήλωση3; Οι οδηγίες θα εκτελεσθούν μόνο εάν η συνθήκη είναι αληθής και μόνο για όσο είναι αληθής. Η συνθήκη ελέγχεται πριν εκτελεστεί ο βρόχος, ακόμα και τη πρώτη φορά. Δηλαδή εάν η συνθήκη είναι ψευδής ο βρόχος δεν θα εκτελεσθεί ούτε μια φορά. Η συνθήκη ελέγχου σχηματίζεται συνήθως με συνδυασμό σχεσιακών και λογικών τελεστών όπως στα παραδείγματα που ακολουθούν: Όσο η μεταβλητή a είναι μικρότερη του 5 while (a<5)... Όσο η απάντηση (μεταβλητή apantisi) δεν είναι 'Y' ή 'N'. while ( (apantisi!='y' ) && (apantisi!= 'N') )... Όσο η μεταβλητή epilogi είναι μεγαλύτερη από 10 ή μικρότερη από 3. while ( ( epilogi >10) (epilogi<3) )... Κάπου μέσα στο σώμα του βρόχου while μια δήλωση πρέπει να αλλάζει τη τιμή της συνθήκης για να επιτρέψει στο βρόχο για να τελειώσει. 1
Παράδειγμα 1: int loop = 0; while( loop <= 10 ) printf("%d\n", loop); ++loop; Στην οθόνη θα εμφανιστεί: 0 1...... 10 Το παραπάνω πρόγραμμα χρησιμοποιεί έναν βρόχο while για να επαναλάβει τις δηλώσεις printf("%d\n", loop); ++loop; όσο η τιμή της μεταβλητής βρόχου loop είναι λιγότερο ή ίσο με το 10. 5.2 Οι συναρτήσεις getchar() και putchar() Για την είσοδο χαρακτήρων από το πληκτρολόγιο και την έξοδο χαρακτήρων στην οθόνη μπορούμε να χρησιμοποιήσουμε τις συναρτήσεις getchar() και putchar() αντίστοιχα. Να κάνετε include και το αρχείο conio.h. Παράδειγμα 2: #include <conio.h> int ch; ch = getchar(); // Παίρνει το ψηφίο που πληκτρολογούμε // και το βάζει στη μεταβλητή ch while(ch!= 'x') putchar(ch); // Εμφανίζει τη μεταβλητή ch ch = getchar(); // Ότι κάνει και πριν η getchar 2
Tο παραπάνω πρόγραμμα τυπώνει στην οθόνη του υπολογιστή τους χαρακτήρες που εισάγονται από το πληκτρολόγιο έως ότου πληκτρολογηθεί ο χαρακτήρας x. Έτσι, για παράδειγμα, εμείς γράφουμε: 45evdxxxxzxssa (σε αυτό το σημείο πατάμε το Enter) Στην οθόνη θα εμφανιστεί: 4 5 e v d Σημείωση: Αν δεν πατήσουμε το ζητούμενο γράμμα (εδώ το 'x') και πατήσουμε Enter, κάθε φορά θα μας εμφανίζει το ένα κάτω από το άλλο τα γράμματα που γράψαμε και θα πρέπει να ξαναγράψουμε συνέχεια μέχρι να πατήσουμε το ζητούμενο. Έτσι, για παράδειγμα γράφουμε: rewy(enter) Εμφανίζει: r e w y Γράφουμε: hfewf(enter) Εμφανίζει: h f e w f Γράφουμε: grxdwd(enter) Εμφανίζει: g r και εδώ το πρόγραμμα σταματάει. 3
5.3 O βρόχος do while Η do while δήλωση επιτρέπει σε έναν βρόχο να συνεχίζει να εκτελείται ενώ μια συνθήκη είναι αληθής. Ο βρόχος εκτελείται το λιγότερο μία φορά, ακόμα κι αν την πρώτη φορά η συνθήκη είναι ψευδής. Χρησιμοποιείται όταν ο αριθμός των επαναλήψεων δεν είναι γνωστός. Γενικά, είναι: do δηλώσεις; while( συνθήκη ); Παράδειγμα 1: int i=0; do printf("h timi tou i einai twra %d\n",i); i++; while (i < 3); Στην οθόνη θα εμφανιστεί: H timi tou i einai twra 0 H timi tou i einai twra 1 H timi tou i einai twra 2 Η δομή do... while μπορεί να χρησιμοποιείται για την επανάληψη ενός προγράμματος μέχρι να αποφασίσει ο χρήστης ότι δεν υπάρχουν περισσότερα δεδομένα για είσοδο: Παράδειγμα 2: #include <conio.h> int temp; double celsius; char repeat; do printf ("Dwse ti thermokrasia:\n") ; scanf ("%d",&temp) ; celsius = (5.0/9.0)*(temp-32); printf ("%d vathmoi Farenait einai %4.2f vathmoi Kelsiou\n\n",temp,celsius); 4
printf ("Thelete na dwsete alli thermokrasia (an thelete pliktrologiste to gramma y i to gramma Y)?\n\n"); repeat = getch(); while ( (repeat == 'y') (repeat == 'Y') ); Ολόκληρο το πρόγραμμα, εκτός από τις δηλώσεις μεταβλητών, περικλείεται σε μία μεγάλη ενότητα do...while. Ο βρόχος συνεχίζεται μέχρι να εισάγετε έναν χαρακτήρα διαφορετικό από τον 'Υ' ή 'y' σε απάντηση στην προτροπή. Παρατηρήστε ότι η εντολή που ρωτάει εάν θέλετε να επαναλάβετε είναι η τελευταία πρόταση της ενότητας. 5.4 Συνδυάζοντας διαφορετικούς τύπους βρόχων Μπορείτε να φωλιάσετε οποιοδήποτε συνδυασμό βρόχων while, for και do...while, εάν η λογική του προγράμματος σας το απαιτεί. Το ακόλουθο πρόγραμμα, για παράδειγμα, φωλιάζει ένα βρόχο while μέσα σε ένα βρόχο for για να δώσει ο μαθητής τους βαθμούς του από τα 5 μαθήματα. Αν για κάποιο μάθημα δώσει βαθμό μικρότερο του 0 ή μεγαλύτερο του 20, το πρόγραμμα του ξαναζητάει το βαθμό του συγκεκριμένου μαθήματος. Έτσι, αφού τα προσθέσει ένα ένα σε κάθε βρόχο της for, στο τέλος το άθροισμα που βρίσκει το διαιρεί με το πλήθος των μαθημάτων. Παράδειγμα: void main () int mathima,vathmos,sum; float mo; sum=0; for (mathima=1;mathima<=5;mathima++) printf("dwse to %d-o mathima:\n",mathima); scanf("%d",&vathmos); while (vathmos<0 vathmos>20) printf("edwses lathos vathmo,xanadwse:\n"); scanf("%d",&vathmos); printf ("Sto %d-o mathima pires %d\n",mathima,vathmos); sum=sum+vathmos; printf("to a8roisma ws twra einai %d\n\n",sum); mo=(float)sum/5; printf ("O mesos oros einai %6.2f\n",mo); 5
Όπως μπορούμε να δούμε, από το παράδειγμα αυτό, ο εξωτερικός βρόχος for θα επαναληφθεί μόνο 5 φορές. Ο εσωτερικός βρόχος while, θα επαναλαμβάνεται εφόσον εισάγεται μία άκυρη καταχώριση. 5.5 Η δήλωση προεπεξεργαστή # define Αν το προηγούμενο πρόγραμμα θέλαμε να τροποποιηθεί, ώστε να ισχύει και για κάποιον μαθητή που έχει για παράδειγμα 8 μαθήματα, θα έπρεπε να αλλάξουμε όσες γραμμές περιείχαν το 5 και να το κάνουμε 8. Όμως, αυτό δεν είναι απόλυτα σωστό, γιατί κάποιο 5 μέσα στο πρόγραμμα μπορεί να ήταν για άλλη διαδικασία ή μπορεί να μας διέφευγε να αλλάξουμε κάποιο. Για αυτό το λόγο, χρησιμοποιούμε τη δήλωση define και την αντιστοιχίζουμε σε ένα όνομα που αποτελεί μια σταθερά. Έτσι, όταν το πρόγραμμα συναντάει αυτή τη σταθερά, θεωρεί ότι έχει την τιμή που του δηλώσαμε στη δήλωση define. Έτσι, το προηγούμενο παράδειγμα γίνεται: Παράδειγμα: #define ARITH_MATHIM 5 void main () int mathima,vathmos,sum; float mo; sum=0; for (mathima=1;mathima<= ARITH_MATHIM;mathima++) printf("dwse to %do mathima:\n",mathima); scanf("%d",&vathmos); while (vathmos<0 vathmos>20) printf("edwses lathos vathmo,xanadwse:\n"); scanf("%d",&vathmos); printf ("Sto %d o mathima pires %d\n",mathima,vathmos); sum=sum+vathmos; printf("to a8roisma ws twra einai %d\n\n",sum); mo=(float)sum/ ARITH_MATHIM; printf ("O mesos oros einai %6.2f\n",mo); system("pause"); Αν θέλουμε να αλλάξουμε το πρόγραμμα για έναν άλλο μαθητή με 8 μαθήματα, κάνουμε μόνο αλλαγή στη δήλωση της define και γράφουμε: #define ARITH_MATHIM 8 6
Η τιμή της σταθέρας (που έχουμε κάνει σύμβαση να τη γράφουμε με κεφαλαία για να ξεχωρίζει), δεν μπορεί να αλλάξει μέσα στο πρόγραμμα, όπως γίνεται με τις μεταβλητές. Προφανώς, η δήλωση #define δε σχετίζεται με τις εντολές επανάληψης, αλλά οποτεδήποτε μας εξυπηρετεί σε κάποιο πρόγραμμα να αλλάζουμε το σύνολο κάποιων συγκεκριμένων αριθμών. 5.6 Ασκήσεις ΑΣΚΗΣΗ 1: Να πληκτρολογήσετε το παρακάτω πρόγραμμα που αντιστρέφει τα ψηφία ενός αριθμού που εισάγεται από το χρήστη. Κάνει αυτό με τη χρησιμοποίηση του τελεστή modulus % για να πάρει το υπόλοιπο και να το βάλει στη μεταβλητή psifio, που θα εμφανιστεί στην οθόνη. Στη συνέχεια, ο αρχικός αριθμός διαιρείται με το 10, αλλά μένει μόνο το ακέραιο μέρος(είναι ουσιαστικά σα να έχουμε αφαιρέσει το τελευταίο ψηφίο) και η λειτουργία επαναλαμβάνεται για όσο ο αριθμός δεν είναι ίσος με 0. (Σημείωση: Αν δεν κατανοηθεί απλά πληκτρολογήστε το και πηγαίνετε στην επόμενη άσκηση) int value, psifio; printf("enter the number to be reversed.\n"); scanf("%d", &value); do psifio = value % 10; printf("%d", psifio); value = value / 10; while( value!= 0 ); system("pause"); ΑΣΚΗΣΗ 2: Να δημιουργήσετε πρόγραμμα που να δέχεται από το πληκτρολόγιο 10 θερμοκρασίες Fahrenheit και να τις μετατρέπει σε βαθμούς Κελσίου με χρήση του βρόχου while. Ο τύπος είναι: celsius = (5.0/9.0)*(temp-32) Υπόδειξη: Η λογική είναι αντίστοιχη με ένα for 10 επαναλήψεων, απλά πρέπει να φροντίσουμε ο μετρητής να αυξάνει μέσα στο βρόχο. 7
ΑΣΚΗΣΗ 3: Να δημιουργήσετε ένα πρόγραμμα που να κάνει ακριβώς το ίδιο όπως στην προηγούμενη άσκηση, αλλά με χρήση του βρόχου do-while. ΑΣΚΗΣΗ 4: Να πληκτρολογήσετε το παρακάτω πρόγραμμα και να εξηγήσετε τι κάνει. int a = 1,b; printf("timi A\tTimi B\t\n", a,b); while( a <= 5 ) b = 1; while( b<= 5 ) printf("%d\t%d\t\n", a,b); b++; a++; ΑΣΚΗΣΗ 5: Να πληκτρολογήσετε το παρακάτω πρόγραμμα και να εξηγήσετε τι κάνει. int a = 1,b; while( a <= 5 ) b = 1; while( b<= 5 ) printf("%d", a); b++; a++; 8
ΑΣΚΗΣΗ 6: Να μετατρέψετε τη παραπάνω άσκηση ώστε να δίνει τα παρακάτω αποτελέσματα; 1 22 333 4444 55555 666666 7777777 88888888 999999999 9