====== Άσκηση 4 - If then else ====== * Στην προηγούμενη άσκηση είδαμε πως ο ΗΥ αποθηκεύει τιμές σε μεταβλητές και κάνει πράξεις με αυτές. * Στην νέα άσκηση θα δούμε τα εξής : * Πως ελέγχουμε μια συνθήκη. Π.χ. **αν (if)** η αποθηκευμένη τιμή της μεταβλητής **pliromi_proion1** **είναι μικρότερη** από την αποθηκευμένη τιμή της μεταβλητής **kostos_proion1** **τότε (then)** να κάνουμε κάτι **αλλιώς (else)** να κάνουμε κάτι άλλο. - **ΑΝΟΙΓΜΑ ΕΡΓΟΥ** - Αν δεν είναι ήδη ανοιχτό, θα ανοίξουμε το υπάρχον έργο **agora** και το αρχείο **agora.pas** - **ΠΡΟΣΘΗΚΗ ΕΛΕΓΧΟΥ** * Μετά τις τελευταίες αλλαγές στην άσκηση 3, δηλώσαμε μια νέα μεταβλητή **pliromi_synolo** (ή άλλο όνομα που διαλέξατε εσείς) και ζητήσαμε από τον χρήστη να εισάγει το συνολικό ποσό πληρωμής. Επίσης καλό είναι να δηλωθεί (αν δεν το κάνατε ήδη) και μια μεταβλητή **kostos_synolo** (ή άλλο περιγραφικό όνομα που σας αρέσει) στην οποία θα αποθηκευτεί το συνολικό κόστος και των 2 προϊόντων. * **kostos_synolo:=kostos_proion1+kostos_proion2;** * Τα συνολικά ρέστα υπολογίζονται με μια απλή αφαίρεση και αποθηκεύονται στην μεταβλητή **resta_synolo** (ή άλλο περιγραφικό όνομα που σας αρέσει) * **ΠΡΟΒΛΗΜΑ : ** Αν ο χρήστης εισάγει ποσό μικρότερο από το συνολικό κόστος π.χ. 60€ αντί για τουλάχιστον 70€, εμείς θα του απαντήσουμε σαν να μην συμβαίνει τίποτα ότι τα ρέστα του είναι **-10€** και θα φύγει σίγουρα ευχαριστημένος! - Θα πρέπει λοιπόν να ελέγξουμε το ποσό που μας δίνει. Ο έλεγχος θα γίνει με την εντολή **if** και την σύγκριση των μεταβλητών και αν η πληρωμή είναι μικρότερη από το συνολικό κόστος, θα του εμφανίσουμε ένα μήνυμα ότι δεν μας έδωσε όλο το ποσό. Εισάγουμε : if pliromi_synolo < kostos_synolo then writeln('Παρακαλώ δώστε όλο το ποσό'); - Αλλιώς, **(else)**, είμαστε εντάξει. Οπότε τις εντολές που υπολογίζουν τα συνολικά ρέστα και τα εμφανίζουν στην οθόνη θα τις βάλουμε μέσα στο αλλιώς **(else)**. Και επειδή είναι 2 εντολές θα τις βάλουμε μέσα σε **begin .. end** if pliromi_synolo < kostos_synolo then writeln('Παρακαλώ δώστε όλο το ποσό') else begin resta_synolo:=pliromi_synolo - kostos_synolo; writeln('Μου έδωσες ', pliromi_synolo, '€. Τα ρέστα σου είναι ', resta_synolo, '€'); end * Μετά το **then**, //(τότε)//, είχαμε μία εντολή, οπότε δεν χρειαστήκαμε **begin .. end**. Θα μπορούσαμε να βάλουμε, αλλά είναι περιττό. * Επίσης η pascal έχει μία ιδιαιτερότητα στην σύνταξη, **αν έχουμε μόνο μια εντολή πριν από το else δεν βάζουμε ερωτηματικό**. Απλά θα το θυμόμαστε.. - **ΑΛΛΑΓΕΣ 1 - Ανάποδη συνθήκη** * Είδαμε ότι μέσα στην συνθήκη συγκρίνουμε μεταβλητές που περιέχουν αριθμούς, (δεν μπορούμε κείμενα). Ας δούμε και ένα πίνακα με όλες τις [[el:school:lessons:programmatismos:pascal:sinthikes]]. * Θα αλλάξουμε την συνθήκη της **if** με την αντίθετή της, δηλαδή, εάν το ποσό πληρωμής που δώσαμε είναι **μεγαλύτερο ή ίσο** με το κόστος των προϊόντων. - Αλλάζουμε την συνθήκη λοιπόν και μεταφέρουμε αντίστοιχα τις εντολές που θα εκτελεστούν αν ισχύει και αν δεν ισχύει. - Επίσης κάνουμε πιο περιγραφική την απάντηση **Παρακαλώ δώστε όλο το ποσό. Το συνολικό κόστος είναι //τόσα// €.** (Εννοείται ότι όπου //τόσα// Θα εμφανίσουμε την τιμή της μεταβλητής που περιέχει το συνολικό κόστος) - **ΑΛΛΑΓΕΣ 2 - Ιδιαιτερότητες στην σύνταξη** - Γράφουμε μία τελευταία εντολή μετά από όλη την **if .. then .. else** και πριν το **END.** που να εμφανίζει το κείμενο **-->>ΤΕΛΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ<<--** - Μήπως η μεταγλώττιση απέτυχε; Αν ναί, **ΠΡΟΣΟΧΗ!!** Αν έχουμε **1 εντολή μετά το else __βάζουμε__** στο τέλος ερωτηματικό, ενώ πριν είδαμε ότι με **1 εντολή μετά το then __δεν βάζουμε__** - Στην τελευταία εντολή πριν το END. αφαιρέστε το ερωτηματικό. Ομοίως αφαιρέστε το και στην τελευταία εντολή πριν το end της συνθήκης. - Κάντε ξανά μεταγλώττιση. Γίνεται με επιτυχία! Πριν από κάθε **end** το ερωτηματικό είναι προεραιτικό! * Για να μην μπερδευτούμε : **Εμείς θα βάζουμε πάντα ερωτηματικό στο τέλος κάθε εντολής, εκτός στο τέλος μίας μόνο εντολής μετά το then και πριν το else** - **ΑΛΛΑΓΕΣ 3 - Συντομότερες δηλώσεις** * Έστω ότι είμαστε 10 άτομα και χωριζόμαστε σε 2 ομάδες για να παίξουμε κάποιο άθλημα. Τι θα λέγαμε; Ο Γιώργος είναι στην 1η ομάδα, ο Νίκος είναι στην 2η ομάδα, η Μαρία είναι στην 1η ομάδα, ο Τάσος είναι στην 1η ομάδα, η Χριστίνα είναι στην 2η ομάδα.. ;; Μάλλον θα λέγαμε : Ο Γιώργος, η Μαρία, ο Τάσος είναι στην 1η ομάδα. Ο Νίκος, η Χριστίνα είναι στην 2η ομάδα.. * Πάμε να κάνουμε κάτι ανάλογο στις δηλώσεις, δηλώνοντας πολλές μεταβλητές ότι είναι ίδιου τύπου, χωρίζοντάς τις με **,** . * Στην Pascal ισχύει ότι οι δηλώσεις : kostos_proion1 : integer; kostos_proion2 : integer; * είναι όμοιες με τις δηλώσεις : kostos_proion1, kostos_proion2 : integer; - Με τον παραπάνω τρόπο, μαζεύουμε όλες τις δηλώσεις που είναι 6-7 γραμμές, σε 2 γραμμές. ---- * **ΕΠΕΚΤΑΣΗ / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** * Δείτε την επέκταση της προηγούμενης άσκησης, όπου ο Κώστας είναι 12 χρονών και λαμβάνουμε από τον χρήστη το όνομα και την ηλικία του. * Στο τέλος της θα ελέγξουμε αν ο χρήστης είναι μεγαλύτερος από τον Κώστα. Αν είναι, θα υπολογίσουμε πόσα χρόνια και θα εμφανίσουμε μήνυμα **Είσαι //τόσα// χρόνια μεγαλύτερος** (όπου //τόσα// η διαφορά τους). Αλλιώς θα εμφανίσουμε μήνυμα **Είσαι //τόσα// χρόνια μικρότερος.** * Τι γίνεται αν ο χρήστης είναι 12 χρονών; Θα εμφανίσει **Είσαι 0 χρόνια μικρότερος** που δεν είναι ωραίο. Υπομονή μέχρι την επόμενη άσκηση που θα το φτιάξουμε και αυτό με επιπλέον **if** μέσα στο **then** ή στο **else (εμφωλιασμένες if)**. Σκεφτείτε το..