4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for) 4.1 Μετρητές Ένας μετρητής (counter) είναι μία μεταβλητή η οποία ξεκινά με μία αρχική τιμή και αυξάνεται κατά ένα κάθε φορά που εκτελείται. Ο αλγόριθμος για έναν μετρητή είναι: μεταβλητή = μεταβλητή + 1 Το παραπάνω είναι απόλυτα νόμιμο στον προγραμματισμό με υπολογιστές αν και μαθηματικά η παραπάνω έκφραση είναι αναληθής. Ο υπολογιστής υπολογίζει την έκφραση που βρίσκεται στα δεξιά πρώτα και κατόπιν εκχωρεί το αποτέλεσμα της στη μεταβλητή που κατονομάζεται στα αριστερά. Αριστερά και δεξιά του ίσον μπορεί να υπάρχει η ίδια μεταβλητή. Παράδειγμα: Ξεκινάμε με μια μεταβλητή count και θα της δώσουμε μια τιμή 0: int count=0; Εάν εκτελέσουμε την οδηγία: count=count +1; // Σημαίνει count = 0+1 άρα count=1 Εάν εκτελέσουμε ξανά την οδηγία: count=count +1; // Σημαίνει count = 1+1 άρα count=2 κλπ... Εάν τώρα εκχωρήσουμε στη μεταβλητή count τη τιμή 1, δηλαδή: int count=1; Εάν εκτελέσουμε την οδηγία: count=count +5; // Σημαίνει count = 1+5 άρα count=6 Εάν εκτελέσουμε ξανά την οδηγία: count=count +5; // Σημαίνει count = 6+5 άρα count=11 κλπ... Για να εκτελέσουμε μείωση, αλλάζουμε απλά την εντολή σε : μεταβλητή = μεταβλητή 1; Κάθε φορά που θα εκτελείται αυτή η πράξη, η τιμή της μεταβλητής θα μειώνεται κατά ένα. 4.2 Τελεστές Αύξησης Μείωσης Οι μετρητές χρησιμοποιούνται τόσο συχνά, που η C διαθέτει ειδικούς τελεστές για την αύξηση και μείωση της τιμής μιας μεταβλητής. Ο τελεστής ++ μεταβλητή προσθέτει 1 στην τιμή της μεταβλητής πριν εκτελεστεί η οδηγία. Έτσι, όταν εκτελείται η εντολή μεταβλητή++; ή η εντολή ++μεταβλητή; είναι σα να εκτελείται η εντολή : μεταβλητή = μεταβλητή + 1; 1
Θα δούμε στα παραδείγματα τη διαφορά ανάμεσα στο μεταβλητή++; και στο ++μεταβλητή; Παράδειγμα 1: int count=0; printf("the first count is %d\n", count); printf("the second count is %d\n", ++count); printf("the last value of count was %d\n", count); The first count is 0 The second count is 1 The last value of count was 1 Η εντολή που γράψαμε προηγουμένως printf("the second count is %d\n", ++count); είναι σα να γράφαμε τις επόμενες δύο εντολές με την παρακάτω σειρά: count=count+1; printf("the second count is %d\n", count); Δηλαδή, πρώτα αυξάνει την τιμή της count και μετά κάνει ότι του ζητάει η εντολή. Ας τροποποιήσουμε το προηγούμενο πρόγραμμα. για να δούμε τι συμβαίνει όταν ο τελεστής αύξησης μπει μετά το όνομα της μεταβλητής. Παράδειγμα 2: void main( ) int count=0; printf("the first count is %d\n", count); printf("the second count is %d\n", count++); printf("the last value of count was %d\n", count); The first count is 0 The second count is 0 The last value of count was 1 Η εντολή που γράψαμε προηγουμένως printf ("The second count is %d\n", count++); είναι σα να γράφαμε τις επόμενες δύο εντολές με την παρακάτω σειρά: printf ("The second count is %d\n", count); 2
count=count+1; Δηλαδή, πρώτα κάνει ότι του ζητάει η εντολή και μετά αυξάνει την τιμή της count. Παράδειγμα 3: void main() int number=3; int storage; storage = number++; printf("the original value was %d\n", storage); printf("the new value is %d\n ", number); The original value was 3 The new value is 4 Ουσιαστικά, αυτό που συμβαίνει είναι η στη μεταβλητή storage, να εκχωρείται η αρχική τιμή της μεταβλητής number και στη συνέχεια η μεταβλητή number, λόγω του τελεστή εκχώρησης να αυξάνεται κατά ένα. Παράδειγμα 4: (το ίδιο παράδειγμα αλλαγμένο) void main() int number=3; int storage; storage = ++number; printf("the original value was %d\n", storage); printf("the new value is %d\n ", number); The original value was 4 The new value is 4 ΠΡΟΣΟΧΗ!!! Άρα, είναι σημαντικό να βλέπουμε αν ο τελεστής αύξησης είναι πριν ή μετά το όνομα της μεταβλητής. Αν είναι πριν κάνουμε πρώτα την αύξηση και μετά οτιδήποτε άλλο, αλλιώς αν είναι μετά κάνουμε τα υπόλοιπα και μετά την αύξηση. Σημείωση Ο τελεστής αύξησης αν είναι μόνος του ως εντολή και στις δύο προηγούμενες περιπτώσεις, απλά αυξάνει την τιμή. Άρα το count++; και ++count; απλά αυξάνουν την τιμή της count κατά 1. 3
Τελεστής Μείωσης Ο τελεστής μείωσης λειτουργεί με τον ίδιο τρόπο, αλλά μειώνει την τιμή της μεταβλητής κατά 1 και γράφεται Άρα το count--; και --count; απλά μειώνουν την τιμή της count κατά 1. 4.3 Ο βρόχος for Η C και η C++ έχουν μερικές (τρεις) ξεχωριστές δομές, γνωστές σαν βρόχους (loops), για τον έλεγχο της επανάληψης στα προγράμματα. Κάθε βρόχος μπορεί να επαναλάβει μια οδηγία ή μία σειρά οδηγιών ή ένα ολόκληρο πρόγραμμα. Τον βρόχο for τον χρησιμοποιούμε όταν ξέρουμε ακριβώς τον αριθμό των επαναλήψεων που θέλουμε να εκτελέσουμε. Η δομή του βρόχου for είναι: for(αρχικοποίηση_μεταβλητής; συνθήκη; βήμα) εντολές βρόχου; Παρατηρήστε ότι το ελληνικό ερωτηματικό δεν τοποθετείται μετά από την παράμετρο for. Ωστόσο, τα τρία στοιχεία μέσα στην παράμετρο πρέπει να διαχωρίζονται με ελληνικά ερωτηματικά. Για παράδειγμα, το ακόλουθο πρόγραμμα χρησιμοποιεί ένα βρόχο for για να εκτυπώσει τους αριθμούς 1 έως 10 προς τα κάτω στην οθόνη. Παράδειγμα 1: int repeat; for(repeat =1; repeat <=10; repeat++) printf("%d\n", repeat); Ο βρόχος ελέγχεται από τη μεταβλητή με όνομα repeat. Μπορείτε να χρησιμοποιείτε οποιοδήποτε όνομα για τη μεταβλητή, αλλά θα πρέπει υποχρεωτικά να είναι τύπου ακεραίου. Η παράμετρος for διαιρείται στα ακόλουθα τμήματα: repeat = 1 // Αρχικοποίηση μεταβλητής repeat < = 10 // Συνθήκη για επανάληψη του βρόχου, // όσο η συνθήκη ισχύει ο βρόχος επαναλαμβάνεται 4
repeat++ // Βήμα αύξησης της μεταβλητής μετά από κάθε επανάληψη. Την πρώτη φορά που ξεκινάει ο βρόχος: Αρχικοποιείται η μεταβλητή (δηλαδή, η μεταβλητή παίρνει τιμή ίση με το πρώτο στοιχείο που υπάρχει μέσα στη for) και μετά εξετάζεται η συνθήκη (δεύτερο στοιχείο μέσα στη for). Αν η συνθήκη ισχύει, εκτελούνται οι εντολές μέσα στο βρόχο, αλλιώς αν δεν ισχύει, τότε βγαίνει από το βρόχο, δηλαδή το πρόγραμμα συνεχίζεται κάτω από το τελευταίο άγκιστρο που περιλαμβάνει τις εντολές του βρόχου. Αν τελικά, η συνθήκη είναι αληθής (δηλαδή ισχύει), τότε αφού εκτελεστούν οι εντολές μέσα στα άγκιστρα της for, το πρόγραμμα ξαναγυρίζει στη for, αλλά αυτή τη φορά αλλάζει την τιμή της μεταβλητής σύμφωνα με το βήμα(τρίτο στοιχείο μέσα στη for). Αμέσως μετά, εξετάζει πάλι τη συνθήκη (δεύτερο στοιχείο μέσα στη for) για τη νέα τιμή και αν είναι αληθής ξαναεκτελεί τις εντολές του βρόχου, αλλιώς βγαίνει από το κομμάτι ελέγχου της for. Αυτό συμβαίνει μέχρι η τιμή της μεταβλητής να μην ικανοποιεί πια τη συνθήκη και τελικά να βγούμε έξω από τα άγκιστρα της εντολής for. Ακολουθεί ένα πρόγραμμα το οποίο μετατρέπει 23 διαδοχικές θερμοκρασίες Fahrenheit (από 110 μέχρι 132) σε βαθμούς Κελσίου: Παράδειγμα 2: int temp; double celsius; for(temp=110; temp<=132; temp++) celsius = (5.0/9.0)*(temp-32); printf("%d farenait antistoixoun se %6.2f Kelsiou\n",temp, celsius); 110 farenait antistoixoun se 43.33 Kelsiou 111 farenait antistoixoun se 43.89 Kelsiou... 132 farenait antistoixoun se 55.56 Kelsiou Το βήμα δεν είναι αναγκαστικά πάντα της μορφής μεταβλητή++, όπως φαίνεται και στο παράδειγμα που ακολουθεί, που οι τιμές αυξάνουν ανά 5, για όσο ισχύει η συνθήκη. Παράδειγμα 3: 5
int metritis, tetragwno; for(metritis=1; metritis<=18; metritis=metritis+5) tetragwno = metritis*metritis; printf("%3d*%3d=%4d\n",metritis,metritis,tetragwno); 1* 1= 1 6* 6= 36 11* 11= 121 16* 16= 256 Να σημειώσουμε ότι τελειώνοντας το βρόχο η μεταβλητή metritis, θα έχει πάρει την τιμή 21, που είναι η πρώτη που δεν ικανοποιεί τη συνθήκη. Ακολουθεί ένα πρόγραμμα, όπου η συνθήκη δεν εξαρτάται από σταθερό αριθμό, αλλά από μια άλλη μεταβλητή (έχουμε τη δυνατότητα να το κάνουμε αυτό). Το πρόγραμμα αναφέρεται στη μαθηματική έννοια του παραγοντικού. Το παραγοντικό ενός αριθμού είναι το γινόμενο όλων των αριθμών από το 1 μέχρι τον αριθμό που θέλουμε και συμβολίζεται ως arithmos! (Διαβάζεται arithmos παραγοντικό) Για παράδειγμα: 5!=1*2*3*4*5=120 Τον αριθμό θα τον πληκτρολογεί ο χρήστης και το πρόγραμμα θα βγάζει το αποτέλεσμα. Παράδειγμα 4: int arithmos, paragontiko, metritis; paragontiko=1; printf("dwse ton arithmo pou thes to paragontiko tou\n"); scanf("%d", &arithmos); for(metritis=1; metritis<=arithmos; metritis++) paragontiko= paragontiko*metritis; printf("%d! = %d\n",arithmos, paragontiko); Dwse ton arithmo pou thes to paragontiko tou Αν ο χρήστης δώσει τον αριθμό... 6 Θα εμφανιστεί 6
6! = 720 Εδώ, παρατηρούμε ότι η συνθήκη εξαρτάται από τη μεταβλητή arithmos και όχι κάποιο σταθερό νούμερο. Να σημειωθεί ότι όπως και στην if, αν περιλαμβάνεται μόνο μια εντολή μέσα στο βρόχο της for δε χρειαζόμαστε τα άγκιστρα. Άρα και αντίστροφα, αν δεν έχουμε άγκιστρα, τότε το πρόγραμμα καταλαβαίνει πως μόνο μια (η αμέσως επόμενη εντολή) περιλαμβάνεται στη for. Οι φωλιασμένοι βρόχοι for Όταν μία εντολή for εκτελείται μέσα από μία άλλη εντολή for, τότε αυτές θεωρούνται φωλιασμένες. Ο εσωτερικός βρόχος επαναλαμβάνεται ολόκληρος όσες φορές μας λέει δηλαδή η συνθήκη του εσωτερικού βρόχου για κάθε μια επανάληψη του εξωτερικού βρόχου. Παράδειγμα 1 int row, column; for(row=1; row <=5 ;row++) printf("\n %d-i epanalipsi tou exwterikou vroxou\n ", row) ; // στον εξωτερικό βρόχο και όχι τον εσωτερικό for (column=1; column<=3;column++) printf("\t%d ", column) ; 1-i epanalipsi tou exwterikou vroxou 2-i epanalipsi tou exwterikou vroxou 3-i epanalipsi tou exwterikou vroxou 4-i epanalipsi tou exwterikou vroxou 5-i epanalipsi tou exwterikou vroxou 7
Αρχικά, με βάση των εξωτερικό βρόγχο που εκτελείται γράφει το κείμενο 1-i epanalipsi tou exwterikou vroxou. Ο αριθμός 1 στην αρχή είναι ο αριθμός της μεταβλητής row. Μετά, φαίνεται πως κάθε εσωτερικός βρόχος κάνει μια σειρά που αποτελείται από την τιμή που έχει κάθε φορά η μεταβλητή column και αφήνοντας λίγο χώρο επειδή υπάρχει το tab \t. Άρα, φτιάχνει τη γραμμή: Βγαίνοντας από τον εξωτερικό βρόγχο πάει να ελέγξει αν η τιμή του νέου row ικανοποιεί τη συνθήκη. Τότε το row=2 αφού αυξάνεται κατά ένα. Γράφει λοιπόν 2-i epanalipsi tou exwterikou vroxou. Μετά ξανακάνει το ίδιο με τον εσωτερικό βρόγχο όπως από πάνω φτιάχνοντας τη γραμμή: 4.4 Οι εντολές continue & break Αν θέλουμε να βγούμε από ένα βρόγχο, μπορούμε να χρησιμοποιήσουμε την εντολή break. Με το που θα βρει την εντολή, το πρόγραμμα θα σταματήσει αυτόματα το βρόχο και θα συνεχίσει να εκτελεί τις εντολές μετά το loop(άρα μετά το τελευταίο άγκιστρο της εντολής επανάληψης) Παράδειγμα 1 #include<stdio.h> void main() int i; for(i=0;i<10;++i) if ( i == 5) break; printf("%d \n",i); 0 1 2 3 4 Μόλις το i, έγινε ίσο με 5 η εντολή for, σταμάτησε να εκτελείται κι ας μην έχουμε φτάσει ακόμα στο σημείο όπου δεν ισχύει η συνθήκη (δηλαδή i=10) Αν θέλουμε σε ένα βρόγχο, για κάποια συγκεκριμένη τιμή του μετρητή να μην εκτελεστούν κάποιες εντολές, αλλά η επανάληψη να συνεχίσει κανονικά για τις 8
υπόλοιπες τιμές μέχρι να μην ισχύει πια η εντολή επανάληψης του βρόχου, μπορούμε να χρησιμοποιήσουμε την εντολή continue. Με το που θα βρει την εντολή, το πρόγραμμα μόνο για τη συγκεκριμένη τιμή του μετρητή, δε θα εκτελέσει τις υπόλοιπες εντολές, αλλά θα πάει ξανά στη for, για να πάρει την επόμενη τιμή ο μετρητής(με βάση το βήμα). Παράδειγμα 2 #include<stdio.h> void main() int i; for(i=0;i<10;++i) if ( i == 5) continue; printf("%d\n",i); 0 1 2 3 4 // (δεν υπάρχει το νούμερο 5) 6 7 8 9 10 Αυτό οφείλεται στο ότι μόλις το i, έγινε ίσο με 5 η εντολή for, δεν εκτέλεσε τις επόμενες εντολές, αλλά πήρε την επόμενη τιμή του μετρητή(i=6) και συνέχισε κανονικά το πρόγραμμα. 9
4.5 Ασκήσεις ΑΣΚΗΣΗ 1: Να πληκτρολογήσετε το παρακάτω πρόγραμμα που τυπώνει το κανόνα της προπαίδειας. Το πρόγραμμα εκτελεί 10 εξωτερικούς και 10 εσωτερικούς βρόχους για τη δημιουργία του πίνακα. int row, column; printf ("\t\t O pinakas tis propaideias \n\n") ; for(row=1; row <=10;row++) for(column=1; column<=10;column++) printf("%4d\t", row*column); printf("\n") ; system("pause"); ΑΣΚΗΣΗ 2: Να πληκτρολογήσετε το παρακάτω πρόγραμμα που αθροίζει τους x πρώτους ακέραιους αριθμούς (1+2+3+4+5+6+.), όπου τον αριθμό x να τον πληκτρολογεί ο χρήστης. Υπόδειξη: Θα χρειαστείτε μια ακόμα μεταβλητή για να αποθηκεύεται τις προσθέσεις, όπως έγινε παραπάνω με το παράδειγμα στο παραγοντικό. (Παραδ. 4, σελ. 6) ΑΣΚΗΣΗ 3: Να δημιουργήσετε πρόγραμμα που να αθροίζει τα τετράγωνα των ν πρώτων ακεραίων αριθμών (1 2 +2 2 +3 2 +4 2 +..). Το ν να το δίνεται από το πληκτρολόγιο. Πάλι, θα χρειαστείτε μια ακόμα μεταβλητή για το άθροισμα. ΑΣΚΗΣΗ 4: Να δημιουργήσετε πρόγραμμα που να δέχεται από το πληκτρολόγιο 10 θερμοκρασίες Fahrenheit και να τις μετατρέπει σε βαθμούς Κελσίου. ΑΣΚΗΣΗ 5: Να γραφεί πρόγραμμα που να εμφανίζει τη σειρά αστερίσκων που φαίνεται στην εικόνα * ** *** **** ***** ****** 10