ΕΠΛ 032.3: Προγραµµατισµός ΜεθόδωνΕπίλυσηςΠροβληµάτων Αχιλλέας Αχιλλέως, Τµήµα Πληροφορικής, Πανεπιστήµιο Κύπρου Email: achilleas@cs.ucy.ac.cy
Κεφάλαιο 6 ΣυνθήκεςΈλεγχου (if-else, switch) και Λογικοίτελεστές / παραστάσεις
Θέµατα ιάλεξης οµές Εκτέλεσης οµές Επιλογής (Selection) Τελεστές/Παραστάσεις Σχεσιακοί Τελεστές (Relational Operators) Λογικοί Τελεστές (Logical Operators) Εκφράσεις µε Λογικούς και Σχεσιακούς Τελεστές Μετατροπή Εκφράσεων σε C
οµέςεκτέλεσης ιαδοχική εκτέλεση Στηρίζεταιστηναπλήπαράθεσηεκφράσεων / εντολών, ηµιαµετάτηνάλλη Εκτέλεση µε επιλογή Η ροή του προγράµµατος διακόπτεται για να παρθεί µια απόφαση, να γίνει κάποια επιλογή Το αποτέλεσµα της απόφασης καθορίζει την κατεύθυνση της ροής του προγράµµατος Εκτέλεση µε επανάληψη Μια οµάδα εκφράσεων / εντολών εκτελείται περισσότερο από µια φορά
οµέςεπιλογής (Selection) Έκφραση Συνθήκης Σχεσιακοί/Συγκριτικοί Τελεστές Λογικοί Τελεστές Εντολές if, if-else φωλιασµένα if-else Εντολή switch
ΠαράδειγµαΕπιλογής Γράψετε κώδικα που παίρνει παραµέτρους δυο ακέραιους αριθµούς και τυπώνει τον µικρότερο.
Ψευδοκώδικας διάβασε τους ακέραιους α, β αν (α < β) τότε τύπωσε α αλλιώς τύπωσε β
Συνθήκηστιςδοµέςεπιλογών αν (συνθήκη) τότε εντολές Α αλλιώς εντολές Β συνθήκη : λογική παράσταση που αποτιµάται σε true-αλήθεια (1) ή false-λάθος (0)
Λογικέςπαραστάσεις Μια λογική παράσταση (ΛΠ) είναι ανάλογη µιας µαθηµατικής παράστασης, µε τη διαφορά ότι το αποτέλεσµα µπορεί να είναι µόνο αλήθεια (1) ή λάθος (0) Λογικές παραστάσεις συνθέτονται χρησιµοποιώντας σχεσιακούς τελεστές υο λογικές παραστάσεις µπορούν να συνδυαστούν µε ένα λογικό τελεστή
ΣχεσιακοίΤελεστές (Relational Operators) υαδικοί Τελεστές < µικρότερο από > µεγαλύτερο από <=µικρότεροήίσοµε >=µεγαλύτεροήίσοµε ==ίσοµε!= διάφορο του Αποτιµούνται σε 0 (ψευδής) ή 1 (αληθής) Τύποιτελεσταίων int, char, float, double
Παραδείγµατα (x < y) t = (x < y); Αν (t)τότε printf( true\n ); k = (i >= 8); a = (b!= c); (f == 2.3456) ΠΡΟΣΟΧΗποτέδενσυγκρίνουµεδυο float ή double µε ισοτητα ( a >= d ) a < b <..< z A < B <..< Z 0 < 1 <..< 9 έστε ASCII κώδικα
ΛογικοίΤελεστές (Logical Operators) Συνδυάζουν δύο λογικές παραστάσεις σε µια σύνθετη λογική παράσταση && σύζευξη, δυαδικός τελεστής (AND) όλες οι υποεκφράσεις ισχύουν διάζευξη, δυαδικός τελεστής (OR) τουλάχιστον µια υποέκφραση ισχύει! άρνηση, µοναδιαίος τελεστής (NOT) ισχύει το αντίθετο µιας έκφρασης Αποτιµούνται σε 0 ή 1 0 (δεν ισχύει, ψευδής ή false) 1 (ισχύει, αληθήςήtrue)
ΕκφράσειςµεΛογικούςκαι ΣχεσιακούςΤελεστές Παραδείγµατα: (A>=0 && A<=100); FALSE TRUE FALSE 0 100 A (s<10 s>100); TRUE FALSE TRUE 10 100 s!(s<10 s>100) (s>=10 && s<=100) (i<10 && j==1)
ΠροτεραιότητεςΤελεστών ()! * / % + < <= >= > ==!= && = υψηλότερη χαµηλότερη
ΑποτίµησηΛογικώνΕκφράσεων Η αποτίµηση αρχίζει από τα αριστερά και προχωρεί µέχρι το σηµείο που χρειάζεται να προχωρήσει (lazy evaluation), π.χ. 0 && Ε 0 ηαποτίµησητηςέκφρασηςεδεν χρειάζεται 1 Ε 1 ηαποτίµησητηςέκφρασηςεδεν χρειάζεται
ΣειράΣυνθηκώνσεµία ΛογικήΈκφραση Για λόγους αποδοτικότητας Αποφυγή λαθών ( (y / x) > 2 && (x!= 0) ) Εάν x ισούταιµε 0, run time error (λάθος Απαγορεύεται η διάιρεση µε το 0). Όµως η ακόλουθη διατύπωση δεν έχει πρόβληµα (υπερβαίνει το πρόβληµα της διαίρεσης µε 0) ( x!= 0 && (y / x) > 2 )
ΣειράΣυνθηκώνσεµία ΛογικήΈκφραση (συν.) Γενικάσεµίασύζευξη, Ε 1 && Ε 2, η συνθήκηε 1 πρέπεινααποτελείτον αριστερό τελεστέο, εάν στην περίπτωση που αποτιµείται σε 0, τυχόναποτίµησητηςε 2 θαοδηγήσει σε πρόβληµα. Με αυτή την σειρά αποτρέπεταιηαποτίµησητηςε 2. Ανάλογο για διάζευξη Ε1 Ε2 ( (x == 0) (y / x) > 2 )
ΜετατροπήΕκφράσεωνσε C x και y µεγαλύτερατου z (x>z && y>z) x είναιίσοµετο 2 ήµετο 10 (x==2 x==10) a είναιστοπεδίοαπό b µέχρικαι c (a>=b && a<=c) αείναιέξωαπότοπεδίο b µέχρικαι c!(a>=b && a<=c) ή (a<b a>c)
ΜετατροπήΕκφράσεωνσε C (συν.) x είναι µικρότερο του 0 ή µεταξύ 10 και 1000 (x<0) (x>=10 && x<=1000) z είναι αγγλικός χαρακτήρας (z>= a && z<= z ) (z>= A && z<= Z )
Eντολή if-else Σύνθετες Εντολές (ή blocks) { ήλωση; ;Εντολή;} Άγκιστρα οµαδοποιούν εντολές σαν να είναι µια εντολή if (συνθήκη) εντολή; else εντολή; if (συνθήκη) { εντολή;... } else { εντολή;... }
Σηµασία if-else Σηµασία: εαντοαποτέλεσµατηςέκφρασης (συνθήκης) είναιαληθής*,τότεεκτελούνται οιεντολέςτου if block, αλλιώς εκτελούνται οι εντολές του else block if (temp > 0) { } else { } printf( above freezing.\n ); printf( freezing!\n ); Η C αποτιµά οποιοδήποτε αποτέλεσµα έκφρασης σε συνθήκη που έχει τιµή διάφορη του 0 ως αληθή (TRUE) if (x) { /* x=, -3, -2, -1, 1, 2, 3, */ printf( TRUE ); } else { printf( FALSE ); }
Παράδειγµα if-else Γράψετε κώδικα που παίρνει παραµέτρους δυο ακέραιους αριθµούς και τυπώνει τον µικρότερο.
Κώδικας C (µόνο η συνάρτηση main) int main(){ int a, b; printf( dwse ta a kai to b\n ); scanf( %d%d, &a, &b); if (a < b) printf( %d\n, a); else printf( %d\n, b); } return 0;
Εντολή if if (συνθήκη) εντολή; if (συνθήκη) { εντολή; }
Σηµασία if Σηµασία: εαν το αποτέλεσµα της έκφρασης (συνθήκης) είναι αληθής τότε εκτελούνται οι εξαρτώµενες εντολές αλλιώς η εκτέλεση συνεχίζει µετά το if block (αγνοούνται οι εξαρτώµενεςεντολές) if (count <= 0){ count = count + 1; printf( increment count\n ); } printf( I am here!\n );
Παράδειγµα int number, count;.. if (number <= 0){ count = count + 1; } printf( %d\n, count);. number count output 2 3?
Παράδειγµα if-else Γράψετε κώδικα που παίρνει παραµέτρους δυο ακέραιους αριθµούς και τυπώνει τον µικρότερο.
Κώδικας if (a < b) printf( %d\n, a); else printf( %d\n, b); int minimum; minimum = b; if (a < b) minimum = a; printf( %d\n, minimum); int minimum; if (a < b) minimum = a; else minimum = b; printf( %d\n, minimum);
Παράδειγµα if-else Γράψετε κώδικα που παίρνει τρεις ακέραιους αριθµούς και επιστρέφει τον µικρότερο.
Κώδικας int minimum; if (a < b) minimum = a; else minimum = b; if (c < minimum) minimum = c; printf( The minimum is %d\n, minimum);
Φώλιασµα (nesting) int minimum; if (a < b) if (a < c) minimum = a; else minimum = c; else if (b < c) minimum = b; else minimum = c; printf( The minimum is %d\n, minimum); Το κάθε else ταιριάζει µε το προηγούµενο if (εκτός και αν χρησιµοποιήσουµε {})
Παράδειγµαφωλιασµένου if-else Γράψετε κώδικα που ελέγχει ένα ακέραιο αριθµό και τυπώνει 1 εανείναιθετικός, 0 εανείναι 0 και -1 εαν είναι αρνητικός
Κώδικας 1 int number, code; scanf( %d, &number); if (number > 0) code = 1; else if (number < 0) code = -1; else /* number einai 0 */ code = 0; printf( %d\n,code);
Κώδικας 2 int number, code; scanf( %d, &number); if (number > 0){ code = 1; } else{ /* number <=0 */ if (number < 0){ code = -1; } else{ /* number einai 0 */ code = 0; } } printf( %d\n,code);
Κώδικας 3 (if else if else) int number, code; scanf( %d, &number); if (number > 0) code = 1; else if (number < 0) code = -1; else /* number einai 0 */ code = 0; printf( %d\n,code);
Παράδειγµα: χρήση λογικών τελεστών Γράψετε κώδικα που παίρνει τρεις ακέραιους αριθµούς και επιστρέφει τον µικρότερο. int minimum; if ( (a < b) && (a < c) ) minimum = a; else if ( (b < a) && (b < c) ) minimum = b; else minimum = c; printf( The minimum is %d\n, minimum);
Φíλτρα/Έλεγχοςδεδοµένων Χρησιµοποιείτε τις εντολές ελέγχου για να ελέγχετε την ορθότητα δεδοµένων π.χ. if(size<=0){ printf( Error: size is not possitive\n ); exit(-1); /*termatizei programma*/ ( #include <stdlib.h>) } EXIT_FAILURE σήµα ή το assert() ( #include <assert.h>) assert(size>0); /*Error: size is not positive - termatizei*/ Βεβαίωση: παίρνει ως παράµετρο συνθήκη: αν η αποτίµησή της είναι TRUE τότε το πρόγραµµα συνεχίζει κανονικά, αλλιώς τερµατίζει µηκανονικά.
Παραδείγµατα printf( Enter length and width in meters: ); scanf( %f%f,&length,&width); if (length<0){ printf( Error: Length is not positive!\n ); assert(0); /* or: exit(-1); */ } assert(length<10000); /* length is less than 10000*/ /* or: if (length >= 10000) exit(-1); */
Εντολή switch switch (παράσταση/έκφραση/µεταβλητή) { case σταθερά_1: πρέπει να είναι τύπου intήchar } εντολές_1 break;.. case σταθερά_n: εντολές_n break; default: εντολές_d πρέπειναείναιτύπου char ή int, αλλά όχι float ή double 0 ή περισσότερες εντολές (εκτελούνται αν η τιµή του case ταιριάζει µε αυτή του switch) Προκαλεί την έξοδο από το switch. Αν δεν υπάρχει στο case που ήδη έχει ταιριάξει, τότε συνεχίζεται η εκτέλεση όλων των cases πουτηνακολουθούν, µέχρι να συναντήσει ένα break ή φτάσουµε στο τέλος του switch. Προαιρετικό (εκτελείται εάν καµία case τιµή δεν ταιριάζει µε την τιµή της έκφρασης του switch)
Παραδείγµατα #include <stdio.h> int main() { } int menu; int v1=10, v2=20, total; char c; printf("please make a selection (1-2) : "); scanf("%d", &menu); /* READ calculation type */ switch (menu) /* select the type of calculation */{ case 1: } total = v1 + v2; c='+'; break; case 2: total = v1 - v2; c='-'; break; default: printf("invalid option selected\n"); printf("%d %c %d = %d", v1, c, v2, total); return 0;
char letter_grade; int count_a, count_b, count_other; count_a = count_b = count_other = 0; switch(letter_grade){ case A : counta=counta+1; printf( excellent\n ); break; case B : countb=countb+1; printf( very_good\n ); break; case C : case D : case F : count_other=count_other+1; printf( other\n ); break; default: printf( %c is the wrong grade!\n, letter_grade); }
ΡοήΕλέγχουµε switch switch παράσταση... επόµενη εντολή
Switch vs if-else switch παράσταση if-else παράσταση true false... επόµενη εντολή επόµενη εντολή
Παράδειγµα Γράψε κώδικα που διαβάζει ένα χαρακτήρα και τυπώνει 0 εαν ο χαρακτήρας είναι άσπρο διάστηµα και 1 αλλιώς Τι είναι άσπρο διάστηµα;
#define WHITE_SPACE 0 #define NOT_WHITE_SPACE 1.............. char xar; int code; scanf( %c, &xar); if (xar== xar== \n xar== \t ) code = WHITE_SPACE; else code = NOT_WHITE_SPACE; printf( %d\n, code); Είσοδος: 123 3#4%^&* asdf Έξοδος: 00111011111110011110 Άσκηση για εξάσκηση: Χρησιµοποιείστε switch αντί if-else
Άσκηση για εξάσκηση: Χρησιµοποιείστε switch αντί if-else Τρόπος Α #define WHITE_SPACE 0 #define NOT_WHITE_SPACE 1................. char xar; int code; scanf( %c, &xar); switch(xar){ case : case \t : case \n : code = WHITE_SPACE; break; default: code = NOT_WHITE_SPACE; } printf( %d\n, code);
Άσκηση για εξάσκηση: Χρησιµοποιείστε switch αντί if-else Τρόπος Β #define WHITE_SPACE 0 #define NOT_WHITE_SPACE 1................. char xar; int code; scanf( %c, &xar); switch(xar== xar== \n xar== \t ){ case 1: code = WHITE_SPACE; break; case 0: code = NOT_WHITE_SPACE; break; } printf( %d\n, code);
if-elseκαι switch Οποιαδήποτε εντολή switch µπορεί να γραφεί µε if-else (ισχύει και το αντίθετο). Επιλέξετε το πιο φυσιολογικό, εύκολο κτλ
ΚοινάΣυντακτικά/ΛογικάΛάθη = αντί == if (x=10) αντί if (x==10) Έξτρα ; στην πρώτη γραµµή του if if (x==10); printf( equal to 10 ); printf( program run continues. ); Μετατροπή από µαθηµατικά σε C, από 0 µέχρι 4: (0 <= x <= 4) αντί (0 <= x && x<= 4) π.χ. x=5 (0 <= 5 <= 4) x=5 (0 <= 5 && 5<= 4) συνθήκη χωρίς παρένθεση if x>4 αντί if (x>4) Λογικό λάθος Λογικό λάθος (κενό σώµα-εντολές του if) Συντακτικό λάθος Λογικό λάθος 1 <= 4 TRUE (λάθοςεκτίµηση) 1 && 0 FALSE (ορθή εκτίµηση)
Λάθοςαντιστοιχία if-else Λάθος: if (x > 0) sum = sum + x; printf( Greater than 0 ); else printf( Less than 0 ); Ορθό: if (x > 0){ sum = sum + x; printf( Greater than 0 ); } else{ printf( Less than 0 ); } Ενέργειες Μεταγλωττιστή Μοναδική εντολή του if Εκτός του if. Θα εκτελεστεί οπωσδήποτε, ως η επόµενη εντολήµετάτο if. Συντακτικόλάθος: εν ξεκινάς µε εντολή else
Τέλος 6 ου Κεφαλαίου