Άσκηση 10 - repeat, while, for

  1. ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ : Θα δημιουργήσουμε το νέο έργο mesos_oros
    • Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι mesos_oros
  2. ΕΙΣΑΓΩΓΗ - repeat until
    • Έστω ότι θέλουμε να πάρουμε 3 βαθμούς από τον χρήστη και μετά να υπολογίσουμε τον μέσο όρο τους. Θα δούμε και τους 3 τρόπους επανάληψης repeat .. until, while .. do και for
    1. Πρώτα με repeat .. until. Εμφανίστε λοιπόν στην οθόνη
      ΕΠΑΝΑΛΗΨΗ με repeat .. until
      ----------------------------
    2. Στην συνέχεια θα ζητήσουμε από τον χρήστη να μας δώσει έναν βαθμό και θα αποθηκεύσουμε σε μια μεταβλητή π.χ. vathmos. Τις εντολές αυτές θα τις βάλουμε μέσα σε μια repeat .. until. Ακόμα δεν είμαστε σίγουροι για την συνθήκη εξόδου οπότε δεν την συμπληρώνουμε.
      repeat
       
         {εντολές - συμπληρώστε}
       
      until {συνθήκη εξόδου - όχι ακόμα}
    3. Γνωρίζουμε ότι θέλουμε να γίνουν 3 επαναλήψεις, οπότε θέλουμε να μετρήσουμε από 1 έως 3. Αυτό θα το κάνουμε με μια μεταβλητή που παίζει ρόλο μετρητή. Συνήθως τις ονομάζουμε απλά i ή j ή x ή j κτλ. Μέχρι τώρα το geany μας έβαζε στο var μια μεταβλητή i που την όριζε ως byte (δηλαδή μικρός θετικός ακέραιος από 0..255). Οπότε ορίζουμε την μεταβλητή i ως integer (ή ως byte)
    4. H i θα πάρει μια αρχική τιμή 1, δηλαδή i:=1;. Αυτήν την τιμή την βάζουμε πριν την επανάληψη, πάνω από το repeat
    5. Στο τέλος της 1ης επανάληψης το i θα πρέπει από 1 να γίνει 2, οπότε τελευταία εντολή της επανάληψης, πάνω από το until βάζουμε i:=i+1;
    • Στην 1η επανάληψη το i έχει τιμή 1 και στο τέλος της γίνεται 2
    • Στην 2η επανάληψη το i έχει τιμή 2 και στο τέλος της γίνεται 3
    • Στην 3η επανάληψη το i έχει τιμή 3 και στο τέλος της γίνεται 4
    1. Μόλις γίνει 4 θέλουμε να σταματήσουμε την επανάληψη, άρα συνθήκη εξόδου θα έχουμε until i=4; ή ακόμα καλύτερα για να δείχνει και τις επαναλήψεις until i>3;.
          ..
          i:=i+1;
      until i>3;
    2. Μπορούμε τώρα να βελτιώσουμε το μήνυμα Δώσε βαθμό ώστε να εμφανίζει δώσε Δώσε 1ο βαθμό, Δώσε 2ο βαθμό κτλ. Πως θα το κάνουμε;
  3. ΥΠΟΛΟΓΙΣΜΟΣ ΑΘΡΟΙΣΜΑΤΟΣ
    • Για να υπολογίσουμε έναν μέσο όρο, πρέπει πρώτα να υπολογίσουμε το άθροισμα των 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
    1. Δηλαδή το νέο athroisma είναι το προηγούμενο athroisma συν vathmos, δηλαδή
          ..
          athroisma:=athroisma+vathmos;
          i:=i+1;
      until i>3;
    2. Όπως όμως το i ξεκινούσε από 1, έτσι και το άθροισμα έχει μια τιμή πριν την επανάληψη. Έχει την τιμή 0. Πάνω από την repeat δώστε αυτήν την τιμή στην μεταβλητή athroisma.
  4. ΥΠΟΛΟΓΙΣΜΟΣ ΜΕΣΟΥ ΟΡΟΥ
    • Τώρα που γνωρίζουμε το athroisma θα διαιρέσουμε απλά με το 3 για να βρούμε τον μέσο όρο.
    1. Έστω μια νέα μεταβλητή mo. Κάντε την παραπάνω πράξη για να της δώσετε τιμή και δηλώστε την mo σωστά στο var. (Τι τύπου θα είναι;)
    2. Εμφανίστε τέλος ένα μήνυμα Ο μέσος όρος σου είναι τόσο (όπου τόσο ή σωστή μεταβλητή με 1 δεκαδικό ψηφίο)
  5. ΕΠΑΝΑΛΗΨΗ με while
    • Θα κάνουμε την ίδια επανάληψη με πριν αλλά με χρήση της while .Δεν θα σβήσουμε τις προηγούμενες εντολές, θα τις κρατήσουμε για να βλέπουμε τις διαφορές και θα τις αντιγράψουμε για να τις αλλάξουμε.
    1. Αντιγράψτε λοιπόν, όλες τις εντολές που υπάρχουν μέσα στο BEGIN .. END. και επικολλήστε πριν το END.
    2. Αλλάξτε στο αντίγραφο στο 2ο ΕΠΑΝΑΛΗΨΗ με repeat .. until ώστε τώρα να λέει ΕΠΑΝΑΛΗΨΗ με while. ΠΡΟΣΟΧΗ ΟΧΙ ΣΤΟ ΠΡΩΤΟ!! Θα έχετε 2 αντίγραφα με τις ίδιες εντολές και θα άλλάξετε στο 2ο.
    3. Αλλάξτε την εντολή
      repeat

      ώστε να γίνει

      while {συνθήκη} do
      begin
    4. Αλλάξτε την εντολή
      until i>3;

      ώστε να γίνει

      end;
    5. Η repeat .. until εκτελεί μια επανάληψη μέχρι η συνθήκη να ισχύσει (δηλαδή να γίνει αλήθεια - true) και τότε βγαίνει από την επανάληψη. Αντίθετα η while εκτελεί μια επανάληψη μέχρι η συνθήκη να πάψει να ισχύει (δηλαδή να γίνει ψεμα - false) και τότε βγαίνει από την επανάληψη. Άρα θέλουμε την ακριβώς αντίθετη συνθήκη από την i>3, δηλαδή
      while i<=3 do
    • Εκτός από την παραπάνω διαφορά, η βασική τους διαφορά είναι ότι η συνθήκη στην repeat .. until ελέγχεται στο τέλος της επανάληψης, άρα η επανάληψη εκτελείται τουλάχιστον μία φορά, ενώ στην while ελέγχεται στην αρχή της επανάληψης, άρα η επανάληψη μπορεί να μην εκτελεστεί και καμία φορά.
  6. ΕΠΑΝΑΛΗΨΗ με for
    • Θα κάνουμε πάλι την ίδια επανάληψη με πριν αλλά με χρήση της for .Δεν θα σβήσουμε τις προηγούμενες εντολές, θα τις κρατήσουμε για να βλέπουμε τις διαφορές και θα τις αντιγράψουμε για να τις αλλάξουμε.
    1. Αντιγράψτε λοιπόν, όλες τις εντολές της επανάληψης με while και επικολλήστε πριν το END.
    2. Αλλάξτε το ΕΠΑΝΑΛΗΨΗ με while ώστε τώρα να λέει ΕΠΑΝΑΛΗΨΗ με for
    3. Αλλάξτε την εντολή
      while i<=3 do

      ώστε να γίνει

      for i:=1 to 3 do
    4. Εδώ βλέπουμε ότι ξεκάθαρα λέμε ότι το i θα ξεκινήσει από το 1 και θα φτάσει στο 3. Οπότε είναι περιττές οι εντολές i:=1; και i:=i+1;. Διαγράψτε τις.
  7. ΑΝΤΙΣΤΡΟΦΗ ΕΠΑΝΑΛΗΨΗ
    • Έστω ότι χρειάζεται να μετρήσουμε αντίστροφα 3..2..1
    1. Αλλάξτε στην επανάληψη με repeat ότι χρειάζεται στις εντολές που βάζουν τιμές στην μεταβλητή i και στην συνθήκη της until
    2. Ομοίως στην επανάληψη με while
    3. Ομοίως στην επανάληψη με for, βάζοντας downto (σημαίνει προς τα κάτω) αντί για to
  8. ΑΛΛΑΓΗ αριθμού επαναλήψεων
    • Έστω ότι θέλουμε να μπορούμε να αλλάζουμε εύκολα τις συνολικές επαναλήψεις π.χ. 6 αντί για 3. Αντί να αλλάζουμε το 3 σε 6 σε ένα σωρό σημεία στο πρόγραμμά μας (8 σημεία εδώ) θα κάνουμε κάτι πιο έξυπνο.
    1. Ορίζουμε μια σταθερά epanalipseis με τιμή 3.
    2. Οπουδήποτε έχει το 3 στο πρόγραμμά μας αντικαθιστούμε με την παραπάνω σταθερά. (Μπορείτε να πάτε από το μενού Αναζήτηση / Replace και να κάνετε Αναζήτηση για : 3 και Αντικατάσταση με : epanalipseis. ΠΡΟΣΟΧΗ! Προσεκτικά ένα, ένα, πατώντας Αντικατάσταση, μην αλλάξουμε κάτι που δεν πρέπει.)
    3. Τώρα μπορούμε να αλλάξουμε τις συνολικές επαναλήψεις π.χ. σε 4 αλλάζοντας απλά την τιμή της σταθεράς επαναλήψεις
  9. Επαναληπτικός έλεγχος με while
    • Η while είναι ιδανική για περιπτώσεις επαναληπτικού ελέγχου λαθών. Στην Άσκηση 9 στο παιχνίδι Μάντεψε με το που θα μας δώσει αριθμό ο χρήστης θα ελέγξουμε αν είναι θετικός. Αν δεν είναι θα εμφανίζουμε ένα κατάλληλο μήνυμα και θα ξαναζητάμε, μέχρι να μας δοθεί θετικός. Ο έλεγχος θα γίνει με while γιατί είναι επαναληπτικός και όχι με if που θα τον έκανε μία φορά μόνο.
    1. Ανοίγουμε την Άσκηση 9 το παιχνίδι Μάντεψε
    2. Μετά την εντολή readln(mantepsia) θα ξεκινήσουμε μια while με την συνθήκη που ο χρήστης έδωσε άκυρο αριθμό δηλαδή mantepsia⇐0
      while mantepsia<=0 do
      begin
           {εντολές}
      end;
    3. Στις εντολές της while, θα εμφανίζουμε ένα μήνυμα ότι Ο αριθμός θα πρέπει να είναι θετικός. Δώσε ξανά αριθμό και θα ξαναδιαβάζουμε την mantepsia από τον χρηστη.

—-

* ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ

  1. Όπως έγινε ο επαναληπτικός έλεγχος στο παιχνίδι Μάντεψε ώστε ο αριθμός που θα δίνει ο χρήστης να είναι πάντα θετικός, το ίδιο να γίνει και στην Άσκηση 8 στην μετατροπή από km σε μίλια, ώστε τα km να είναι πάντα θετικός.