Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ-3122/106 Γλώσσα Προγραμματισμού Εντολές Ελέγχου Ροής.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ-3122/106 Γλώσσα Προγραμματισμού Εντολές Ελέγχου Ροής."— Μεταγράφημα παρουσίασης:

1 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ-3122/106 Γλώσσα Προγραμματισμού Εντολές Ελέγχου Ροής

2 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 2 Σειριακή εκτέλεση εντολών Όλα τα προγράμματα «γράφονται» χρησιμοποιώντας 3 είδη εντολών: – Σειριακές εντολές (sequential – built in C) – Εντολές απόφασης (if, if/else, switch) – Εντολές επανάληψης ( for, while, do/while)

3 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 3 if βασική εντολή διακλάδωσης κάθε γλώσσας προγραμματισμού Ελέγχει τη ροή του κώδικα ανάλογα με τη (λογική) τιμή μιας συνθήκης, δηλαδή μιας ποσότητας ή έκφρασης λογικού τύπου. Στη C++ συντάσσεται ως εξής: if (condition) {... // block A } else {... // block B } Εάν η συνθήκη (condition) είναι αληθής ή μπορεί να μετατραπεί σε αληθή, εκτελείται το block των εντολών που περικλείεται μεταξύ των πρώτων {} (block A). Αν η συνθήκη είναι ψευδής, τότε εκτελείται το block των εντολών μετά το else (block B).

4 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 4 if Το κάθε block μπορεί να αποτελείται από καμμία, μία, ή περισσότερες εντολές. Στην περίπτωση που περιλαμβάνει μία μόνο εντολή μπορούν να παραληφθούν τα άγκιστρα ({}) που την περικλείουν. if (val > max) max = val; else { max = ; ++i; }

5 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 5 if Στην περίπτωση που το else block είναι κενό μπορεί να παραληφθεί ολόκληρο: if (condition) {... }

6 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 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;

7 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 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

8 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 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; }

9 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 9 Παραστάσεις υπό Συνθήκη - ? Ο τελεστής ( ?: ) είναι ένας ιδιαίτερα διαδεδομένος ιδιωματισμός της C++. Η εντολή if (condition) val = value1; else val = value2; ισοδυναμεί με val = (condition ? value1 : value2); Γενικότερα, η έκφραση (condition ? έκφρασηΑ : έκφρασηΒ) έχει την τιμή “έκφρασηΑ” όταν η συνθήκη condition είναι αληθής, ενώ έχει την τιμή “έκφρασηΒ” όταν η συνθήκη είναι ψευδής.

10 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 10 Παραστάσεις υπό Συνθήκη - ? Οι παρενθέσεις που περιβάλουν τον τελεστή ( ?: ) με τα ορίσματά του στο συγκεκριμένο παράδειγμα δεν είναι απαραίτητες, βοηθούν όμως στην κατανόηση του κώδικα. Καθώς για το συγκεκριμένο τελεστή δεν μπορεί να καθοριστεί μονοσήμαντα η προτεραιότητά του σε σχέση με τον ( = ) πρέπει να τις χρησιμοποιούμε για να εκτελείται η επιδιωκόμενη πράξη. Εναλλακτικά, μπορούμε να εφαρμόζουμε τον εξής κανόνα: Οι τελεστές ( ?: ) και ( = ) έχουν ίδια προτεραιότητα, δεχόμενοι ότι οι πράξεις εκτελούνται από τα δεξιά προς τα αριστερά. Επομένως, η έκφραση a = b ? c : d ισοδυναμεί με a = (b ? c : d), ενώ η έκφραση a ? b : c = d εκτελείται ως a ? b : (c = d)

11 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 11 Παραστάσεις υπό Συνθήκη - ? if ( x > y) { x = a; }  else { x = b; } x = (x>y) ? a : b;

12 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 12 Εντολές υπό Συνθήκη - switch switch (έκφραση) { case σταθερή_παράσταση_1 : statements; break; case σταθερή_παράσταση_2 : statements; break; default : statements; } Το default είναι προαιρετικό και εκτελείται αν καμία παράσταση δεν βρεθεί ίση με την έκφραση Αν ένα break λείπει τότε συνεχίζεται η εκτέλεση των εντολών

13 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 13 Εντολές υπό Συνθήκη - 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 μπορούν να είναι οποιεσδήποτε.

14 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 14 Παράδειγμα με switch #include /*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; }

15 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 15 Τυπικά Λάθη if(x=5) αντί για if(x==5) Ξεχάσατε το break σε εντολή switch Ξεχάσατε {, } Λάθος στις προτεραιότητες: ( ) Λύση: Μορφοποίηση και χρήση σχολίων

16 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 16 Μορφοποίηση Σχόλια πριν από συναρτήσεις και τους ορισμούς μεταβλητών Κατάλληλη χρήση tabs, παρενθέσεων και αγκυλών Κατάλληλη ονοματολογία συναρτήσεων - μεταβλητών /*Epistrefei ton endiameso ari8mo twn a,b,c*/ int getMedian(int a,int b, int c) { int median; /*Endiamesos*/ if ((a = c)) || ((a >= b) && (a <= c)) { median = a; } else if ((b = c)) || ((b >= a) && (b <= c)) { median = b; } else { median = c; } return median; }

17 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 17 Define – Const – Include #define #define FALSE 0 #define TRUE !FALSE #define N 1000 /*ΠΡΟΣΟΧΗ!! – ΔΕΝ ΜΠΟΡΩ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΩ ΤΟ Ν ΩΣ ΜΕΤΑΒΛΗΤΗ*/ #define Pi – Ορίζεται στην αρχή κάθε προγράμματος και μπορεί να χρησιμοποιηθεί σε όλο το πρόγραμμα. – To Pi θα αντικατασταθεί από τον στο πρώτο βήμα του compilation (preprocessing) int const a = 1; – ορίζει μια σταθερά – δεν μπορεί να αλλάξει τιμή #include #include “file”

18 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 18 Γενική Δομή Προγράμματος #include # define N 1000 /*Επιστρέφει το μέγιστο μεταξύ των x, y*/ int max(int x,int y) { int z = x; /*δηλώσεις μεταβλητών - αρχικοποίηση*/ if (y > x) /*λίστα εντολών*/ { z = y; } return z; }

19 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 19 #include 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; }

20 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης Είσοδος / Έξοδος χαρακτήρων

21 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 21 putchar() / putchar() #include main() { int c; c = getchar() putchar(c); }

22 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 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 ) ; }

23 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 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 ) ; }

24 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Συναρτήσεις

25 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 25 Αλγόριθμοι / Προγράμματα Λύνουμε ένα πρόβλημα εκτελώντας μια ακολουθία από εντολές σε συγκεκριμένη σειρά Αλγόριθμος: καθορίζει τις εντολές και τη σειρά εκτέλεσης Έλεγχος προγράμματος (program control): καθορίζει αυστηρά τη σειρά εκτέλεσης των εντολών

26 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 26 Συναρτήσεις - Functions Χωρίζουμε το πρόγραμμα σε μέρη Φιλοσοφία του «διαίρει και βασίλευε» (divide and conquer) Τα μέρη αντιστοιχούν σε επιμέρους και μικρότερα προβλήματα Αναλογία με μια επιχείρηση: – Ο προϊστάμενος αναθέτει μια δουλειά σε κάποιον υφιστάμενο – Παίρνει το αποτέλεσμα χωρίς να «ενδιαφέρεται» για τις λεπτομέρειες

27 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 27 Συναρτήσεις - Functions Τα υποπροβλήματα πιο εύκολα διαχειρίσιμα Κάθε υποπρόβλημα αντιστοιχεί σε μία συνάρτηση Πιο εύκολη διαχείριση κώδικα – Debugging – Updating Χρήση υπαρχόντων συναρτήσεων σε καινούρια προγράμματα για τη λύση νέων προβλημάτων (code reuse) – Επαναχρησιμοποίηση κώδικα Αποφυγή επανάληψης του ίδιου κώδικα πολλές φορές μέσα σε ένα πρόγραμμα Αφαίρεση (abstraction): «κρύβονται» λεπτομέρειες που δεν είναι απαραίτητες συνέχεια στον προγραμματιστή

28 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 28 Συναρτήσεις - Functions main() Debugging Updating Code reuse Συναρτησιακός Προγραμματισμός

29 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 29 Ορισμός Συναρτήσεων Επιστρεφόμενος-τύπος όνομα-συνάρτησης(λίστα-παραμέτρων) { Δηλώσεις μεταβλητών; Εντολές; } Όνομα-συνάρτησης: οποιοδήποτε δεκτό όνομα Επιστρεφόμενος-τύπος: τύπος των δεδομένων που επιστρέφει η συνάρτηση – v o i d : δεν επιστρέφει τίποτα Λίστα-παραμέτρων: δηλώσεις παραμέτρων, χωρίζονται με κόμμα (τύπος παράμετρος, τύπος παράμετρος,...) int SquareIt(int a) { int result; result = a*a; return result; }

30 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 30 Κλήση Συναρτήσεων – Function Call όνομα_συνάρτησης ( όρισμα1,..., όρισμαΝ) έκφραση1  όνομα_συνάρτησης ( έκφραση1..., έκφρασηΝ) τιμή1  η τιμή που επιστρέφει ο κώδικας της συνάρτησης όταν εκτελεστεί με τα δοσμένα ορίσματα τύπος1  ο τύπος που επιστρέφει η συνάρτηση x = (SquareIt(5) > 7); Η έκφραση SquareIt(5) αντικαθίσταται από την έκ φραση 25.

31 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 31 Συναρτήσεις void Αν η συνάρτηση είναι τύπου void, δεν επιστρέφει τιμή void f() { printf(“Test\n”); return; } Λάθος: x = f() + 10;

32 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 32 Ροή του Προγράμματος Η ροή του προγράμματος αλλάζει όταν συναντήσει την κλήση μιας συνάρτησης f(a, b, c) 1. Πρώτα υπολογίζονται οι εκφράσεις που αντιστοιχούν στα ορίσματα 2. Οι τιμές των εκφράσεων a, b, c αντιγράφονται στα ορίσματα της f με την ίδια σειρά 3. Ο έλεγχος μεταπηδά στην πρώτη εντολή της f 4. Οι εντολές της f εκτελούνται μέχρι να συναντηθεί return έκφραση; Τέλος συνάρτησης (δηλαδή }) 5. Η κλήση f(a, b, c) αντικαθίσταται με την επιστρεφόμενη τιμή

33 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 33 Συναρτήσεις βιβλιοθήκης Συναρτήσεις ορισμένες από το χρήστη (user defined functions) Συναρτήσεις βιβλιοθήκης (library functions) – η τυπική βιβλιοθήκη της C – βιβλιοθήκες συναρτήσεων στο διαδίκτυο

34 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 34 Η βιβλιοθήκη double sqrt(double x); : Υπολογίζει την τετραγωνική ρίζα του x, πρέπει x > 0 double exp(double x);: Υπολογίζει τον εκθετικό του x, e x double log(double x);: Υπολογίζει τον φυσικό λογάριθμο του x, ln(x) int abs(int val);: Υπολογίζει την απόλυτη τιμή του val double pow(double x, double y); : Υπολογίζει την τιμή του x υψωμένη στη δύναμη y, χ y double sin(double x);: Υπολογίζει το sine του x, σε rad double cos(double x);: Υπολογίζει το cosine του x, σε rad double tan(double x);: Υπολογίζει την εφαπτομένη του x, σε rad double fmod(double x, double y); : Υπολογίζει το δεκαδικό υπόλοιπο της διαίρεσης χ/y, y > 0. double ceil(double x);: Υπολογίζει την μικρότερη ακέραια τιμή όχι μικρότερη από x. double floor(double x); : Υπολογίζει την μεγαλύτερη ακέραια τιμή όχι μεγαλύτερη από χ. Για να κάνουμε compile πρόγραμμα που χρησιμοποιεί την math.h: >gcc –lm program.c #include int rand(void); void srand(unsigned int seed); Η συνάρτηση rand επιστρέφει ψευδοτυχαίους αριθμούς από 0 έως RAND_MAX Η συνάρτηση srand χρησιμοποιείται για την αρχικοποίηση της rand() και τη γέννηση ψευδοτυχαίων αριθμών. Καλούμε μία φορά την srand και μετά την rand διαδοχικά για την παραγωγή των τυχαίων αριθμών. Αν ξανακαλέσουμε την srand και μετά την rand θα προκαλέσουμε την ίδια σειρά τυχαίων αριθμών.

35 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 35 Ορισμός Συναρτήσεων Δηλώσεις μεταβλητών μέσα σε blocks: ΤΟΠΙΚΕΣ μεταβλητές Συναρτήσεις ΔΕΝ μπορούν να οριστούν μέσα σε άλλες συναρτήσεις ΟΠΟΙΑΔΗΠΟΤΕ συνάρτηση μπορεί να καλέσει άλλες συναρτήσεις και τον εαυτό της (αναδρομή)

36 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 36 Πρωτότυπα Συναρτήσεων (Function Prototypes) Επιστρεφόμενος-τύπος όνομα-συνάρτησης (λίστα- τύπων-παραμέτρων) Δηλώσεις των συναρτήσεων στην αρχή του αρχείου Χρειάζεται οπωσδήποτε αν χρησιμοποιούμε τη συνάρτηση πριν τον ορισμό της Πλεονεκτήματα – Ελέγχουμε την ορθή χρήση των συναρτήσεων – Μπορούμε να δούμε ποιες είναι οι συναρτήσεις που έχουν υλοποιηθεί στο πρόγραμμα – Μπορούμε να καλέσουμε όλες τις συναρτήσεις που έχουν υλοποιηθεί στο πρόγραμμα χωρίς να μας ενδιαφέρει η σειρά που έχουν γραφτεί

37 ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης 1. Function prototype (3 parameters) 2. Input values 2.1 Call function 3. Function definition Program Output 1/* Fig. 5.4: fig05_04.c 2 Finding the maximum of three integers */ 3#include 4 5int maximum( int, int, int ); /* function prototype */ 6 7int main() 8{8{ 9 int a, b, c; printf( "Enter three integers: " ); 12 scanf( "%d%d%d", &a, &b, &c ); 13 printf( "Maximum is: %d\n", maximum( a, b, c ) ); return 0; 16} 17 18/* Function maximum definition */ 19int maximum( int x, int y, int z ) 20{ 21 int max = x; if ( y > max ) 24 max = y; if ( z > max ) 27 max = z; return max; 30} Enter three integers: Maximum is: 85


Κατέβασμα ppt "ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ-3122/106 Γλώσσα Προγραμματισμού Εντολές Ελέγχου Ροής."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google