Προγραμματισμός HY: Γλώσσα Προγραμματισμού C Δρ. Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας Email: savvas@teilar.gr URL: http://teilar.academia.edu/iliassavvas Γλώσσα Προγραμματισμού C Εισήγηση #3 Προτάσεις ελέγχου και λογικής, Ο τύπος δεδομένων char, Οι τελεστές ++, --, @=, Εισαγωγή στις επαναληπτικές εντολές (προτάσεις) - repetation statements. Ηλίας Κ. Σάββας Εισήγηση #3 2 Αριθμητικοί Τελεστές Πρόσθεση + Αφαίρεση Πολ/μός * Διαίρεση / Ακέραιο υπόλοιπο % 5+3 12-5 3*5 6/3, 3/2, 3.0/2.0 3%2 (=1) Ηλίας Κ. Σάββας Εισήγηση #3 3 1
Οι Προτάσεις if και if-else if ( λογική έκφραση - expression) Πρόταση ή σύνολο προτάσεων (block) {.. if (λογική έκφραση - expression) Πρόταση ή σύνολο προτάσεων (block) {.. else Πρόταση ή σύνολο προτάσεων (block) {.. Ηλίας Κ. Σάββας Εισήγηση #3 4 Λογικοί Τελεστές Μικρότερο : Μεγαλύτερο: Μικρότερο ή ίσο: Μεγαλύτερο ή ίσο: Ίσο: Όχι ίσο (διάφορο): < > <= >= ==!= Ηλίας Κ. Σάββας Εισήγηση #3 5 Συσχέτιση Λογικών Εκφράσεων ΚΑΙ (σύζευξη) Η (διάζευξη) ΔΕΝ (άρνηση) &&! Ηλίας Κ. Σάββας Εισήγηση #3 6 2
Παράδειγμα (τεχνική) Πως μπορούμε να καταλάβουμε εάν ένας ακέραιος είναι άρτιος ή περιττός? if (a % 2 == 0) printf( \n ο %d είναι ΑΡΤΙΟΣ αριθμός, a); else printf( \n ο %d είναι ΠΕΡΙΤΤΟΣ αριθμός, a); Ηλίας Κ. Σάββας Εισήγηση #3 7 Άσκηση (τεχνική) Δεδομένων δύο μεταβλητών a, και b γράψτε κώδικα ο οποίος να αντιμεταθέτει τις τιμές τους (π.χ. εάν a=3 και b=4 τότε a b, : a=4, b=3): a=b; b=a; Λάθος! a=4, b=4! temp =a; a=b; b=temp; (temp: μία προσωρινή μεταβλητή για να αποθηκεύσουμε την τιμή του a), ή a=a+b; b=a-b; a=a-b; Ηλίας Κ. Σάββας Εισήγηση #3 8 Ένας Ακόμη Τύπος Δεδομένων char: Αναπαριστά έναν απλό χαρακτήρα, όπως: 'a', '7', '@', '?',... Δήλωση τέτοιου τύπου μεταβλητών: char a, b; Απόδοση τιμής: a = 'Q'; b = a; Χαρακτήρας μορφοποίησης: %c printf( %c, a);... scanf( %c, &a) Ηλίας Κ. Σάββας Εισήγηση #3 9 3
char Είσοδος: Έξοδος: scanf( %c, &a); a = getchar(); printf( %c, a); putchar(a); Ηλίας Κ. Σάββας Εισήγηση #3 10 Παράδειγμα Δεδομένου ενός γράμματος της αλφαβήτου, να γραφεί ο αντίστοιχος κώδικας που ελέγχει εάν είναι φωνήεν ή σύμφωνο. switch ( letter ) { case α' : case ε'...: printf( Φωνήεν ); break; case β' : case γ'...:printf( Σύμφωνο ); Δύσκολο? ΝΑΙ... Ας το σκεφτούμε λίγο Δηλαδή πρέπει να γράψουμε πάνω (γιατί?) από 24 if??? Όχι... Ευτυχώς!!! Ηλίας Κ. Σάββας Εισήγηση #3 11 Η Εντολή (πρόταση) switch switch (τιμή) /* μόνο int και char */ { case τιμή1: /* εκτέλεση κώδικα για περίπτωση τιμής 1 */ break; case τιμή2: /* εκτέλεση κώδικα για περίπτωση τιμής 2 */ break;... default: /* εκτέλεση κώδικα για κάθε άλλη περίπτωση */ Ηλίας Κ. Σάββας Εισήγηση #3 12 4
Χρήσιμες Παρατηρήσεις Εάν δεν υπάρχει η πρόταση break, όλες οι προτάσεις που ακολουθούν την περίπτωση στην τιμή που ταιριάζει θα εκτελεσθούν. Η πρόταση break σταματάει τον έλεγχο των υπολοίπων περιπτώσεων. Πολύπλοκη if πρόταση? Πιθανώς η switch απλοποιεί την λογική. Χρησιμοποιήστε την πρόταση switch για την εκτίμηση της απάντησης του χρήστη σε ένα μενού επιλογών. Χρησιμοποιήστε την πρόταση switch για την διαχείριση χαρακτήρων (και όχι μόνο). Ηλίας Κ. Σάββας Εισήγηση #3 13 Παραδείγματα... Εάν δεν υπάρχει η πρόταση break, όλες οι προτάσεις που ακολουθούν την περίπτωση στην τιμή που ταιριάζει θα εκτελεσθούν: /* Άρτιος Περιττός */ switch ( a % 2) { case 0 : printf( ΑΡΤΙΟΣ ); case 1 : printf( ΠΕΡΙΤΤΟΣ ); Εάν είναι ΑΡΤΙΟΣ ο κώδικας λειτουργεί λάθος! ΓΙΑΤΙ? Γιατί η πρόταση που ακολουθεί θα εκτελεσθεί επίσης! Ηλίας Κ. Σάββας Εισήγηση #3 14 Παραδείγματα... Εάν δεν υπάρχει η πρόταση break, όλες οι προτάσεις που ακολουθούν την περίπτωση στην τιμή που ταιριάζει θα εκτελεσθούν: /* Άρτιος Περιττός */ /* Άρτιος Περιττός */ switch ( a % 2) { case 0 : printf( ΑΡΤΙΟΣ ); case 1 : printf( ΠΕΡΙΤΤΟΣ ); switch ( a % 2) { case 0 : printf( ΑΡΤΙΟΣ ); break; case 1 : printf( ΠΕΡΙΤΤΟΣ ); Ηλίας Κ. Σάββας Εισήγηση #3 15 5
...Παραδείγματα... Πολύπλοκη if πρόταση? Χρήση της switch για να απλουστεύσει την λογική. char answer; printf( Απαντήστε με N ή Ο: "); scanf(" %c", &answer); switch (answer) { case ν': case Ν': printf("\nαπαντήσατε καταφατικά."); break; case ο': case Ο': printf("\nαπαντήσατε αρνητικά."); break; default: printf("\nδεν απαντήσατε σωστά..."); Ηλίας Κ. Σάββας Εισήγηση #3 16 Καλή Τεχνική Χρησιμοποιήστε την πρόταση switch για την εκτίμηση της απάντησης του χρήστη σε ένα μενού επιλογών. int Apantisi; printf("\nεπιλέξτε από 1-4: "); scanf("%d", &Apantisi); switch (Apantisi) { case 1: printf("\nεπιλέξατε 1\n"); break; case 2: printf(" Επιλέξατε 2\n"); break; case 3: printf(" Επιλέξατε 3\n"); break; case 4: printf(" Επιλέξατε 4\n"); Ηλίας Κ. Σάββας Εισήγηση #3 17 Επιπλέον Αριθμητικοί Τελεστές ++ (τελ. αύξησης) - - (τελ. μείωσης) Συνδυασμός τελεστών: @= += -= *= /= %= a++; a = a + 1; b--; b = b 1; a+=10; a=a+10; b-=x; b=b-x; c*=x+4; c=c*(x+4); d/=2; d = d / 2; Ηλίας Κ. Σάββας Εισήγηση #3 18 6
Αύξηση / Μείωση (int - char) a++; Αύξηση μετά ++a; Αύξηση πριν a--; Μείωση μετά --a; Μείωση πριν Μετά: χρήση της τρέχουσας τιμής και μετά αύξηση / μείωση της τιμής τους κατά 1. Πριν: Αύξηση / μείωση της τιμής τους κατά 1 και μετά χρήση της αλλαγμένης πλέον τιμής τους. Ηλίας Κ. Σάββας Εισήγηση #3 19 Συνδυασμός Τελεστών Αντί για a = a + 3; a += 3; προσθέτει την τιμή που υπάρχει δεξιά στην τρέχουσα τιμή της μεταβλητής αριστερά, Πέντε συνδυασμοί τελεστών: +=, -=, *=, /=, %= που αντιστοιχούν στις 5 αριθμητικές πράξεις, Παραδείγματα: b -= 20; b = b 20; c *= (a+b); c = c * (a+b); m /= 2; m = m / 2; Ηλίας Κ. Σάββας Εισήγηση #3 20 Παραδείγματα int a=2; int x=10; b=2*(a++); a=, b =? b=2*(++a); a=, b =? x *= (a++); x=?, a =? x *= (++a); x=?, a =? Ηλίας Κ. Σάββας Εισήγηση #3 21 7
Προσωρινή Μετατροπή Τύπου Δεδομένων (Type Conversion : Casting Method) int a=7; float b; b = a / 2; b=? b= (float) a / 2; b=? Η λύση είναι η χρήση μιας μεθόδου που ονομάζεται casting η οποία προσωρινά θεωρεί μια τιμή σαν διαφορετικού τύπου (από αυτόν που αρχικά δηλώθηκε). Η μέθοδος cast λειτουργεί εάν τοποθετήσουμε σε παρένθεση τον επιθυμητό τύπο δεδομένων ακριβώς μπροστά από την τιμή που θέλουμε να αλλάξουμε. Ηλίας Κ. Σάββας Εισήγηση #3 22 Γρήγορος Πίνακας Αναφοράς Σύνταξης Αριθμητικοί τελεστές + - * / % Αύξησης / Μείωσης τελεστές ++ -- Συνδυασμός τελεστών += -= *= /= %= Σύνταξη Παραδείγματα FPA = axia * 0.21; ypoloipo = a % 10; Mesi_timi = (a+b+c)/3; b++; b--; a += 10; b*=2; Casting (type) Mesi_timi = (float) (a+b+c)/3; Ηλίας Κ. Σάββας Εισήγηση #3 23 H Οδηγία #define (directive) Ορίζει μία σταθερά: #define FPA 0.23 #define Pi 3.14159 #define { Start #define End #define Onoma Kwstas #define X? Οι τιμές πλέον ΔΕΝ είναι δυνατόν να αλλαχτούν μέσα στο πρόγραμμα. Ηλίας Κ. Σάββας Εισήγηση #3 24 8
Παράδειγμα #include <stdio.h> #define Start { #define End #define Fpa 0.23 int main() Start int c = 23; float f; f = (9.0*c)/5.0+32.0; printf("\n\n Fahrenheit = %.2f\n\n", f); Fpa = 0.20; /* FATAL ERROR */ return 0; End Ηλίας Κ. Σάββας Εισήγηση #3 25 Άσκηση (3 λύσεις) Δεδομένου ενός αριθμού από 1 μέχρι 7, γράψτε ένα πρόγραμμα το οποίο να τυπώνει την αντίστοιχη ημέρα της βδομάδας (1 για Δευτέρα κλπ). Εάν ο αριθμός είναι εκτός των ορίων 17 τότε να εκτυπώνεται ένα μήνυμα λάθους. Ηλίας Κ. Σάββας Εισήγηση #3 26 Άσκηση (1) printf( \nεισαγωγή αριθμού από 1 μέχρι 7: ); scanf( %d, &n); switch (n) { case 1: printf( \nδευτέρα! ); break; case 7 : printf( \nκυριακή! ); break; default: printf( \nεκτός ορίων ); Ηλίας Κ. Σάββας Εισήγηση #3 27 9
Άσκηση (2) if (n==1) printf( \nδευτέρα! ); if (n==2) printf.... if (n<1 n>7) printf( \nεκτός ορίων ); Ηλίας Κ. Σάββας Εισήγηση #3 28 Άσκηση (3) if (n==1) printf( \nδευτέρα! ); else if (n==2) printf.. else if (n==3).. else if (n==7) printf( \nκυριακή! ); else printf( \nεκτός ορίων ); Ηλίας Κ. Σάββας Εισήγηση #3 29 Ασκήσεις... Γράψτε ένα πρόγραμμα το οποίο αφού διαβάζει 3 πραγματικούς αριθμούς (a, b, c): 1. Προσδιορίζει εάν αντιστοιχούν σε μήκη πλευρών τριγώνου (Χρησιμοποιήστε την τριγωνική ανισότητα: Το άθροισμα των μηκών οποιονδήποτε 2 πλευρών να είναι πάντα μεγαλύτερο από το μήκος της τρίτης πλευράς). 2. Εάν πράγματι αντιστοιχούν σε τρίγωνο να υπολογίσετε το εμβαδόν του (Emvado = t(t-a)(t-b)(t-c) όπου t=(a+b+c)/2) Ηλίας Κ. Σάββας Εισήγηση #3 30 10
...Ασκήσεις... Γράψτε ένα πρόγραμμα το οποίο να μετατρέπει μονάδες του Αμερικάνικου μετρικού συστήματος στο διεθνές μετρικό σύστημα. Ο χρήστης να μπορεί να επιλέγει μεταξύ των 1.Μήκος, 2.Όγκος, 3.Δύναμη. (1 πόδι=0.3048 μέτρα, 1 κυβικό πόδι = 0.00282 κυβικά μέτρα, and 1 pound = 4.4482 newtons). Το πρόγραμμα να λειτουργεί ως εξής Ηλίας Κ. Σάββας Εισήγηση #3 31 Ασκήσεις. Επιλέξτε μετατροπή μεταξύ των: 1 Μήκος, 2 Όγκος, 3 Δύναμη Χρησιμοποιείστε την πρόταση SWITCH! Εισαγωγή της επιλογής σας: 1 Πόδια: 3 3.00 πόδια είναι 0.9144 μέτρα Ηλίας Κ. Σάββας Εισήγηση #3 32...Ασκήσεις Εάν υποθέσουμε ότι οι αλφαβητικοί βαθμοί σε ένα μάθημα είναι A, B, C, D, και F και αντιστοιχούν στους αριθμούς 4, 3, 2, 1, και 0. Γράψτε ένα πρόγραμμα το οποίο να τυπώνει το αριθμητικό αντίστοιχο εάν ο χρήστης εισάγει το αλφαβητικό βαθμό. Οι προτάσεις <if> και <switch> λίγο πολύ είναι όμοιες αλλά μπορούμε να τα καταφέρουμε και χωρίς την <switch>. Είναι αυτό σωστό? Από την άλλη μεριά, μπορούμε να τα καταφέρουμε χωρίς καθόλου <if>? Δικαιολογήστε την απάντησή σας και γράψτε μία πρόταση με <if> που δεν μπορεί να γραφεί με <switch> ή αντίστροφα για να υποστηρίξετε την άποψή σας. Ηλίας Κ. Σάββας Εισήγηση #3 33 11
Επανάληψη: Βρόγχοι (Loop Statements). Γράψτε ένα πρόγραμμα όπου να εισάγονται μη αρνητικοί ακέραιοι αριθμοί από το πληκτρολόγιο και να υπολογίζει το άθροισμα και την μέση τιμή τους Το πλήθος των αριθμών που θα εισαχθούν είναι άγνωστο. Το πρόγραμμα να τερματίζει όταν εισαχθεί ο αριθμός -1. Ποιο μέρος του προγράμματος πρέπει να επαναλαμβάνεται?... int number, sum, counter; float average; printf( \nεισαγωγή μη αρνητικού αριθμού: ); scanf( %d, &number); If (number >= 0) { counter++; /* Ένας νέος αριθμός έχει εισαχθεί */ sum += number;... average = (float) sum / counter; printf( \nεισήχθησαν %d αριθμοί, counter); printf( \nμε άθροισμα = %d, sum); printf( \nκαι με μέσο όρο = %.2, average);... return 0; Ηλίας Κ. Σάββας Εισήγηση #3 34 Επανάληψη: Βρόγχοι Γράψτε ένα πρόγραμμα όπου να εισάγονται μη αρνητικοί ακέραιοι αριθμοί από το πληκτρολόγιο και να υπολογίζει το άθροισμα και την μέση τιμή τους Το πλήθος των αριθμών που θα εισαχθούν είναι άγνωστο. Το πρόγραμμα να τερματίζει όταν εισαχθεί ο αριθμός -1. Ποιο μέρος του προγράμματος πρέπει να επαναλαμβάνεται?... int number, sum, counter; float average; printf( \nεισαγωγή μη αρνητικού αριθμού: ); scanf( %d, &number); If (number >= 0) { counter++; /* Ένας νέος αριθμός έχει εισαχθεί */ sum += number;... average = (float) sum / counter; printf( \nεισήχθησαν %d αριθμοί, counter); printf( \nμε άθροισμα = %d, sum); printf( \nκαι με μέσο όρο = %.2, average);... return 0; Ηλίας Κ. Σάββας Εισήγηση #3 35 Επανάληψη: Βρόγχοι #include <stdio.h> int main() { int number, sum, counter; float average; while (number>=0) { printf( \n Εισαγωγή μη αρνητικού αριθμού : ); scanf( %d, &number); If (number >= 0) { counter++; /* Ένας νέος αριθμός έχει εισαχθεί */ sum += number; average = (float) sum / counter; printf( \ Εισήχθησαν %d αριθμοί, counter); printf( \nμε άθροισμα = %d, sum); printf( \n και με μέσο όρο = %.2, average); return 0; Σωστό? Ας το τρέξουμε για να το δοκιμάσουμε... Ηλίας Κ. Σάββας Εισήγηση #3 36 12
Εκτέλεση του Προγράμματος Εισαγωγή μη αρνητικού αριθμού :1 Εισαγωγή μη αρνητικού αριθμού : 3 Εισαγωγή μη αρνητικού αριθμού : 5 Εισαγωγή μη αρνητικού αριθμού : -1 Εισήχθησαν 1933363 αριθμοί (3) Με άθροισμα = 134513940 (9) Και μέση τιμή = 69.58 (3.00) ΓΙΑΤΙ??? Ηλίας Κ. Σάββας Εισήγηση #3 37 Οι Αρχικές Τιμές είναι ΑΠΑΡΑΙΤΗΤΕΣ #include <stdio.h> int main() { int number=0, sum=0, counter=0; float average; while (number>=0) { printf( \n Εισαγωγή μη αρνητικού αριθμού : ); scanf( %d, &number); If (number >= 0) { counter++; /* Ένας νέος αριθμός έχει εισαχθεί */ sum += number; average = (float) sum / counter; printf( \ Εισήχθησαν %d αριθμοί, counter); printf( \nμε άθροισμα = %d, sum); printf( \n και με μέσο όρο = %.2, average); return 0; Ηλίας Κ. Σάββας Εισήγηση #3 38 Εκτέλεση του Προγράμματος Εισαγωγή μη αρνητικού αριθμού : 1 Εισαγωγή μη αρνητικού αριθμού : 3 Εισαγωγή μη αρνητικού αριθμού : 5 Εισαγωγή μη αρνητικού αριθμού : -1 Εισήχθησαν 3 αριθμοί Με άθροισμα = 9 Και μέση τιμή = 3.00 Ηλίας Κ. Σάββας Εισήγηση #3 39 13
Άσκηση Γράψτε ένα πρόγραμμα το οποίο να εισάγει αγνώστου πλήθους μη αρνητικούς ακέραιους αριθμούς από το πληκτρολόγιο να υπολογίζει και εκτυπώνει: Το πλήθος των αριθμών που εισήχθησαν, Το άθροισμα: Sum a a a a 2 2 2 2 1 2 3 n Το πρόγραμμα να τερματίζει μόλις εισαχθεί αρνητικός αριθμός. Ηλίας Κ. Σάββας Εισήγηση #3 40 Τέλος της #3 Εισήγησης Ερωτήσεις??? Χρησιμοποιήστε το email εάν θέλετε να με ρωτήσετε οτιδήποτε: savvas@teilar.gr Σημειώσεις Μαθήματος (και όχι μόνο): http://e-class.teilar.gr/ Ηλίας Κ. Σάββας Εισήγηση #3 41 14