ΕΡΓΑΣΤΗΡΙΟ 7 Ο Η ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ Εντολές Επανάληψης REPEAT UNTIL, FOR, WHILE Βασικές Έννοιες: Δομή Επανάληψης, Εντολές Επανάληψης (For, While do, Repeat until), Αλγόριθμος, Αθροιστής, Μετρητής, Παράσταση και Αποθήκευση Δεδομένων, Μνήμη ΑΠΑΙΤΟΥΜΕΝΗ ΥΛΗ Κεφάλαια 5 της PASCAL, Σ. Πανέτσος Σελίδες 121 133 7.1 ΣΚΟΠΟΣ ΤΗΣ ΕΡΓΑΣΤΗΡΙΑΚΗΣ ΑΣΚΗΣΗΣ Η άσκηση αυτή αναφέρεται για μια ακόμα φορά στις εντολές επανάληψης και αποσκοπεί να αναδείξει τη μορφή, τη χρησιμότητα και τη λειτουργία αυτών των εντολών σε ένα πρόγραμμα. Έτσι, με την ολοκλήρωση αυτής της άσκησης θα πρέπει να ξέρουμε: α) Σε τι χρησιμεύουν οι εντολές επανάληψης, β) πότε και πώς χρησιμοποιούνται στο κώδικα ενός προγράμματος, γ) ποιά είναι τα βασικά στοιχεία αυτών των εντολών, πως αυτά ορίζονται και επιτρέπουν την επαναληπτική εκτέλεση μίας ομάδας εντολών κατά την εκτέλεση του προγράμματος. 7.2 ΣΥΝΟΠΤΙΚΗ ΘΕΩΡΙΑ Εντολές Επανάληψης στη PASCAL Στο προηγούμενο εργαστήριο εξετάσαμε δύο από τις εντολές επανάληψης της PASCAL, τη for και τη while. Σ αυτό το εργαστήριο εξετάζουμε τη τρίτη από τις εντολές επανάληψης, τη repeat until. 1
7.2.1 Η ΕΝΤΟΛΗ REPEAT UNTIL Η γενική μορφή της repeat until είναι: repeat Εντολή 1; Εντολή 2; Η εκτέλεση των εντολών μεταξύ των λέξεων repeat και until επαναλαμβάνεται μέχρι η συνθήκη να μήν ισχύει. Εντολή ν συνθήκη εξόδου. until λογική συνθήκη; Επόμενη εντολή; Η ακολουθία Εντολή 1, Εντολή 2,..., Εντολή ν εκτελείται και μετά εξετάζεται η λογική συνθήκη, μετά το until. Εάν η λογική συνθήκη δεν ισχύει, τότε η ροή εκτέλεσης του προγράμματος επανέρχεται στο repeat και η εκτέλεση της ακολουθίας Εντολή 1, Εντολή 2,..., Εντολή ν επαναλαμβάνεται. Μετά από κάθε επαναληπτική εκτέλεση των Εντολή 1, Εντολή 2,..., Εντολή ν, η συνθήκη επανεξετάζεται. Όσο αυτή η συνθήκη εξακολουθεί να μήν ισχύει, η εκτέλεση των Εντολή 1, Εντολή 2,..., Εντολή ν επαναλαμβάνεται. Όταν η συνθήκη γίνει αληθής, η επανάληψη σταματάει και η εκτέλεση του προγράμματος μεταφέρεται στην επόμενη εντολή μετά την repeat until. Σημείωση 1 Όπως και η εντολή while, η repeat until χρησιμοποιείται όταν δεν ξέρουμε από πρίν πόσες ακριβώς φορές θα χρειαστεί να επαναληφθεί η εκτέλεση μίας εντολής, ή μίας ομάδας εντολών. Αυτός, ο αριθμός των επαναλήψεων καθορίζεται δυναμικά, δηλαδή κατά την εκτέλεση του προγράμματος, στη βάση μίας συνθήκης. Σημείωση 2 Στην εντολή while, η λογική συνθήκη ελέγχεται πρίν από κάθε επανάληψη. Αντίθετα, στη repeat until η συνθήκη ελέγχεται μετά από κάθε επανάληψη. Έτσι, οι εντολές που βρίσκονται μεταξύ των λέξεων repeat και until θα εκτελεστούν τουλάχιστον μία φορά, πρίν ελεγχθεί η λογική συνθήκη. Παράδειγμα Ένα άλλο παράδειγμα προβλήματος που η λύση του απαιτεί την επαναληπτική εκτέλεση μιας ενέργειας είναι να εξετάσουμε εάν ένας φυσικός αριθμός είναι πρώτος, εάν δηλαδή δεν έχει άλλους διαιρέτες, εκτός από το 1 και τον εαυτό του. Αν και υπάρχει ένας πολύ γρήγορος τρόπος / αλγόριθμος για να εξετάζουμε εάν ένας αριθμός είναι πρώτος, ο πλέον απλός τρόπος για να δούμε έαν ένας αριθμός x είναι πρώτος είναι να εξετάσουμε εάν αυτός διαιρείται απο τους αριθμούς 2, 3,..., x (μέχρι τη 2
τετραγωνική ρίζα του x, γιατί εαν ο x δεν διαιρείται απο κανένα αριθμό μικρότερο ή ίσο της τετραγωνικής ρίζας του ( x), τότε δεν θα διαιρείται από κανένα αριθμό μεγαλύτερο της x). Δηλαδή για οποιοδήποτε αριθμό x, για να βρούμε τους διαιρέτες του θα πρέπει να διαιρέσουμε τον x κατά σειρά με τους αριθμούς 2, 3,, x. Η πράξη που επαναλαμβάνεται είναι η διαίρεση, αν και με διαφορετικό κάθε φορά διαιρέτη. Ο αλγόριθμος αυτός έχει τη σχηματική μορφή: Διαβάζουμε τον x Θέτουμε δ = 2 Εξετάζουμε εάν ο αριθμός δ διαιρεί ακριβώς τον x. x Υ δ π Εαν Υ == 0, τότε γράφουμε τον δ στην έξοδο ως διαιρέτη του x δ := δ + 1 Εαν δ <= x, επαναλαμβάνουμε τη παραπάνω διαδικασία 3
program protoi; var N, i : integer; orio : real; prime : boolean; begin writeln( Δώσε έναν ακέραιο αριθμό ); readln(n); orio := sqrt(n); i := 2; repeat prime := N mod i; i := i +1 until not prime or (i > orio); writeln(n, prime) end. Η ανάγκη να επαναλάβουμε πολλές φορές ένα βήμα, ή στάδιο σ έναν αλγόριθμο, όπως την είδαμε στον αλγόριθμο για τους διαιρέτες ενός αριθμού εμφανίζεται τόσο συχνά και είναι τόσο απαραίτητη στο προγραμματισμό, ώστε οι εντολές επανάληψης να αποτελούν βασικό στοιχείο, όχι μόνον στη PASCAL, αλλά σε κάθε γλώσσα προγραμματισμού. 4
ΕΡΓΑΣΤΗΡΙΟ 7 Εισαγωγή στο Προγραμματισμό με τη PASCAL & τη MATLAB Εντολές Επανάληψης Όνομα: Ενότητα 1: Θεωρητικό Μέρος 1. Γράψτε την εντολή επανάληψης που χρησιμοποιούμε, για να διαβάσουμε τις 10 παρακάτω τιμές, από έναν αισθητήρα: 0.0 132.5 1.0 147.2 2.0 148.5 3.0 157.3 4.0 163.2 5.0 158.2 6.0 169.3 7.0 148.2 8.0 137.6 9.0 135.9 <Ctrl-Z> Ενότητα 2 Εργαστηριακό Μέρος 2. Γράψτε ένα πρόγραμμα που να διαβάζει δύο ακέραιους αριθμούς a και b, από την οθόνη και να εξετάζει εάν ο δεύτερος (ο b) διαιρεί τον a. 5
3. Γράψτε ένα πρόγραμμα που να διαβάζει από την οθόνη το μήκος (l), τη διατομή (S) και το ρεύμα (I), σ ένα αγωγό (στο καλώδιο μίας ηλεκτρικής γραμμής). Το πρόγραμμα θα πρέπει να υπολογίζει την εσωτερική αντίσταση (R) και τη πτώση τάσης (ΔV), στον αγωγό, από τους τύπους, της εσωτερικής αντίστασης ενός αγωγού και της πτώσης τάσης. Η αντίσταση ενός αγωγού υπολογίζεται από το τύπο: ρ l R = S όπου ρ = 0,017 Ω mm 2 /m, για το χαλκό. Έτσι, η πτώση τάσης στα άκρα του αγωγού είναι: ΔU = ρ I l S Το πρόγραμμα θα πρέπει ακόμα να ελέγχει εάν η πτώση τάσης είναι μικρότερη την επιτρεπτή πτώση τάσης των 9,2 V. Εάν η πτώση τάσης είναι μικρότερη, ή ίση με αυτό το όριο, το πρόγραμμα θα πρέπει να γράφει στην οθόνη, το μήνυμα: Επιτρεπτή Διατομή. Διαφορετικά, θα πρέπει να γράφει στην οθόνη, Μη Επιτρεπτή Διατομή. 6
4. Γράψτε ένα πρόγραμμα για να διαβάζει τις τιμές που έχουν καταγραφεί από ένα αισθητήρα και να υπολογίζει και να εκτυπώνει τη μέγιστη, την ελάχιστη και τη μέση τιμή αυτών των δεδομένων. Οι μετρήσεις από τον αισθητήρα έχουν τη παρακάτω μορφή: 0.0 132.5 1.0 147.2 2.0 148.5 3.0 157.3 4.0 163.2 5.0 158.2 6.0 169.3 7.0 148.2 8.0 137.6 9.0 135.9 <Ctrl-Z> H πρώτη στήλη παριστάνει χρονικές στιγμές (t) και η δεύτερη τις τιμές ταχύτητας (v), για τις αντίστοιχες χρονικές στιγμές. Η εισαγωγή των δεδομένων τερματίζεται, πατώντας το χαρακτήρα Ctrl-Z. Αλγόριθμος 1. Μέση Τιμή: Για να υπολογίσουμε τη μέση τιμή, χρειάζεται να υπολογίσουμε το άθροισμα όλων των τιμών. Επομένως, χρησιμοποιούμε μία μεταβλητή που την ονομάζουμε athroisma, για να υπολογίσουμε και να αποθηκεύσουμε σ αυτή, το άθροισμα όλων των τιμών 2. Στη μεταβλητή athroisma, δίνουμε την αρχική τιμή μηδέν (0) 3. Καθώς διαβάζουμε κάθε μέτρηση, από τον αισθητήρα, προσθέτουμε αυτή τη τιμή μέτρησης, στη μεταβλητή athrorisma 4. Μέγιστος & Ελάχιστος: Παίρνουμε τη πρώτη μέτρηση που διαβάζουμε να είναι ταυτόχρονα η μεγίστη και η ελάχιστη μέτρηση 5. Καθώς διαβάζουμε κάθε επόμενη μέτρηση, τη συγκρίνουμε με τη μέχρι τώρα μέγιστη και ελάχιστη τιμή, από τις προηγούμενες μετρήσεις που έχουμε αποθηκεύσει σε δύο αντίστοιχες μεταβλητές min και max 6. Αν η καινούργια μέτρηση είναι μικρότερη από τη εως τώρα τιμή της min, την αποθηκεύουμε στη min, σαν τη νέα ελάχιστη τιμή. Αν η καινούργια μέτρηση είναι μεγαλύτερη από τη τιμή max, τότε την αποθηκεύουμε στη max, σαν τη νέα μέγιστη τιμή. 7
5. Γράψτε ένα πρόγραμμα για να υπολογίζει το άθροισμα των μονών ακέραιων από το 1 έως το 30. 6. Υπολογίστε τη τιμή του π από την άπειρη σειρά, π = 4 4/3 + 4/5 4/7 + 4/9 4/11 +... μέχρι να πάρετε τη τιμή 3,141. Πόσοι όροι της παραπάνω σειράς χρησιμοποιούνται για να πάρουμε τη τιμή π = 3,141. Γράψτε ένα πρόγραμμα για να υπολογίζει το άθροισμα των μονών ακέραιων από το 1 έως το 30. 7. Γράψτε ένα πρόγραμμα στη Pascal, για να εμφανίζει στη οθόνη το σχήμα μίας σκακιέρας 8