Download - ΗΥ- 150 Προγραμματισμός

Transcript
Page 1: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης

ΗΥ-150Προγραμματισμός

Εντολές Ελέγχου Ροής

Page 2: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης2

Σειριακή εκτέλεση εντολών

Όλα τα προγράμματα «γράφονται» χρησιμοποιώντας 3 είδη εντολών:– Σειριακές εντολές (sequential – built in C)– Εντολές απόφασης (if, if/else, switch)– Εντολές επανάληψης ( for, while, do/while)

Page 3: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης3

if βασική εντολή διακλάδωσης κάθε γλώσσας

προγραμματισμού Ελέγχει τη ροή του κώδικα ανάλογα με τη (λογική) τιμή

μιας συνθήκης, δηλαδή μιας ποσότητας ή έκφρασης λογικού τύπου. Στη C++ συντάσσεται ως εξής:

if (condition) { ... // block A } else { ... // block B

} Εάν η συνθήκη (condition) είναι αληθής ή μπορεί να

μετατραπεί σε αληθή, εκτελείται το block των εντολών που περικλείεται μεταξύ των πρώτων {} (block A). Αν η συνθήκη είναι ψευδής, τότε εκτελείται το block των εντολών μετά το else (block B).

Page 4: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης4

if

Το κάθε block μπορεί να αποτελείται από καμμία, μία, ή περισσότερες εντολές. Στην περίπτωση που περιλαμβάνει μία μόνο εντολή μπορούν να παραληφθούν τα άγκιστρα ({}) που την περικλείουν.

if (val > max) max = val;

else { max = 1000.0; ++i;

}

Page 5: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης5

if

Στην περίπτωση που το else block είναι κενό μπορεί να παραληφθεί ολόκληρο:

if (condition) { ...

}

Page 6: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης6

if Kάθε block μπορεί να περιλαμβάνει οποιεσδήποτε άλλες εντολές και

βέβαια άλλο if. H if (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;

Page 7: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης7

Εντολές υπό Συνθήκη - ifεντολή <- έκφραση;εντολή <- { σειρά εντολών }

if (έκφραση) εντολή1

if (έκφραση)εντολή1

else εντολή2

if (έκφραση1) εντολή1

else if (έκφραση2) εντολή2

elseεντολή3

//Αν η έκφραση έχει τιμή διάφορη του 0 (!0), //εκτελείται η εντολή 1 αλλιώς η εντολή2

//Αν η έκφραση έχει τιμή διάφορη του 0 (!0), //εκτελείται η εντολή 1

//Αν η έκφραση1 έχει τιμή διάφορη του 0 (!0), //εκτελείται η εντολή 1 //αλλιώς αν η έκφραση2 έχει τιμή διάφορη του 0 //εκτελείται η εντολή 2//αλλιώς εκτελείται η εντολή 3

Page 8: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης8

Παράδειγμα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;

}

Page 9: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης9

Παραστάσεις υπό Συνθήκη - ?

Ο τελεστής ( ?: ) είναι ένας ιδιαίτερα διαδεδομένος ιδιωματισμός της C++. Η εντολή

if (condition) val = value1;

else val = value2;

ισοδυναμεί με val = (condition ? value1 : value2); Γενικότερα, η έκφραση

(condition ? έκφρασηΑ : έκφρασηΒ) έχει την τιμή “έκφρασηΑ” όταν η συνθήκη

condition είναι αληθής, ενώ έχει την τιμή “έκφρασηΒ” όταν η συνθήκη είναι ψευδής.

Page 10: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης10

Παραστάσεις υπό Συνθήκη - ?

Οι παρενθέσεις που περιβάλουν τον τελεστή ( ?: ) με τα ορίσματά του στο συγκεκριμένο παράδειγμα δεν είναι απαραίτητες, βοηθούν όμως στην κατανόηση του κώδικα.

Καθώς για το συγκεκριμένο τελεστή δεν μπορεί να καθοριστεί μονοσήμαντα η προτεραιότητά του σε σχέση με τον ( = ) πρέπει να τις χρησιμοποιούμε για να εκτελείται η επιδιωκόμενη πράξη.

Εναλλακτικά, μπορούμε να εφαρμόζουμε τον εξής κανόνα: Οι τελεστές ( ?: ) και ( = ) έχουν ίδια προτεραιότητα, δεχόμενοι ότι οι πράξεις εκτελούνται από τα δεξιά προς τα αριστερά. Επομένως, η έκφραση

a = b ? c : d ισοδυναμεί με a = (b ? c : d), ενώ η έκφραση a ? b : c = d εκτελείται ως a ? b : (c =

d)

Page 11: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης11

Παραστάσεις υπό Συνθήκη - ?

if ( x > y)

{

x = a;

}

else

{

x = b;

}

x = (x>y) ? a : b;

Page 12: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης12

printf(“%d\n”,(x>y?a:b));

Page 13: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης13

Εντολές υπό Συνθήκη - switch

switch (έκφραση){

case σταθερή_παράσταση_1 : statements; break;

case σταθερή_παράσταση_2 : statements;break;

default : statements;}

Το default είναι προαιρετικό και εκτελείται αν καμία παράσταση δεν βρεθεί ίση με την έκφραση

Αν ένα break λείπει τότε συνεχίζεται η εκτέλεση των εντολών

Page 14: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης14

Εντολές υπό Συνθήκη - switch Η τιμή ελέγχου i πρέπει να είναι ακέραιου τύπου (char , int ,

short int, long int) με τις 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 μπορούν να είναι οποιεσδήποτε.

Page 15: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης15

Παράδειγμα με 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;

}

Page 16: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης16

Τυπικά Λάθη

if(x=5) αντί για if(x==5)

Ξεχάσατε το break σε εντολή switch

Ξεχάσατε {, }

Λάθος στις προτεραιότητες: ( )

Λύση: Μορφοποίηση και χρήση σχολίων

Page 17: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης17

Μορφοποίηση Σχόλια πριν από συναρτήσεις και τους ορισμούς μεταβλητών Κατάλληλη χρήση 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;}

Page 18: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης18

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”

Page 19: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης19

#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;}

}

Page 20: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης

Είσοδος / Έξοδος χαρακτήρων

Page 21: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης21

putchar() / putchar()

#include <stdio.h> main() {

int c;

c = getchar();

putchar(c); }

Page 22: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης22

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 ) ; }

Page 23: ΗΥ- 150 Προγραμματισμός

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης23

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 ) ;

}