3. ΕΝΤΟΛΕΣ ΕΛΕΓΧΟΥ (Β' μέρος: switch και :? ) 3.1 Η εντολή switch case Στην περίπτωση που θέλουμε να εξετάσουμε πολλές διαφορετικές τιμές, θα αναγκαζόμασταν να φτιάξουμε ένα κώδικα που θα περιέχει πολλά else if, οπότε για να δομηθεί πιο σωστά το πρόγραμμα μας, χρησιμοποιούμε τη switch. Μπορείτε να έχετε τόσες περιπτώσεις όσες θέλετε, συμπεριλαμβανομένης μιας περίπτωσης προεπιλογής(default) που εκτελείται εάν καμία από τις προηγούμενες περιπτώσεις δεν ισχύει. Η γενική μορφή της εντολής switch... case είναι: switch ( metavliti ) case τιμή_1: σύνολο_εντολών_1; case τιμή_2: σύνολο_εντολών_2;...... σύνολο_εντολών_n; Αυτό θα ήταν αντίστοιχο με το να γραφεί ένα πρόγραμμα, όπως: if (metavliti==τιμή_1) σύνολο_εντολών_1; else if (metavliti==τιμή_2) σύνολο_εντολών_2; else σύνολο_εντολών_n; Το πλεονέκτημα της if είναι ότι μπορούμε να βάλουμε και συνθήκες που να έχουν να κάνουν με μεγαλύτερο ή μικρότερο και όχι μόνο ισότητες. 1
Παράδειγμα: int a; printf("dwse ena noumero apo to 1 mexri to 4:\n"); scanf("%d", &a); switch (a) case 1: printf("dialexes ton arithmo 1\n"); case 2: printf("dialexes ton arithmo 2\n"); case 3: printf("dialexes ton arithmo 3\n"); case 4: printf("dialexes ton arithmo 4\n"); printf("den edwses arithmo apo tous 1,2,3 i 4\n"); Στην οθόνη θα εμφανιστεί: Dwse ena noumero apo to 1 mexri to 4: Αν πατήσετε... 2 Θα εμφανιστεί: Dialexes ton arithmo 2 Οι case εντολές λειτουργούν απλά σαν ετικέτες (δηλαδή απλά δείχνουν στο πρόγραμμα από ποιό σημείο να συνεχίσει) Π.χ. Αν είναι 2 συνέχισε να εκτελείς το πρόγραμμα από το σημείο 2 και κάτω. Το αποτέλεσμα είναι ότι αφού ταιριάξει την case που έχει την τιμή εκτελεί όλες τις μεταβλητές από κει και πέρα. Γι' αυτό το λόγο, εισάγουμε την εντολή που λέει στο πρόγραμμα να βγει τελείως από τη switch και να συνεχίσει με τις επόμενες εντολές του προγράμματος (αν υπάρχουν) μετά το άγκιστρο που κλείνει τη switch. 2
Στο προηγούμενο παράδειγμα, αν είχαμε αφαιρέσει όλες τις break, και επιλέγαμε το 2, θα εμφανιζόντουσαν στην οθόνη όλα τα επόμενα: Dialexes ton arithmo 2 Dialexes ton arithmo 3 Dialexes ton arithmo 4 Den edwses arithmo apo tous 1,2,3 i 4 Αντίστοιχα, αν είχαμε αφήσει τη break που υπάρχει στην case 3, τότε το αποτέλεσμα που θα εμφανιζόταν θα ήταν: Dialexes ton arithmo 2 Dialexes ton arithmo 3 Για να καταλάβουμε, ποιός είναι ο λόγος που η switch συμπεριφέρεται έτσι, θα δούμε το παρακάτω παράδειγμα, όπου οι ίδιες εντολές εκτελούνται για διαφορετικές τιμές της μεταβλητής : Παράδειγμα: int a; printf("dwse ena noumero apo to 1 mexri to 4:\n"); scanf("%d", &a); switch (a) case 1: case 3: printf("epelexes mono noumero\n"); case 2: case 4: printf("epelexes zygo noumero\n"); printf("den edwses arithmo apo tous 1,2,3 i 4!\n"); Στην οθόνη θα εμφανιστεί: Dwse ena noumero apo to 1 mexri to 4: Αν πατήσετε... 2 Θα εμφανιστεί: Epelexes zygo noumero αφού εκτελεί τις εντολές από το case 2 μέχρι να βρει break ή να τελειώσει το switch. 3
3.2 Ο υπό όρους τελεστής «? :» (The Conditional Operator) Ο υπό όρους τελεστής (conditional operator) συμπεριφέρεται όπως μία απλή if... else δήλωση. Η διαφορά του είναι ότι ορίζεται ολόκληρος σε μια μόνο γραμμή: Συνθήκη? εντολή_1: εντολή_2; Ο μεταγλωττιστής εξετάζει αρχικά τη συνθήκη. Εάν η συνθήκη είναι αληθινή, εκτελεί την εντολή_1, διαφορετικά θα εκτελούσε εντολή_2. Για παράδειγμα, όταν σε ένα πρόγραμμα ζητούνται δύο αριθμοί από το χρήστη και θέλετε να τους συγκρίνετε, το ακόλουθο πρόγραμμα θα υπολογίσει ποιος από τους δύο αριθμούς είναι ο μεγαλύτερος. Η σύγκριση εκτελείται χρησιμοποιώντας τον υπό όρους τελεστή : long int Num1, Num2, Max; printf("dwse dyo noumera pou na xwrizontai metaxy tous me to keno:"); scanf("%d %d",&num1,&num2); Max = (Num1 < Num2)? Num2 : Num1; printf ( "\nto megalytero noumero apo ta %d kai %d einai to %d\n",num1,num2,max); Δηλαδή, στο σημείο που φράφουμε την εντολή Max = (Num1 < Num2)? Num2 : Num1; θα μπορούσαμε να είχαμε γράψει: if (Num1 < Num2) Max = Num2; else Max = Num1; 3.3 Ασκήσεις ΑΣΚΗΣΗ 1: Πληκτρολογείστε το παρακάτω πρόγραμμα: int menu, numb1, numb2, total; printf("dwse dyo noumera pou na xwrizontai metaxy tous me to keno:"); 4
scanf("%d %d", &numb1, &numb2 ); printf("enter in choice\n"); printf("1=prosthesi\n"); printf("2=afairesi\n"); scanf("%d", &menu ); switch( menu ) case 1: total = numb1 + numb2; printf("%d kai %d ison %d\n", numb1, numb2, total ); case 2: total = numb1 - numb2; printf("%d meion %d ison %d\n", numb1, numb2, total ); printf("invalid option selected\n"); Το παραπάνω πρόγραμμα να επεκταθεί ώστε να εκτελεί και τις τέσσερις βασικές πράξεις. ΑΣΚΗΣΗ 2: Πληκτρολογείστε το παρακάτω πρόγραμμα το οποίο είναι μια παραλλαγή του προηγούμενου προγράμματος. Στη συνέχεια, να επεκταθεί κι αυτό ώστε να κάνει και τις τέσσερις βασικές πράξεις. char op; float number1, number2, result; printf("grapste dyo noumera kai enan arithmo me tin parakatw morphi\n"); printf(" noumero1 (keno) telestis_praxis (keno) noumero2\n"); scanf("%f %c %f", &number1, &op, &number2); switch( op ) case '+' : result = number1 + number2; case '-' : result = number1 - number2; printf("%f %c %f is %f\n", number1, op, number2, result ); 5
ΑΣΚΗΣΗ 3: Να γραφεί πρόγραμμα που να δέχεται δύο πραγματικούς αριθμούς και να εκτελεί τις πράξεις του υπολοίπου της διαίρεσης, της ύψωσης σε δύναμη, του αθροίσματος και της διαφοράς των αντίστροφων τους. Υπόδειξη: Η ύψωση σε δύναμη γράφεται χρησιμοποιώντας και τη βιβλιοθήκη math.h, άρα στην αρχή του προγράμματος, εκτός της, θα πρέπει να γράψουμε και τη βιβλιοθήκη #include <math.h>, που περιέχει μαθηματικούς τύπους. Μετά θα μπορέσουμε να χρησιμοποιήσουμε μέσα στο πρόγραμμα μας τη συνάρτηση pow(a,b); που σημαίνει ο αριθμός με βάση το a υψωμένο στη δύναμη b. Ο αντίστροφος ενός αριθμού a είναι ο 1/a και λογικά, πρέπει να είναι δεκαδικός. Επίσης, για να δουλέψει το υπόλοιπο, πρέπει να έχουμε ακέραιους (παίρνοντας άλλες δύο μεταβλητές που θα είναι ίσες με τις αντίστοιχες δεκαδικές που μας έδωσε ο χρήστης) ή βάζοντας κατά την πράξη μπροστά από τις μεταβλητές το (int). ΑΣΚΗΣΗ 4: Να γραφεί πρόγραμμα που να εισάγει έναν αριθμό από το πληκτρολόγιο και να χρησιμοποιεί τις εντολές switch case που να εκτελεί τις ίδιες λειτουργίες με το παρακάτω εντολές if else : if (x == 10) printf( deka\n ); else if ( x == 20) printf( eikosi\n ); else if (x == 30) printf( trianta\n ); else printf( oute deka, oute eikosi, oute trianta\n ); 6