Εντολες Επιλογης (Selection) Εντολες if, if-else, ? : nested if-else Εκφραση Συνθηκης Σχεσιακοι Τελεστες Λογικοι Τελεστες Εντολη switch (και το break)
Δομες Ελεγχου Ενα προγραμμα αποτελειται απο Ακολουθιες πχ { εντολη;εντολη;…} Εκλογη πχ if(){} Επαναληψη πχ while{}
Eντολη if if (εκφραση) εντολή; if (εκφραση){ εντολη; … }
Eντολη if-else if (εκφραση) εντολή; else if (εκφραση){ εντολη; ... }
Eντολη ? : Συνταξη: (εκφραση) ? εντοληΑ : εντοληΒ; Σημασια: Εαν η τιμη της εκφρασης ειναι διαφορη του μηδεν εκτελα την εντοληΑ αλλιως εκτελα την εντοληΒ, πχ: x = (y>100) ? y : 0;
if Σημασια: εαν η εκφραση(συνθηκη) παιρνει τιμη διαφορη του μηδεν τοτε εκτελουνται οι εξαρτομενες εντολες αλλιως συνεχισε με τις εντολες που ακολουθουν το if block if (length <= 0){ printf(‘‘error: length should be possitive\n’’); exit(0); }
if-else Σημασια: εαν η εκφραση(συνθηκη) παιρνει τιμη διαφορη του μηδεν τοτε εκτελουνται οι εντολες του if block αλλιως εκτελουνται οι εντολες του else block if (temp > 0){ printf(‘‘above freezing.\n’’); } else{ printf(‘‘freezing!\n’’);
Παραδειγμα if-else Γραψετε την συναρτηση min που παιρνει παραμετρους δυο ακεραιους αριθμους και επιστρεφει τον μικροτερο.
int min(int a, int b) { int minimum; if (a < b) minimum = a; else minimum = b; return minimum; }
int min(int a, int b) { int minimum; if (a < b) minimum = a; else minimum = b; return minimum; } int min(int a, int b) { if (a < b) return a; else return b; } int min(int a, int b) { if (a < b) return a; return b; } int min(int a, int b) { int minimum; minimum = b; if (a < b) minimum = a; return minimum; }
Παραδειγμα με Φωλιασμα (nested if-else) Γραψετε την συναρτηση min_three που παιρνει παραμετρους τρεις ακεραιους αριθμους και επιστρεφει τον μικροτερο.
int min_three(int a, int b, int c) { int minimum; if (a < b) if (a < c) minimum = a; else minimum = c; if (b < c) minimum = b; return minimum; }
int min_three(int a, int b, int c) { int minimum; if (a < b) minimum = a; else minimum = b; if (c < minimum) minimum = c; return minimum; }
Παραδειγμα nested if-else Γραψετε την συναρτηση detect που παιρνει μια ακεραια παραμετρο και επιστρεφει 1 εαν ειναι θετικη, 0 εαν ειναι 0 και -1 εαν ειναι αρνητικη
int detect(int number) { int code; if (number > 0) code = 1; else if (number < 0) code = -1; else /* number einai 0 */ code = 0; return code; }
int detect(int number) { int code; if (number > 0){ code = 1; } else{ if (number < 0){ code = -1; else{ /* number einai 0 */ code = 0; return code;
int detect(int number) { int code; if (number > 0) code = 1; else if (number < 0) code = -1; else /* number einai 0 */ code = 0; return code; }
Σχεσιακοί Τελεστές (Relational Operators) Δυαδικοι Τελεστες < μικρότερο από > μεγαλύτερο από <= μικρότερο ή ίσο με >= μεγαλύτερο ή ίσο με == ίσο με != διάφορο του Αποτιμουνται σε 0 (ψευδης) ή 1 (αληθης) Τυποι τελεσταιων int, char, float, double, *
Σχεσιακοί Τελεστές (Relational Operators) t = (x < y); k = (i >= 8); a = (b != b); (f == 2.3456) (‘a’ >= ‘b’) ‘a’<‘b’<..<‘z’ ‘A’<‘B’<..<‘Z’ ‘0’<‘1’<..<‘9’ d = (e <= ‘3’);
Λογικοί Τελεστές (Logical Operators) && σύζευξη, δυαδικός τελεστής (and) διάζευξη, δυαδικός τελεστής (or) ! άρνηση, μοναδιαίος τελεστής (not) Αποτιμουνται σε 0 ή 1 0 (δεν ισχυει, ψευδης ή false) 1 (ισχυει, αληθης ή true) Tυποι τελεσταιων int, char
Eκφρασεις με Λογικους και Σχεσιακους Τελεστες (πεδιο) t = (A>=0 && A<=100); y = (s<10 || s>100); !(s<10 || s>100) (i<10 && j==1)
Λογικοι Τελεστες t = (A>=0 && A<=100); t1 = (A>= 0); t = (t1 && t2);
Πίνακες Αλήθειας για && τελεστέος1 τελεστέος2 && ΔΤ0 ΔΤ0 1 ΔΤ0 0 0 0 ΔΤ0 0 0 0 0 Oταν χρειαζεται να ελεγξουμε πως ολες οι υποεκφρασεις ισχυουν, πχ (a && b)
Πίνακες Αλήθειας για || τελεστέος1 τελεστέος2 || ΔΤ0 ΔΤ0 1 ΔΤ0 0 1 0 ΔΤ0 1 0 0 0 Oταν χρειαζεται να ελεγξουμε πως τουλαχιστο μια υποεκφραση ισχυει πχ (a || b)
Πινακας Αληθειας για ! τελεστέος ! ΔΤ0 0 0 1 τελεστέος ! ΔΤ0 0 0 1 Oταν χρειαζεται να ελεγξουμε πως ισχυει το αντιθετο μιας εκφρασης πχ !(a && b)
Συμπλήρωμα Συνθηκών – Complementing Conditions Το συμπλήρωμα μίας συνθήκης είναι η άρνησή της, π.χ. Συνθήκη Συμπλήρωμα 1 0 0 1 100345 1 item == SENT !(item == SENT) ή item != SENT item > SENT item <= SENT (n % 2) == 0 (n % 2) != 0
Κανόνες DeMorgan !(E1 && E2) !E1 !E2 !(E1 E2) !E1 && !E2 !(age > 25 && (status == S status == D)) !(age > 25) || !(status == S || status == D) age <= 25 || (status != S && status != D)
Προτεραιότητες κλησεις συναρτησεων υψηλοτερη κλησεις συναρτησεων υψηλοτερη ! + & (μοναδιαίοι τελεστές) * / % + < <= >= > == != && = χαμηλότερη
Αποτίμηση Λογικών Εκφράσεων Η αποτίμηση αρχίζει από τα αριστερά και προχωρεί μέχρι το σημείο που χρειάζεται να προχωρήσει (short-circuit evaluation), π.χ. 0 && Ε 0 η αποτίμηση της έκφρασης Ε δεν χρειάζεται 1 Ε 1
Σειρά Συνθηκών σε μία Λογική Έκφραση για λόγους αποδοτικότητας σειρά των συνθηκών σε μία λογική έκφραση, π.χ. (y / x) > 2 && x != 0 Εάν x ισούται με 0, run time error (λάθος). Όμως η ακόλουθη διατύπωση δεν έχει πρόβλημα x != 0 && (y / x) > 2
Σειρά Συνθηκών σε μία Λογική Έκφραση Γενικά σε μία σύζευξη, Ε1 && Ε2, η συνθήκη Ε1 πρέπει να αποτελεί τον αριστερό τελεστέο, εάν στην περίπτωση που αποτιμείται σε 0, τυχόν αποτίμηση της Ε2 θα οδηγήσει σε πρόβλημα. Με αυτή την σειρά αποτρέπεται η αποτίμηση της Ε2. Αναλογο για διαζευξη Ε1||Ε2
Μεταφραση Εκφρασεων σε C x και y μεγαλυτερα του z x ειναι ισο με το 2.5 ή με το 10.32 a ειναι στο πεδιο απο b μεχρι και c α ειναι εξω απο το πεδιο b μεχρι και c x να ειναι μικροτερο του 0 ή μεταξυ 10 και 1000 l να ειναι english character
Μεταφραση Εκφρασεων σε C x και y μεγαλυτερα του z (x>z && y>z) x ειναι ισο με το 2.5 ή με το 10.32 (x==2.5 || x==10.32) 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) l να ειναι english character (l>=‘a’ && l<=‘z’) || (l<=‘A’ && l<=‘Z’)
Συνταξη Λογικης Εκφρασης <λογική_έκφραση> ::= <λογική_τιμή> <σχεσιακή_έκφραση> (<λογική_έκφραση>) !<λογική_έκφραση> <λογική_έκφραση>&&<λογική_έκφραση> |<λογική_έκφραση> <λογική_έκφραση> <λογική_τιμή> ::= true(ΔΤ0) false (0)
Εντολη switch switch (έκφραση_ελέγχου) { σύνολο_ετικεττών_1 εντολές_1 break; …………………….. σύνολο_ετικεττών_n εντολές_n default: εντολές_d }
Εντολη switch Η έκφραση_ελέγχου πρέπει να είναι βαθμωτού τύπου, π.χ. char ή int, αλλά όχι float ή double. εντολές_n εντολή; εντολή;…; Συνολο Ετικεττων case constant_expression: case constant_expression: ...
char letter_grade; int count_a, count_b, count_other; count_a = count_b = count_other = 0; …… switch(letter_grade){ case ‘A’: counta++; message_excelent(); break; case ‘B’: countb++; message_very_good(); case ‘C’: case ‘D’: case ‘F’: count_other++; message_other(); default: message_error(); }
Παραδειγμα Γραψε την συναρτηση convert_stream που παιρνει μια παραμετρο τυπου χαρακτηρα και επιστρεφει 0 εαν ο χαρακτηρας ειναι ασπρο διαστημα και 1 αλλιως Τι ειναι ασπρο διαστημα;
#define WHITE_SPACE 0 #define NOT_WHITE_SPACE 1 int convert_stream(char c) { int code; if (c== ‘ ’ || c==‘\n’ || c==‘\t’) code = WHITE_SPACE; else code = NOT_WHITE_SPACE; return code; } 123 3#4%^&* asdf 001110111111110011110
Παράδειγμα Γραψετε διαδικασια display_grade_message που παιρνει μια παραμετρο, τον βαθμο ενος φοιτητη μεταξυ 0 και 100, και τυπωνει τα μυνηματα: πανω απο 85 Excellent 65-84 Very Good 50-64 Good κατω απο 50 Failure
void display_grade_message(int weighted_aver) { if (weighted_aver >= 85) printf(\nExcellent); else if (weighted_aver < 85 && weighted_aver >= 65) printf(\nVery Good); else if (weighted_aver < 65 && weighted_aver > 50) printf(\nGood); else printf(\nFailure); }
Παράδειγμα Ένας χρόνος είναι δίσεχτος εάν διαιρείται ακριβώς με το 4, εκτός και εάν διαιρείται ακριβώς με το 100, στην οποία περίπτωση θα πρέπει να διαιρείται ακριβώς και με το 400.
int is_leap (int year) { int disektos; if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) disektos = 1; else disektos = 0; return disektos; }
int is_leap (int year) { return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); }
int is_leap (int year) { int disektos; if (year % 4 == 0) if (year % 100 == 0) if (year % 400 == 0) disektos = 1; else disektos = 0; return disektos; }
Διακλάδωση μόνο στη κατεύθυνση του όχι Ο πιο συνηθισμένος τρόπος φωλιάσματος επιλογών (φυσικός τρόπο έκφρασης), είναι όταν η διακλάδωση γίνεται μόνο στην κατεύθυνση του όχι. Έτσι υπάρχει μία αλυσίδα επιλογών.
int is_leap (int year) { int disektos; if (year % 4 == 0) if (year % 100 != 0) disektos = 1; else if (year % 400 == 0) else disektos = 0; else disektos = 0; return disektos; }
Κοινα Λαθη = αντι == συνθηκη χωρις παρενθεση if (x=10) if (x==10) συνθηκη χωρις παρενθεση if x>4 if (x>4) Μεταφραση απο μαθηματικα σε C, απο 0 μεχρι 4: (0 <= x <= 4) αντι (0 <= x && x<= 4)
Λαθος αντιστοιχια if-else Λαθος: if (x > 0) sum = sum + x; printf(Greater than 0); else printf(Less than 0); Ορθο: if (x > 0){ }