el:school:lessons:programmatismos:pascal:askisi10_while_for
Άσκηση 10 - repeat, while, for
Μέχρι τώρα έχουμε δει την repeat ..until για να εκτελούμε επαναληπτικά εντολές, τουλάχιστον μία φορά με έλεγχο συνθήκης στο τέλος της επανάληψης.
Στην νέα άσκηση θα δούμε επιπλέον τα εξής :
Επαναληπτική εκτέλεση εντολών με while .. do όσο ισχύει μια συνθήκη με έλεγχο συνθήκης στην αρχή της επανάληψης
Επαναληπτική εκτέλεση εντολών με for όταν ξέρουμε τον αριθμό των επαναλήψεων από πριν. Π.χ. 5
ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ : Θα δημιουργήσουμε το νέο έργο mesos_oros
ΕΙΣΑΓΩΓΗ - repeat until
Πρώτα με
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.
ΥΠΟΛΟΓΙΣΜΟΣ ΜΕΣΟΥ ΟΡΟΥ
Έστω μια νέα μεταβλητή mo. Κάντε την παραπάνω πράξη για να της δώσετε τιμή και δηλώστε την mo σωστά στο var. (Τι τύπου θα είναι;)
Εμφανίστε τέλος ένα μήνυμα Ο μέσος όρος σου είναι τόσο (όπου τόσο ή σωστή μεταβλητή με 1 δεκαδικό ψηφίο)
ΕΠΑΝΑΛΗΨΗ με 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
Αντιγράψτε λοιπόν, όλες τις εντολές της επανάληψης με while και επικολλήστε πριν το END.
Αλλάξτε το ΕΠΑΝΑΛΗΨΗ με while ώστε τώρα να λέει ΕΠΑΝΑΛΗΨΗ με for
Αλλάξτε την εντολή
while i<=3 do
ώστε να γίνει
for i:=1 to 3 do
Εδώ βλέπουμε ότι ξεκάθαρα λέμε ότι το i θα ξεκινήσει από το 1 και θα φτάσει στο 3. Οπότε είναι περιττές οι εντολές i:=1; και i:=i+1;. Διαγράψτε τις.
ΑΝΤΙΣΤΡΟΦΗ ΕΠΑΝΑΛΗΨΗ
Αλλάξτε στην επανάληψη με repeat ότι χρειάζεται στις εντολές που βάζουν τιμές στην μεταβλητή i και στην συνθήκη της until
Ομοίως στην επανάληψη με while
Ομοίως στην επανάληψη με for, βάζοντας downto (σημαίνει προς τα κάτω) αντί για to
ΑΛΛΑΓΗ αριθμού επαναλήψεων
Ορίζουμε μια σταθερά 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 να είναι πάντα θετικός.
el/school/lessons/programmatismos/pascal/askisi10_while_for.txt · Last modified: Y/m/d H:i by vagk