====== Άσκηση 10 - repeat, while, for ======
* Μέχρι τώρα έχουμε δει την **repeat ..until** για να εκτελούμε επαναληπτικά εντολές, **τουλάχιστον μία φορά** με **έλεγχο συνθήκης στο τέλος** της επανάληψης.
* Στην νέα άσκηση θα δούμε επιπλέον τα εξής :
* Επαναληπτική εκτέλεση εντολών με **while .. do** όσο ισχύει μια συνθήκη με **έλεγχο συνθήκης στην αρχή** της επανάληψης
* Επαναληπτική εκτέλεση εντολών με **for** όταν ξέρουμε τον αριθμό των επαναλήψεων από πριν. Π.χ. 5
- **ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ** : Θα δημιουργήσουμε το νέο έργο **mesos_oros**
* Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι **mesos_oros**
- **ΕΙΣΑΓΩΓΗ - repeat until**
* Έστω ότι θέλουμε να πάρουμε 3 βαθμούς από τον χρήστη και μετά να υπολογίσουμε τον μέσο όρο τους. Θα δούμε και τους 3 τρόπους επανάληψης **repeat .. until**, **while .. do** και **for**
- Πρώτα με **repeat .. until**. Εμφανίστε λοιπόν στην οθόνη ΕΠΑΝΑΛΗΨΗ με repeat .. until
----------------------------
- Στην συνέχεια θα ζητήσουμε από τον χρήστη να μας δώσει έναν βαθμό και θα αποθηκεύσουμε σε μια μεταβλητή π.χ. **vathmos**. Τις εντολές αυτές θα τις βάλουμε μέσα σε μια **repeat .. until**. Ακόμα δεν είμαστε σίγουροι για την συνθήκη εξόδου οπότε δεν την συμπληρώνουμε.
repeat
{εντολές - συμπληρώστε}
until {συνθήκη εξόδου - όχι ακόμα}
- Γνωρίζουμε ότι θέλουμε να γίνουν **3 επαναλήψεις**, οπότε θέλουμε να μετρήσουμε **από 1 έως 3**. Αυτό θα το κάνουμε με μια μεταβλητή που παίζει ρόλο **μετρητή**. Συνήθως τις ονομάζουμε απλά **i** ή **j** ή **x** ή **j** κτλ. Μέχρι τώρα το geany μας έβαζε στο var μια μεταβλητή **i** που την όριζε ως **byte** (δηλαδή μικρός θετικός ακέραιος από 0..255). Οπότε ορίζουμε την μεταβλητή **i** ως **integer** (ή ως byte)
- H **i** θα πάρει μια αρχική τιμή **1**, δηλαδή **i:=1;**. Αυτήν την τιμή την βάζουμε πριν την επανάληψη, **πάνω από το repeat**
- Στο τέλος της 1ης επανάληψης το **i** θα πρέπει **από 1 να γίνει 2**, οπότε τελευταία εντολή της επανάληψης, **πάνω από το until** βάζουμε **i:=i+1;**
* Στην **1η επανάληψη** το **i έχει τιμή 1** και στο τέλος της **γίνεται 2**
* Στην **2η επανάληψη** το **i έχει τιμή 2** και στο τέλος της **γίνεται 3**
* Στην **3η επανάληψη** το **i έχει τιμή 3** και στο τέλος της **γίνεται 4**
- Μόλις γίνει 4 θέλουμε να σταματήσουμε την επανάληψη, άρα συνθήκη εξόδου θα έχουμε **until i=4;** ή ακόμα καλύτερα για να δείχνει και τις επαναλήψεις **until i>3;**.
..
i:=i+1;
until i>3;
- Μπορούμε τώρα να βελτιώσουμε το μήνυμα **Δώσε βαθμό** ώστε να εμφανίζει δώσε **Δώσε 1ο βαθμό**, **Δώσε 2ο βαθμό** κτλ. Πως θα το κάνουμε;
- **ΥΠΟΛΟΓΙΣΜΟΣ ΑΘΡΟΙΣΜΑΤΟΣ**
* Για να υπολογίσουμε έναν μέσο όρο, πρέπει πρώτα να υπολογίσουμε το άθροισμα των 3 βαθμών. Η μεταβλητή **vathmos** αλλάζει σε κάθε επανάληψη, (μας δίνει νέο βαθμό ο χρήστης), οπότε η προηγούμενη χάνεται. Θέλουμε λοιπόν μια νέα μεταβλητή έστω **athroisma** για να αποθηκεύουμε κάθε φορά το μέχρι τότε άθροισμα.
* Αν στην **1η επανάληψη** μας δώσει ο χρήστης **βαθμό 8**. Τότε ο **vathmos είναι 8** και το **athroisma 8**
* Αν στην **2η επανάληψη** μας δώσει ο χρήστης **βαθμό 17**. Τότε ο **vathmos είναι 17** και το **athroisma είναι 8 + 17 -> 25**
* Αν στην **3η επανάληψη** μας δώσει ο χρήστης **βαθμό 12**. Τότε ο **vathmos είναι 12** και το **athroisma 25+12 -> 37**
- Δηλαδή το νέο athroisma είναι το προηγούμενο athroisma συν vathmos, δηλαδή
..
athroisma:=athroisma+vathmos;
i:=i+1;
until i>3;
- Όπως όμως το i ξεκινούσε από 1, έτσι και το άθροισμα έχει μια τιμή πριν την επανάληψη. Έχει την **τιμή 0**. **Πάνω από την repeat** δώστε αυτήν την τιμή στην μεταβλητή **athroisma**.
- **ΥΠΟΛΟΓΙΣΜΟΣ ΜΕΣΟΥ ΟΡΟΥ**
* Τώρα που γνωρίζουμε το athroisma θα διαιρέσουμε απλά με το 3 για να βρούμε τον μέσο όρο.
- Έστω μια νέα μεταβλητή **mo**. Κάντε την παραπάνω πράξη για να της δώσετε τιμή και δηλώστε την **mo** σωστά στο **var**. (Τι τύπου θα είναι;)
- Εμφανίστε τέλος ένα μήνυμα **Ο μέσος όρος σου είναι //τόσο//** (όπου //τόσο// ή σωστή μεταβλητή **με 1 δεκαδικό ψηφίο**)
- **ΕΠΑΝΑΛΗΨΗ με while**
*Θα κάνουμε την ίδια επανάληψη με πριν αλλά με χρήση της **while** .Δεν θα σβήσουμε τις προηγούμενες εντολές, θα τις κρατήσουμε για να βλέπουμε τις διαφορές και θα τις αντιγράψουμε για να τις αλλάξουμε.
- Αντιγράψτε λοιπόν, όλες τις εντολές που υπάρχουν μέσα στο **BEGIN .. END.** και επικολλήστε **πριν το END.**
- Αλλάξτε στο αντίγραφο στο 2ο **ΕΠΑΝΑΛΗΨΗ με repeat .. until** ώστε τώρα να λέει **ΕΠΑΝΑΛΗΨΗ με while**. ΠΡΟΣΟΧΗ ΟΧΙ ΣΤΟ ΠΡΩΤΟ!! Θα έχετε 2 αντίγραφα με τις ίδιες εντολές και θα άλλάξετε στο 2ο.
- Αλλάξτε την εντολή
repeat
ώστε να γίνει
while {συνθήκη} do
begin
- Αλλάξτε την εντολή
until i>3;
ώστε να γίνει
end;
-Η **repeat .. until** εκτελεί μια επανάληψη μέχρι η συνθήκη να ισχύσει (δηλαδή να γίνει **αλήθεια - true**) και τότε βγαίνει από την επανάληψη. Αντίθετα η **while** εκτελεί μια επανάληψη μέχρι η συνθήκη να πάψει να ισχύει (δηλαδή να γίνει **ψεμα - false**) και τότε βγαίνει από την επανάληψη. Άρα θέλουμε την ακριβώς αντίθετη συνθήκη από την **i>3**, δηλαδή
while i<=3 do
* Εκτός από την παραπάνω διαφορά, η βασική τους διαφορά είναι ότι η συνθήκη στην **repeat .. until** ελέγχεται **στο τέλος της επανάληψης**, άρα η επανάληψη εκτελείται **τουλάχιστον μία φορά**, ενώ στην **while** ελέγχεται **στην αρχή της επανάληψης**, άρα η επανάληψη **μπορεί να μην εκτελεστεί και καμία φορά.**
- **ΕΠΑΝΑΛΗΨΗ με for**
*Θα κάνουμε πάλι την ίδια επανάληψη με πριν αλλά με χρήση της **for** .Δεν θα σβήσουμε τις προηγούμενες εντολές, θα τις κρατήσουμε για να βλέπουμε τις διαφορές και θα τις αντιγράψουμε για να τις αλλάξουμε.
- Αντιγράψτε λοιπόν, όλες τις εντολές της **επανάληψης με while** και επικολλήστε **πριν το END.**
- Αλλάξτε το **ΕΠΑΝΑΛΗΨΗ με while** ώστε τώρα να λέει **ΕΠΑΝΑΛΗΨΗ με for**
- Αλλάξτε την εντολή
while i<=3 do
ώστε να γίνει
for i:=1 to 3 do
- Εδώ βλέπουμε ότι ξεκάθαρα λέμε ότι το i θα **ξεκινήσει από το 1 και θα φτάσει στο 3**. Οπότε είναι περιττές οι εντολές **i:=1;** και **i:=i+1;. Διαγράψτε τις.**
- **ΑΝΤΙΣΤΡΟΦΗ ΕΠΑΝΑΛΗΨΗ**
* Έστω ότι χρειάζεται να μετρήσουμε αντίστροφα 3..2..1
- Αλλάξτε στην **επανάληψη με repeat** ότι χρειάζεται στις εντολές που βάζουν τιμές στην **μεταβλητή i** και **στην συνθήκη της until**
- Ομοίως στην **επανάληψη με while**
- Ομοίως στην **επανάληψη με for**, βάζοντας **downto** (σημαίνει προς τα κάτω) αντί για **to**
- **ΑΛΛΑΓΗ αριθμού επαναλήψεων**
* Έστω ότι θέλουμε να μπορούμε να αλλάζουμε εύκολα τις συνολικές επαναλήψεις π.χ. 6 αντί για 3. Αντί να αλλάζουμε το 3 σε 6 σε ένα σωρό σημεία στο πρόγραμμά μας (8 σημεία εδώ) θα κάνουμε κάτι πιο έξυπνο.
- Ορίζουμε μια σταθερά **epanalipseis** με τιμή 3.
- Οπουδήποτε έχει το 3 στο πρόγραμμά μας αντικαθιστούμε με την παραπάνω σταθερά. (Μπορείτε να πάτε από το μενού **Αναζήτηση / Replace** και να κάνετε **Αναζήτηση για : 3** και **Αντικατάσταση με : epanalipseis**. ΠΡΟΣΟΧΗ! Προσεκτικά ένα, ένα, πατώντας **Αντικατάσταση**, μην αλλάξουμε κάτι που δεν πρέπει.)
- Τώρα μπορούμε να αλλάξουμε τις συνολικές επαναλήψεις π.χ. **σε 4** αλλάζοντας απλά την τιμή της σταθεράς **επαναλήψεις**
- **Επαναληπτικός έλεγχος με while**
* Η **while** είναι ιδανική για περιπτώσεις επαναληπτικού ελέγχου λαθών. Στην Άσκηση 9 στο παιχνίδι **Μάντεψε** με το που θα μας δώσει αριθμό ο χρήστης θα ελέγξουμε αν είναι θετικός. Αν δεν είναι θα εμφανίζουμε ένα κατάλληλο μήνυμα και θα ξαναζητάμε, μέχρι να μας δοθεί θετικός. Ο έλεγχος θα γίνει με **while** γιατί είναι επαναληπτικός και όχι με **if** που θα τον έκανε μία φορά μόνο.
- Ανοίγουμε την Άσκηση 9 το παιχνίδι **Μάντεψε**
- Μετά την εντολή **readln(mantepsia)** θα ξεκινήσουμε μια while με την συνθήκη που ο χρήστης έδωσε άκυρο αριθμό δηλαδή **mantepsia<=0**
while mantepsia<=0 do
begin
{εντολές}
end;
- Στις εντολές της **while**, θα εμφανίζουμε ένα μήνυμα ότι **Ο αριθμός θα πρέπει να είναι θετικός. Δώσε ξανά αριθμό** και θα ξαναδιαβάζουμε την **mantepsia** από τον χρηστη.
----
* **ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ**
- Όπως έγινε ο επαναληπτικός έλεγχος στο παιχνίδι **Μάντεψε** ώστε ο αριθμός που θα δίνει ο χρήστης να είναι πάντα θετικός, το ίδιο να γίνει και στην **Άσκηση 8** στην μετατροπή από km σε μίλια, ώστε τα km να είναι πάντα θετικός.
* **ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ**
* Στο παιχνίδι **blackjack** :