HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος Νικολάου
ΕΝΟΤΗΤΑ Ι ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Διάλεξη 4η
Περιεχόμενα Αυτοματοποίηση χρήσης τετραδίου Εντολή εκχώρησης Αριθμητικές εκφράσεις Λογικές εκφράσεις Εντολές ελέγχου ροής
Αυτοματοποίηση χρήσης τετραδίου (1/3) Είδαμε ότι για να χρησιμοποιήσουμε παραμέτρους κάνουμε τα εξής: 1.Προσδιορίζουμε τον κατάλληλο τύπο δεδομένων Τ 2.Προσδιορίζουμε τις Κ σειρές του τετραδίου που απαιτούνται για τον τύπο Τ Δεχόμαστε ότι οι απλοί τύποι χρειάζονται μία (1) σειρά τετραδίου 3.Βρίσκουμε Κ ελεύθερες συνεχόμενες σειρές στο τετράδιο 4.Δηλώνουμε ότι τις χρησιμοποιούμε για τον συγκεκριμένο τύπο Τ και με μοναδικό συμβολικό όνομα της επιλογής μας 5.Στο πρόγραμμά μας αναφερόμαστε στις σειρές αυτής της παραμέτρου μέσω του συμβολικού ονόματος, και με εκφραστικό τρόπο που «αρμόζει» στον τύπο δεδομένων Τ
Αυτοματοποίηση χρήσης τετραδίου (2/3) Η ευθύνη μας ως προγραμματιστές: 1.Προσδιορισμός κατάλληλου τύπου Τ 2.Δήλωση συμβολικού αναγνωριστικού Α τύπου Τ Δηλ. δήλωση μεταβλητής Α τύπου Τ 3.Χρήση της μεταβλητής Α στο πρόγραμμά μας «όπως πρέπει» Ενώ ο υπηρέτης αναλαμβάνει: 1.Να βρει τόσες ελεύθερες θέσεις μνήμης όσες αποθηκευτικά χρειάζεται ο συγκεκριμένος τύπος Τ 2.Να τις αντιστοιχίσει με το συμβολικό αναγνωριστικό Α 3.Να αντικαταστήσει όλες τις αναφορές μέσω του αναγνωριστικού Α στις κατάλληλες αναφορές σε συγκεκριμένες σειρές του τετραδίου
Αυτοματοποίηση χρήσης τετραδίου (3/3) Το πρόγραμμα απόλυτης τιμής με δύο τρόπους Με αυτόματη χρήση μνήμης Με χειροκίνητη χρήση μνήμης REAL x; INPUT(x);INPUT(POSITION(0,0)); IF x >= 0 THEN OUTPUT(x); ELSE OUTPUT(–x); IF POSITION(0,0) >= 0 THEN OUTPUT(POSITION(0,0)); ELSE OUTPUT(-POSITION(0,0)); Εάν δεν δοθεί αριθμός, ο υπηρέτης θα βγάλει runtime error στην εντολή εισόδου. Εάν δεν δοθεί αριθμός, ο υπηρέτης θα βγάλει runtime error στην εντολή υπολογισμού του αντίθετου αριθμού.
Εντολή εκχώρησης (1/4) Είναι της μορφής Μεταβλητή = Έκφραση; Μεταβλητή είναι ένα αναγνωριστικό όνομα ή έκφραση μεταβλητής (που έχει δηλωθεί στο πρόγραμμα) Έκφραση μπορεί να είναι (προς το παρόν) –Μεταβλητή x, y, P[9], arxh.x, telos.y –Αριθμητική έκφραση (x+y)/2 * (arxh.x – telos.x)/2 –Ανάγνωση περιεχομένου από θυρίδα εισόδου Μετά την ανάγνωση το περιεχόμενο που διαβάστηκε αφαιρείται x = GETINPUT; P[3] = GETINPUT;
Εντολή εκχώρησης (2/4) Διευκρινίσεις για την GETINPUT –Στην έκφραση GETINPUT ο υπηρέτης κάνει τα εξής: Ζητάει από την είσοδο να του δώσετε κάποια τιμή. Επειδή δεν γνωρίζει τι τύπου πρόκειται να είναι η τιμή αυτή, θα δείτε να γράφεται GETINPUT, (undefined): Στην συνέχεια, αφού διαβάσει το περιεχόμενο της θυρίδας εισόδου που θα δώσετε, αντικαθιστά την έκφραση GETINPUT με την τιμή αυτή Π.χ. εάν έχουμε x = GETINPUT; και δώσετε την τιμή 42 ως είσοδο, ο υπηρέτης, αντικαθιστώντας την έκφραση GETINPUT με την τιμή 42, θα προχωρήσει στην εκτέλεση της εντολής εκχώρησης x=42;
Ένθετο - GETINPUT input Διάβασε από τα εισερχόμενα «κάτι» output Αποθήκευσέ το σε προσωρινή ελεύθερη θέση του τετραδίου Γράψε στα εξερχόμενα το περιεχόμενο αυτής της προσωρινής θέσης Το πρόγραμμα αυτό γράφει στην έξοδο ότι διαβάζει στην είσοδο ανεξαρτήτως τύπου (ήταν θέμα εξέτασης το 2005)
Εντολή εκχώρησης (3/4) Παράδειγμα εκχωρήσεων RECORD Point RECBEGIN INTEGER x,y; RECEND; Point first, last; INTEGER a, b; Ορισμός σύνθετου τύπου Δήλωση μεταβλητών first.x = GETINPUT; first.y = GETINPUT; last.x = GETINPUT; last.y = GETINPUT; a = last.x - first.x; b = last.y – first.y; Εκχώρηση από είσοδο Εκχώρηση αριθμ. έκφρασης
Εντολή εκχώρησης (4/4) a = last.x – first.x Θέση(σελίδα (last.x), σειρά (last.x) ) Θέση(σελίδα (first.x), σειρά (first.x) ) - Θέση( σελίδα (x), σειρά (x) ) Η παραπάνω εκχώρηση εκτελείται από τον υπηρέτη σε τέσσερα απλά βήματα: 1. Ανέλκυση περιεχομένου μεταβλητής (READ) 2. Ανέλκυση περιεχομένου μεταβλητής (READ) 3. Αφαίρεση (SUB) 4. Αποθήκευση αποτελέσματος σε μεταβλητή (WRITE)
Ένθετο εκχωρήσεις Έχω δύο μεταβλητές x και y. Θέλω να ανταλλάξω το περιεχόμενο τους, δηλ. αν x=5 και y=8 να γίνει x=8 και y=5. INTEGER x, y; PROGRAM_BEGIN INPUT(x); INPUT(y); OUTPUT(x); OUTPUT(y); /* Τι εντολή(-ες) γράφω εδώ? */ OUTPUT(x); OUTPUT(y); PROGRAM_END INTEGER temp; temp = x; x = y; y = temp; 1. Χρειάζομαι μία βοηθητική σειρά τετραδίου για να κρατήσω το περιεχόμενο της μεταβλητής που θα αλλάξει πρώτη! 2. Προφανώς πρέπει να αποθηκεύσω στην μεταβλητή temp την μεταβλητή που θα αλλάξει πρώτη…πριν την εντολή στην οποία αλλάζει! 3. Αλλάζουμε την πρώτη μεταβλητή εκχωρώντας την τιμή της δεύτερης 4. Αλλάζουμε την δεύτερη μεταβλητή εκχωρώντας την αποθηκευμένη τιμή της πρώτης
Αριθμητικές εκφράσεις (1/8) Είδαμε ήδη τις βασικές αριθμητικές πράξεις + * / - Για αυτές υπάρχουν κάποιοι κανόνες προτεραιότητας κατά την εκτέλεση –Το μοναδιαίο - έχει τη μεγαλύτερη προτεραιότητα –Ακολουθούν τα * / –Ακολουθούν τα + - Η έκφραση x * y + z / w * -k θα εκτελεστεί ως: –(x * y) + (( z / w) * (-k)) –…και όχι όπως θα υπολογίζονταν σε ένα κομπιουτεράκι τσέπης, δηλ. ως (((x * y) + z) / w) * (-k) –…ωστόσο εάν δεν θυμάστε ακριβώς τους κανόνες, βάλετε παρενθέσεις για να επιβάλλετε εσείς την επιθυμητή προτεραιότητα.
Αριθμητικές εκφράσεις (2/8) x * y + z / w * -k Υπολογισμός μίας αριθμητικής έκφρασης από τον υπηρέτη μας x y z w k* * - / + (x*y) αυτόματο ενδιάμεσο αποτέλεσμα (z/w) αυτόματο ενδιάμεσο αποτέλεσμα (-k) αυτόματο ενδιάμεσο αποτέλεσμα ((z/w) * (-k)) αυτόματο ενδιάμεσο αποτέλεσμα (x*y) + ((z/w) * (-k)) τελικό αποτέλεσμα Προηγείται η ανέλκυση περιεχομένου μεταβλητής, για κάθε μεταβλητή Αυτό ονομάζεται δέντρο αποτίμησης αριθμητικής έκφρασης Αυτό ονομάζεται δέντρο αποτίμησης αριθμητικής έκφρασης
Αριθμητικές εκφράσεις (3/8) Γιατί ο υπηρέτης δημιουργεί αυτό το δέντρο? –Οι βασικές αριθμητικές πράξεις είναι δυαδικές, δηλ. ορίζονται μόνο πάνω σε δύο ορίσματα κάθε φορά. –Επομένως πρέπει να υπολογιστούν τέτοια ζευγάρια, και έπειτα το αποτέλεσμα της κάθε πράξης να θεωρηθεί ως αυτοτελής τιμή που θα εμπλακεί σε επόμενη πράξη. –Π.χ. x+y+z σημαίνει (x+y) + z ή x + (y+z). Ο υπηρέτης προτιμά την πρώτη περίπτωση. –Για την αποθήκευση των ενδιάμεσων αποτελεσμάτων ο υπηρέτης χρησιμοποιεί και πάλι ελεύθερες σειρές του τετραδίου.
Αριθμητικές εκφράσεις (4/8) Παράδειγμα –a = (x1-y1) * (x2-y2) + (x3-y3) Κατειλημμένη (x1-y1) Κατειλημμένη (x1-y1) (x2-y2) Κατειλημμένη (x1-y1)*(x2-y2) (x2-y2) Κατειλημμένη (x1-y1)*(x2-y2) (x3-y3) Κατειλημμένη Αποτέλεσμα (x3-y3) Βήμα 1 Βήμα 2 x1 y1 - x2 y2 - x3 y3 - * + Βήμα 1 Βήμα 2 Βήμα 3 Βήμα 4 Βήμα 5 Βήμα 3 Βήμα 4 Βήμα 5
Αριθμητικές εκφράσεις (5/8) Επιπλέον υποστηρίζονται και οι παρακάτω μαθηματικές συναρτήσεις, για ορίσματα INTEGER ή REAL, τις οποίες ήδη γνωρίζει να τις υπολογίζει ο υπηρέτης: –Τετράγωνο, sqr(x) π.χ. η εκχώρηση z = sqr(x+y) σημαίνει για τον υπηρέτη: 1.Διάβασε τα περιεχόμενα των μεταβλητών x και y, 2.Πρόσθεσέ τα, 3.Βάλε το αποτέλεσμα ως όρισμα της συνάρτησης sqr, και υπολόγισέ την, 4.Εκχώρησε το αποτέλεσμα του υπολογισμού στη μεταβλητής z. –Τετραγωνική ρίζα, sqrt(x) –Ημίτονο, sin(θ), θ σε μοίρες –Συνημίτονο, cos(θ), θ σε μοίρες –Εφαπτομένη, tan(θ), θ σε μοίρες
Αριθμητικές εκφράσεις (6/8) Παράδειγμα (1/3) –Πρόβλημα Θέλουμε να προγραμματίσουμε τον υπηρέτη να υπολογίζει το μήκος των καθέτων πλευρών οποιουδήποτε ορθογώνιου τριγώνου, όταν δίνονται: –Μήκος υποτείνουσας Γ –Μία οξεία γωνία φ –Γεωμετρική λύση Α = cos(φ) * Γ Β = sin(φ) * Γ –Πρόγραμμα Παράμετροι είναι το φ και το Γ Μπορούμε να γράψουμε ένα πρόγραμμα που να υπολογίζει τη λύση? Γ Α Β φ
Αριθμητικές εκφράσεις (7/8) Παράδειγμα (2/3) REAL A, B, C, phi; 1. Δηλώσεις INPUT(phi); INPUT(C); 2. Είσοδος παραμέτρων A = cos(phi) * C; B = sin(phi) * C; 3. Υπολογισμός OUTPUT(A); OUTPUT(B); 4. Έξοδος αποτελεσμάτων Αυτή είναι και μία γενική δομή απλών προβλημάτων επιστημονικών υπολογισμών (scientific computation problems)
Αριθμητικές εκφράσεις (8/8) Παράδειγμα (3/3) Γ=120 Α=60 Β = Γ=78 Α=67.5 Β = Γ=112 Α=79.2 Β = Πάντοτε «τρέχουμε» αρκετές φορές το πρόγραμμά μας και πιστοποιούμε ότι οι λύσεις που παράγει ανταποκρίνονται στην πραγματικότητα.
Λογικές εκφράσεις (1/6) Ο υπολογισμός των λογικών εκφράσεων καταλήγει σε αποτέλεσμα που είναι αληθές (true) ή ψευδές (false). Οι λογικές εκφράσεις ανήκουν στις εξής κατηγορίες: –Συσχετιστικές με χρήση των δυαδικών τελεστών διάταξης. Επιτρέπονται μόνο μεταξύ αριθμών και strings (λεξικογραφική διάταξη): > >= < <= –Συσχετιστικές με χρήση των τελεστών ισότητας (επιτρέπονται για όλους τους τύπους): EQUAL DIFFERENT –Σύζευξης, διάζευξης και άρνησης (επιτρέπονται μόνο μεταξύ λογικών εκφράσεων και μεταβλητών τύπου BOOLEAN): AND OR NOT
Λογικές εκφράσεις (2/6) Παραδείγματα INTEGER x,y; PROGRAM_BEGIN INPUT(x); INPUT(y); OUTPUT(x > y); PROGRAM_END INTEGER x,y; BOOLEAN b; PROGRAM_BEGIN INPUT(x); INPUT(y); b = x > y; OUTPUT(b); PROGRAM_END
Λογικές εκφράσεις (3/6) Παραδείγματα STRING a,b; PROGRAM_BEGIN INPUT(a); INPUT(b); OUTPUT(a > b); PROGRAM_END Λεξικογραφική διάταξη για τιμές τύπου string INTEGER x,y,z; PROGRAM_BEGIN INPUT(x); INPUT(y); INPUT(z); OUTPUT((x+y) EQUAL (y+z) OR x DIFFERENT z); PROGRAM_END Αυτή η έκφραση είναι πάντα αληθής για κάθε x, y, z
Λογικές εκφράσεις (4/6) Πίνακες αποτίμησης εκφράσεων λογικών τελεστών OR, AND και NOT AND, Λογική σύζευξη Όρισμα 1Όρισμα 2Αποτέλεσμα TRUE FALSE TRUEFALSE OR, Λογική διάζευξη Όρισμα 1Όρισμα 2Αποτέλεσμα TRUE FALSETRUE FALSETRUE FALSE NOT, Λογική άρνηση ΌρισμαΑποτέλεσμα TRUEFALSE TRUE Προτεραιότητα NOT AND OR Οι λογικοί τελεστές έχουν μικρότερη προτεραιότητα από τους συσχετιστικούς, και αυτοί μικρότερη από τους αριθμητικούς
Λογικές εκφράσεις (5/6) Δέντρο αποτίμησης λογικών εκφράσεων –x >=y AND z < w OR NOT b Κατειλημμένη (x >= y) Κατειλημμένη (x >= y) (z < w) Κατειλημμένη (x>=y) AND (x<w) (z<w) Κατειλημμένη ( x>=y) AND (x<w) NOT b Κατειλημμένη Αποτέλεσμα NOT b Βήμα 1 Βήμα 2 x y >= z w < b AND Βήμα 1 Βήμα 2 Βήμα 3 Βήμα 4 Βήμα 5 Βήμα 3 Βήμα 4 Βήμα 5 OR NOT
Λογικές εκφράσεις (6/6) Από το σημείο αυτό, ο υπηρέτης γνωρίζει πώς να αποτιμήσει μία έκφραση που περιλαμβάνει αριθμητικούς, συγκριτικούς και λογικούς τελεστές με ένα μόνο δέντρο, …αφού γνωρίζει όλους τους κανόνες προτεραιότητας υπολογισμού εκφράσεων ( ) παρενθέσεις Αριθμητικές εκφράσεις Συγκριτικοί τελεστές Λογικοί τελεστές Αυξανόμενηπροτεραιότητα BOOLEAN b; PROGRAM_BEGIN INPUT(b); OUTPUT(b AND NOT b); OUTPUT(b OR NOT b); PROGRAM_END Προσοχή στον έλεγχο των λογικών εκφράσεων που γράφετε. Μπορούμε να ελέγξουμε και κάποιους κανόνες της λογικής.
Εντολές ελέγχου ροής Έως τώρα οι περισσότερες εντολές προέτρεπαν σε μία ακολουθιακή εκτέλεση, δηλ απλώς «η μία μετά την άλλη». Ωστόσο, θα πρέπει να μπορούμε να οδηγούμε τον υπηρέτη στην εκτέλεση εντολών –είτε υπό συνθήκη, δηλ. εάν «ισχύει κάτι», κάνουμε τον υπολογισμό Α, αλλιώς τον υπολογισμό Β –είτε επαναληπτικά, δηλ. κάνουμε τον υπολογισμό Α ως ότου πληρείται κάποια συγκεκριμένη τερματική συνθήκη Β –…άλλωστε κάτι τέτοιο έχουμε δει ότι υποστηρίζεται και σε απλά έγγραφα με οδηγίες που περιγράφουν κάποιες αλγοριθμικές διαδικασίες
Εκτέλεση υπό συνθήκη (1/5) Είναι γνωστή και σαν εντολή διακλάδωσης, έχοντας την παρακάτω γενική μορφή: –ΕΑΝ Λογική Έκφραση ΤΟΤΕ Εντολή 1 ΑΛΛΙΩΣ Εντολή 2 –IF Λογική Έκφραση THEN Εντολή 1 ELSE Εντολή 2 –Το υπογραμμισμένο τμήμα είναι προαιρετικό Όταν ο υπηρέτης καλείται να εκτελέσει μία τέτοια εντολή, κάνει τα εξής: 1.Υπολογίζει την τιμή της λογικής έκφρασης 2.Εάν είναι αληθής, προχωράει στην εκτέλεση της Εντολής 1 3.Αλλιώς (ψευδής), εάν έχει δοθεί και ELSE εντολή προχωρά στην εκτέλεση της Εντολή 2 4.Όταν βρίσκει ELSE το συσχετίζει πάντα με το πιο κοντινό IF ο οποίο δεν βρίσκεται μέσα σε άλλο block.
Εκτέλεση υπό συνθήκη (2/5) Παράδειγμα Υπολογισμός τετραγωνικής ρίζας αριθμού εισόδου REAL x; PROGRAM_BEGIN INPUT(x); IF x < 0 THEN OUTPUT("Square root of negative number!"); ELSE OUTPUT(sqrt(x)); PROGRAM_END
Εκτέλεση υπό συνθήκη (3/5) Αφού μία εντολή IF…THEN…ELSE ορίζεται ως εντολή, κανείς δεν εμποδίζει η Εντολή 1 ή Εντολή 2 να είναι και αυτές εντολές διακλάδωσης. Θέλουμε ένα πρόγραμμα που διαβάζει από την είσοδο τα μήκη των πλευρών ενός τριγώνου και να γράφει στην έξοδο εάν το τρίγωνο είναι ισόπλευρο, ισοσκελές ή σκαληνό. a b c 1.Αν a=b και b=c τότε ισόπλευρο 2.Αν a=b ή b=c ή a=c τότε ισοσκελές 3.Αν δεν ισχύει το 1 ή το 2, τότε σκαληνό
Εκτέλεση υπό συνθήκη (4/5) REAL a,b,c; PROGRAM_BEGIN INPUT(a); INPUT(b); INPUT(c); IF a EQUAL b AND b EQUAL c THEN OUTPUT("ISOPLEURO"); ELSE IF a EQUAL b OR a EQUAL c OR b EQUAL c THEN OUTPUT("ISOSKELES"); ELSE OUTPUT("SKALHNO"); PROGRAM_END Εδώ θα έπρεπε να βάλουμε και μία ακόμη εντολή διακλάδωσης για έλεγχο θετικών τιμών μήκους!!
Εκτέλεση υπό συνθήκη (5/5) Τέλος, υπάρχει και η περίπτωση των λεγόμενων «φωλιασμένων» εντολών διακλάδωσης. REAL x; PROGRAM_BEGIN INPUT(x); IF x < 0 THEN IF x < THEN OUTPUT("x in (-a, -1000)"); ELSE OUTPUT("x in [-1000, 0)"); ELSE IF x < 1000 THEN OUTPUT("x in [0, 1000)"); ELSE OUTPUT("x in [1000, +a)"); PROGRAM_END