Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 3 Εντολές Επιλογής Γιώργος Λαμπρινίδης 1
Ασκησεις Εργατηρίου 2 30/10/2015 2
/* File: pososto.c */ #include <stdio.h> main() {double timi, pososto, teliki; printf("dwse tin Arxikh Timh tou proiontos\n"); scanf("%lf", &timi); printf("dwse to pososto ekptwsis %\n"); scanf("%lf", &pososto); teliki = timi + (timi*pososto)/100; printf("h teliki timi einai %lf",teliki); getchar(); getchar(); }
/* File: antallagi.c */ #include <stdio.h> main() {double a, b, interchange; printf("dwse ton Atirhmo A\n"); scanf("%lf", &a); printf("dwse ton arithmo B\n"); scanf("%lf", &b); interchange=a; a=b; b=interchange; printf("a = %lf kai B = %lf",a,b); getchar(); getchar(); } 4
* File: moriako_baros.c */ #include <stdio.h> main() {int c, h, o, n, MW; printf("ypologismos Moriakou Barous Enwsh me Xhmiko Typo CxHyOzNw"); printf("dwse ton Arirhmo Atomwn C\n"); scanf("%d", &c); printf("dwse ton Arithmo Atomwn H\n"); scanf("%d", &h); printf("dwse ton Atirhmo Atomwn O\n"); scanf("%d", &o); printf("dwse ton Arithmo Atomwn N\n"); scanf("%d", &n); MW=c*12+h*1+o*16+n*14; printf("to Moriako Baros tiw Enwseis C%dH%dO%dN%d einai %d\n",c,h,o,n,mw); getchar(); getchar(); } 5
Εντολές Επιλογής l Σε κάθε γλώσσα προγραμματισμού υπάρχουν εντολές που επηρεάζουν τη ροή ελέγχου στα προγράμματα l Οι κυριότερες είναι οι if, switch, while, for l Στις εντολές αυτές είναι πολύ συχνή η χρήση ενός μπλοκ εντολών. Ένα μπλοκ εντολών αποτελείται από εντολές που είναι κλεισμένες μέσα σε άγκιστρα ({ και }). Αν σε ένα μπλοκ εντολών περιέχεται μια μόνο εντολή, αυτή δεν είναι απαραίτητο να περικλείεται μέσα σε άγκιστρα 6
Η εντολή επιλογής if l Η εντολή επιλογής if είναι: if (<παράσταση>) <μπλοκ επιλογών1> επόμενη επιλογή l Αν η <παράσταση> είναι αληθής (έχει τιμή διάφορη από το μηδέν), θα εκτελεστεί το <μπλοκ εντολών1> και μετά η επόμενη εντολή l Αν η <παράσταση> είναι ψευδής δε θα εκτελεστεί το <μπλοκ εντολών1> αλλά θα εκτελεστεί απευθείας η επόμενη εντολή 7
Λογικό διάγραμμα της εντολής επιλογής if 8
Η εντολή επιλογής if else l Η σύνταξη της εντολής if else είναι: if (<παράσταση>) else <μπλοκ εντολων1> <μπλοκ εντολών2> l Αν η <παράσταση> είναι αληθής (έχει τιμή διάφορη από το μηδεν), θα εκτελεσθεί το <μπλοκ εντολών1>, αλλιώς το <μπλοκ εντολών2> 9
Λογικό διάγραμμα της εντολής if else 10
Η εντολή επιλογής if else l Όπως είδαμε, το τμήμα από το else και μετά είναι προαιρετικό. Η προαιρετικότητα του else μπορεί να προκαλέσει προβλήματα στην αναγνωσιμότητα προγραμμάτων με εμφωλευμένες εντολές if, αν δεν υπάρχει σαφής ομαδοποίηση με άγκιστρα, Αν δεν υπάρχουν άγκιστρα που να επιβάλλουν συγκεκριμένη δομή κάθε else αντιστοιχεί στην αμέσως προηγούμενη if που δεν έχει else 11
Η εντολή επιλογής if else Παράδειγμα 1 l l Η ενέργεια «αν x > 0, τότε y = y x» σε C γράφεται if ( x > 0 ) y = y x; Η ενέργεια «αν b 2 4ac 0, τότε d = b 2 4ac» σε C γράφεται if (b * b 4 * a * c >= 0) d = b * b 4 * a * c; 12
Η εντολή επιλογής if else Πιο σύνθετες έννοιες (1) l l Τι ακριβώς σημαίνει το παρακάτω; if (n > 0) else if (a > b) z = a; z = b; Προσοχή! Ο μεταγλωττιστής δεν ασχολείται με τη στοίχιση. 13
Η εντολή επιλογής if else Πιο σύνθετες έννοιες (2) l Τι ακριβώς σημαίνει το παρακάτω; if (n > 0) { } if (a > b) z = a; else z = b; 14
Η εντολή επιλογής if else Πιο σύνθετες έννοιες (3) l Αν θέλαμε το else να αντιστοιχεί στο πρώτο if, έπρεπε να το γράψουμε έτσι: if (n > 0) { } if (a > b) else z = b; z = a; 15
Η εντολή επιλογής if else Ένα πιο σύνθετο παράδειγμα l If (x > 0) { sign = 1; } prinj( Number is posiqve\n ); else if (x < 0){ } sign = -1; prinj( Number is negaqve\n ); else { sign = 0; } prinj( Number is zero\n ); 16
Ευρεση Ημερομηνίας Πασχα /* File: easter.c */ #include <stdio.h> main() { int year, a, b, c, d, e; prinj("dwse qn xronia poy theleis to Pasxa:"); scanf("%d", &year); a = year % 19; b = year % 4; /* Gauss method for Easter date computaqon */ c = year % 7; d = (19*a+15) % 30; e = (2*b+4*c+6*d+6) % 7; prinj("to Pasxa th Xronia %d einai: ", year); if (d+e+4 > 30) prinj(" May %d\n", d+e-26); else prinj("april %d\n", d+e+4); getchar(); getchar(); } 17
Πρόβλημα l Γράψτε ένα πρόγραμμα σε C που να διαβάζει δύο πραγματικούς αριθμούς από το πληκτρολόγιο, να βρίσκει ποιος από τους δύο είναι μεγαλύτερος, και να τον εκτυπώνει στην οθόνη. Στη συνέχεια να κάνετε το ίδιο για τρεις αριθμούς. 18
Η εντολή επιλογής switch (1) l Η σύνταξη επιλογής switch είναι: switch (<παράσταση>) { case <σταθερά1>: <εντολές1> case <σταθέρα2>: <εντολές2>... default: <εντολές> } 19
Η εντολή επιλογής switch (2) l Η <παράσταση> πρέπει να είναι ακέραια. Υπολογίζεται η τιμή της. l Κάθε <σταθεράi> πρέπει να είναι ακέραια σταθερά και δεν πρέπει να υπάρχουν δύο case με την ίδια σταθερά l Αν η τιμή που έχει η <παράσταση> ισούται με κάποια <σταθεράi>, τότε ο έλεγχος μεταφέρεται στις <εντολέςi>. Αν όχι, ο έλεγχος μεταφέρεται στις <εντολές> (μετά το default) 20
Η εντολες επιλογής switch (3) l l Οι <εντολέςi> (και <εντολές>) δεν είναι απαραίτητο να συνιστούν μπλοκ εντολών, δηλαδή να είναι κλεισμένες μέσα σε { και } Η περίπτωση default είναι προαιρετική. Αν δεν υπάρχει και δεν ταιριάζει καμία case, o έλεγχος μεταφέρεται μετά την εντολή switch 21
Η εντολή επιλογής switch Χρήση του break l Μετά την εκτέλεση των εντολών σε μια case, ο έλεγχος μεταφέρεται στις εντολές της επόμενης case, εκτός αν τελευταία εντολή της προηγούμενης case είναι η break l Η break έχει ως αποτέλεσμα ο έλεγχος του προγράμματος να μεταφερθεί στο τέλος της switch case. Δηλαδή, δεν εκτελείται καμία εντολή εντός του switch case που ακολουθεί το break που καλείται l Η break χρησιμοποιείται ευρύτερα και όχι μόνο εντός της switch case 22
Η εντολή επιλογής switch Παράδειγμα l } switch (x){ case 1: prinj( one\n ); case 2: break; case 3: prinj( two or three\n ); break; case 4: prinj( four\n ); break; default: prinj( other\n ); break; 23
Πρόβλημα l Γράψτε ένα πρόγραμμα σε C που να διαβάζει από το πληκτρολόγιο έναν ακέραιο αριθμό με τιμές από το 1 εώς το 7. Στη συνέχεια, χρησιμοποιώντας τη δομή switch case να εκτυπώνει στην οθόνη την ημέρα που αντιστοιχεί στον αριθμό που δόθηκε. (π.χ. για είσοδο 1 να εκτυπώνει Δευτέρα, για είσοδο 7 να εκτυπώνει Κυριακή). Σε περίπτωση που ο χρήστης εισήγαγε αριθμό που δεν ανήκει στο διάστημα 1 εώς 7 να εκτυπώνει σχετικό μήνυμα λάθους. 24
Λύση (1) #include <stdio.h> int main(){ /* Declare variables */ int day; /* Get day of the week */ prinj("enter a day of the week as a number (acceptable values are from 1 to 7):\n"); scanf("%d",&day); /* Find day of the week */ switch(day) { case 1: prinj("the day is MONDAY.\n"); break; case 2: prinj("the day is TUESDAY.\n"); break; 25
Λύση (2) case 3: prinj("the day is WEDNESDAY.\n"); break; case 4: prinj("the day is THURSDAY.\n"); break; case 5: prinj("the day is FRIDAY.\n"); break; case 6: prinj("the day is SATURDAY.\n"); break; case 7: prinj("the day is SUNDAY.\n"); break; default: prinj("you gave WRONG INPUT!.\n"); break; } getchar() } 26
Ασκήσεις 1. Να διαβαστούν δύο ακέραιοι αριθμοί και να υπολογισθεί η απόλυτη τιμή της διαφοράς τους. 2. Να διαβαστούν οι συντελεστές α, β και γ ενός τριωνύμου και να υπολογιστούν οι ρίζες του. 3. Να διαβαστούν τρεις αριθμοί και να ταξινομηθούν κατά φθίνουσα σειρά. 4. Να διαβαστεί ένας λατινικός χαρακτήρας και να εμφανιστεί ο χαρακτήρας αυτός σε Upper Case (κεφαλαία) αν είναι φωνήεν. Σε διαφορετική περίπτωση να εμφανιστεί το μήνυμα Character is not a vowel (Τα φωνήεντα είναι οι χαρακτήρες a,e,i,o,u,y). Να λυθεί με την εντολή switch 27