====== Άσκηση 8b - Εισιτήρια - Πολλαπλές συνθήκες (and, or, not) ====== * Στην προηγούμενη άσκηση είδαμε την χρήση της repeat .. until για επανάληψη και την const για δήλωση σταθερών - αποθηκευμένες μεταβλητές που δεν αλλάζουν τιμή. * Στην νέα άσκηση θα δούμε επιπλέον τα εξής : * 2 και περισσότερες συνθήκες συνδυασμένες με **AND** (και), **OR** (ή), **ΝΟΤ** (όχι) . - **ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ** : Θα δημιουργήσουμε το νέο έργο **eisitiria** * Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι **eisitiria** - **ΕΙΣΑΓΩΓΗ - μεταβλητή boolean** * Έστω ότι θέλουμε να αγοράσουμε εισιτήρια για μία διαδρομή με πλοίο. Το κόστος των εισιτηρίων θα εξαρτηθεί από πολλούς παράγοντες. Π.χ. εάν είναι με επιστροφή, εάν είμαστε κάτω από 10 ετών ή πάνω από 65, εάν είναι με κατάστρωμα ή καμπίνα κτλ. Πάμε να δούμε πως θα το φτιάξουμε σε pascal - Αρχικά θα εμφανίσουμε ένα μήνυμα στην οθόνη **ΑΓΟΡΑ ΕΙΣΙΤΗΡΙΩΝ**, μετά κενή γραμμή και μετά θα ζητήσουμε την ηλικία του : ΑΓΟΡΑ ΕΙΣΙΤΗΡΙΩΝ Δώσε ηλικία επιβάτη : - Θα διαβάσουμε την ηλικία και θα αποθηκεύσουμε σε μια μεταβλητή **ilikia** - Θα ρωτήσουμε εάν είναι φοιτητής εμφανίζοντας το μήνυμα **Είσαι φοιτητής (ν/ο);**. Θα διαβάσουμε την απάντηση και θα αποθηκεύσουμε σε μια μεταβλητή **apantisi**. - Ελέγχουμε εάν η απάντηση είναι **ν** (με μια if) και τότε βάζουμε τιμή **true** (αλήθεια/ισχύει) σε μια μεταβλητή **foititis**. Δηλαδή στο **then** της if θα βάλουμε **foititis:=true** - Αντίστοιχα στο **else** της if θα βάλουμε **foititis:=false;** (ψέματα/δεν ισχύει). - Η νέα μεταβλητή δεν είναι ούτε κείμενο, ούτε αριθμός, είναι ένας νέος τύπος που λέγεται **boolean** (λογικός) και παίρνει 2 τιμές μόνο **true** (αλήθεια/ισχύει) ή **false;** (ψέματα/δεν ισχύει). Θα τον δηλώσουμε στο var ως **foititis : boolean;** - Θα ρωτήσουμε επίσης εάν το εισιτήριο είναι με επιστροφή εμφανίζοντας το μήνυμα **Είναι με επιστροφή (ν/ο);**. Θα διαβάσουμε την απάντηση και θα αποθηκεύσουμε σε μια μεταβλητή **apantisi** - Με όμοιο τρόπο όπως πριν ελέγχουμε εάν η απάντηση είναι **ν** (με μια if) και τότε βάζουμε τιμή **true** (αλήθεια/ισχύει) στην μεταβλητή **epistrofi**. - Αντίστοιχα στο **else** της if θα βάλουμε τιμή **false** (ψέματα/δεν ισχύει) στην μεταβλητή **epistrofi**. - **ΣΥΝΘΗΚΕΣ με μεταβλητές boolean** - Ας εμφανίσουμε μια κενή γραμμή, στην συνέχεια ένα μήνυμα **ΕΜΦΑΝΙΣΗ ΕΚΠΤΩΣΕΩΝ** και άλλη μια κενή γραμμή μετά. - Έστω ότι έχουν έκπτωση 20% όσοι είναι φοιτητές. Η συνθήκη μας εδώ είναι απλή. Η μεταβλητή **foititis** θα πρέπει να έχει την τιμή **true** (αλήθεια, ισχύει). if foititis=true then writeln('Έχεις έκπτωση 20% επειδή είσαι φοιτητής') else writeln('Δεν έχεις έκπτωση 20%'); - Στις γλώσσες προγραμματισμού μια συνθήκη π.χ. ilikia>=65, ελέγχεται και βγάζει αποτέλεσμα την τιμή **true** (αλήθεια) αν ισχύει, π.χ. όταν η ηλικία είναι 70, ή false αν δεν ισχύει. Εμείς όμως έχουμε ήδη μια **boolean** μεταβλητή **foititis** με τιμές **true** ή **false**, οπότε δεν χρειάζεται ο έλεγχος (foititis=true). Μπορούμε να πάρουμε σαν αποτέλεσμα κατευθείαν την τιμή της και να την βάλουμε σκέτη, δηλαδή : if foititis then writeln('Έχεις έκπτωση 20% επειδή είσαι φοιτητής') else writeln('Δεν έχεις έκπτωση 20%'); - **Συνδυασμένες συνθήκες με OR (ή)** * Πάμε να δούμε πως θα συνδυάσουμε συνθήκες. - Έστω ότι έχει επίσης έκπτωση 20% ο επιβάτης εάν είναι **από 65 ετών και πάνω**. Θα βάλουμε λοιπόν και μια 2η συνθήκη **ilikia>=65**. Πρέπει να ισχύεί **ή** η μία περίπτωση **ή** η άλλη. Οπότε μέσα στην **if** θα βάλουμε τις συνθήκες με το **or** ανάμεσα (το //ή// στα αγγλικά). Προσοχή χρειάζονται παρενθέσεις στην 2η συνθήκη. if foititis or (ilikia >=65) then writeln('Έχεις έκπτωση 20% επειδή είσαι φοιτητής ή είσαι από 65 και πάνω') else writeln('Δεν έχεις έκπτωση 20%'); * Στον [[#πίνακας_αληθείας_or|Πίνακα Αληθείας OR]] θα συμβολίζουμε με **False** (ψέμα, δεν ισχύει) και με **Τrue** (αλήθεια, ισχύει) * Βλέπουμε ότι στις 3 από τις 4 περιπτώσεις το αποτέλεσμα είναι **True** (Αλήθεια, ισχύει), αρκεί να είναι Αλήθεια μία από τις 2 συνθήκες. - **Συνδυασμένες συνθήκες με AND (και)** - Έστω ότι έχει έκπτωση 30% ο επιβάτης εάν είναι **από 65 ετών και πάνω**, **και** βγάλει εισιτήριο με επιστροφή. Θέλουμε μία συνθήκη **ilikia >=65** και μια δεύτερη συνθήκη **epistrofi**. Πρέπει να ισχύεί **και** η μία περίπτωση **και** η άλλη. Οπότε μέσα στην **if** θα βάλουμε τις συνθήκες με το **and** ανάμεσα (το //και// στα αγγλικά). Αν ισχύουν και οι 2 τότε θα μας εμφανίζει ένα μήνυμα **Έχεις έκπτωση 30%**. if (ilikia >=65) and epistrofi then writeln('Έχεις έκπτωση 30% επειδή είσαι από 65 και πάνω, και έβγαλες εισιτήριο με επιστροφή') else writeln('Δεν έχεις έκπτωση 30%'); * Στον [[#πίνακας_αληθείας_and|Πίνακα Αληθείας AND]] θα συμβολίζουμε με **False** (ψέμα, δεν ισχύει) και με **Τrue** (αλήθεια, ισχύει) * Βλέπουμε ότι στις 3 από τις 4 περιπτώσεις το αποτέλεσμα είναι **True** (Αλήθεια, ισχύει), αρκεί να είναι Αλήθεια μία από τις 2 συνθήκες. - **ΠΡΟΣΘΗΚΗ 1** - Έστω ότι έχουν έκπτωση 25% τα παιδιά από 6 έως και 12 ετών. Φτιάξτε το. - **ΠΡΟΣΘΗΚΗ 2** * Έστω ότι έχει κάποιος έκπτωση 50% αν είναι Άτομο Με Ειδικές Ανάγκες (ΑΜΕΑ) ή εάν είναι σε πολύτεκνη οικογένεια. - Αρχικά θα πρέπει να π.χ. ρωτήσουμε **Έκπτωση λόγω ΑΜΕΑ;(ν/ο)** και να αποθηκεύσουμε σε μια **boolean** μεταβλητή π.χ. **amea** (όπως κάναμε στις περιπτώσεις φοιτητής, εισιτήριο με επιστροφή). Με όμοιο τρόπο και για το να ανήκει σε πολύτεκνη οικογένεια. Βάλτε τις εντολές πριν την **ΕΜΦΑΝΙΣΗ ΕΚΠΤΩΣΕΩΝ**. - Στην συνέχεια με μια συνδυαστική συνθήκη θα του πούμε εάν δικαιούται έκπτωση 50% ή όχι. - **ΤΡΟΠΟΠΟΙΗΣΗ 1** - Αλλάξτε λίγο την συνθήκη στην έκπτωση 30%, ώστε να έχουν έκπτωση όσοι είναι φοιτητές ή από 65 και πάνω και έχουν βγάλει εισιτήριο με επιστροφή. Αλλάξτε και το μήνυμα σε **Έχεις έκπτωση 30% επειδή είσαι φοιτητής ή είσαι από 65 και πάνω, και έβγαλες εισιτήριο με επιστροφή** - Δοκιμάστε σαν χρήστης να εισάγετε ότι είστε φοιτητής αλλά δεν θέλετε εισιτήριο με επιστροφή. Μήπως μας έβγαλε ότι δικαιούμαστε έκπτωση 30%; Τι συμβαίνει; * Η συνθήκη **foititis or (ilikia >=65) and epistrofi** είναι ίδια με την συνθήκη **foititis or ( (ilikia >=65) and epistrofi )**. Αυτό συμβαίνει γιατί το AND έχει προτεραιότητα από το OR. * Είναι παρόμοιο με το να γράφαμε **10 + 5 * 2**. Το ***** έχει προτεραιότητα από το + οπότε είναι ίδιο με **10 + (5 * 2)** με αποτέλεσμα **20**. Εάν θέλαμε να γίνει πρώτα η πράξη **10+5** θα έπρεπε να το βάλουμε σε παρένθεση, δηλαδή **(10 + 5) * 2** με αποτέλεσμα **30**. * Ακριβώς το ίδιο πρέπει να κάνουμε και εδώ πρέπει να βάλουμε σε παρένθεση το **foititis or (ilikia >=65)** ώστε να γίνει πρώτα αυτός ο έλεγχος, δηλαδή **( foititis or (ilikia >=65) ) and epistrofi**. Κάντε το και ελέγξτε πάλι. - **ΤΡΟΠΟΠΟΙΗΣΗ 2 - not** - Πολλές φορές θέλουμε να ελέγξουμε την αντίθετη από μία συνθήκη. Για παράδειγμα έστω ότι θέλουμε να ελέγξουμε αν κάποιος **ΔΕΝ** είναι ΑΜΕΑ. if not amea then writeln('Δεν ανήκεις στην κατηγορία ΑΜΕΑ'); - Έστω ότι θέλουμε να μην ανήκει στην κατηγορία AMEA και ούτε στους πολυτέκνους. Τότε θα προσθέταμε if not amea and not politeknos then writeln('Δεν ανήκεις στην κατηγορία ΑΜΕΑ ούτε σε πολύτεκνη οικόγενεια'); * Αλλά αυτή η περίπτωση είναι ακριβώς ίδια με την **else** της από πάνω συνθήκης **amea or politeknos**. * Δηλαδή όταν το **not amea and not politeknos** είναι **true** το **amea or politeknos** είναι **false**. * Οπότε είναι ίδια με την αντίθετη της, δηλαδή με την **not (amea or politeknos)**. Δοκιμάστε να βάλετε **not (amea or politeknos)** στην θέση του **not amea and not politeknos** * Γενικά **not P and not Q = not (P or Q)** * Και **not P or not Q = not (P and Q)** * Επίσης **ilikia>=65** ίδιο με **not (ilikia<65)**. Δηλαδή ηλικία **μεγαλύτερη ή ίση των 65** είναι ίδιο με ηλικία **όχι κάτω από 65**. Αλλάξτε λοιπόν την συνθήκη **foititis or (ilikia >=65)**. Προσοχή μην ξεχάσετε την επιπλέον παρένθεση. ===== Πίνακας Αληθείας OR ===== | ΦΟΙΤΗΤΗΣ | ilikia ^ foititis ^ (ilikia >=65) ^ foititis or (ilikia >=65) ^ | ΟΧΙ | 15 | False | False ^ False | | ΟΧΙ | 65 | False | True ^ True | | NAI | 20 | True | False ^ True | | ΝΑΙ | 70 | True | True ^ True | ===== Πίνακας Αληθείας AND ===== | ilikia | ΕΠΙΣΤΡΟΦΗ ^ (ilikia >=65) ^ epistrofi ^ (ilikia >=65) and epistrofi ^ | 15 | ΟΧΙ | False | False ^ False | | 20 | ΝΑΙ | False | True ^ False | | 70 | ΟΧΙ | True | False ^ False | | 65 | ΝΑΙ | True | True ^ True | ---- ===== Επεκτάσεις ===== * **ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** * Βάλτε όλον τον κώδικα σε μία επανάληψη. * Στο τέλος της θα ρωτάτε εάν θέλει ο χρήστης και άλλο εισιτήριο ώστε να ξαναγίνει η επανάληψη. Ως ναι θα δέχεστε τις απαντήσεις **'ν', 'Ν', 'n', 'Ν' (αγγλικό)**. * Αν δώσει τις παραπάνω απαντήσεις θα βάζετε τιμή σε μια boolean μεταβλητή **pali** * Στην συνθήκη εξόδου της επανάληψης θα ελέγχετε την μεταβλητή **pali**. * **ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** * Έστω το εισιτήριο κοστίζει **100€** γενικά. * Ποια θα είναι η τελική έκπτωση, δεδομένου θα εφαρμοστεί η **μεγαλύτερη** μόνο. (βοήθεια: επιπλέον μεταβλητή ekptosi, που θα παίρνει νέα τιμή μόνο αν η προηγούμενή τιμή της ήταν μικρότερη) * Ποια θα είναι η τελική τιμή του εισιτηρίου; * Αντί για σταθερή τιμή εισιτηρίου στα 100€ δώστε την δυνατότητα ο ταξιδιώτης να μπορεί να διαλέξει θέση με τιμές εισιτηρίου **Α Θέση 150€, Β Θέση 100€, Γ θέση 50€**