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