2. ΕΝΤΟΛΕΣ ΕΛΕΓΧΟΥ (Α' μέρος: if) 2.1. Τελεστές ΠΡΑΞΗ ΤΕΛΕΣΤΗΣ Ισότητα = = Μεγαλύτερο από > Μικρότερο από < Μεγαλύτερο ή ίσο από >= Μικρότερο ή ίσο από <= Διάφορο (όχι ίσο: το θαυμαστικό σημαίνει άρνηση)!= Παραδείγματα : x == z, x > y, x < (z+y) 2.2. Δομές ελέγχου ενός προγράμματος 2.2.1. Η εντολή if Η εντολή if χρησιμοποιείται για τη λήψη απόφασης εάν θα πρέπει να εκτελεστεί μια οδηγία ή όχι. Η δομή της εντολής είναι: if ( συνθήκη ) εντολές ; Εάν η συνθήκη είναι αληθής, μόνο τότε εκτελούνται οι εντολές μέσα στα άγκιστρα. Εάν η συνθήκη είναι ψευδής παρακάμπτεται η οδηγία και το πρόγραμμα συνεχίζει κανονικά στην εκτέλεση της επόμενης οδηγίας. Εάν η οδηγία είναι μόνο μια γραμμή τότε τα άγκιστρα και, είναι προαιρετικά. if (temperature < 0) printf("pagomeno nero"); Παράδειγμα: int thermokrasia; printf("dwse ti thermokrasia :\n"); scanf("%d", & thermokrasia); if (thermokrasia >35 ) printf( "Kafsonas\n" ); 2.2.2. H εντολή if Το if συνήθως χρησιμοποιείται για να αποφασίσει κάποιος μεταξύ δύο σχεδίων δράσης και η δομή του είναι : 1
if ( συνθήκη ) σύνολο εντολών 1 σύνολο εντολών 2 Εάν η συνθήκη είναι αληθής, να εκτελεσθεί η οδηγία που ακολουθεί αλλιώς εκτέλεσε την οδηγία μετά το. Άρα οπωσδήποτε το ένα από τα δύο σύνολα εντολών θα εκτελεστεί. Παράδειγμα int vathmos; printf("dose to vathmo tou mathimatos:\n"); scanf("%d",&vathmos); if (vathmos >= 10) printf("perases\n"); printf("den perases\n"); Παράδειγμα int vathmos; printf("dose to vathmo tou mathimatos:\n"); scanf("%d",&vathmos); if (vathmos >= 10) printf("perases\n"); printf("sygxaritiria\n"); printf("den perases\n"); printf("kali epityxia to Septemvri\n"); 2.2.3. Η εντολή if Μερικές φορές επιθυμούμε να καταστήσουμε μια απόφαση βασισμένη σε πολλαπλές συνθήκες. Ο γενικότερος τρόπος αυτό είναι με τη χρησιμοποίηση του if μέσα σε μια δήλωση if. Μόλις βρεθεί μια συνθήκη από αυτές που είναι αληθής, εκτελούνται οι εντολές που την ακολουθούν και μετά το πρόγραμμα σταματάει αυτόματα τις συγκρίσεις. Άρα, συνεχίζει από το σημείο μετά το τελευταίο άγκιστρο της. 2
if (συνθήκη 1) πρόταση 1; if (συνθήκη 2) πρόταση 2; πρόταση n; Στο παραπάνω παράδειγμα με τις if, δεν είναι αναγκαστικό ότι υπάρχει. Αν υπάρχει οπωσδήποτε μια τουλάχιστον πρόταση θα εκτελεστεί, αφού αν δεν ικανοποιείται καμία από τις συνθήκες, θα εκτελεστεί ο κώδικας που αφορά την. Αν δεν υπάρχει η στο τέλος, μπορεί, αν δεν ικανοποιηθεί καμία συνθήκη, συνολικά από την if, να μην εκτελεστεί καμία από τις προτάσεις και το πρόγραμμα να συνεχίσει από την επόμενη εντολή. Στο ακόλουθο παράδειγμα απονέμουμε τους βαθμούς ανάλογα με το αποτέλεσμα διαγωνισμών. Παράδειγμα: int vathmos; printf("dose to vathmo tou mathimatos:\n"); scanf("%d",&vathmos); if (vathmos >= 16) printf("perases me poly kalo vathmo\n"); if (vathmos >= 10) printf("perases to mathima\n"); printf("den perases \n"); 3
2.3 Φωλιασμένες εντολές if Μια εντολή if μπορεί να περιέχεται μέσα σα μια άλλη εντολή if και λέγεται ότι είναι φωλιασμένη (nested). Για παράδειγμα: if (income >= 20000) if (status == 'S') σύνολο_εντολών_1; σύνολο_εντολών_2; if (status == 'R') σύνολο_εντολών_3; σύνολο_εντολών_4; Όπως φαίνεται η δεύτερη συνθήκη if είναι φωλιασμένη μέσα στη πρώτη. Η δεύτερη συνθήκη if ελέγχεται μόνο εάν η πρώτη είναι αληθής, οπότε η πρόταση 1 εκτελείται μόνο εάν και οι δύο πρώτες συνθήκες if ( ) είναι αληθείς. Αν για παράδειγμα το income είναι μικρότερο από 20000 και το status δεν είναι 'R', τότε εκτελείται το... σύνολο_εντολών_3; (Προσπαθήστε να το επαληθεύσετε και μόνοι σας). Στο ίδιο ακριβώς παράδειγμα που υπάρχει από κάτω, φαίνεται και η σημασία του να σπρώχνουμε πιο μέσα όσες εντολές εξαρτώνται από κάποια συνθήκη. Έτσι, διαβάζεται πολύ πιο εύκολα το πρόγραμμα. Συγκρίνεται το με το ίδιο που βρίσκεται ακριβώς από κάτω. Γίνεται μπέρδεμα, τόσο με τα άγκιστρα, όσο και με το ποια συνθήκη, επηρεάζει ποια εντολή. 4
if (income >= 20000) if (status == S ) σύνολο εντολών 1; σύνολο εντολών 2; if (status == R ) σύνολο εντολών 3; σύνολο εντολών 4; Παράδειγμα: float eisodima; printf("dose ta lefta pou vgazeis kathe xrono:\n"); scanf("%f",&eisodima); if (eisodima >= 20000) if (eisodima <= 100000) printf("o foros pou prepei na plirwseis einai 22%%\n"); printf("o foros pou prepei na plirwseis einai 40%%\n"); printf("kerdizeis ligotera apo 20.000, o foros sou einai 15%%\n"); Η λογική του παραπάνω προγράμματος είναι η εξής: Η πρώτη συνθήκη if εξετάζει εάν το εισόδημα είναι άνω των 20000 αλλιώς φορολογείται με 15%. Εάν το εισόδημα είναι άνω των 20000 τότε εξετάζει εάν είναι έως 100000 και φορολογείται με 22% ενώ εάν όχι με 40%. Σημείωση: Μέσα στην printf υπάρχει το σύμβολο %%, που αποτελεί τον τρόπο για να εμφανιστεί στην οθόνη το %. Π.χ. η φράση: O foros pou prepei na plirwseis einai 22% 5
2.4. Λογικοί Τελεστές Οι σχεσιακοί τελεστές δημιουργούν απλές παραστάσεις που μπορούν να συνδυαστούν για τη δημιουργία πολύπλοκων παραστάσεων με τη βοήθεια των λογικών τελεστών. ΠΡΑΞΗ ΤΕΛΕΣΤΗΣ AND && OR NOT! XOR ^ Παραδείγματα : a>=0 && b>=0,!(c-b)== a, a<0 b!=3 Η λογική που διέπει τους παραπάνω τελεστές είναι η εξής: (Συνθ.Α) && (Συνθ. Β) Είναι TRUE, μόνο αν και οι δύο συνθήκες είναι TRUE (Συνθ.Α) (Συνθ. Β) Είναι TRUE, αρκεί τουλάχιστον η μία από τις δύο συνθήκες να είναι TRUE!(Συνθ.Α) Είναι TRUE, μόνο αν η συνθήκη Α είναι FALSE (Συνθ.Α) ^ (Συνθ. Β) Είναι TRUE, μόνο αν η μια είναι TRUE και συγχρόνως η άλλη είναι FALSE Στο παρακάτω παράδειγμα, αν ο μαθητής περάσει και τα δύο μαθήματα (λογικό AND), περνάει την τάξη. Αν περάσει έστω το ένα από τα δύο μαθήματα (λογικό OR), τότε δίνει ένα μάθημα το Σεπτέμβρη.(Η περίπτωση το OR, να είναι TRUE, επειδή πέρασε και τα δύο μαθήματα, έχει ήδη προβλεφθεί από την αρχική if). Τέλος, οι υπόλοιπες περιπτώσεις(μια ουσιαστικά και σημαίνει ότι κόπηκε και στα δύο μαθήματα), σημαίνει ότι χάνει τη χρονιά. Παράδειγμα: int prwto, deftero; printf("dwse vathmo 1ou mathimatos:\n"); scanf("%d",&prwto); printf("dwse vathmo 2ou mathimatos:\n"); scanf("%d",&deftero); if (prwto>=10 && deftero>=10) printf("perases tin taxi\n"); if (prwto>=10 deftero>=10) printf("dwse ena mathima to Septemvri\n"); printf("emeines stin idia taxi\n"); 6
Παράδειγμα χρήσης λογικών τελεστών Αν έχουνε τις περιπτώσεις : Α) (x>=10 && y>=10) B) (x>=10 y>=10) C)! (x>=10) Εδώ, αναφερόμαστε μόνο σε μια συνθήκη. D) (x>=10 ^ y>=10) Και τα δεδομένα μας είναι: i) x=15, y=6 τότε: A) False, αφού υπάρχει τουλάχιστον ένα False (2ο μέλος) B) True, αφού υπάρχει τουλάχιστον ένα True (1ο μέλος) C) False, αφού το 1ο μέλος που εξετάζεται είναι True D) True, αφού οι δύο συνθήκες είναι διαφορετικές μεταξύ τους ii) x=8, y=6 τότε: A) False, αφού υπάρχει τουλάχιστον ένα False B) False, αφού και τα δύο είναι False C) True, αφού το 1ο μέλος που εξετάζεται είναι False D) False, αφού και οι δύο συνθήκες είναι το ίδιο (False) iii) x=18, y=19 τότε: A) True, αφού και οι δύο συνθήκες είναι True B) True, αφού υπάρχει τουλάχιστον ένα True C) False, αφού το 1ο μέλος που εξετάζεται είναι True D) False, αφού και οι δύο συνθήκες είναι το ίδιο (True) iv) x=8, y=10 τότε: A) False, αφού υπάρχει τουλάχιστον ένα False (2ο μέλος) B) True, αφού υπάρχει τουλάχιστον ένα True (2ο μέλος) C) True, αφού το 1ο μέλος που εξετάζεται είναι False D) True, αφού οι δύο συνθήκες είναι διαφορετικές μεταξύ τους (Δοκιμάστε και μόνοι σας δίνοντας τιμές στα A,B,C και D, να δείτε αν όντως βγάζετε τα αντίστοιχα αποτελέσματα) 2.5. Ασκήσεις ΑΣΚΗΣΗ 1: Πληκτρολογείστε το παρακάτω πρόγραμμα: #include <stdio.h> void main() float a,b,max; printf("give A NUMBER (FLOAT) a="); scanf("%f",&a); printf("give A NUMBER (FLOAT) b="); scanf("%f",&b); if (a >= b) max = a; max = b; printf("the maximum number is %8.2f\n",max); 7
ΑΣΚΗΣΗ 2: Να τροποποιήσετε το παραπάνω πρόγραμμα ώστε να συγκρίνει τρεις ακεραίους και να τυπώνει το μικρότερο. ΑΣΚΗΣΗ 3: Να δημιουργήσετε πρόγραμμα που θα διαβάζει την ηλικία του χρήστη από το πληκτρολόγιο και θα τυπώνει: για ηλικία < 18. eisai anilikos για ηλικία μεταξύ 18 και 65. eisai enilikos για ηλικία > 65... eisai iperilikos ΑΣΚΗΣΗ 4: Γράψτε πρόγραμμα που να υπολογίζει τις ρίζες ενός τριώνυμου ax 2 +bx+c=0 με συντελεστές (a,b,c) που θα δίνονται από το πληκτρολόγιο. Θα υπολογίζεται η διακρίνουσα: D = b * b 4 * a * c και οι ρίζες: r1=(-b+sqrt(d))/(2*a) και r2=(-b-sqrt(d))/(2*a ) Να ελέγχεται η διακρίνουσα D ως προς το εάν είναι θετική, αρνητική, ή μηδέν και να εμφανίζονται τα ανάλογα αποτελέσματα. ΑΣΚΗΣΗ 5: Γράψτε πρόγραμμα που να πληκτρολογεί ο χρήστης ένα έτος και να παίρνει απάντηση αν πρόκειται για δίσεκτο έτος ή όχι. Δίσεκτα είναι τα έτη που διαιρούνται ακριβώς με το 4, αλλά δε διαιρούνται με το 100. Από τα υπόλοιπα, αυτά που είναι επίσης δίσεκτα είναι όσα διαιρούνται ακριβώς με το 400. Για παράδειγμα έχουμε: Έτος Δίσεκτο Αιτία 1551 Όχι Δε διαιρείται ακριβώς με το 4 1620 Ναι Διαιρείται ακριβώς με το 4 και δε διαιρείται με το 100 1700 Όχι Διαιρείται ακριβώς με το 4 αλλά διαιρείται και με το 100 1600 Ναι Διαιρείται ακριβώς με το 400 8