Table of Contents

Άσκηση 8b - Εισιτήρια - Πολλαπλές συνθήκες (and, or, not)

  1. ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ : Θα δημιουργήσουμε το νέο έργο eisitiria
    • Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι eisitiria
  2. ΕΙΣΑΓΩΓΗ - μεταβλητή boolean
    • Έστω ότι θέλουμε να αγοράσουμε εισιτήρια για μία διαδρομή με πλοίο. Το κόστος των εισιτηρίων θα εξαρτηθεί από πολλούς παράγοντες. Π.χ. εάν είναι με επιστροφή, εάν είμαστε κάτω από 10 ετών ή πάνω από 65, εάν είναι με κατάστρωμα ή καμπίνα κτλ. Πάμε να δούμε πως θα το φτιάξουμε σε pascal
    1. Αρχικά θα εμφανίσουμε ένα μήνυμα στην οθόνη ΑΓΟΡΑ ΕΙΣΙΤΗΡΙΩΝ, μετά κενή γραμμή και μετά θα ζητήσουμε την ηλικία του :
      ΑΓΟΡΑ ΕΙΣΙΤΗΡΙΩΝ
       
      Δώσε ηλικία επιβάτη : 
    2. Θα διαβάσουμε την ηλικία και θα αποθηκεύσουμε σε μια μεταβλητή ilikia
    3. Θα ρωτήσουμε εάν είναι φοιτητής εμφανίζοντας το μήνυμα Είσαι φοιτητής (ν/ο);. Θα διαβάσουμε την απάντηση και θα αποθηκεύσουμε σε μια μεταβλητή apantisi.
    4. Ελέγχουμε εάν η απάντηση είναι ν (με μια if) και τότε βάζουμε τιμή true (αλήθεια/ισχύει) σε μια μεταβλητή foititis. Δηλαδή στο then της if θα βάλουμε foititis:=true
    5. Αντίστοιχα στο else της if θα βάλουμε foititis:=false; (ψέματα/δεν ισχύει).
    6. Η νέα μεταβλητή δεν είναι ούτε κείμενο, ούτε αριθμός, είναι ένας νέος τύπος που λέγεται boolean (λογικός) και παίρνει 2 τιμές μόνο true (αλήθεια/ισχύει) ή false; (ψέματα/δεν ισχύει). Θα τον δηλώσουμε στο var ως foititis : boolean;
    7. Θα ρωτήσουμε επίσης εάν το εισιτήριο είναι με επιστροφή εμφανίζοντας το μήνυμα Είναι με επιστροφή (ν/ο);. Θα διαβάσουμε την απάντηση και θα αποθηκεύσουμε σε μια μεταβλητή apantisi
    8. Με όμοιο τρόπο όπως πριν ελέγχουμε εάν η απάντηση είναι ν (με μια if) και τότε βάζουμε τιμή true (αλήθεια/ισχύει) στην μεταβλητή epistrofi.
    9. Αντίστοιχα στο else της if θα βάλουμε τιμή false (ψέματα/δεν ισχύει) στην μεταβλητή epistrofi.
  3. ΣΥΝΘΗΚΕΣ με μεταβλητές boolean
    1. Ας εμφανίσουμε μια κενή γραμμή, στην συνέχεια ένα μήνυμα ΕΜΦΑΝΙΣΗ ΕΚΠΤΩΣΕΩΝ και άλλη μια κενή γραμμή μετά.
    2. Έστω ότι έχουν έκπτωση 20% όσοι είναι φοιτητές. Η συνθήκη μας εδώ είναι απλή. Η μεταβλητή foititis θα πρέπει να έχει την τιμή true (αλήθεια, ισχύει).
      if foititis=true then
          writeln('Έχεις έκπτωση 20% επειδή είσαι φοιτητής')
      else
          writeln('Δεν έχεις έκπτωση 20%');
    3. Στις γλώσσες προγραμματισμού μια συνθήκη π.χ. ilikia>=65, ελέγχεται και βγάζει αποτέλεσμα την τιμή true (αλήθεια) αν ισχύει, π.χ. όταν η ηλικία είναι 70, ή false αν δεν ισχύει. Εμείς όμως έχουμε ήδη μια boolean μεταβλητή foititis με τιμές true ή false, οπότε δεν χρειάζεται ο έλεγχος (foititis=true). Μπορούμε να πάρουμε σαν αποτέλεσμα κατευθείαν την τιμή της και να την βάλουμε σκέτη, δηλαδή :
      if foititis then
          writeln('Έχεις έκπτωση 20% επειδή είσαι φοιτητής')
      else
          writeln('Δεν έχεις έκπτωση 20%');
  4. Συνδυασμένες συνθήκες με OR (ή)
    • Πάμε να δούμε πως θα συνδυάσουμε συνθήκες.
    1. Έστω ότι έχει επίσης έκπτωση 20% ο επιβάτης εάν είναι από 65 ετών και πάνω. Θα βάλουμε λοιπόν και μια 2η συνθήκη ilikia>=65. Πρέπει να ισχύεί ή η μία περίπτωση ή η άλλη. Οπότε μέσα στην if θα βάλουμε τις συνθήκες με το or ανάμεσα (το ή στα αγγλικά). Προσοχή χρειάζονται παρενθέσεις στην 2η συνθήκη.
      if foititis or (ilikia >=65) then
          writeln('Έχεις έκπτωση 20% επειδή είσαι φοιτητής ή είσαι από 65 και πάνω')
      else
          writeln('Δεν έχεις έκπτωση 20%');
    • Στον Πίνακα Αληθείας OR θα συμβολίζουμε με False (ψέμα, δεν ισχύει) και με Τrue (αλήθεια, ισχύει)
    • Βλέπουμε ότι στις 3 από τις 4 περιπτώσεις το αποτέλεσμα είναι True (Αλήθεια, ισχύει), αρκεί να είναι Αλήθεια μία από τις 2 συνθήκες.
  5. Συνδυασμένες συνθήκες με AND (και)
    1. Έστω ότι έχει έκπτωση 30% ο επιβάτης εάν είναι από 65 ετών και πάνω, και βγάλει εισιτήριο με επιστροφή. Θέλουμε μία συνθήκη ilikia >=65 και μια δεύτερη συνθήκη epistrofi. Πρέπει να ισχύεί και η μία περίπτωση και η άλλη. Οπότε μέσα στην if θα βάλουμε τις συνθήκες με το and ανάμεσα (το και στα αγγλικά). Αν ισχύουν και οι 2 τότε θα μας εμφανίζει ένα μήνυμα Έχεις έκπτωση 30%.
      if (ilikia >=65) and epistrofi then
          writeln('Έχεις έκπτωση 30% επειδή είσαι από 65 και πάνω, και έβγαλες εισιτήριο με επιστροφή')
      else
          writeln('Δεν έχεις έκπτωση 30%');   
    • Στον Πίνακα Αληθείας AND θα συμβολίζουμε με False (ψέμα, δεν ισχύει) και με Τrue (αλήθεια, ισχύει)
    • Βλέπουμε ότι στις 3 από τις 4 περιπτώσεις το αποτέλεσμα είναι True (Αλήθεια, ισχύει), αρκεί να είναι Αλήθεια μία από τις 2 συνθήκες.
  6. ΠΡΟΣΘΗΚΗ 1
    1. Έστω ότι έχουν έκπτωση 25% τα παιδιά από 6 έως και 12 ετών. Φτιάξτε το.
  7. ΠΡΟΣΘΗΚΗ 2
    • Έστω ότι έχει κάποιος έκπτωση 50% αν είναι Άτομο Με Ειδικές Ανάγκες (ΑΜΕΑ) ή εάν είναι σε πολύτεκνη οικογένεια.
    1. Αρχικά θα πρέπει να π.χ. ρωτήσουμε Έκπτωση λόγω ΑΜΕΑ;(ν/ο) και να αποθηκεύσουμε σε μια boolean μεταβλητή π.χ. amea (όπως κάναμε στις περιπτώσεις φοιτητής, εισιτήριο με επιστροφή). Με όμοιο τρόπο και για το να ανήκει σε πολύτεκνη οικογένεια. Βάλτε τις εντολές πριν την ΕΜΦΑΝΙΣΗ ΕΚΠΤΩΣΕΩΝ.
    2. Στην συνέχεια με μια συνδυαστική συνθήκη θα του πούμε εάν δικαιούται έκπτωση 50% ή όχι.
  8. ΤΡΟΠΟΠΟΙΗΣΗ 1
    1. Αλλάξτε λίγο την συνθήκη στην έκπτωση 30%, ώστε να έχουν έκπτωση όσοι είναι φοιτητές ή από 65 και πάνω και έχουν βγάλει εισιτήριο με επιστροφή. Αλλάξτε και το μήνυμα σε Έχεις έκπτωση 30% επειδή είσαι φοιτητής ή είσαι από 65 και πάνω, και έβγαλες εισιτήριο με επιστροφή
    2. Δοκιμάστε σαν χρήστης να εισάγετε ότι είστε φοιτητής αλλά δεν θέλετε εισιτήριο με επιστροφή. Μήπως μας έβγαλε ότι δικαιούμαστε έκπτωση 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. Κάντε το και ελέγξτε πάλι.
  9. ΤΡΟΠΟΠΟΙΗΣΗ 2 - not
    1. Πολλές φορές θέλουμε να ελέγξουμε την αντίθετη από μία συνθήκη. Για παράδειγμα έστω ότι θέλουμε να ελέγξουμε αν κάποιος ΔΕΝ είναι ΑΜΕΑ.
       if not amea then 
          writeln('Δεν ανήκεις στην κατηγορία ΑΜΕΑ');
    2. Έστω ότι θέλουμε να μην ανήκει στην κατηγορία 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 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ

* ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ