Εργαστήριο 6 Εντολές Επανάληψης Η δομή Επιλογής στη PASCAL H δομή Επανάληψης στη PASCAL. Ρεύμα Εισόδου / Εξόδου.. Ρεύμα Εισόδου / Εξόδου. To πρόγραμμα γραφικών gnuplot. Γραφικά στη PASCAL. Σκοπός
6.1 ΕΠΙΔΙΩΞΗ ΤΗΣ ΕΡΓΑΣΙΑΣ Σκοπός της άσκησης είναι να εξετάσουμε τις εντολές επανάληψης. Η επιλογή και η επανάληψη είναι βασικές λειτουργίες της επεξεργασίας δεδομένων από ένα πρόγραμμα. Οι δύο αυτές λειτουργίες μαζί με / στη βάση της εκτέλεσης αλγεβρικών και λογικών πράξεων από τον υπολογιστή αποτελούν το σύνολο των εργαλείων της επεξεργασίας δεδομένων. Κάθε πρόγραμμα που γράφουμε στη PASCAL χρησιμοποιεί αυτές τις εντολές. Ακόμα γενικότερα, κάθε υπολογισμός ή επεξεργασία δεδομένων που μπορεί ο υπολογιστής να εκτελέσει μπορεί να περιγραφεί, μέσα από τις εντολές επιλογής, επανάληψης, τις αλγεβρικές και λογικές πράξεις. Έτσι, αυτές οι εντολές αποτελούν ένα πλήρες σύνολο εντολών, μέσα από το οποίο μπορούμε να προσδιορίσουμε κάθε δυνατό υπολογισμό στον υπολογιστή. Στα μέχρι τώρα προγράμματα, εξετάσαμε την επικοινωνία του προγράμματος με τον έξω κόσμο. Δηλαδή, αυτές τις λειτουργίες που περιλαμβάνουν την Είσοδο (δεδομένων στο πρόγραμμα) και την Έξοδο (των αποτελεσμάτων της επεξεργασίας αυτών των δεδομένων από το πρόγραμμα). Γενικεύσαμε αυτές τις λειτουργίες από τις κατά συνθήκη συσκευές εισόδου / εξόδου, ώστε να περιλαμβάνουν την είσοδο δεδομένων από ένα άλλο πρόγραμμα και την έξοδο δεδομένων και αποτελεσμάτων σε άλλα προγράμματα. Εξετάσαμε ακόμα τη λειτουργία της επιλογής από ένα πρόγραμμα, μέσα από την εντολή επιλογής που επιτρέπει σε ένα πρόγραμμα να λαμβάνει αποφάσεις, να μπορεί δηλαδή να επιλέγει να εκτελεί μία από διαφορετικές λειτουργίες που περιγράφονται από διαφορετικές ομάδες εντολών στο πρόγραμμα, στη βάση μίας συνθήκης. Η επανάληψη περιλαμβάνει την εκτέλεση μία ομάδας εντολών περισσότερες από μία φορές, Σ αυτή την άσκηση εξετάζουμε πως ορίζουμε αυτή τη λειτουργία σ ένα πρόγραμμα τις εντολές δηλαδή που χρησιμοποιούμε για να προσδιορίσουμε την επανάληψη μίας ομάδας εντολών σ ένα πρόγραμμα. Εξετάζουμε ακόμα τη πρακτική εφαρμογή / τη χρησιμότητα αυτής της λειτουργίας σ ένα πρόγραμμα, μέσα από παραδείγματα πρακτικών εφαρμογών. 6.2 ΣΥΝΟΠΤΙΚΗ ΘΕΩΡΙΑ Εντολές Επανάληψης στη PASCAL Οι μέχρι τώρα εντολές της PASCAL παρείχαν τη δυνατότητα της εισόδου (READ) και της αποθήκευσης των δεδομένων στη μνήμη, προκειμένου να επιτελεστεί η πρόσβαση και η επεξεργασία αυτών των δεδομένων απο τον υπολογιστή. Οι (έως τώρα) εντολές της PASCAL περιλάμβαναν ακόμα την εντολή εξόδου (WRITE) για την εμφάνιση των αποτελεσμάτων, την εντολή εκχώρησης (:=) για την αποθήκευση των ενδιάμεσων αποτελεσμάτων σε συγκεκριμμένες τοποθεσίες στη μνήμη του υπολογιστή, προκειμένου αυτά να χρησιμοποιηθούν σε παραπέρα υπολογισμούς και τις εντολές ελέγχου ή επιλογής (IF THEN ELSE και CASE). Οι εντολές επιλογής (IF THEN ELSE και CASE) παρέχουν στο πρόγραμμα τη δυνατότητα να αποφασίσει (ή να επιλέξει) μεταξύ εναλλακτικών ενεργειών στην επεξεργασία των δεδομένων, επιτρέποντας στη «ροή» του προγράμματος να επιλέξει να ακολουθήσει διαφορετικούς κλάδους του προγράμματος κατά την εκτέλεσή του, δηλαδή εναλλακτικές ομάδες εντολών που επιτελούν εναλλακτικές ενέργειες στα εξωτερικά δεδομένα του προγράμματος. 2
Η εντολή επανάληψης εξυπηρετεί ένα διαφορετικό σκοπό: την επαναληπτική εκτέλεση μιάς ή περισσότερων ενεργειών. Η ανάγκη να επαναλάβουμε πολλές φορές ένα βήμα ή στάδιο σ έναν αλγόριθμο εμφανίζεται πολύ συχνά και σε πάρα πολλά προβλήματα και εφαρμογές που περιλαμβάνουν τη ταξινόμηση ή τη κατηγοριοποίηση δεδομένων, την οργάνωση και την ανεύρεση πληροφοριών σε βάσεις δεδομένων, τα λειτουργικά συστήματα. Οταν για παράδειγνα, ψάχνουμε το κατάλογο μιας βιβλιοθήκης για βιβλία σε κάποιο θέμα, το πρόγραμμα που εκτελεί ανεύρεση θα πρέπει αρχικά να συγκρίνει το θέμα που ψάχνουμε με καθεμία απο τις γενικές κατηγορίες θεμάτων και μετά με τίτλους βιβλίων που είναι καταχωρημένοι και υπάρχουν σε σχετικές θεματικές κατηγορίες. Η ενέργεια που επαναλαμβάνεται είναι η σύγκριση του θέματος πρώτα με τις γενικές κατηγορίες θεμάτων, ώστε να βρεθεί η σχετική θεματική κατηγορία και μετά με τίτλους βιβλίων σ αυτή τη κατηγορία, ώστε να βρεθούν τα σχετικότερα βιβλία. Η ανάγκη επανάληψης μιας πράξης, ή βήματος ενός αλγορίθμου εμαφανίζεται τόσο συχνά και είναι τόσο απαραίτητη στο προγραμματισμό ώστε να σχεδιαστούν και να αναπτυχθούν εντολές επανάληψης που επιτρέπουν την επανάληψη του όποιου τμήματος του κώδικα ενός προγράμματος. Η PASCAL διαθέτει 3 εντολές που μπορουν να χρησιμοποιηθούν για την επαναληπτική εκτέλεση του όποιου τμήματος κώδικα. Οι εντολές αυτές είναι οι For, While και Repeat until. Οι εντολές επανάληψης, η δομή, η χρήση τους και παραδείγματα της χρήσης τους είναι το αντικείμενο του Κεφαλαίου 5, της PASCAL, Σπύρος Πανέτσος, σελ. 121 133. Συνοπτικά η μορφή αυτών των εντολών είναι: 6.2.1 Η ΕΝΤΟΛΗ FOR Μεταβλητή ελέγχου ή Μετρητής, μεταβλητή του τύπου INTEGER, CHAR, BOOLEAN For i := αρχική τιμή to τελική τιμή do begin Εντολή 1; Εντολή 2; Εντολή ν Η εκτέλεση των εντολών μέσα στη for επαναλαμβάνεται για end; Χρησιμοποιούμε την εντολή For όταν γνωρίζουμε ακριβώς πόσες φορές πρέπει να επαναληφθεί μία εντολή, ή ένα κομμάτι προγράμματος. Οι εντολές Εντολή 1, 3
Εντολή 2,..., Εντολή ν που περιέχονται στη For εκτελούνται για κάθε τιμή της μεταβλητής ελέγχου i, ξεκινώντας από την αρχική τιμή. Μετά από κάθε επαναληπτική εκτέλεση της ομάδας Εντολή 1, Εντολή 2,..., Εντολή ν, η τιμή της μεταβλητής i, αυξάνεται κατά 1 και συγκρίνεται με τη τελική τιμή. Όσο η τιμή της i είναι μικρότερη ή ίση της τελικής τιμής η εκτέλεση των Εντολή 1, Εντολή 2,..., Εντολή ν επαναλαμβάνεται. Όταν, μετά από επαναληπτικές εκτελέσεις των Εντολή 1, Εντολή 2,..., Εντολή ν, η τιμή της i υπερβεί (γίνει μεγαλύτερη) της τελικής τιμής, η εντολή For σταματά να εκτελείται και η εκτέλεση του προγράμματος συνεχίζεται με την αμέσως επόμενη της For εντολής. 6.2.2 H ΕΝΤΟΛΗ WHILE Η γενική μορφή της while είναι: while λογική συνθήκη do begin Εντολή 1; Εντολή 2; Η εκτέλεση των εντολών μέσα στο while do επαναλαμβάνεται για όσο η συνθήκη ισχύει Εντολή ν end; Επόμενη εντολή; H επανάληψη καθορίζεται από τη λογική συνθήκη. Εάν η συνθήκη ισχύει, τότε η ακολουθία Εντολή 1, Εντολή 2,..., Εντολή ν εκτελείται και η συνθήκη επανεξετάζεται. Έτσι, η ακολουθία Εντολή 1, Εντολή 2,..., Εντολή ν εκτελείται συνέχεια εφόσον η συνθήκη είναι αληθής. Όταν η συνθήκη παίρνει τη λογική τιμή 0 (ψευδής), τότε σταματά η εκτέλεση της while και η εκτέλεση του προγράμματος μεταφέρεται στη επόμενη εντολή μετά τη while. Πρόγραμμα 7.1 Δυναμικά Συστήματα Ελεύθερη Πτώση. Μία σφαίρα που υποθέτουμε ότι έχει μοναδιαία μάζα (m = 1), αφήνεται να πέσει από κάποιο αρχικό ύψος h 0 από το έδαφος. Γράψτε ένα πρόγραμμα στη PASCAL που να υπολογίζει τη ταχύτητα v και το ύψος h της σφαίρας από το έδαφος, σε διαφορετικές χρονικές στιγμές t, της ελεύθερης πτώσης της, μέχρι να φτάσει στο έδαφος. Στην αρχική θέση (t = 0), η αρχική ταχύτητα v 0 και το αρχικό ύψος h 0, απ όπου η σφαίρα αφήνεται να πέσει, είναι v(0) = 0 και h 0 = 2 m. Οι εξισώσεις της ελεύθερης πτώσης ενός αντικειμένου, υποθέτοντας μοναδιαία μάζα 4
και αγνοώντας την αντίσταση του αέρα είναι: a = dv/ dt = - g και v = dh / dt όπου a είναι η επιτάχυνση του αντικειμένου, g = 9.81 m/sec 2 είναι η επιτάχυνση της βαρύτητας, v είναι η ταχύτητα του αντικειμένου και h είναι το ύψος της σφαίρας από το έδαφος. Ανάλυση του προγράμματος Ολοκληρώνοντας τις παραπάνω εξισώσεις, παίρνουμε: v = -g t + v 0 h = - ½ g t 2 + h 0 Έτσι, για να υπολογίσουμε τη ταχύτητα v(t) και την απόσταση h(t) σε διαφορετικές χρονικές στιγμές t = 1, 2, 3,, 10 sec της ελεύθερης πτώσης του αντικειμένου, θα πρέπει να αντικαταστήσουμε αυτές τις τιμές χρόνου και να υπολογίσουμε τους παραπάνω τύπους, για κάθε τιμή t = 1, 2, 3,, 10 sec. Επομένως, ο υπολογισμός της ταχύτητας v(t) και της απόστασης y(t) της ελεύθερης πτώσης ενός αντικειμένου, σε διαφορετικές χρονικές στιγμές t = 1, 2, 3,, 10 sec αυτής της πτώσης, είναι μία διαδικασία που περιλαμβάνει την επανάληψη μία; ενέργειας: τον υπολογισμό των παραπάνω τύπων, για διαφορετικές τιμές χρόνου. Μπορούμε εύκολα να περιγράψουμε αυτή τη λειτουργία (την επανάληψη του υπολογισμού των τύπων της ελεύθερης πτώσης, για διαφορετικές τιμές του χρόνου) σ ένα πρόγραμμα, χρησιμοποιώντας την εντολή επανάληψης. Γενικά, όποτε χρειάζεται να προσδιορίσουμε σ ένα πρόγραμμα την επανάληψη μίας λειτουργίας, μπορούμε να χρησιμοποιούμε την εντολή επανάληψης, περιγράφοντας / ορίζοντας: Βήμα 1: Υπολόγισε το ύψος (h) και τη ταχύτητα (v) της σφαίρας τη χρονική στιγμή t = 0. Βήμα 2: Υπολόγισε το ύψος (h) και τη ταχύτητα (v) της σφαίρας την επόμενη χρονική στιγμή t := t + 0.1 xρησιμοποιώντας τους τύπους: v = g * t; h = (1/2) * g * (t * t) + h0; Βήμα 3: Εκτύπωσε τις τιμές 5 του ύψους και της ταχύτητας, ή ή t
program freefall; const g = 9.81; var v, v0 : real; t, h, h0 : real; begin t:= 0.0; v0 := 0.0; write('h0 = '); readln(h0); h := h0; writeln('t v h'); while ( h > 0.0 ) do begin t := t + 0.1; v := g*t; h := h0 - (0.5 * v * t); writeln(t:3:1, ' ', v:5:2, ' ', h:4:2); end; readln; end. 1. Τη λειτουργία ή τις λειτουργίες που πρέπει να επαναληφθούν και 2. Πόσες φορές πρέπει να επαναληφθούν. 6
Έτσι, για να προσδιορίσουμε σ ένα πρόγραμμα την επανάληψη του υπολογισμού των τύπων της ελεύθερης πτώσης, για διαφορετικές τιμές του χρόνου, μπορούμε να χρησιμοποιήσουμε την εντολή επανάληψης. Όλο το πρόγραμμα που υπολογίζει την ελεύθερη πτώση της σφαίρας παριστάνεται στην Εικόνα 2. Το πρόγραμμα στην Εικόνα 2 μπορεί να ακολουθεί τη κίνηση της σφαίρας, δηλαδή να υπολογίζει τη ταχύτητα και το ύψος της σφαίρας από το έδαφος, κάθε χρονική στιγμή από τη αρχή της πτώσης της. Λίγο πριν η σφαίρα φτάσει στο έδαφος, όταν φτάσει σε ένα συγκεκριμένο ύψος από το έδαφος, το πρόγραμμα μπορεί να ενεργοποιήσει το κινητήρα που λειτουργεί (ανοίγει και κλείνει) το χέρι του ρομπότ, ώστε το ρομπότ να μπορέσει να πιάσει τη σφαίρα. Πρόγραμμα 7.3 Γράψτε ένα πρόγραμμα που να διαβάζει από την οθόνη έναν θετικό ακέραιο Ν και να υπολογίζει και να εκτυπώνει το άθροισμα των μονών ακέραιων από 1 έως Ν. Αλγόριθμος Βήμα 1: Διάβασε έναν θετικό ακέραιο Ν; Βήμα 2: Άθροισμα = 1; Βήμα 3: Εάν με n συμβολίσουμε τον τρέχοντα ακέραιο, υπολόγισε τον επόμενο μονό ακέραιο n + 2; Βήμα 4: Εξετάζουμε εάν o επόμενος μονός είναι μικρότερος ή ίσος του N. Τότε τον προσθέτουμε στοπ άθροισμα, δηλαδή: Άθροισμα := Άθροισμα + τρέχον μονός ακέραιος Βήμα 5: Επαναλαμβάνουμε τα βήματα 3-4, μέχρι ο επόμενος μονός ακέραιος να είναι μεγαλύτερος του Ν Βήμα 6: Εκτυπώνουμε τη τιμή της μεταβλητής Άθροισμα που λειτουργεί σαν αθροιστής. Πρόγραμμα 7.4 Γράψτε ένα πρόγραμμα που να διαβάζει από την οθόνη μία συμβολοσειρά μεταξύ αποστρόφων, να τυπώνει τους χαρακτήρες της και να υπολογίζει και να εκτυπώνει το πλήθος των χαρακτήρων αυτής της συμβολοσειράς. Επεξηγήσεις 7
Η συμβολοσειρά δεν θα βρίσκεται κατ ανάγκη στην αρχή των δεδομένων. Μπορεί να υπάρχουν άλλοι χαρακτήρες πριν ή μετά από αυτή τη συμβολοσειρά. Επίσης, η συμβολοσειρά μπορεί να είναι κενή, δηλαδή μπορεί να μην εμφανίζεται στα δεδομένα συμβολοσειρά μεταξύ αποστρόφων. Η απόστροφος, σαν τιμή μίας μεταβλητής συμβολίζεται με \ και θα πρέπει να τοποθετηθεί μεταξύ δύο αποστρόφων. Πρόγραμμα 7.5 Εμφυτευμένη Επανάληψη Σκακιέρα. Γράψτε ένα πρόγραμμα που να διαβάζει από την οθόνη έναν θετικό ακέραιο Ν και να χρησιμοποιεί μία εμφυτευμένη επανάληψη για να εκτυπώσει στην οθόνη μία Ν Ν σκακιέρα από κενά και αστερίσκους, όπως στο παρακάτω σχήμα. 8
ΕΡΓΑΣΤΗΡΙΟ 6 Εισαγωγή στο Προγραμματισμό με τη PASCAL & τη MATLAB Εντολές Επανάληψης Όνομα: Ενότητα 1: Θεωρητικό Μέρος 1. Η λειτουργία της εντολής επανάληψης σ ένα πρόγραμμα, είναι: (α) Να επαναλαμβάνει διαρκώς, χωρίς τέλος, μία λειτουργία του προγράμματος. (β) Να ελέγχει διαρκώς μία συνθήκη, εκτελώντας ή όχι μία εντολή του προγράμματος, στη βάση αυτής της συνθήκης. (γ) Να επαναλαμβάνει την εκτέλεση των εντολών ενός προγράμματος, μέχρι να εκπληρωθεί μία συνθήκη. (δ) Να επαναλαμβάνει μία ομάδα εντολών ενός προγράμματος, στη βάση μίας συνθήκης. 2. Η συνθήκη στην εντολή επανάληψης while: (α) Μπορεί μόνον να είναι μία απλή συνθήκη που συγκρίνει δύο αριθμούς. (β) Μπορεί να εξετάζει σχέσεις ισότητας ή ανισότητας μόνον μεταξύ αριθμητικών τιμών. (γ) Μπορεί να συγκρίνει όχι μόνο αριθμητικές τιμές, αλλά χαρακτήρες και κείμενο. (δ) Μπορεί να συγκρίνει μόνο ακέραιες τιμές.. 3. Με την εντολή for: (α) Μπορούμε να επαναλαμβάνουμε την εκτέλεση εντολών ενός προγράμματος, αλλά θα πρέπει να ξέρουμε πόσες φορές θα πρέπει να επαναληφθούν αυτές οι εντολές, όταν γράφουμε το πρόγραμμα. (β) Μπορούμε να επαναλαμβάνουμε την εκτέλεση των εντολών ενός προγράμματος ορισμένες φορές, αλλά δεν χρειάζεται να ξέρουμε πόσες φορές θα επαναληφθούν αυτές οι εντολές, όταν γράφουμε το πρόγραμμα. (γ) Μπορούμε να επαναλαμβάνουμε την εκτέλεση μίας ομάδας εντολών ενός προγράμματος, ορισμένες φορές, στη βάση μίας συνθήκης. 9
(δ) Μπορούμε να επαναλαμβάνουμε την εκτέλεση μίας ομάδας εντολών ενός προγράμματος, τόσες φορές, όσες καθορίζονται από μία συνθήκη. 4. Ποια είναι η βασική χρησιμότητα της εντολής επανάληψης σ ένα πρόγραμμα. Γιατί δηλαδή, η δυνατότητα της επανάληψης ορισμένων εντολών ενός προγράμματος μπορεί να είναι απαραίτητη σ ένα πρόγραμμα? 5. Γράψτε ένα πρόγραμμα για να υπολογίζει τις τιμές της συνάρτησης f (x) = 1/3x 3 4x 2 + 15x + 3 για τιμές του x από 1 έως 12. 6. Μία ενδιαφέρουσα εφαρμογή των υπολογιστών είναι η σχεδίαση γραφημάτων που ονομάζονται ιστογράμματα. Γράψτε ένα πρόγραμμα που να διαβάζει έναν αριθμό από την οθόνη, ανάμεσα στο 1 και το 30. Το πρόγραμμα θα πρέπει να εκτυπώνει αυτό το αριθμό και δίπλα στον αριθμό, τόσους συνεχόμενους αστερίσκους, όσους η τιμή του συγκεκριμένου αριθμού. Για παράδειγμα, αν το πρόγραμμα διαβάσει από την οθόνη τον αριθμό 9, τότε θα πρέπει να εκτυπώσει: 9 ********* Αν διαβάσει τον αριθμό 12, τότε θα πρέπει να εκτυπώσει: 12 ************ 10
7. Τροποποιείστε το παραπάνω πρόγραμμα ώστε να διαβάζει μέχρι 10 αριθμούς, ανάμεσα στο 1 και το 30. Για κάθε αριθμό, το πρόγραμμα θα πρέπει να εκτυπώνει μία γραμμή που θα περιέχει τόσους συνεχόμενους αστερίσκους, όσους η τιμή του συγκεκριμένου αριθμού. 8. Γράψτε ένα πρόγραμμα που να στρίβει ένα νόμισμα 10 φορές και να εκτυπώνει τα αποτελέσματα. 9. Γράψτε ένα πρόγραμμα που να διαβάζει από την οθόνη μία συμβολοσειρά μεταξύ αποστρόφων, να τυπώνει τους χαρακτήρες της και να υπολογίζει και να εκτυπώνει το πλήθος των χαρακτήρων αυτής της συμβολοσειράς. Επεξηγήσεις Η συμβολοσειρά δεν θα βρίσκεται κατ ανάγκη στην αρχή των δεδομένων. Μπορεί να υπάρχουν άλλοι χαρακτήρες πριν ή μετά από αυτή τη συμβολοσειρά. Επίσης, η συμβολοσειρά μπορεί να είναι κενή, δηλαδή μπορεί να μην εμφανίζεται στα δεδομένα συμβολοσειρά μεταξύ αποστρόφων. Η απόστροφος, σαν τιμή μίας μεταβλητής συμβολίζεται με \ και θα πρέπει να τοποθετηθεί μεταξύ δύο αποστρόφων. 11
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> H πρώτη στήλη παριστάνει χρονικές στιγμές (t) και η δεύτερη τις τιμές ταχύτητας (v), για τις αντίστοιχες χρονικές στιγμές. Η εισαγωγή των δεδομένων τερματίζεται, πατώντας το χαρακτήρα Ctrl-Z. 11. Σκακιέρα. Γράψτε ένα πρόγραμμα που να διαβάζει από την οθόνη έναν θετικό ακέραιο Ν και να χρησιμοποιεί μία εμφυτευμένη επανάληψη για να εκτυπώσει στην οθόνη μία Ν Ν σκακιέρα από κενά και αστερίσκους, όπως στο παρακάτω σχήμα. 12. Επτάρια Γράψτε ένα πρόγραμμα που να διαβάζει έναν τετραψήφιο ακέραιο αριθμό και να υπολογίζει και να εκτυπώνει πόσες φορές επαναλαμβάνεται το 7, σ αυτό τον αριθμό. 12