====== Άσκηση 8 - Repeat Until, const και επανάληψη προηγουμένων ======
* Στην προηγούμενη άσκηση είδαμε την χρήση της case με πολλές εντολές, ακέραια διαίρεση και υπόλοιπο, τον τύπο μεταβλητής real και πως εμφανίζεται με την writeln
* Στην νέα άσκηση θα δούμε επιπλέον τα εξής :
* Χρήση **const** για δήλωση **σταθερών** - αποθηκευμένες μεταβλητές που δεν αλλάζουν τιμή.
* Επαναληπτική εκτέλεση εντολών μέχρι κάποια συνθήκη εξόδου με **repeat .. until**
* Επανάληψη των προηγουμένων - **mod, real if .. then .. else** κτλ.
- **ΑΝΟΙΓΜΑ ΕΡΓΟΥ** - Αν δεν είναι ήδη ανοιχτό, θα ανοίξουμε το υπάρχον έργο **epiloges** και το αρχείο **epiloges.pas**
- **ΠΡΟΣΘΗΚΗ 1 - χρήση const**
* Πολλές φορές στο πρόγραμμά μας υπάρχουν τιμές ή κείμενα που επαναλαμβάνονται. Για παράδειγμα ορίσαμε ότι εάν ο χρήστης πατήσει **x** το πρόγραμμα θα τερματίσει. Το x εμφανίζεται 2 φορές. Στην **writeln('x. Έξοδος');** και στην επιλογή της case **'x': writeln('Γεια..');**
- Στην θέση του **x** θα βάλουμε και στις 2 περιπτώσεις μια μεταβλητή π.χ. **pliktro_exodou**. Γνωρίζουμε πως βάζουμε μεταβλητές σε μια writeln και προσοχή πως θα την βάλουμε στην επιλογή της case.
- **Δεν** θα ορίσουμε το **pliktro_exodou** ως μεταβλητή στο var. Θα την ορίσουμε ως **σταθερά const**. Κάτω από το **uses** και πάνω από το **var** εισάγουμε const
pliktro_exodou = 'x';
- Μεταγλωττίζουμε το πρόγραμμα και ως χρήστης πατάμε **x** για έξοδο. Λειτουργεί όπως πριν;
- Έστω ότι θέλουμε να αλλάξουμε το πλήκτρο εξόδου από **x** σε **q** (από το quit). Αλλάξτε το.
* Πριν θα αλλάζαμε σε 2 σημεία τον κώδικα. Φανταστείτε να υπήρχε το x σε 5 ή περισσότερα σημεία. Τώρα αλλάζουμε μόνο ένα. Αυτή είναι μία από τις χρησιμότητες των σταθερών.
* Οι **σταθερές** έχουν επίσης την ασφάλεια ότι από την αρχή μέχρι το τέλος του προγράμματος κρατάνε την ίδια τιμή. **Δεν** μπορούμε μέσα στο πρόγραμμα να βάλουμε πιο μετά **pliktro_exodou:= 'z';**, οπότε προστατευόμαστε από πιθανά λάθη μας.
- **ΠΡΟΣΘΗΚΗ 2 - mod και if..then..else**
* Στην επιλογή 3 της case θέλουμε ο χρήστης να μας δώσει έναν ακέραιο αριθμό και να του απαντήσουμε αν είναι μονός ή ζυγός.
- Φτιάχνουμε λοιπόν τον κώδικα της επιλογής 3 ώστε να ζητάμε από τον χρήστη έναν αριθμό και να τον αποθηκεύουμε σε μία μεταβλητή π.χ. **akeraios3**.
- Το **mod** δηλαδή το **υπόλοιπο** της διαίρεσης ενός αριθμού με το 2 θα είναι είτε 0 είτε 1. Χρησιμοποιήστε σε μια **if** την πράξη **akeraios3 mod 2**. Αν είναι 0 εμφανίστε **Ο αριθμός //τάδε// είναι ζυγός** (όπου //τάδε// η αντίστοιχη μεταβλητή). Αλλιώς εμφανίστε **Ο αριθμός //τάδε// είναι μονός**. Δείτε την **άσκηση 5 - ergasia** για να θυμηθείτε την **if**.
- **ΠΡΟΣΘΗΚΗ 3 - Δομή επανάληψης repeat .. until**
* Το πρόγραμμά μας εκτελείται **1 μόνο φορά**, κάνει μία από τις 3 επιλογές ή στην 4η επιλογή δεν κάνει τίποτα. Θα ήταν πιο ωραίο εάν **επαναλάμβανε** την εκτέλεσή του ξανά και ξανά και **τερμάτιζε** μόνο στην 4η επιλογή εάν δηλαδή πατάγαμε το πλήκτρο εξόδου.
* Για να το κάνουμε αυτό θα βάλουμε όλο τον κώδικα του προγράμματος μέσα σε μια **repeat .. until**.
- Κάτω από το 1ο **BEGIN** όλου του προγράμματος βάζουμε ως 1η εντολή **repeat**.
- Επιλέγουμε όλο τον κώδικα κάτω από το **repeat** χωρίς το τελευταίο **END.** και πατάμε TAB ώστε να στοιχηθεί μία θέση δεξιά.
- Τέλος πάνω από το **END.** γράφουμε **until**.
BEGIN
repeat
textcolor(lightgreen);
textbackground(blue);
..
.. {Το υπόλοιπο πρόγραμμα}
..
else writeln('Λάθος επιλογή');
end;
until
END.
- Στην **until** πρέπει να βάλουμε την συνθήκη στην οποία θα τερματίσει το πρόγραμμά μας. Αυτή είναι όταν πατήσουμε σαν χρήστης το πλήκτρο εξόδου π.χ. **q**. Αυτό αποθηκεύεται στην μεταβλητή **epilogi**. Οπότε η **until** θα γίνει: until epilogi=pliktro_exodou;
- Το πρόγραμμά μας κάνει την επανάληψη αλλά αν έχουμε στην αρχή της **repeat** την εντολή **clrscr()** που καθαρίζει την οθόνη δεν προλαβαίνουμε να δούμε τα αποτελέσματα. **Πάνω** λοιπόν από την **until** πριν ξαναγυρίσει το πρόγραμμα στην αρχή της **repeat**, βάζουμε τις εξής εντολές:
writeln('Πατήστε ENTER');
readln;
until epilogi=pliktro_exodou;
* Η απλή **readln** περιμένει να διαβάσει μόνο το ENTER που πατάμε χωρίς αποθηκεύει τίποτα σε μεταβλητή. Έτσι μέχρι να πατήσουμε ENTER, μένουν στην οθόνη τα προηγούμενα αποτελέσματα .
- **BONUS**
- Για να κάνουμε πιο ωραίο το πρόγραμμά μας μπορούμε να βάλουμε μια **clrscr();** πριν τα μηνύματα στην Οθόνη **Διαίρεση Ακεραίων**, **Διαίρεση Πραγματικών** και **Μονά Ζυγά**
- **ΠΡΟΣΘΗΚΗ 4 - νέα επίλογή στην case**
- Θα εισάγουμε μια νέα επιλογή στο μενού **4. Χλμ σε μίλια**. Την προσθέτουμε μαζί με τις άλλες writeln που εμφανίζουν το μενού.
- Εισάγουμε την νέα επιλογή στην **case**.
- Θα ζητήσουμε από τον χρήστη να μας δώσει τα χλμ. Ότι πληκτρολογήσει θα το βάλουμε σε μια μεταβλητή **km**
- Τα μίλια υπολογίζονται εάν **διαιρέσουμε τα χλμ με 1.609**. Τα υπολογίζουμε και τα βάζουμε σε μια μεταβλητή **milia**. (Δείτε και τις εντολές στην Διαίρεση Πραγματικών).
- Τέλος θα εμφανίσουμε το μήνυμα **Τα //τόσα// χλμ είναι //τόσα// μίλια.** (όπου //τόσα// οι αντίστοιχες μεταβλητές). Εμφανίζουμε 1 δεκαδικό ψηφίο στις μεταβλητές. χωρίς στοίχιση. (Όπως στις εντολές στην Διαίρεση Πραγματικών - Άσκηση 7)
- Το **1.609** είναι τα χλμ που αντιστοιχούν σε 1 μίλι. Είναι μια τιμή που δεν αλλάζει. Θα την ορίσουμε λοιπόν ως μια **σταθερά** με όνομα **km_ana_mili**.
----
* **ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ**
* Στην προηγούμενη επέκταση είχαμε ένα μενού
1. Πρόσθεση
2. Αφαιρεση
3. Πολλαπλασιασμός
4. Διαίρεση
q. Έξοδος
* Τροποποιήστε την ώστε να έχει μία **σταθερά** για το πλήκτρο εξόδου.
* Κάντε την να εκτελείται συνέχεια με **repeat until**.
* Φτιάξτε την όμορφα με **χρώματα** και **clrscr()**.
* **ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ**
* Στην επέκταση που είχατε κάνει για να υπολογίσετε ευρώ σε δολάρια στην άσκηση **epiloges**, ορίστε το **1.3** να είναι **σταθερά** με όνομα π.χ. **isotimia**
* Βάλτε άλλη μία επιλογή για να υπολογίσετε **δολάρια σε ευρώ**
* Βάλτε άλλη μία επιλογή για να υπολογίσετε **μίλια σε km**