230 likes | 347 Views
ΗΥ- 150 Προγραμματισμός. Εντολές Ελέγχου Ροής. Σειριακή εκτέλεση εντολών. Όλα τα προγράμματα «γράφονται» χρησιμοποιώντας 3 είδη εντολών: Σειριακές εντολές ( sequential – built in C) Εντολές απόφασης ( if, if/else, switch) Εντολές επανάληψης ( for, while, do/while).
E N D
ΗΥ-150Προγραμματισμός Εντολές Ελέγχου Ροής
Σειριακή εκτέλεση εντολών • Όλα τα προγράμματα «γράφονται» χρησιμοποιώντας 3 είδη εντολών: • Σειριακές εντολές (sequential – built in C) • Εντολές απόφασης (if, if/else, switch) • Εντολές επανάληψης ( for, while, do/while)
ifβασική εντολή διακλάδωσης κάθε γλώσσας προγραμματισμού Ελέγχει τη ροή του κώδικα ανάλογα με τη (λογική) τιμή μιας συνθήκης, δηλαδή μιας ποσότητας ή έκφρασης λογικού τύπου. Στη C++ συντάσσεται ως εξής: if (condition) { ... // block A } else { ... // block B } Εάν η συνθήκη (condition) είναι αληθής ή μπορεί να μετατραπεί σε αληθή, εκτελείται το block των εντολών που περικλείεται μεταξύ των πρώτων {} (block A). Αν η συνθήκη είναι ψευδής, τότε εκτελείται το block των εντολών μετά το else (block B).
if Το κάθε block μπορεί να αποτελείται από καμμία, μία, ή περισσότερες εντολές. Στην περίπτωση που περιλαμβάνει μία μόνο εντολή μπορούν να παραληφθούν τα άγκιστρα ({}) που την περικλείουν. if (val > max) max = val; else { max = 1000.0; ++i; }
if Στην περίπτωση που το else block είναι κενό μπορεί να παραληφθεί ολόκληρο: if (condition) { ... }
if • Kάθε block μπορεί να περιλαμβάνει οποιεσδήποτε άλλες εντολές και βέβαια άλλο if. Hif (condition) {...}else{...} είναι μία εντολή. Στην περίπτωση ενός εσωκλειόμενου if , θέλει ιδιαίτερη προσοχή το επόμενο else του κώδικα. Το κάθε else ταιριάζει με το αμέσως προηγoύμενό του if στο ίδιο block. if (i == 0) if (val > max) max = val; else max = 10; Η εντολή max = 10; εκτελείται όταν to i είναι 0 και δεν ισχύει το ( val > max ) και όχι όταν δεν ισχύει το ( i == 0 ). Η χρήση των αγκίστρων επιβάλει την πρόθεση του προγραμματιστή: if (i == 0) { if (val > max) max = val; } else max = 10;
Εντολές υπό Συνθήκη - if εντολή <- έκφραση; εντολή <- { σειρά εντολών } if (έκφραση) εντολή1 if (έκφραση) εντολή1 else εντολή2 if (έκφραση1) εντολή1 else if (έκφραση2) εντολή2 else εντολή3 //Ανηέκφρασηέχειτιμήδιάφορητου 0 (!0), //εκτελείταιηεντολή 1 //Ανηέκφρασηέχειτιμήδιάφορητου 0 (!0), //εκτελείταιηεντολή 1 αλλιώςηεντολή2 //Ανηέκφραση1έχειτιμήδιάφορητου 0 (!0), //εκτελείταιηεντολή 1 //αλλιώςανηέκφραση2 έχειτιμήδιάφορητου 0 //εκτελείταιηεντολή 2 //αλλιώςεκτελείταιηεντολή 3
Παράδειγμα int main() /*Ypologismos aplwn pra3ewn*/ { char p; float x,y,res; scanf("%f %c %f",&x,&p,&y); if (p == ‘+’) { res = x+y; } else if (p == ‘-’) { res = x-y; } else if (p == ‘*’) { res = x*y; } else if (p == ‘/’); { res = x/y; } else { printf(“La8os eisodos\n”); return -1; } printf(“%f%c%f = %f\n”,x,p,y,res); return 0; }
Παραστάσεις υπό Συνθήκη - ? Ο τελεστής ( ?: ) είναι ένας ιδιαίτερα διαδεδομένος ιδιωματισμός της C++. Η εντολή if (condition) val = value1; else val = value2; ισοδυναμεί με val = (condition ? value1 : value2); Γενικότερα, η έκφραση (condition ? έκφρασηΑ : έκφρασηΒ) έχει την τιμή “έκφρασηΑ” όταν η συνθήκη condition είναι αληθής, ενώ έχει την τιμή “έκφρασηΒ” όταν η συνθήκη είναι ψευδής.
Παραστάσεις υπό Συνθήκη - ? Οι παρενθέσεις που περιβάλουν τον τελεστή ( ?: ) με τα ορίσματά του στο συγκεκριμένο παράδειγμα δεν είναι απαραίτητες, βοηθούν όμως στην κατανόηση του κώδικα. Καθώς για το συγκεκριμένο τελεστή δεν μπορεί να καθοριστεί μονοσήμαντα η προτεραιότητά του σε σχέση με τον ( = ) πρέπει να τις χρησιμοποιούμε για να εκτελείται η επιδιωκόμενη πράξη. Εναλλακτικά, μπορούμε να εφαρμόζουμε τον εξής κανόνα: Οι τελεστές ( ?: ) και ( = ) έχουν ίδια προτεραιότητα, δεχόμενοι ότι οι πράξεις εκτελούνται από τα δεξιά προς τα αριστερά. Επομένως, η έκφραση • a = b ? c : d ισοδυναμεί με a = (b ? c : d), • ενώ η έκφραση a ? b : c = d εκτελείται ως a ? b : (c = d)
Παραστάσεις υπό Συνθήκη - ? if (x > y) { x = a; } else { x = b; } x = (x>y) ? a : b;
Εντολές υπό Συνθήκη - switch switch (έκφραση) { case σταθερή_παράσταση_1 : statements; break; case σταθερή_παράσταση_2 : statements; break; default : statements; } • Το default είναι προαιρετικό και εκτελείται αν καμία παράσταση δεν βρεθεί ίση με την έκφραση • Αν ένα break λείπει τότε συνεχίζεται η εκτέλεση των εντολών
Εντολές υπό Συνθήκη - switch • Η τιμή ελέγχου i πρέπει να είναι ακέραιου τύπου (char , int , shortint, longint) με τις signed και unsigned παραλλαγές τους. Η τιμή μπορεί να προέρχεται από μεταβλητή ή να είναι η τιμή συνάρτησης που επιστρέφει τέτοιο τύπο ή κάποια μεταβλητή. Οι τιμές value1, value2,..., valueN είναι σταθερές ακέραιου τύπου και διακριτές μεταξύ τους. • Κατά την εκτέλεση, η τιμή ελέγχου i συγκρίνεται με κάθε μία από τις value1, value2,...,valueN. Αν η τιμή της περιλαμβάνεται σε αυτές, τότε εκτελούνται οι εντολές που ακολουθούν το αντίστοιχο case . Η εκτέλεση συνεχίζει με τις εντολές των επόμενων case ή/και του default αν έπεται, έως ότου διακοπεί με break (ή τυχόν π.χ. goto, return). • Μετά το break η εκτέλεση συνεχίζει με την πρώτη εντολή μετά το καταληκτικό άγκιστρο της δομής switch. • Αν δεν βρεθεί η τιμή της στις value1, value2,...,valueN εκτελείται το block των εντολών του default , αν υπάρχει. Αλλιώς, η εκτέλεση συνεχίζει μετά το } του switch . • Οι σχετικές θέσεις των case και του default μπορούν να είναι οποιεσδήποτε.
Παράδειγμα με switch #include <stdio.h> /*Ypologismos aplwn pra3ewn*/ int main() { char p; float x,y,res; scanf("%f %c %f",&x,&p,&y); switch (p) { case ‘+’ : res = x+y; break; case ‘-’ : res = x-y; break; case ‘*’ : res = x*y; break; case ‘/’ : res = x/y; break; default : printf(“La8os eisodos\n”); } printf(“%f%c%f = %f\n”,x,c,y,res); return 0; }
Τυπικά Λάθη • if(x=5) αντί για if(x==5) • Ξεχάσατε το break σε εντολή switch • Ξεχάσατε {, } • Λάθος στις προτεραιότητες: ( ) • Λύση: Μορφοποίησηκαι χρήση σχολίων
Μορφοποίηση • Σχόλια πριν από συναρτήσεις και τους ορισμούς μεταβλητών • Κατάλληλη χρήση tabs, παρενθέσεων και αγκυλών • Κατάλληλη ονοματολογία συναρτήσεων - μεταβλητών /*Epistrefei ton endiameso ari8mo twn a,b,c*/ int getMedian(int a,int b, int c) { int median; /*Endiamesos*/ if ((a <= b) && (a >= c)) || ((a >= b) && (a <= c)) { median = a; } else if ((b <= a) && (b >= c)) || ((b >= a) && (b <= c)) { median = b; } else { median = c; } return median; }
Define – Const – Include #define <macro> <replacement name> #define FALSE 0 #define TRUE !FALSE #define N 1000 /*ΠΡΟΣΟΧΗ!! – ΔΕΝ ΜΠΟΡΩ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΩ ΤΟ Ν ΩΣ ΜΕΤΑΒΛΗΤΗ*/ #define Pi 3.14159 • Ορίζεται στην αρχή κάθε προγράμματος και μπορεί να χρησιμοποιηθεί σε όλο το πρόγραμμα. • To Pi θα αντικατασταθεί από τον 3.14159 στο πρώτο βήμα του compilation (preprocessing) int const a = 1; • ορίζει μια σταθερά – δεν μπορεί να αλλάξει τιμή #include <file> #include <stdio.h> #include “file”
#include <stdio.h> #include <math.h> float diakrinousa(float,float , float ); int printSolution2ba8mou(float a, float b, float c); int main() { float a,b,c; printf(“Dwste 3 pragmatikous ari8mous \n”); scanf(“%f %f %f”,&a,&b,&c); printf("Dw8hke to poluwnumo: %f x^2 + (%f) x + (%f) \n",a,b,c); if (a == 0) printf(“H e3iswsh einai prwtou ba8mou\n”); else printSolution2ba8mou(a, b, c); } /*Υπολογίζει τη διακρίνουσα */ float diakrinousa(float a,float b, float c) { float D = b*b – 4*a*c; return D; } /*Εκτυπώνει τις λύσεις */ int printSolution2ba8mou(float a, float b, float c) { float D = diakrinousa( a, b, c); float x1,x2; if (D < 0) { printf(“Den uparxoun pragmatikes luseis.\n”); return 0; } else if (D == 0) { x1 = -b/(2*a); printf(“Yparxei monadikh lush %f\n”,x1); return 1; } else { x1 = (-b+sqrt(D))/(2*a); x2 = (-b-sqrt(D))/(2*a); printf(“Yparxoun 2 luseis :%f, %f\n”,x1,x2); return 2; } }
putchar() / putchar() #include <stdio.h> main() { int c; c = getchar(); putchar(c); }
getchar() /* char_count.c A program to count characters of input. */ main() { int c ; int count = 0; while ( ( c = getchar() ) != EOF ) count ++ ; printf( "%d characters\n" , count ) ; }
getchar() /* letter_count.c A program to count letters in input. */ main() { int c ; int count = 0; while ( ( c = getchar() ) != EOF ) if ( ( c >= 'A' ) && ( c <= 'Z' ) || ( c >= 'a' ) && ( c <= 'z' ) ) count ++ ; printf( "%d letters\n" , count ) ; }