el:school:lessons:programmatismos:pascal:askisi8b_sinthikes
Άσκηση 8b - Εισιτήρια - Πολλαπλές συνθήκες (and, or, not)
Στην προηγούμενη άσκηση είδαμε την χρήση της repeat .. until για επανάληψη και την const για δήλωση σταθερών - αποθηκευμένες μεταβλητές που δεν αλλάζουν τιμή.
Στην νέα άσκηση θα δούμε επιπλέον τα εξής :
ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ : Θα δημιουργήσουμε το νέο έργο 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%');
Συνδυασμένες συνθήκες με AND (και)
Έστω ότι έχει έκπτωση 30% ο επιβάτης εάν είναι
από 65 ετών και πάνω,
και βγάλει εισιτήριο με επιστροφή. Θέλουμε μία συνθήκη
ilikia >=65 και μια δεύτερη συνθήκη
epistrofi. Πρέπει να ισχύεί
και η μία περίπτωση
και η άλλη. Οπότε μέσα στην
if θα βάλουμε τις συνθήκες με το
and ανάμεσα (το
και στα αγγλικά). Αν ισχύουν και οι 2 τότε θα μας εμφανίζει ένα μήνυμα
Έχεις έκπτωση 30%.
if (ilikia >=65) and epistrofi then
writeln('Έχεις έκπτωση 30% επειδή είσαι από 65 και πάνω, και έβγαλες εισιτήριο με επιστροφή')
else
writeln('Δεν έχεις έκπτωση 30%');
ΠΡΟΣΘΗΚΗ 1
Έστω ότι έχουν έκπτωση 25% τα παιδιά από 6 έως και 12 ετών. Φτιάξτε το.
ΠΡΟΣΘΗΚΗ 2
Αρχικά θα πρέπει να π.χ. ρωτήσουμε Έκπτωση λόγω ΑΜΕΑ;(ν/ο) και να αποθηκεύσουμε σε μια 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€
el/school/lessons/programmatismos/pascal/askisi8b_sinthikes.txt · Last modified: Y/m/d H:i by vagk