3. Εντολές ελέγχου και επανάληψης
Σύνοψη Η εντολή if, ένθετες if, η if‐else‐if, ξεκρέμαστο if, η εντολή switch, οι εντολές επανάληψης for, while και do ... while, ατέρμονοι βρόχοι, ένθετες επαναλήψεις, οι εντολές break, continue και goto.
Προαπαιτούμενη γνώση Τύποι δεδομένων, είσοδος/έξοδος.
3.1 Εισαγωγή
Η C ανήκει στις λεγόμενες προστακτικές (imperative) γλώσσες προγραμματισμού. Οι προστακτικές γλώσσες προγραμματισμού διαθέτουν εντολές ελέγχου ροής, δηλαδή εντολές επιλογής και εντολές επανάληψης, που επιτρέπουν στους προγραμματιστές να καθορίσουν βήμα προς βήμα τις εντολές που θα εκτελούνται. Ένα επιπλέον χαρακτηριστικό των προστακτικών γλωσσών είναι ότι οι μεταβλητές είναι τροποποιήσιμες (mutable), δηλαδή μπορούν να αλλάζουν τιμές κατά την εκτέλεση του προγράμματος. Με αυτόν τον τρόπο διατηρείται μια κατάσταση προγράμματος (program’s state) που αλλάζει καθώς εκτελούνται οι επιμέρους εντολές. Ο προγραμματιστής πρέπει να σχεδιάζει και να υλοποιεί το πρόγραμμα έτσι ώστε οι διαδοχικές αλλαγές στην κατάσταση του προγράμματος να παράγουν το επιθυμητό τελικό αποτέλεσμα. Υπάρχουν πολλές άλλες γλώσσες που υποστηρίζουν το «προστακτικό παράδειγμα προγραμματισμού» (imperative programming paradigm) όπως η C++, η Java, η Python και η C#.
3.2 Εντολές επιλογής
Η C διαθέτει δύο εντολές επιλογής, την εντολή if και την εντολή switch που παρουσιάζονται στη συνέχεια.
3.2.1 Η εντολή if
Η εντολή if έχει την ακόλουθη σύνταξη.
Αν η συνθήκη είναι αληθής, δηλαδή έχει μη μηδενική τιμή, τότε εκτελείται το μπλοκ κώδικα 1, ενώ αν είναι ψευδής, τότε εκτελείται το μπλοκ κώδικα 2. Συνεπώς, τα δύο μπλοκ κώδικα είναι μεταξύ τους αμοιβαία αποκλειόμενα. Το τμήμα else μαζί με το μπλοκ κώδικα 2 είναι προαιρετικό. Αν ένα μπλοκ κώδικα περιέχει μόνο μια εντολή, τότε οι αγκύλες του μπλοκ μπορούν να παραλειφθούν, αν και θεωρείται καλή πρακτική να υπάρχουν αγκύλες ακόμα και για μπλοκ κώδικα με μια εντολή. Το ακόλουθο παράδειγμα (κώδικας 3.1) χρησιμοποιεί την if με τη σύνταξη που δόθηκε και εξετάζει αν ένας αριθμός είναι άρτιος ή περιττός.
Κώδικας 3.1: ch3_p1.c - απλό παράδειγμα με την if. | |
---|---|
if (x%2==0)
printf("The number %d is even.\n", x);
if (x%2==1)
printf("The number %d is odd.\n", x);
Και στις δύο νέες περιπτώσεις οι κώδικες είναι ισοδύναμοι με τον αρχικό.
Ένθετες if Σε μια εντολή if, στις εντολές που εκτελούνται αν η συνθήκη είναι αληθής ή στις εντολές που εκτελούνται αν η συνθήκη είναι ψευδής, μπορούν να υπάρχουν οποιεσδήποτε εντολές, άρα και νέες εντολές if, οπότε δημιουργούνται οι λεγόμενες ένθετες ή εμφωλευμένες επιλογές (nested ifs). Ένα παράδειγμα ακολουθεί στη συνέχεια στον κώδικα 3.2 όπου εμφανίζεται για έναν αριθμό που δίνει ο χρήστης, το εάν είναι θετικός, αρνητικός ή μηδέν.
Κώδικας 3.2: ch3_p2.c - ένθετη επιλογή. | |
---|---|
Η if-else-if Συχνή είναι η χρήση της if με τη μορφή if‐else‐if. Πρόκειται, επί της ουσίας για μια μορφή ένθετων if. Ο τρόπος γραφής της if‐else‐if είναι ο ακόλουθος:
Στη μορφή αυτή της if, οι συνθήκες αποτιμώνται στη σειρά από πάνω προς τα κάτω μέχρι να βρεθεί μια συνθήκη που να είναι αληθής. Τότε εκτελείται η εντολή ή το μπλοκ εντολών που αντιστοιχεί στην αληθή συνθήκη και η εκτέλεση συνεχίζει με την εντολή που ακολουθεί την εντολή if συνολικά. Αν δεν βρεθεί καμία συνθήκη που να είναι αληθής, τότε εκτελούνται οι εντολές που βρίσκονται στο else τμήμα της εντολής, εφόσον το τμήμα αυτό υπάρχει. Χρησιμοποιώντας την if-else-if, ο κώδικας του προηγούμενου παραδείγματος γράφεται «καθαρότερα» όπως στη συνέχεια στον κώδικα 3.3.Κώδικας 3.3: ch3_p2b.c - παράδειγμα με if-else-if. | |
---|---|
Μια ιδιαιτερότητα της if που θα πρέπει να γνωρίζει ο προγραμματιστής της C είναι το λεγόμενο «ξεκρέμαστο else» (dangling else) που αφορά τη συσχέτιση των else με if σε ένθετες επιλογές με πολλούς κλάδους if. Αν υπάρχουν ένθετες if και ένα else όπως στο ακόλουθο παράδειγμα, τότε εκ πρώτης όψης δεν είναι φανερό σε ποιο από τα if αντιστοιχεί το else.
Μπορεί μάλιστα η μορφή γραφής του κώδικα να υποδεικνύει, όπως στο παράδειγμα, ότι το else αντιστοιχεί στο πρώτο if, κάτι που όμως δεν ισχύει. Ο κανόνας που επιλύει αυτό το πρόβλημα είναι ότι «η πρόταση else ανήκει στο πλησιέστερο if που δεν έχει κλείσει». Συνεπώς, στο παράδειγμα η else κλείνει την if με τη συνθήκη3. Ο δε κώδικας θα μπορούσε να στοιχιστεί όπως στη συνέχεια. Εντολές if με σύνθετες συνθήκες Μια σύνθετη συνθήκη δημιουργείται συνδυάζοντας με λογικούς τελεστές (&& για λογικό ΚΑΙ, || για λογικό Ή και ! για λογικό ΌΧΙ) απλές συνθήκες. Για παράδειγμα η σύνθετη συνθήκη(year % 4 == 0 && year % 100 != 0) || year % 400 == 0 συνδυάζει 3 απλές συνθήκες και γίνεται αληθής όταν η τιμή της ακέραιας μεταβλητής year διαιρείται με το 4 και δεν διαιρείται με το 100, εκτός και αν διαιρείται με το 400 οπότε πάλι γίνεται αληθής. Ο έλεγχος αυτός εξετάζει αν ένα έτος είναι δίσεκτο και στη συνέχεια παρουσιάζονται δύο λειτουργικά ισοδύναμοι κώδικες που ο πρώτος χρησιμοποιεί τη σύνθετη συνθήκη ενώ ο δεύτερος χρησιμοποιεί ένθετες if και απλές συνθήκες.
Κώδικας 3.4: ch3_p3.c - έλεγχος για δίσεκτο έτος με σύνθετη συνθήκη. | |
---|---|
Ακολουθεί μια εκτέλεση του προγράμματος.
Μια διαφορετική υλοποίηση για το ίδιο πρόβλημα παρουσιάζεται στη συνέχεια3.2.2 Η εντολή switch
Η switch είναι η δεύτερη εντολή επιλογής της C και συνήθως χρησιμοποιείται λιγότερο συχνά από την if. Η σύνταξή της είναι η ακόλουθη:
switch (έκφραση) {
case σταθερά1:
// Κώδικας που θα εκτελεστεί αν η έκφραση αποτιμηθεί στην τιμή σταθερά1
break;
case σταθερά2:
// Κώδικας που θα εκτελεστεί αν η έκφραση αποτιμηθεί στην τιμή σταθερά2
break;
// Επιπλέον περιπτώσεις μπορούν να προστεθούν εδώ ανάλογα με τις ανάγκες
default:
// Κώδικας που θα εκτελεστεί αν η έκφραση δεν ταιριάξει με καμία από τις
↪ ανωτέρω σταθερές τιμές
break;
}
Η τιμή της έκφρασης (που μπορεί να είναι μόνο ακέραια ή χαρακτήρας) συγκρίνεται από πάνω προς τα κάτω με τις τιμές των σταθερών σε κάθε περίπτωση case. Αν υπάρξει ταύτιση τότε εκτελούνται οι αντίστοιχες εντολές. Αν δεν υπάρξει ταύτιση σε καμία από τις περιπτώσεις τότε εκτελείται το τμήμα default, εφόσον υπάρχει, καθώς είναι προαιρετικό. Παρατηρήστε ότι οι εντολές που ακολουθούν κάθε περίπτωση case δεν τοποθετούνται σε αγκύλες.
Ακολουθεί ένα παράδειγμα χρήσης της switch, στον κώδικα 3.6, στον οποίο ο χρήστης εισάγει έναν αριθμητικό τελεστή από τους +, ‐, *,/ καθώς και δύο τιμές και στη συνέχεια πραγματοποιείται η αριθμητική πράξη που επιλέχθηκε με τελεστέους τις δύο τιμές.
Ένα παράδειγμα εκτέλεσης του κώδικα φαίνεται στη συνέχεια.
Παρατηρήστε ότι μετά από τον κώδικα κάθε περίπτωσης case υπάρχει η εντολή break, που προκαλεί έξοδο από τη switch. Αν δεν τοποθετηθεί break σε μια περίπτωση case τότε ο έλεγχος συνεχίζει στην περίπτωση case που ακολουθεί στη σειρά (follow-through). Αυτό το χαρακτηριστικό μπορεί να χρησιμοποιηθεί έτσι ώστε να προκύψει συντομότερος κώδικας όπως στο ακόλουθο παράδειγμα (κώδικας 3.7) που αναμένει τον χρήστη να εισαγάγει σε μια υποθετική ερώτηση είτε ’Y’ ή ’y’ είτε ’N’ ή ’n’.Κώδικας 3.7: ch3_p5.c - περιπτώσεις case χωρίς break. | |
---|---|
3.3 Εντολές επανάληψης
Η C διαθέτει 3 εντολές επανάληψης, την for, την while και την do...while που η λειτουργία τους μπορεί να τροποποιηθεί με τις εντολές continue και break. Επίσης, βρόχοι επανάληψης μπορούν να υλοποιηθούν και με την εντολή goto, αν και αυτό δεν θεωρείται καλή πρακτική προγραμματισμού.
3.3.1 Η εντολή for
Η εντολή for είναι η εντολή επανάληψης που χρησιμοποιείται συχνότερα. Έχει την ακόλουθη σύνταξη.
for (αρχικοποίηση; συνθήκη ελέγχου επανάληψης; ενημέρωση) {
// Κώδικας που εκτελείται σε κάθε επανάληψη
}
Κώδικας 3.8: ch3_p6.c - εκτέλεση του βρόχου επανάληψης 5 φορές | |
---|---|
Loop 1, variable i = 0
Loop 2, variable i = 1
Loop 3, variable i = 2
Loop 4, variable i = 3
Loop 5, variable i = 4
Κώδικας 3.9: ch3_p7.c - παράδειγμα με διπλή αρχικοποίηση στη for. | |
---|---|
Κώδικας 3.10: ch3_p8.c - παράλειψη του τμήματος ενημέρωσης μεταβλητών επανάληψης της for | |
---|---|
Ακολουθεί η έξοδος του προγράμματος.
Loop 1, variable i = 1
Loop 2, variable i = 2
Loop 3, variable i = 3
Loop 4, variable i = 4
Loop 5, variable i = 5
3.3.2 Η εντολή while
Μια άλλη εντολή επανάληψης της C είναι η εντολή while που επαναλαμβάνει ένα μπλοκ εντολών όσο μια συνθήκη είναι αληθής. Η σύνταξή της είναι η ακόλουθη.
Η συνθήκη ελέγχεται στην αρχή κάθε επανάληψης και αν είναι αληθής εκτελείται το μπλοκ εντολών που ακολουθεί. Αν το μπλοκ εντολών περιέχει μία μόνο εντολή, τότε οι αγκύλες του μπλοκ μπορούν να παραλειφθούν. Αν η συνθήκη είναι ψευδής, τότε τερματίζεται ο βρόχος επανάληψης και το πρόγραμμα συνεχίζει την εκτέλεσή του με την εντολή αμέσως μετά το μπλοκ εντολών. Καθώς ο έλεγχος της συνθήκης για τη συνέχεια ή τον τερματισμό της επανάληψης βρίσκεται πριν το μπλοκ εντολών, υπάρχει περίπτωση η συνθήκη να είναι αρχικά ψευδής και να μην γίνει καμία επανάληψη. Στη συνέχεια, στον κώδικα 3.11 παρουσιάζεται ένα παράδειγμα χρήσης της εντολής while που υπολογίζει το μικρότερο πλήθος διαδοχικών ακεραίων που ξεκινούν από το 1 και που το άθροισμά τους ξεπερνά την τιμή 1000.
Κώδικας 3.11: ch3_p9.c - παράδειγμα επανάληψης με τη while. | |
---|---|
Σε κάθε επανάληψη ελέγχεται η τιμή του sum, που έχει αρχικοποιηθεί στο μηδέν, και αν είναι μικρότερη ή ίση του 1000 εκτελείται ο βρόχος επανάληψης. Σε κάθε επανάληψη η τιμή του sum ενημερώνεται προσθέτοντας στο sum την τρέχουσα τιμή του n, και στη συνέχεια αυξάνεται η τιμή του n κατά 1. Όταν η συνθήκη της επανάληψης γίνει ψευδής, τότε ο βρόχος τερματίζεται. Παρατηρήστε ότι η τιμή που εμφανίζεται για το n στη γραμμή 10, είναι μειωμένη κατά 1, διότι η μεταβλητή n αυξάνεται στον βρόχο μετά την εντολή που προσθέτει την τρέχουσα τιμή του n στο sum, οπότε όταν γίνεται ο έλεγχος στη συνθήκη της επανάληψης (για το εάν sum < 1000), η τελευταία τιμή που έχει προστεθεί στο sum είναι η μικρότερη κατά ένα τιμή του n, σε σχέση με την τρέχουσα τιμή της. Από την άλλη μεριά, αν παραλειφθεί η εντολή sum += n τότε η τιμή του sum δεν θα αλλάζει κάθε φορά που θα εκτελείται ο βρόχος και η επανάληψη θα συνεχίζεται επ’ άπειρο. Ο τερματισμός εκτέλεσης του προγράμματος σε αυτήν την περίπτωση γίνεται με τον συνδυασμό πλήκτρων Ctrl + C και είναι ευθύνη του προγραμματιστή να γράφει κώδικα με τέτοιον τρόπο ώστε να μη συμβαίνουν άπειροι ή όπως αλλιώς ονομάζονται ατέρμονοι βρόχοι (infinite loop).
3.3.3 Η εντολή do...while
Παρόμοια με την εντολή while είναι και η εντολή do...while, με τη διαφορά ότι ο έλεγχος συνέχειας ή τερματισμού της επανάληψης γίνεται μετά το μπλοκ εντολών και όχι πριν όπως στη while. Η σύνταξη της do...while είναι η ακόλουθη:
Οι εντολές του βρόχου επανάληψης εκτελούνται αρχικά και στη συνέχεια εξετάζεται η συνθήκη της επανάληψης. Αν η συνθήκη είναι αληθής τότε οι εντολές του βρόχου εκτελούνται ξανά. Αν όμως η συνθήκη είναι ψευδής, τότε η επανάληψη σταματά και το πρόγραμμα συνεχίζει την εκτέλεσή του με την εντολή που ακολουθεί τη while. H do..while είναι χρήσιμη σε καταστάσεις που επιθυμούμε να διασφαλίσουμε ότι ο βρόχος επανάληψης θα εκτελεστεί τουλάχιστον μια φορά, ανεξάρτητα από τη συνθήκη της επανάληψης. Στο ακόλουθο παράδειγμα (κώδικας 3.12) το πρόγραμμα εμφανίζει ένα μενού με 3 επιλογές και προτρέπει τον χρήστη να εισάγει την επιλογή του έτσι ώστε να εκτυπωθεί ένα μήνυμα ή να τερματίσει η επανάληψη. Η επιλογή της do...while φαίνεται να είναι καταλληλότερη, διότι επιθυμούμε το μενού να εμφανιστεί τουλάχιστον μία φορά, ανεξάρτητα από την τιμή της μεταβλητής choice.
Select an option:
1. Print 'Hello'
2. Print 'Goodbye '
3. Quit
Enter your choice: 4
Invalid choice. Please try again.
Select an option:
1. Print 'Hello'
2. Print 'Goodbye '
3. Quit
Enter your choice: 1
Hello
Select an option:
1. Print 'Hello'
2. Print 'Goodbye '
3. Quit
Enter your choice: 3
Quitting the program...
3.3.4 Οι εντολές break και continue
Οι εντολές break και continue μπορούν να χρησιμοποιηθούν στις εντολές επανάληψης για να παρακάμψουν τον προκαθορισμένο τρόπο λειτουργίας τους. Η εντολή break προκαλεί πρόωρο τερματισμό της επανάληψης, ενώ η εντολή continue προκαλεί μετάβαση στον έλεγχο της συνθήκης της επανάληψης, όπου και καθορίζεται αν η επανάληψη θα συνεχιστεί ή θα τερματιστεί.
Παραδείγματα με την εντολή break Στο πρώτο παράδειγμα με τη break, στον κώδικα 3.13, ο χρήστης εισάγει 5 ακέραιες τιμές και το πρόγραμμα υπολογίζει και εμφανίζει το άθροισμα των τιμών που εισήχθησαν. Αν όμως ο χρήστης εισάγει την τιμή -1, τότε η επανάληψη τερματίζει και εμφανίζεται το άθροισμα από τις τιμές που έχουν εισαχθεί μέχρι εκείνο το σημείο.
Κώδικας 3.13: ch3_p11.c - παράδειγμα με την εντολή break. | |
---|---|
for(;;){ | while (1){ | do {
// βρόχος επανάληψης | // βρόχος επανάληψης | // βρόχος επανάληψης
} | } | } while (1);
Στο δεύτερο παράδειγμα με τη break, στον κώδικα 3.14, ο χρήστης εισάγει τιμές μέχρι να εισαχθεί η τιμή -1. Ο κώδικας χρησιμοποιεί την εντολή break για να «βγει» από τον ατέρμονα βρόχο.
Κώδικας 3.14: ch3_p12.c - παράδειγμα με «ατέρμονα βρόχο» και την break. | |
---|---|
Ακολουθεί ένα παράδειγμα εκτέλεσης.
Enter a number (‐1 to exit): 42
You entered: 42
Enter a number (‐1 to exit): 73
You entered: 73
Enter a number (‐1 to exit): ‐1
Loop terminated.
Παράδειγμα με την εντολή continue Στο παράδειγμα του κώδικα 3.15 εκτελούνται 10 επαναλήψεις με την εντολή for, με τη μεταβλητή επανάληψης i να λαμβάνει τιμές από 0 μέχρι και 9. Σε κάθε επανάληψη εμφανίζεται η τιμή της μεταβλητής επανάληψης, εκτός από τις περιττές τιμές δείκτη που είναι μεγαλύτερες του 5. Η παράλειψη εκτύπωσης της τιμής της μεταβλητής επανάληψης επιτυγχάνεται τοποθετώντας την εντολή continue στην κατάλληλη θέση.
Κώδικας 3.15: ch3_p13.c - παράδειγμα με την continue. | |
---|---|
Το αποτέλεσμα της εκτέλεσης είναι: 0 1 2 3 4 5 6 8.
3.3.5 Ένθετοι βρόχοι
Ένας ένθετος βρόχος είναι ένας βρόχος που περικλείεται σε έναν άλλο βρόχο. Ακολουθεί ένα απλό παράδειγμα ένθετων βρόχων με την εντολή for (κώδικας 3.16). Ο εξωτερικός βρόχος εκτελείται 5 φορές και για κάθε επανάληψή του ο ένθετος βρόχος εκτελείται 2 φορές. Άρα συνολικά η εντολή printf θα εκτελεστεί 10 φορές.
Κώδικας 3.16: ch3_p14.c - ένθετοι βρόχοι. | |
---|---|
Οι ένθετοι βρόχοι μπορεί να είναι συνθετότεροι. Στο επόμενο παράδειγμα (κώδικας 3.17), το πλήθος των επαναλήψεων του ένθετου βρόχου αλλάζει από επανάληψη σε επανάληψη.
Κώδικας 3.17: ch3_p15.c - ένθετοι βρόχοι. | |
---|---|
Ακολουθεί το αποτέλεσμα της εκτέλεσης.
3.3.6 Η εντολή goto
Η goto είναι μια εντολή αλλαγής της ροής του προγράμματος που προκαλεί μετάβαση σε ένα σημείο του προγράμματος που προσδιορίζεται από μια ετικέτα. Η μετάβαση γίνεται χωρίς να εξαρτάται από κάποια συνθήκη και συνεπώς πραγματοποιείται απευθείας αλλαγή της ροής εκτέλεσης του προγράμματος. Ακολουθεί ένα παράδειγμα χρήσης της goto, στον κώδικα 3.18, που δημιουργεί έναν βρόχο επανάληψης που τερματίζεται όταν ο χρήστης εισάγει την τιμή -1. Το όνομα της ετικέτας στο παράδειγμα αυτό είναι loop.
Κώδικας 3.18: ch3_p16.c - παράδειγμα με τη goto. | |
---|---|
Ο κώδικας είναι λειτουργικά ισοδύναμος με το παράδειγμα με την εντολή break του κώδικα 3.14 και συνεπώς παράγει τα ίδια αποτελέσματα.
Γενικά, προτείνεται η αποφυγή της εντολής goto διότι ο κώδικας που προκύπτει είναι πιθανό να είναι δυσκολότερο να αναγνωσθεί και να κατανοηθεί 1. Ο κώδικας με πολλά goto συχνά αναφέρεται και ως spaghetti κώδικας και όπως παραστατικά περιγράφεται στο 2 σε συνδυασμό με άλλους παράγοντες μπορεί να οδηγήσει σταδιακά στη μεταμόρφωση του λογισμικού σε “big ball of mud” (μεγάλη σφαίρα λάσπης), με μηδενικές δυνατότητες επέκτασης και διόρθωσης. Ωστόσο, σε ορισμένες περιπτώσεις 3 η goto μπορεί να χρησιμοποιηθεί αποδοτικά έτσι ώστε να απλοποιήσει τον έλεγχο ροής εκτέλεσης του προγράμματος ή να χειριστεί σφάλματα. Ακολουθούν δύο παραδείγματα που η goto δίνει εύκολο στην κατανόηση κώδικα. Στο πρώτο παράδειγμα (κώδικας 3.19) η goto προκαλεί την έξοδο από μια τριπλά ένθετη επανάληψη με for, ενώ στο δεύτερο παράδειγμα (κώδικας 3.21) απομονώνει τον χειρισμό εισαγωγής τιμών που οδηγούν σε σφάλματα.
Κώδικας 3.19: ch3_p17.c - έξοδος από ένθετες επαναλήψεις με την goto. | |
---|---|
i=0, j=0, k=0
i=0, j=0, k=1
i=0, j=0, k=2
i=0, j=0, k=3
i=0, j=0, k=4
i=0, j=1, k=0
i=0, j=1, k=1
i=0, j=1, k=2
Exit from the nested loops!
Στο επόμενο παράδειγμα (κώδικας 3.21) παρουσιάζεται ένας συνηθισμένος τρόπος χειρισμού λαθών με την goto. Στο παράδειγμα ζητείται η είσοδος δύο ακεραίων τιμών από τον χρήστη και ο υπολογισμός του πηλίκου του πρώτου με τον δεύτερο, καθώς και ο υπολογισμός της τετραγωνικής ρίζας του πρώτου αριθμού. Τα σημεία του κώδικα που προκαλούν σφάλματα (διαίρεση με το μηδέν, τετραγωνική ρίζα με αρνητικό υπόριζο) κατευθύνουν τη ροή εκτέλεσης του προγράμματος με την goto σε συγκεκριμένο τμήμα του κώδικα (γραμμές 17-19) που εμφανίζει μήνυμα σφάλματος και τερματίζει την εκτέλεση του προγράμματος.
Ακολουθεί παράδειγμα εκτέλεσης.
Συμπερασματικά, η υπερβολική χρήση της goto ή η χρήση της goto στη θέση άλλων δομών που θα έδιναν απλούστερο κώδικα, μπορεί να οδηγήσει σε φτωχά δομημένο κώδικα που είναι δύσκολο να συντηρηθεί. Η γενική σύσταση είναι να προτιμώνται οι δομές επιλογής και επανάληψης όπως οι if, switch, for και while, όπου αυτό είναι δυνατό.
3.4 Ασκήσεις
Άσκηση 1
Γράψτε ένα πρόγραμμα που να ελέγχεται από ένα μενού επιλογών με τις επιλογές 1) ημίτονο, 2) συνημίτονο, 3) εφαπτομένη. Ανάλογα με την επιλογή του χρήστη να εμφανίζει τις τιμές της τριγωνομετρικής συνάρτησης που επιλέγεται για όλες τις τιμές γωνιών από 1 μέχρι και 360 μοίρες. Χρησιμοποιήστε τις συναρτήσεις sin() (ημίτονο), cos() (συνημίτονο) και tan() (εφαπτομένη) από την τυπική βιβλιοθήκη της C που ορίζονται στο math.h. Προσέξτε ότι οι συναρτήσεις αυτές λειτουργούν με τιμές σε ακτίνια, οπότε πρέπει πρώτα οι μοίρες να μετατραπούν σε ακτίνια. Η μετατροπή μιας γωνίας από μοίρες σε ακτίνια γίνεται πολλαπλασιάζοντας τις μοίρες με το (𝜋/180).
Λύση άσκησης 1
Άσκηση 2
Γράψτε ένα πρόγραμμα που να ελέγχει αν δύο αριθμοί που εισάγει ο χρήστης είναι φίλιοι αριθμοί. Δύο αριθμοί λέγεται ότι είναι φίλιοι αν το άθροισμα των διαιρετών του καθένα από τους δύο αριθμούς (εξαιρώντας τον ίδιο τον αριθμό) είναι ίσο με τον άλλο αριθμό. Για παράδειγμα οι αριθμοί 220 και 284 είναι φίλιοι αριθμοί καθώς
284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 (οι διαιρέτες του 220)
και
220 = 1 + 2 + 4 + 71 + 142 (οι διαιρέτες του 284).
Λύση άσκησης 2
Άσκηση 3
Με βάση τη λύση που δώσατε στην προηγούμενη άσκηση, υπολογίστε το πλήθος των ζυγών φίλιων αριθμών στο διάστημα από 1 μέχρι 10000.
Λύση άσκησης 3
Άσκηση 4
Η φόρμουλα του Wallis(1), από το 1652,
$$ \frac{\pi}{2} = \left(\frac{2}{1} \times \frac{2}{3}\right) \times \left(\frac{4}{3} \times \frac{4}{5}\right) \times \left(\frac{6}{5} \times \frac{6}{7}\right) \times \left(\frac{8}{7} \times \frac{8}{9}\right) \times \dots $$ μπορεί να χρησιμοποιηθεί για τον υπολογισμό μία προσέγγιση του 𝜋. Γράψτε ένα πρόγραμμα που χρησιμοποιώντας τη φόρμουλα να υπολογίζει την προσέγγιση του 𝜋. Ο υπολογισμός να συνεχίζεται για ένα πλήθος όρων του γινομένου που θα δίνεται από τον χρήστη.
Λύση άσκησης 4
-
Edsger W Dijkstra. “Letters to the editor: go to statement considered harmful”. Στο: Communications of the ACM 11.3 (1968), σσ. 147–148. ↩
-
Brian Foote και Joseph Yoder. “Big ball of mud”. Στο: Pattern languages of program design 4 (1997), σσ. 654–692. ↩
-
Delroy A. Brinkerhoff. Object Oriented Proggramming using C++. Supplemental: Legitimate Uses For goto. https://icarus.cs.weber.edu/~dab/cs1410/textbook/3.Control/goto.html. Accessed: 2023-06-01. ↩