====== Άσκηση 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**