ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα 4: Έλεγχος ροής Κουκουλέτσος Κώστας Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστικών Συστημάτων
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σκοποί ενότητας Oι διδακτικοί σκοποί της ενότητας είναι Να εξοικειωθούν με την χρήση των εντολών αλλαγής ροής του προγράμματος Να γνωρίσουν την χρήση λογικών τελεστών στις εντολές αλλαγής ροής Να κατανοήσουν την χρήση ένθετων εντολών if για την υλοποίηση σύνθετων αποφάσεων Να μάθουν την χρήση της εντολής switch σαν μία άλλη τεχνική επιλογής μεταξύ εναλλακτικών καταστάσεων
Περιεχόμενα ενότητας (1/2) Εντολή if Απλή πρόταση if-παραδείγματα -Πρόγραμμα Παρατηρήσεις στην λογική παράσταση Εντολή if else - Παράδειγμα Ένθετη εντολή if..else (nested if) Άσκηση: Χαρακτηρισμός βαθμού Χρήση Λογικών τελεστών- Παράδειγμα
Περιεχόμενα ενότητας (2/2) Άσκηση Χαρακτηρισμός βαθμού-επίλυση Ένθετη εντολή if else (nested if) - Εναλλακτική παρουσίαση (else if ) Παράδειγμα - Χαρακτηρισμός βαθμού Άσκηση - Επίλυση Αντιστοίχιση else με if Συχνά Λάθη στις εντολές if Άσκηση (Χαρακτηρισμός προσώπου με bmi) Εντολή switch Εντολή switch- Παραδείγματα - Ασκήσεις
Εντολή if Με την εντολή αυτή γίνεται έλεγχος (αλλαγή) της ροής του προγράμματος H εντολή παρουσιάζεται με τρείς μορφές 1) Απλή πρόταση if 2) Πρόταση if else 3) Πρόκειται για εντολές if που περικλείονται σε άλλες εντολές if else
Απλή πρόταση if Σύνταξη» if (πρόταση)» Block εντολών Το Block εντολών είναι εντολές που περικλείονται σε { } Η πρόταση συνήθως είναι μία λογική παράσταση δηλαδή η πιο συνήθης μορφή είναι» if (λογική παράσταση)» Block εντολών
Απλή πρόταση if-παραδείγματα Παράδειγμα 1» int a=5;» if (a==5) {» a=2*a;» printf("%d\n", a);» } (1/2)
Απλή πρόταση if-παραδείγματα (2/2) Παράδειγμα 2» int num ;» printf ( Dose arithmo <10 " ) ;» scanf ( "%d", &num ) ;» if ( num <= 10 ) {» printf ( To tetragono tou arithmou einai );» printf( %d,num*num);» } Σε περίπτωση μίας εντολής δεν χρειάζονται { }» if (a==5)» printf( %d, a);
Πρόγραμμα με εντολή if» int main(void)» {» int number = 0;» printf("\ndose megalitero apo 10 ");» scanf("%d",&number);»» if(number > 10)» printf("edoses ton %d pou einai >10\n", number);»» if(number <= 10)» printf("edoses ton %d pou einai <=10\n", number);»» return 0;» }
Παρατηρήσεις στην λογική Η γενική μορφή της if είναι:» if (πρόταση)» Block εντολών Παράδειγμα» if ( a = 10 ) //true παράσταση» printf ( "to programma trexei " ) ;» if (-5 ) //true» printf ( "to programma trexei " ) ;» if (3.5 ) //true» printf ( "to programma trexei " ) ;
Εντολή if else (1/2) Σύνταξη if (λογική παράσταση) Block εντολών1 else Block εντολών2
Εντολή if else (2/2) Παράδειγμα 1» if (a==5) {» a=2*a;» printf( %d, a);» }» else{» b=a;» printf( %d %d, a, b);» }
Παράδειγμα if else (1/2) To παράδειγμα που είδαμε προηγουμένως με χρήση if else
Παράδειγμα if else (2/2)» int main(void){»» int number = 0;» printf("\ndose megalitero apo 10 ");» scanf("%d",&number);»» if(number > 10)» printf("edoses ton %d pou einai >10\n", number);» else» printf("edoses ton %d pou einai <=10\n", number);» return 0;» }
Ένθετη εντολή if..else (nested if) Πρόκειται για εντολές if που περικλείονται σε άλλες εντολές if else Παράδειγμα (χαρακτηρισμός αριθμού)
Άσκηση: Χαρακτηρισμός βαθμού Να εισάγεται ο βαθμός ενός σπουδαστή και να χαρακτηρίζεται ο σπουδαστής με άριστα, λίαν καλώς, καλώς και αποτυχία ανάλογα με τον βαθμό του
Άσκηση Χαρακτηρισμός βαθμού- Επίλυση» float vathmos;» printf("dose ton vathmo");» scanf("%f", &vathmos);» if (vathmos <5)» printf("apotixia\n");» else» {» if(vathmos >= 6.5)» if (vathmos >= 8.5 )» printf("arista\n");» else» {» if (vathmos < 6.5)» printf("kalos\n");» else» printf( "Lian kalos\n");» }» } Πολλές εσοχές Πρέπει κάθε if να αντιστοιχεί σε else Πρέπει να αντιστοιχηθούν οι αγκύλες
Χρήση Λογικών τελεστών (1/2) Οι 3 λογικοί τελεστές που μπορούν να χρησιμοποιηθούν είναι && λογικό AND λογικό OR! Λογικό ΝΟΤ Οι λογικοί τελεστές && και επιτρέπουν συνδυασμό συνθηκών και μπορούν να κάνουν το πρόγραμμα πιο κατανοητό.
Χρήση Λογικών τελεστών (2/2) Εάν θέλω να εισάγω αριθμό εντός ορίων πχ 10<num<100 τότε πρέπει» (10<num && num<100) Εάν θέλω να εισάγω αριθμό εκτός ορίων πχ να μην είναι μεταξύ 10 και 100 τότε»!(10<num && num<100) Η ανωτέρω παράσταση μπορεί να γραφεί και (νόμος De Morgan)» (10>=num num >=100)» (num<=10 num >=100
Παράδειγμα (1/2) Απαίτηση» printf("\ndose num megalitero apo 10 kai mikrotero 100 ");» scanf("%d",&num); Υλοποίηση» if(num > 10 && num<100)» printf("edoses ton %d pou einai apodektos\n", num);
Παράδειγμα (2/2) Απαίτηση» printf("\ndose num ektos apo perioxi 10 eos 100 ");» scanf("%d",&num); Υλοποίηση» if(!(num > 10 && num<100))» printf("edoses ton %d pou einai apodektos\n", num);» if(num <= 10 num>=100)» printf("edoses ton %d pou einai apodektos\n", num);
Άσκηση Χαρακτηρισμός βαθμού-επίλυση Tο Παράδειγμα της βαθμολογίας με χρήση απλού if και λογικούς τελεστές» float vathmos;» printf("dose ton vathmo");» scanf("%f", &vathmos);»» if (vathmos <5)» printf("apotixia\n");»» if(vathmos >= 6.5 && vathmos < 8.5)» printf( "Lian kalos\n");»» if (vathmos >=5.0 && vathmos < 6.5)» printf("kalos\n");»» if (vathmos >= 8.5 )» printf("arista\n"); Μείωση εσοχών Δεν έχω προβλήματα αντιστοίχισης
Ένθετη εντολή if else (nested if) Εναλλακτική παρουσίαση (else if ) (1/2) H στοίχιση του παραδείγματος μπορεί να διαφοροποιηθεί» if (x > 0) printf("thetikos\n");» else» if (x < 0) printf("arnitikos\n");» else printf( "Miden\n"); Μπορεί να γραφεί» if (x > 0) printf("thetikos\n");» else if (x < 0) printf("arnitikos\n");» else» printf( "Miden\n");
Ένθετη εντολή if else (nested if) Εναλλακτική παρουσίαση (else if ) (2/2)» if (λογική παράσταση1)» Block εντολών1» else if (λογική παράσταση2)» Block εντολών2» else if (λογική παράσταση3)» Block εντολών3» else if (λογική παράσταση4)» Block εντολών4»..» else» Block εντολώνν» υπόλοιπο πρόγραμμα Γίνεται έλεγχος για πολλαπλές περιπτώσεις παραθέτοντας μία if/else μέσα σε μία άλλη if/else Μόλις μία από τις συνθήκες (λογική παράσταση) βρεθεί ότι είναι αλήθεια εκτελείται το block που αντιστοιχεί σε αυτή την συνθήκη και όλες οι άλλες εντολές δεν εκτελούνται (παραλείπονται)
Παράδειγμα - Χαρακτηρισμός βαθμού (1/2) Tο Παράδειγμα της βαθμολογίας με χρήση απλού if και λογικούς τελεστές»» float vathmos;» printf("dose ton vathmo");» scanf("%f", &vathmos);»
Παράδειγμα - Χαρακτηρισμός βαθμού (2/2)» if (vathmos <5 && vathmos>=0)» printf("apotixia\n");» else if(vathmos >= 6.5 && vathmos < 8.5)» printf( "Lian kalos\n");» else if (vathmos >=5.0 && vathmos < 6.5)» printf("kalos\n");» else if (vathmos >= 8.5 && vathmos <=10 )» printf("arista\n");» else» printf("lathos vathmos\n"); Μείωση εσοχών Δεν έχω προβλήματα αντιστοίχισης Eχω προσθέσει όλες τις περιπτώσεις
Άσκηση Οι λογικοί τελεστές βρίσκουν εφαρμογή στην παρακάτω άσκηση
» Άσκηση- Επίλυση (1/2)
» Άσκηση- Επίλυση (2/2)
Αντιστοίχιση else με if (1/3) Στις ένθετες εντολές if else προκύπτει πρόβλημα αντιστοίχισης μίας εντολής else με το if. O κανόνες που ισχύει είναι ότι μίας εντολή else αντιστοιχεί στην αμέσως προηγούμενη εντολή if που δεν έχει κάποια άλλη εντολή else Επομένως η στοίχιση που γίνεται στις ένθετες εντολές if δεν καθορίζει την σχέση μεταξύ εντολών if else αλλά ο καθορισμός γίνεται από τον παραπάνω κανόνα. Καλό είναι η στοίχιση να γίνεται ώστε εύκολα να φαίνεται ποια εντολή if αντιστοιχεί σε εντολή else. H χρήση αγκίστρων διευκολύνει την αντιστοίχιση στην περίπτωση που η ένθετη δομή γίνεται πολύπλοκη
Αντιστοίχιση else με if (2/3) Το else αντιστοιχεί στο τελευταίο if που δεν έχει δικό του else. a=9, b=3; a=9, b=7; a=2, b=3; a=2, b=7;
Αντιστοίχιση else με if (3/3) a=9, b=3; a=9, b=7; a=2, b=3; a=2, b=7; Το else αντιστοιχεί στο τελευταίο if που δεν έχει δικό του else.
Συχνά Λάθη στις εντολές if Λάθος 1» int i ;» printf ( "Dose timi gia to i " ) ;» scanf ( "%d", &i ) ;» if ( i = 5 )» printf ( "Edoses to 5" ) ;» else» printf ( "Edoses diaforo tou 5" ) ;»
Συχνά Λάθη στις εντολές if Λάθος 2» int i ;» printf ( "Dose timi gia to i " ) ;» scanf ( "%d", &i ) ;» if ( i == 5 ) ;» printf ( "Edoses to 5" ) ;»»
Συχνά Λάθη στις εντολές if Λάθος 3» int x ;» printf ( "Dose timi gia to x " ) ;» scanf ( "%d", &x ) ;»» if (x > 0)» printf("o arithmos %d einai >0\n",x);» printf("greater than zero\n");» else» printf("less than or equal to zero\n");»» return 0; Το πρόγραμμα βγάζει λάθος else without a previous if
Άσκηση (Χαρακτηρισμός ατόμου με bmi)
Άσκηση- Επίλυση (1/2)
Άσκηση- Επίλυση (2/2)»
Εντολή switch Χρησιμοποιείται για πολλαπλή επιλογή αντί της εντολής if..elseif..else if else Η παράσταση πρέπει να εκτιμάται σαν ακεραία Η τιμη1, τιμή2 είναι σταθερές συνήθως ακέραιοι αριθμοί ή χαρακτήρες (όχι πραγματικοί ή strings )» switch (παράσταση)» {case τιμή1:» Block εντολών1» break;» case τιμή2:» Block εντολών2» break;» case τιμή3:» Block εντολών3» break;»..»» default» Block εντολώνν }
Εντολή switch- Παράδειγμα 1
Εντολή switch Παράδειγμα 2 - αριθμομηχανή (1/2) break προκαλεί το τέλος της switch και το πρόγραμμα συνεχίζει με την πρώτη εντολή μετά την δομή switch. Αν δεν μπεί το break συνεχίζεται η εκτέλεση και των άλλων εντολών ακόμη και αυτών που ανήκουν σε άλλες case Προσοχή στις δύο case. Εδώ τα δύο case έχουν κοινό block επειδή δεν υπάρχει break οπότε αυτό το εκτελείται αν η παράσταση op είναι ίσον με * ή ίσο με x
Εντολή switch Παράδειγμα 2 - αριθμομηχανή (2/2) Προσοχή αν αφαιρέσω τα break Τότε αφού βρεθεί η case που ισχύει εκτελούνται και οι εντολές που ανήκουν στα επόμενα case
Εντολή switch Παράδειγμα 3 (εποχές)
if else if αντί για switch Παράδειγμα 3 (εποχές)
Τέλος Ενότητας