102
Κεφάλαιο 1 ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ , ΠΡΟΓΡΑΜΜΑΤΑ Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟΙ ΤΟΥ ΚΕΦΑΛΑΙΟΥ 1.1 - Εισαγωγή 1.2 - Λειτουργίες του Υπολογιστή για Επίλυση Προβλημάτων 1.3 - Η Έννοια Πρόβλημα και Κατηγορίες Προβλημάτων 1.4 - Προγραμματισμός και Επίλυση Προβλημάτων 1.5 - Καθορισμός ενός Προβλήματος 1.5.1 - Παράδειγμα Καθορισμού ενός Προβλήματος 1.6 - Αλγόριθμοι 1.7 - Αλγοριθμικές Δομές 1.8 - Τρόποι Αναπαράστασης Αλγορίθμων 1.9 - Αναπαράσταση Βασικών Δομών Ενός Αλγορίθμου 1.10 - Παραδείγματα Αλγορίθμων 1.11 - Τεστ Αυτοαξιολόγησης Κεφαλαίου Κεντρική Σελίδα Επόμενη Ενότητα

All Chapters

Embed Size (px)

Citation preview

Page 1: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ, ΑΛΓΟΡΙΘΜΟΙ , ΠΡΟΓΡΑΜΜΑΤΑ

Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟΙ ΤΟΥ ΚΕΦΑΛΑ ΙΟΥ

1.1 - Εισαγωγή

1.2 - Λειτουργίες του Υπολογιστή για Επίλυση Προβλημάτων

1.3 - Η Έννοια Πρόβλημα και Κατηγορίες Προβλημάτων

1.4 - Προγραμματισμός και Επίλυση Προβλημάτων

1.5 - Καθορισμός ενός Προβλήματος

1.5.1 - Παράδειγμα Καθορισμού ενός Προβλήματος

1.6 - Αλγόριθμοι

1.7 - Αλγοριθμικές Δομές

1.8 - Τρόποι Αναπαράστασης Αλγορίθμων

1.9 - Αναπαράσταση Βασικών Δομών Ενός Αλγορίθμου

1.10 - Παραδείγματα Αλγορίθμων

1.11 - Τεστ Αυτοαξιολόγησης Κεφαλαίου

Κεντρική Σελίδα Επόμενη Ενότητα

Page 2: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.1 - Εισαγωγή

Στη σημερινή τεχνολογικά ανεπτυγμένη, εποχή είναι σχεδόν αδύνατο ν' αποφύγει κάποιος τις επιδράσεις και τις επιρροές των ηλεκτρονικών υπολογιστών και των πληροφοριακών συστημάτων. Οιυπολογιστές, χρησιμοποιούνται παντού, στα εργοστάσια, στις τηλεπικοινωνίες, στην εκπαίδευση, στην ιατρική, στις τραπεζικές συναλλαγές κτλ. Ο ανταγωνισμός, αλλά και ο ρυθμός των τεχνολογικώνεξελίξεων, μας δημιουργούν την ανάγκη να ψάχνουμε συνεχώς για περισσότερους, καινούργιους ή καλύτερους τρόπους εκμετάλλευσης των δυνατοτήτων των υπολογιστών και των πληροφοριακώνσυστημάτων. Η παρακάτω παράθεση είναι χαρακτηριστική:

Αν η εξέλιξη των αεροπλάνων ήταν ισοδύναμη με την εξέλιξη των ηλεκτρονικών υπολογιστών τα τελευταία 25 χρόνια, σήμερα ένα αεροπλάνο θα κόστιζε 500 δολάρια και θα έκανετο γύρο της γης σε 5 λεπτά, χρησιμοποιώντας καύσιμα αξίας 5 δολαρίων.

Scientific American, Δεκέμβριος 1982

Είναι, λοιπόν, γεγονός ότι οι ηλεκτρονικοί υπολογιστές έχουν γίνει ένα πολύ σημαντικό και απαραίτητο εργαλείο. Στον εργασιακό χώρο, για παράδειγμα, μπορούν να χρησιμοποιηθούν για τηνεπεξεργασία κειμένου και λογιστικών φύλλων, καθώς και για την αποθήκευση πληροφοριών για πελάτες και εργαζομένους. Σε ένα εργοστασιακό χώρο, μπορούν να ορίζουν την κίνηση διαφόρωνμηχανών κατά τη διαδικασία παραγωγής κάποιου προϊόντος. Σε προσωπικό επίπεδο, μπορούμε να τους χρησιμοποιήσουμε ως μέσω διασκέδασης παίζοντας τρισδιάστατα παιχνίδια ή ακούγονταςμουσική. Καθώς είναι πραγματικά αναρίθμητες οι χρήσεις των υπολογιστών, είναι φυσικό και η εξάπλωσή τους να είναι ραγδαία. Είναι πλέον βοηθοί μας, όργανα προέκτασης των δυνατοτήτων μας.Ποιά είναι όμως, η δύναμη των ηλεκτρονικών υπολογιστών; Είναι σε τελική ανάλυση, ευφυή μηχανήματα που μπορούν από μόνα τους να βρούνε λύσεις σε μικρά η μεγάλα προβλήματα; Μπορούν ναθεραπεύσουν τον καρκίνο, να σώσουν τις φάλαινες από την εξαφάνιση ή να εξαλείψουν την εγκληματικότητα;

Η δύναμη των ηλεκτρονικών υπολογιστών, έγκειται στο γεγονός ότι μπορούν να αποθηκεύουν και να ανακτούν τεράστιες ποσότητες πληροφορίας και δεδομένων, καθώς και στην ικανότητά τους ναεπεξεργάζονται τα δεδομένα αυτά με πολύ μεγάλη ταχύτητα. Οι άνθρωποι, δεν μπορούν να κάνουν αυτές τις δύο διαδικασίες στο βαθμό που μπορεί ένας ηλεκτρονικός υπολογιστής, παρ'όλο που οανθρώπινος εγκέφαλος είναι ο πιο γρήγορος υπολογιστής που υπάρχει. Έτσι, λοιπόν, το αποτέλεσμα της αριθμητικής πράξης 128 + (9584 / 142) ή τί μέρα θα πέσουν τα γενέθλιά μας μετά απόπέντε χρόνια, θα υπολογιστούν πολύ πιο γρήγορα από έναν υπολογιστή παρά από έναν άνθρωπο. Οι ηλεκτρονικοί υπολογιστές, όμως, δεν είναι ικανοί να λύσουν κάποιο πρόβλημα από μόνοι τους.Απλά, εφαρμόζουν μια λύση, εκτελώντας εντολές που δίνονται από τους ανθρώπους. Για να βρεθεί μια λύση σε ένα πρόβλημα, απαιτείται η κατανόηση του προβλήματος και η ανάπτυξη του τρόπουεπίλυσής του. Οι υπολογιστές, δεν μπορούν να κάνουν αυτές τις δύο διαδικασίες. Μπορούν όμως να βοηθήσουν τους ανθρώπους στη ταχύτερη κατανόηση ενός προβλήματος και στη ταχύτερηανάπτυξη και επιλογή τρόπων επίλυσής του. Δε μπορούν από μόνοι τους να θεραπεύσουν τον καρκίνο αλλά μπορούν να χρησιμοποιηθούν για την ανάλυση της συμπεριφοράς του και την αντίδρασήτου σε διάφορες θεραπείες. Δε μπορούν να λύσουν το πρόβλημα της εξαφάνισης των φαλαινών, αλλά μπορούν να χρησιμοποιηθούν για την ανίχνευση των μεταναστευτικών τους μοτίβων που θαμπορούσαν να βοηθήσουν στην κατανόηση των κινδύνων που τις απειλούν. Δε είναι δυνατό να εξαλείψουν το πρόβλημα της εγκληματικότητας, αλλά μπορούν να χρησιμοποιηθούν για την αναγνώρισηκοινωνικών και οικονομικών λόγων, που δημιουργούν υψηλούς βαθμούς εγκληματικότητας.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 3: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.2 - Λειτουργίες του Υπολογιστή για Επίλυση Προβλημάτων

Είπαμε ήδη, ότι η χρήση των υπολογιστών για την επίλυση προβλημάτων, γίνεται κυρίως λόγω των ικανοτήτων τους ν' αποθηκεύουν τεράστιες ποσότητες δεδομένων να επεξεργάζονται τα δεδομένααυτά με μεγάλη ταχύτητα. Όμως όσο πολύπλοκο και να είναι ένα πρόβλημα, για να εφαρμόσει την επίλυσή του ένας υπολογιστής, εκτελεί πολλές, μικρές και απλές λειτουργίες, οι οποίες μπορούν ναταξινομηθούν σε τρεις κατηγορίες:

λειτουργίες εισαγωγής: να μπορεί ο υπολογιστής να δέχεται δεδομέναλειτουργίες επεξεργασίας: να μπορεί να πραγματοποιεί υπολογισμούςλειτουργίες εξόδου: να μπορεί να εμφανίζει αποτελέσματα

Παράδειγμα 1 - Επεξεργασία ΕγγράφουΑν υποθέσουμε, ότι θέλετε να γράψετε μια εργασία σε ηλεκτρονική μορφή για το μάθημα της Τεχνολογίας Λογισμικού, ο υπολογιστής θα πρέπει να λάβει εντολές και κείμενο μέσω του πληκτρολόγιου(λειτουργίες εισαγωγής), να μορφοποιήσει το κείμενο, τους πίνακες και τα διαγράμματα (λειτουργίες επεξεργασίας), και να εμφανίσει το έγγραφο στην οθόνη ή να το εκτυπώσει σε κάποιο εκτυπωτή(λειτουργίες εξόδου).

Παράδειγμα 2 - Μηχανογραφημένος ΛογαριασμόςΥποθέστε, ότι μόλις λάβατε το λογαριασμό του ηλεκτρικού ρεύματος. Για να δημιουργηθεί ο λογαριασμός, αρχικά κάποιος υπάλληλος πληκτρολόγησε στον υπολογιστή τον αριθμό του λογαριασμούσας και τις τελευταίες μετρήσεις του μετρητή ρεύματος που σας αντιστοιχεί (λειτουργίες εισαγωγής). Ο υπολογιστής μετά, έλεγξε τη βάση δεδομένων, για να διαβάσει τις τιμές της προηγούμενηςμέτρησης του μετρητή σας (λειτουργίες εισαγωγής). Κατόπιν, υπολόγισε την κατανάλωση ρεύματος και το κόστος της (λειτουργίες επεξεργασίας) και τέλος εκτύπωσε ένα τιμολόγιο (λειτουργίαεξόδου) και το καταχώρησε στη βάση δεδομένων για μελλοντική χρήση.

Από τα δύο παραπάνω παραδείγματα, καταλαβαίνουμε ότι εκτός από τις τρεις κατηγορίες λειτουργιών, η αποθήκευση δεδομένων καθώς και η ανάκτηση αυτών, είναι εξίσου σημαντικές λειτουργίεςτου υπολογιστή για την επίλυση προβλημάτων. Ποιά είναι όμως η έννοια ενός προβλήματος και πώς μπορεί να αναπαρασταθεί ένα πρόβλημα;

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 4: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.3 - Η Έννοια Πρόβλημα και Κατηγορίες Προβλημάτων

Η έννοια πρόβλημα, συναντάται σε όλες τις επιστήμες αλλά και στην καθημερινή μας ζωή. Αν προσπαθούσαμε να βρούμε κάποιον ορισμό, θα μπορούσαμε να πούμε ότι με τον όρο πρόβλημα,εννοούμε μια κατάσταση η οποία πρέπει να αντιμετωπιστεί, χρησιμοποιώντας κάποια λύση η οποία δεν είναι γνωστή ή προφανής. Για να μπορέσουμε να αντιμετωπίσουμε σωστά ένα πρόβλημα,πρέπει πρώτα να έχουμε συγκεντρώσει όλες τις σαφείς πληροφορίες και δεδομένα τα οποία σχετίζονται με το πρόβλημα. Έπειτα, μπορούμε να αναλύσουμε όλες αυτές τις πληροφορίες, έτσι ώστενα μπορέσουμε να λύσουμε το πρόβλημα. Η επίλυση, δηλαδή, ενός προβλήματος, προϋποθέτει τον επακριβή προσδιορισμό των δεδομένων του. Απαιτείται, επίσης, η λεπτομερειακή καταγραφή τωναποτελεσμάτων ή των ζητουμένων που αναμένονται από την λύση του προβλήματος. Αρα, λοιπόν, τα τρία στάδια της αντιμετώπισης ενός προβλήματος είναι: κατανόηση - ανάλυση - επίλυση.

Αν και τα προβλήματα μπορούν να κατηγοριοποιηθούν με πολλούς τρόπους, δύο κριτήρια είναι τα πιο σημαντικά: η δυνατότητα επίλυσης και το είδος της επίλυσης. Με κριτήριο τη δυνατότηταεπίλυσης ενός προβλήματος υπάρχουν τρεις κατηγορίες προβλημάτων:

Επιλύσιμα: τα προβλήματα των οποίων η λύση τους είναι ήδη γνωστή και έχει διατυπωθεί.Αλυτα: τα προβλήματα εκείνα για τα οποία υπάρχει η παραδοχή ότι δεν επιδέχονται λύση.Ανοικτά: προβλήματα τα οποία αν και δεν έχει βρεθεί ακόμα η λύση τους, δεν έχει αποδειχθεί, ότι είναι άλυτα.

Με κριτήριο το είδος επίλυσης που επιζητούν, τα προβλήματα χωρίζονται σε τρεις κατηγορίες:

Απόφασης: όταν λαμβάνεται μια απόφαση ως λύση του προβλήματος με πιθανή απάντηση ένα 'Ναι' ή ένα 'Όχι'. Αυτό που θέλουμε να διαπιστώσουμε σε ένα πρόβλημα απόφασης, είναι ανυπάρχει απάντηση που ικανοποιεί τα δεδομένα που τίθονται από το πρόβλημα.Υπολογιστικά: όταν απαιτείται η διεξαγωγή υπολογισμών, για να μπορεί να δοθεί μια απάντηση στο πρόβλημα. Σ' ένα υπολογιστικό πρόβλημα, ζητάμε να βρούμε τη τιμή της απάντησης πουικανοποιεί τα δεδομένα του προβλήματος.Βελτιστοποίησης: όταν απαιτείται το βέλτιστο αποτέλεσμα για τα συγκεκριμένα δεδομένα του προβλήματος. Σ' ένα πρόβλημα βελτιστοποίησης, αναζητούμε την απάντηση που ικανοποιεί κατάτον καλύτερο τρόπο τα δεδομένα που παρέχει το πρόβλημα.

Ένα από τα σημαντικότερα ζητήματα, που αφήσαμε για το τέλος αυτής της ενότητας, είναι ότι ένα πρόβλημα, κατά τη διαδικασία ανάλυσής του, μπορεί να διασπαστεί σε ολοένα και μικρότεραεπιμέρους τμήματα, τα οποία μπορούν να θεωρηθούν ως μικρότερα προβλήματα. Ένα τέτοιο παράδειγμα, απεικονίζεται σ' αυτήν την εικόνα. Αυτά τα επιμέρους προβλήματα, δεδομένου τουμικρότερου μεγέθους, αλλά και της μικρότερης πολυπλοκότητας, είναι ευκολότερο να αντιμετωπιστούν και να επιλυθούν. Η δομή, λοιπόν, ενός προβλήματος περιλαμβάνει τα επιμέρους τμήματα πουτο αποτελούν και πώς αυτά συνδέονται μεταξύ τους. Στο κεφάλαιο 6, θα αναλύσουμε εκτενέστατα τον τρόπο με τον οποίο γίνεται αυτή η διάσπαση ενός προβλήματος σε "υποπροβλήματα".

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 5: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.4 - Προγραμματισμός και Επίλυση Προβλημάτων

Μέχρι τώρα, αναφερθήκαμε στις ικανότητες των υπολογιστών, στις λειτουργίες που εκτελούν για την επίλυση προβλημάτων και στην έννοια πρόβλημα. Πώς σχετίζεται, όμως, ο προγραμματισμός μετην επίλυση προβλημάτων; Τί σημαίνει γράφω ένα πρόγραμμα για να λύσω κάποιο πρόβλημα;

Προγραμματισμός, είναι "μία ολόκληρη σειρά βημάτων που περιλαμβάνονται στην επίλυση ενός προβλήματος, χρησιμοποιώντας έναν υπολογιστή". Πάρα πολύ συχνά, όμως, η λέξηπρογραμματισμός, χρησιμοποιείται ως συνώνυμο για τη λέξη κωδικοποίηση, που είναι η διαδικασία εγγραφής εντολών σε κάποια υπάρχουσα γλώσσα προγραμματισμού. Εντούτοις, μια πολύ μεγάληπροεργασία πρέπει να προηγηθεί της πραγματικής κωδικοποίησης. Αυτή η προεργασία, περιλαμβάνει πολλά βήματα, όπως για παράδειγμα το να καθορίσουμε ακριβώς τί θέλουμε να κάνουμε, ναδιευκρινίσουμε ασάφειες και αβεβαιότητες, ν' αποφασίσουμε πώς θα λύσουμε το πρόβλημα κλπ. Στην πραγματικότητα, εάν αυτή η προεργασία γίνει σωστά, η φάση της κωδικοποίησης, που φαίνεταινα είναι πολύπλοκή, γίνεται σχετικά απλή. Γίνεται απλά η μηχανική μετάφραση της λύσης του προβλήματος στις γραμματικά σωστές δηλώσεις και εντολές κάποιας γλώσσας προγραμματισμού.Επιπλέον, όπως ακριβώς ξοδεύουμε πολύ χρόνο και προσπάθεια πριν την κωδικοποίηση, έτσι έχουμε να κάνουμε και αρκετά πράγματα αφότου έχουμε τελειώσει την κωδικοποίηση. Πρέπει, γιαπαράδειγμα, ν' ασχοληθούμε με τον έλεγχο και την εύρεση προβλημάτων και λαθών, καθώς και με τη συγγραφή της τεκμηρίωσης του προγράμματος. Ο προγραμματισμός, λοιπόν, είναι μιαεξαιρετικά σύνθετη εργασία και αποτελείται από πολλές φάσεις που είναι όλες εξίσου σημαντικές και συμβάλλουν στη λύση του προβλήματος. Ας δούμε, όμως, λίγο πιο αναλυτικά ποιά είναι αυτά ταβήματα.

Καθορισμός του Προβλήματος. - Είναι προφανές, όπως έχουμε ήδη αναφέρει, ότι πριν αρχίσουμε, πρέπει να ξέρουμε ακριβώς τί θέλουμε να κάνουμε. Αλλά αυτό το προφανές βήμα,παραλείπεται συχνά από τους προγραμματιστές, που ξεκινούν να λύσουν ένα πρόβλημα, ενώ υπάρχουν ασάφειες και αβεβαιότητες. Η σαφής κατανόηση του τί ακριβώς απαιτείται ωςαποτέλεσμα, είναι απολύτως απαραίτητη για τη δημιουργία μιας εφαρμόσιμης λύσης.

1.

Περιγραφή της Λύσης - Εκτός από τα προγράμματα τα οποία λύνουν πολύ απλά προβλήματα, ένα πρόγραμμα, δεν αποτελείται από ένα μόνο "κομμάτι" αλλά, από πολλές αλληλένδετεςπρογραμματιστικές μονάδες (program modules ή units). Για παράδειγμα, ένα αυτοματοποιημένο σύστημα μισθοδοσίας δεν αντιμετωπίζεται ως ένα ενιαίο πρόγραμμα. Περιέχει, πιθανώς,διάφορες μονάδες προγραμμάτων (program modules), όπως για παράδειγμα, την επικύρωση των δεδομένων εισόδου, την ταξινόμηση ή τη συγχώνευση αρχείων, τον υπολογισμό και τηντύπωση επιταγών πληρωμής, την τύπωση κάποιων καταστάσεων (reports) κτλ. Στα μεγάλα προγράμματα, είναι εξαιρετικά σημαντικό να διευκρινιστούν όλες οι ξεχωριστές μονάδεςπρογραμμάτων, ποιές είναι οι λειτουργίες τους, αλλά και πώς αυτές συσχετίζονται και αλληλεπιδρούν.

2.

Επιλογή και Αναπαράσταση Αλγορίθμων - Ένας αλγόριθμος, είναι η συγκεκριμένη μέθοδος που χρησιμοποιείται για να λυθεί ένα πρόβλημα. Αν η λύση του προβλήματος δεν είναι γνωστή,τότε θα πρέπει εμείς ν' αναπτύξουμε τον αλγόριθμό που λύνει το πρόβλημα. Αν, όμως, η λύση του προβλήματος είναι γνωστή, τότε θα πρέπει να επιλέξουμε έναν (τον πιο αποδοτικό) απότους υπάρχοντες αλγορίθμους που λύνουν το συγκεκριμένο πρόβλημα. Όπως θα δούμε αργότερα, δεν είναι καλή ιδέα ν' αρχίσουμε αμέσως να γράφουμε σε κώδικα τις άτυπες προδιαγραφέςενός αλγορίθμου σε κάποια συγκεκριμένη γλώσσα προγραμματισμού. Είναι σημαντικό, ν' αναπτυχθεί η περιγραφή των λεπτομερειών της προτεινόμενης λύσης σε μια αλγοριθμικήαντιπροσώπευση που είναι ανεξάρτητη από οποιοδήποτε γλώσσα προγραμματισμού ή υπολογιστή.

3.

Κωδικοποίηση (Coding) - Η συγγραφή του κώδικα του προγράμματος χρησιμοποιώντας κάποια γλώσσα προγραμματισμού, μπορεί ν' αρχίσει μόνο μετά το σαφή ορισμό του προβλήματος,την οργάνωση της λύσης, και το σχεδιασμό διεξοδικών βημάτων και λεπτομερειών του αλγορίθμου. Η γλώσσα προγραμματισμού η οποία επιλέγεται, καθορίζεται συνήθως από τη φύση τουπροβλήματος.

4.

Δοκιμή και επικύρωση (Testing and Validation) - Δεν είναι αρκετό, απλά να έχουμε κάποια αποτελέσματα από ένα πρόγραμμα που δημιουργήσαμε. Πρέπει να εγγυηθούμε ότι είναι τασωστά αποτελέσματα, αλλά και επιπλέον, ότι το πρόγραμμα θα παράγει αυτά τα σωστά αποτελέσματα σε όλες τις περιπτώσεις.

5.

Τεκμηρίωση (Documentation) - Τεκμηρίωση, είναι το σύνολο του γραπτού υλικού που περιγράφει και επεξηγεί τα συστατικά μέρη και τις λειτουργίες ενός προγράμματος και είναι μια συνεχήςδιαδικασία. Οι προδιαγραφές του προγράμματος από το βήμα 1, η αλγοριθμική αναπαράσταση από το βήμα 3, καθώς και το ίδιο το πρόγραμμα από το βήμα 4, μπορούν όλα να θεωρηθούνμέρος της τεκμηρίωσης ενός προγράμματος. Μετά την υλοποίηση του προγράμματος, πρέπει να εξασφαλίσουμε ότι η τεκμηρίωσή μας είναι χρήσιμη αλλά και πλήρης. Αυτό σημαίνει, ότι πρέπεινα συμπεριλάβουμε και την τεχνική τεκμηρίωση για άλλους προγραμματιστές, αλλά και την τεκμηρίωση για τη χρήση του προγράμματος για τους απλούς χρήστες.

6.

Στις επόμενες ενότητες αυτού του κεφαλαίου, θ' ασχοληθούμε με τον καθορισμό ενός προβλήματος (βήμα 1) και με την επιλογή και αναπαράσταση αλγορίθμων (βήμα 3). Σε όλα τα υπόλοιπακεφάλαια, θ' ασχοληθούμε με την κωδικοποίηση (βήμα 4) και συγκεκριμένα με την εκμάθηση της γλώσσας προγραμματισμού Pascal, συνδυάζοντας πάντα τον αλγοριθμικό τρόπο σκέψης.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 6: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.5 - Καθορισμός ενός Προβλήματος

Το στάδιο καθορισμού του προβλήματος (definition phase), περιλαμβάνει την ανάπτυξη και τη διευκρίνιση της επακριβής περιγραφής του προβλήματος. Πρέπει, δηλαδή, να βρούμε τί ακριβώς είναιαυτό που πρέπει να κάνουμε. Μπορεί να φαίνεται, ότι η συγκεκριμένη διεργασία είναι κάτι εύκολο, απλό, ίσως και ευνόητο, αλλά η επακριβής κατανόηση ενός προβλήματος είναι ίσως το πιοσημαντικό μέρος στη διαδικασία επίλυσής του. Ο λόγος, είναι ότι τα προβλήματα σπάνια περιγράφονται με σαφή και ξεκάθαρο τρόπο, γιατί οι άνθρωποι χρησιμοποιούν συχνά αόριστους ή καιδιφορούμενους όρους. Τις περισσότερες φορές, κάποιος που περιγράφει κάποιο πρόβλημα, δεν έχει τη γνώση των δυνατοτήτων και των περιορισμών των υπολογιστών και είναι φυσικό και απόλυτακατανοητό κάποιος γιατρός, λογιστής, δικηγόρος ή επιχειρηματίας να θέτει ένα πρόβλημα, δίνοντας μια περιγραφή η οποία είναι λυτή και αόριστη όπως τα παρακάτω παραδείγματα.

"Όταν θέλω να βρω μια κάποια νομική απόφαση, παίρνω τηλέφωνο στο συμβούλιο της επικρατείας (ΣΤΕ) και μου τη στέλνουν με φαξ μετά από δύο μέρες. Θα μου ήταν πολύ χρήσιμο, ανήταν όλες καταχωρημένες στον υπολογιστή μου και τις έψαχνα από εκεί""Θα ήθελα να αυτοματοποιήσω τη διαδικασία μισθοδοσίας και το λογιστήριο. Έχω πέντε γραμματείς που όλη την ημέρα συμπληρώνουν επιταγές και φορολογικές δηλώσεις""Καθυστερούμε πάρα πολύ στις αποθήκες των υλικών, όπου έχουμε να συμπληρώσουμε πάρα πολλά έντυπα παραγγελιών""Στην επιχείρησή μου, δυσκολευόμαστε πάρα πολύ όταν κάνουμε απογραφή των προϊόντων και θα θέλαμε να αυτοματοποιήσουμε αυτή την διαδικασία"

Για ένα προγραμματιστή, όλα τα παραπάνω παραδείγματα προβλημάτων, αντιπροσωπεύουν περιοχές εφαρμογής των υπολογιστών, άλλα οι περιγραφές τους, είναι πάρα πολύ ασαφής για νασυγκροτήσουν τη βάση μιας πιθανής επίλυσης. Είναι απαραίτητο, λοιπόν, να υπάρξουν αρκετές συζητήσεις με τον «πελάτη» ενός προβλήματος, για να διευκρινιστούν ασαφή μέρη, να προσδιοριστούνοι οποιεσδήποτε εναλλακτικές επιλογές και να υπάρξει ξεκάθαρη κατανόηση του τί ακριβώς χρειάζεται να γίνει.

Το αποτέλεσμα αυτής της συνεργασίας, είναι το σύνολο των προδιαγραφών του προβλήματος (problem specifications), οι οποίες περιγράφουν το επακριβές πρόβλημα που θέλουμε να λύσουμε, μεαπλό και λεπτομερή τρόπο. Οι προδιαγραφές ενός προβλήματος, περιλαμβάνουν τρεις σημαντικές κατηγορίες πληροφοριών:

Προδιαγραφές Εισαγωγής (Input Specifications). Η κατηγορία αυτή, περιγράφει τις εισαγωγές (input) του προγράμματος. Θα πρέπει, για παράδειγμα, να περιλαμβάνει απαντήσεις για ταπαρακάτω ερωτήματα:

Ποιές συγκεκριμένες τιμές θα δίνονται ως εισαγωγές στο πρόγραμμα;Σε τί μορφή θα είναι αυτές οι τιμές (π.χ. με ποιά σειρά, με πόση ακρίβεια, σε τί μέγεθος);Για κάθε εισαγωγή δεδομένων ή στοιχείων, ποιό είναι το έγκυρο σύνολο τιμών, από το οποίο μπορούν να ανατεθούν τιμές;Τί περιορισμοί υπάρχουν για την χρήση των εισαγωγών; Επιτρέπετε η τροποποίηση μιας εισαγωγής; Μπορούμε ν' αγνοήσουμε μια εισαγωγή μετά την χρήση της;

1.

Προδιαγραφές Εξόδου (Output Specifications). Πρέπει, επίσης, να περιγράψουμε τις εξόδους (output) που θα παράγονται από ένα πρόγραμμα. Θα πρέπει, λοιπόν, οι προδιαγραφέςεξόδου, να περιλαμβάνουν απαντήσεις στα παρακάτω είδη ερωτημάτων:

Τί τιμές θα παράγονται;Ποιά είναι η μορφή και η διάταξη αυτών των τιμών;Υπάρχουν κάποιες ενδείξεις για την ποσότητα των εξόδων που θα παραχθούν;Τί σημειώσεις, σχολιασμοί ή τίτλοι χρειάζονται σε μια αναφορά που περιέχει εξόδους του προγράμματος;

2.

Ειδικές Προδιαγραφές Επεξεργασίας (Special Processing). Στις προδιαγραφές ενός προβλήματος, πρέπει επίσης, ν' αναλύουμε όλες τις ειδικές καταστάσεις για τις οποίες πρέπει να γίνειέλεγχος και να διευκρινίζουμε τις ενέργειες αποκατάστασης που πρέπει να πάρουμε αν προκύψει μια τέτοια κατάσταση. Αυτές οι ειδικές καταστάσεις, θα μπορούσαν να θεωρηθούν ως μησυνηθισμένες περιστάσεις που απαιτούν έναν ιδιαίτερο χειρισμό ή ως λάθη που απαιτούν διόρθωση και αποκατάσταση.

3.

Η προδιαγραφές εισαγωγής, εξόδου και ειδικής επεξεργασίας, αντιπροσωπεύουν τις σημαντικότερες πληροφορίες που συλλέγονται κατά τη διάρκεια του καθορισμού ενός προβλήματος.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 7: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.5.1 - Παράδειγμα Καθορισμού ενός Προβλήματος

Θα χρησιμοποιήσουμε ως παράδειγμα, ένα πολύ απλό, όμως ,πολύ σημαντικό πρόβλημα - την αναζήτηση μέσα σε μια λίστα αντικειμένων. Η συγκεκριμένη εφαρμογή, δεν εμφανίζεται συνήθως ωςξεχωριστό πρόβλημα, αλλά, ως μια λειτουργία ενός πολύ μεγαλύτερου προγράμματος. Για παράδειγμα, σε ένα σύστημα μισθοδοτικών καταστάσεων μπορεί να χρειαστεί, να ψάξουμε και να βρούμετο ποσοστό αμοιβής ενός υπαλλήλου. Σε ένα πρόγραμμα γλωσσικών μεταφράσεων, μπορεί να χρειαστεί ν' αναζητήσουμε μια λέξη μέσα σε μια λίστα από λέξεις, για να βρούμε την αντίστοιχή της σεμια άλλη γλώσσα. Μια άλλη εφαρμογή, χρήσιμη για την αστυνομία, είναι η αναζήτηση του αριθμού μιας συγκεκριμένης πινακίδας κυκλοφορίας μέσα σε έναν κατάλογο (λίστα), που περιέχει αριθμούςπινακίδων κλεμμένων αυτοκινήτων. Το πρόβλημα, διατυπώνεται συνήθως με την εξής μια μορφή:

Έστω, ότι έχουμε μια λίστα από τιμές, καθώς και μια ειδική τιμή την οποία επιθυμούμε να βρούμε. Να γίνεται αναζήτηση μέσα στην λίστα τιμών και να ενημερώνεται ο χρήστης, για το αν ηειδική τιμή εμφανίζεται οπουδήποτε μέσα στη λίστα τιμών.

Η παραπάνω δήλωση του προβλήματος, μπορεί να φαίνεται αρκετά σαφής. Εντούτοις, εάν εφαρμόσουμε τα κριτήρια που είδαμε στην προηγούμενη ενότητα, θα διαπιστώσουμε ότι είναι μια πολύκακή περιγραφή του προβλήματος. Όλες οι ακόλουθες ερωτήσεις, έχουν αφεθεί αναπάντητες:

Ποιός είναι ο τύπος και η δομή των τιμών που περιλαμβάνονται στη λίστα;1.Γνωρίζουμε πόσες τιμές (στοιχεία) υπάρχουν στη λίστα;2.Ποιός είναι ο τύπος της ειδική τιμής, την οποία ψάχνουμε να βρούμε;3.Μπορεί η ίδια τιμή, να εμφανίζεται δύο ή και περισσότερες φορές μέσα στη λίστα;4.Τί μήνυμα θέλουμε να εμφανίζεται, όταν βρίσκουμε την ειδική τιμή μέσα στη λίστα;5.Τί μήνυμα θέλουμε να εμφανίζεται, όταν δε βρίσκουμε την ειδική τιμή μέσα στη λίστα;6.Εκτός από ένα από τα δύο προηγούμενα μηνύματα, θέλουμε να εμφανίζονται κάποιες άλλες πληροφορίες;7.

Θα πρέπει, λοιπόν, να δοθούν απαντήσεις για όλα τα παραπάνω ερωτήματα. Εάν χρησιμοποιούμε ως παράδειγμα το πρόβλημα με τα κλεμμένα αυτοκίνητα, ίσως μετά από συζητήσεις με αρμόδιοπροσωπικό της αστυνομίας να καταλήξουμε στην περιγραφή του προβλήματος που παρουσιάζεται στον παρακάτω πίνακα.

Υπάρχει μία λίστα μεταβλητού μεγέθους που περιέχει αριθμούς πινακίδων κυκλοφορίας κλεμμένων αυτοκινήτων αποτελούμενους από επτά χαρακτήρες στην ακόλουθη μορφή:

Κάθε ένας από τους χαρακτήρες 1, 2 και 3 παίρνουν μία τιμή από το σύνολο τιμών Α, Β, Ε, Ζ, Η, Ι, Κ, Μ, Ν, Ο, Ρ, Τ, Υ, Χ.Κάθε ένας από τους χαρακτήρες 4, 5, 6 και 7 παίρνουν μία τιμή από το σύνολο τιμών 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Θα δίνεται από το χρήστη ένας αριθμός μιας πινακίδας κυκλοφορίας και το πρόγραμμα θα προσδιορίζει εάν ο συγκεκριμένος αριθμός υπάρχει μέσα στη λίστα.

Εάν δεν εμφανίζεται, τότε να παράγεται το μήνυμα: Αριθμός Πινακίδας : "γγγαααα" - Το όχημα δεν έχει αναφερθεί κλεμμένο.Εάν εμφανίζεται, τότε να παράγεται το μήνυμα: Αριθμός Πινακίδας : "γγγαααα" - Το όχημα έχει αναφερθεί κλεμμένο.

Στον παραπάνω πίνακα, η διατύπωση του προβλήματος παρουσιάζει σημαντικές βελτιώσεις και είναι αρκετά σαφής. Εντούτοις, ακόμη και με αυτές τις προδιαγραφές, δεν έχουμε ακόμαολοκληρωμένη και σαφή εικόνα του προβλήματος. Για παράδειγμα, δε διευκρινίζεται πουθενά τί πρέπει να κάνουμε στις ακόλουθες περιστάσεις:

Τί θα πρέπει να γίνεται όταν η ειδική τιμή δίνεται με λανθασμένη μορφή; (π.χ. η πινακίδα κυκλοφορίας που δίνεται είναι με τη μορφή YIΑ123).1.Αν η ειδική τιμή που ψάχνουμε, εμφανίζεται περισσότερο από μια φορά μέσα στη λίστα, ενημερώνουμε μόνο για την πρώτη ή για όλες τις εμφανίσεις;2.Η λίστα τιμών, θα είναι άμεσα διαθέσιμη ή πρέπει να τη «διαβάσουμε» από κάποια συσκευή εισαγωγής;3.

Θα πρέπει, λοιπόν, να καθοριστούν μέσω συζητήσεων, οι έγκυρες απαντήσεις στις προηγούμενες ερωτήσεις, έτσι ώστε να μπορούμε να φτάσουμε στις σωστές προδιαγραφές του προβλήματος,που παρουσιάζονται παρακάτω.

Υπάρχει μια λίστα μεταβλητού μεγέθους, που περιέχει ως στοιχεία τους αριθμούς πινακίδων κυκλοφορίας κλεμμένων αυτοκινήτων. Κάθε στοιχείο μέσα στη λίστα, αντιπροσωπεύει μια πινακίδακυκλοφορίας που αποτελείται από επτά χαρακτήρες στην ακόλουθη μορφή:

Κάθε ένας από τους χαρακτήρες 1, 2 και 3 παίρνουν μια τιμή από το σύνολο τιμών Α, Β, Ε, Ζ, Η, Ι, Κ, Μ, Ν, Ο, Ρ, Τ, Υ, Χ.Κάθε ένας από τους χαρακτήρες 4, 5, 6 και 7 παίρνουν μια τιμή από το σύνολο τιμών 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Το πρόγραμμα, θα πρέπει να δέχεται ως εισαγωγή από το χρήστη τον αριθμό μιας πινακίδας κυκλοφορίας, με τη μορφή που διευκρινίζεται παραπάνω και να εντοπίζει όλες τις εμφανίσεις τουσυγκεκριμένου αριθμού πινακίδας μέσα στη λίστα.

Εάν ο αριθμός της πινακίδας κυκλοφορίας, έχει δοθεί από το χρήστη σε λανθασμένη μορφή, τότε παράγεται το ακόλουθο μήνυμα:

Page 8: All Chapters

γγγααααΛανθασμένη Μορφή - Παρακαλώ Ελέγξτε και Εισάγετε Ξανά τον Αριθμό.Εάν ο αριθμός της πινακίδας κυκλοφορίας δεν εμφανίζεται ποτέ μέσα στη λίστα, τότε να παράγεται το ακόλουθο μήνυμα:Αριθμός Πινακίδας : "γγγαααα" - Το όχημα δεν έχει αναφερθεί κλεμμένο.Εάν ο αριθμός της πινακίδας κυκλοφορίας εμφανίζεται τουλάχιστον μια φορά μέσα στη λίστα, τότε να παράγεται το ακόλουθο μήνυμα:Αριθμός Πινακίδας : "γγγαααα" - Το όχημα έχει αναφερθεί κλεμμένο "x" φορές.όπου x είναι ένας ακέραιος αριθμός, που υποδηλώνει πόσες φορές εμφανίζεται ο συγκεκριμένος αριθμός πινακίδας μέσα στη λίστα.

Η λίστα, είναι αποθηκευμένη στον σκληρό δίσκο, σε ένα αρχείο που ονομάζεται PLATES.dat που βρίσκεται στον κατάλογο C:\datafiles\

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 9: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.6 - Αλγόριθμοι

Στην καθημερινή μας ζωή, επιλύουμε συνεχώς διάφορα προβλήματα που αφορούν συνήθεις δραστηριότητές μας, όπως για παράδειγμα, να διασχίσουμε ένα κεντρικό δρόμο, να αγοράσουμε κάποιοπροϊόν, ή να μαγειρέψουμε κάποιο φαγητό. Για να αντιμετωπίσουμε αυτά τα καθημερινά προβλήματα, ακολουθούμε χωρίς να το αντιληφθούμε συνειδητά, κάποια ενδιάμεσα λογικά βήματα. Έτσι,λοιπόν, όταν θέλουμε ν' αγοράσουμε ένα προϊόν, πρώτα ελέγχουμε αν έχουμε τα απαραίτητα χρήματα, ύστερα πληρώνουμε και τέλος υπολογίζουμε αν τα ρέστα είναι σωστά, αν το καταβαλλόμενοποσό είναι μεγαλύτερο από το κόστος αγοράς. Με την ίδια λογική, πριν διασχίσουμε έναν κεντρικό δρόμο, ελέγχουμε αν το φανάρι για τους πεζούς είναι πράσινο και αν περνάνε αυτοκίνητα. Όταν,όμως, έχουμε να λύσουμε ένα πρόβλημα χρησιμοποιώντας έναν ηλεκτρονικό υπολογιστή, είναι επιτακτική η καταγραφή του τρόπου επίλυσης, δηλαδή ,των διαδοχικών λογικών βημάτων που οδηγούνστη λύση του προβλήματος.

Μια από τις πιο σημαντικές έννοιες στο χώρο της επιστήμης της πληροφορικής, είναι ο αλγόριθμος. Ο όρος αλγόριθμος, χρησιμοποιείται για να δηλώσει τη μέθοδο επίλυσης ενός προβλήματος.Ωστόσο, ένας πιο αυστηρός ορισμός της έννοιας αυτής, είναι ο εξής: "Αλγόριθμος είναι ένα πεπερασμένο σύνολο αυστηρά καθορισμένων ενεργειών που στοχεύουν στην εκπλήρωση ενός έργουμέσα σε πεπερασμένο χρόνο".

Με πιο απλά λόγια, είναι η μη διφορούμενη περιγραφή των διαδοχικών βημάτων (εντολών) μιας διαδικασίας επίλυσης προβλήματος, η οποία καταλήγει σε λύση σε πεπερασμένο χρόνο. Αξίζει νααναφέρουμε ,ότι ο όρος αλγόριθμος, δεν αναφέρεται απαραίτητα σε προβλήματα που απαιτούν επεξεργασία και επίλυση με τη χρήση ηλεκτρονικού υπολογιστή. Για πολλά χρόνια, η λέξη αλγόριθμος,είχε μόνο μαθηματική έννοια, όταν χρειαζόταν να αναφερθούμε σε συστηματική επεξεργασία αριθμών. Κάθε αλγόριθμος, όμως ,πρέπει απαραίτητα να ικανοποιεί τα επόμενα κριτήρια:

Καθοριστικότητα (definiteness). Κάθε εντολή, πρέπει να ορίζεται χωρίς καμια αμφιβολία για τον τρόπο εκτέλεσης της.Περατότητα (finiteness). Ο αλγόριθμος, θα πρέπει να τελειώνει μετά από πεπερασμένα βήματα εκτέλεσης των εντολών του.Αποτελεσματικότητα (effectiveness). Κάθε μεμονωμένη εντολή του αλγορίθμου, πρέπει να είναι απλή, που σημαίνει ότι δεν αρκεί απλά να έχει ορισθεί μια εντολή αλλά θα πρέπει να μπορείκαι να εκτελεστεί.

Τέλος, είναι επίσης σημαντικό να αναφέρουμε, ότι ένας αλγόριθμος συνήθως επεξεργάζεται κάποια δεδομένα (είσοδος δεδομένων π.χ. από κάποιο αρχείο ή από το πληκτρολόγιο) και παράγεικάποια άλλα δεδομένα ως αποτελέσματα (έξοδος δεδομένων π.χ. στην εμφάνιση στην οθόνη ή αποθήκευση σε κάποιο αρχείο).

Αν και η έννοια του αλγόριθμου εξηγείται συχνά με το παράδειγμαμιας συνταγής, εμείς ως πρώτο, απλό παράδειγμα θα δούμε τοναλγόριθμο που ακολουθείται για να βάλουμε ένα CD σε έναCD-PLAYER έτσι ώστε να ακούσουμε μουσική. Μελετήστε τοναλγόριθμο που βρίσκεται στον πίνακα δεξιά.

Βήμα 1ο: Παίρνουμε το CD-PLAYER Βήμα 2ο: Βάζουμε το καλώδιο του CD-PLAYER στην πρίζα Βήμα 3ο: Παίρνουμε το CD Βήμα 4ο: Πατάμε το κουμπί EJECT για να ανοίξει το πορτάκι του CD-PLAYER Βήμα 5ο: Τοποθετούμε το CD μέσα στην ειδική θέση του CD-PLAYER Βήμα 6ο: Πατάμε το κουμπί PLAY

Παρόλο που πολλοί αλγόριθμοι, είναι πολύ πιο πολύπλοκοι, ο παραπάνω αλγόριθμος αποτελείται από διαδοχικά βήματα τα οποία πρέπει να ακολουθηθούν έτσι ώστε να μπορέσουμε να ακούσουμεμουσική από το CD-PLAYER. Επίσης, αν εξετάσουμε τον αλγόριθμο σύμφωνα με τα τρία κριτήρια που είδαμε παραπάνω, θα δούμε ότι πληρεί το κριτήριο της περατότητας, εφόσον ολοκληρώνεταιτο έργο (το να ακούσουμε μουσική) σε έξι βήματα, καθώς επίσης και το κριτήριο της αποτελεσματικότητας εφόσον όλα τα βήματα είναι απλά. Δεν πληρεί όμως, το κριτήριο της καθοριστικότητας.Αυτό συμβαίνει στο πέμπτο βήμα (όταν πρέπει να τοποθετήσουμε το CD μέσα στο CD-PLAYER), για το οποίο υπάρχει ασάφεια ως προς τον τρόπο εκτέλεσής της. Κι αυτό, γιατί αν τοποθετήσουμετο CD ανάποδα, δε θα μπορέσει να διαβαστεί από το CD-PLAYER με αποτέλεσμα να μην ακούσουμε μουσική. Η σωστή ,λοιπόν, εφαρμογή ενός αλγόριθμου δε θα εκπληρώσει κάποιο έργο ή δε θαλύσει ένα πρόβλημα, εάν ο αλγόριθμος είναι λανθασμένος ή μη κατάλληλος για το πρόβλημα. Υπάρχουν, όμως και άλλες περιπτώσεις, στις οποίες ο παραπάνω αλγόριθμός δε θα είναιαποτελεσματικός. Για παράδειγμα, δε θα ακουστεί η μουσική, αν ο ήχος είναι ρυθμισμένος στο μηδέν, αλλά ούτε και αν κάποιος κατά λάθος χρησιμοποιήσει ένα CD-ROM ή ένα DVD-ROM αντί γιαCD ήχου. Θα τελειώσουμε, λοιπόν, αυτή την ενότητα συνοψίζοντας τα κυριότερα χαρακτηριστικά που πρέπει να έχει ένας αλγόριθμος.

Ακριβής περιγραφή των δεδομένωνΣαφής καθορισμός των βημάτων τουΠεπερασμένος αριθμός βημάτωνΟλοκλήρωση κάθε βήματος σε καθορισμένο χρόνοΑκρίβεια του αποτελέσματος κάθε βήματοςΣωστή ολοκλήρωση της σκέψης επίλυσης του προβλήματος για κάθε περίπτωση

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 10: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.7 - Αλγοριθμικές Δομές

Το αλγοριθμικό παράδειγμα που είδαμε στην προηγούμενη ενότητα με το CD-PLAYER, ήταν ένα πολύ απλό παράδειγμα αλγορίθμου που αποτελούνταν από έξι διαδοχικά βήματα. Τις περισσότερεςφορές, όμως, οι αλγόριθμοι έχουν επαναλαμβανόμενα βήματα ή απαιτούν κάποιες αποφάσεις μέχρι ότου να ολοκληρωθεί το έργο. Πριν, λοιπόν, δούμε κάποια πιο πολύπλοκα παραδείγματααλγορίθμων, πρέπει να εξηγήσουμε ποιες είναι οι βασικές δομές που χρησιμοποιούνται για την κατασκευή των αλγορίθμων καθώς και πώς μπορούμε να αναπαραστήσουμε έναν αλγόριθμο.

Οι αλγοριθμικές δομές, αναφέρονται στον τρόπο που εκτελείται το σύνολο των εντολών ενός αλγορίθμου. Υπάρχουν τρεις βασικές αλγοριθμικές δομές, για τις οποίες θα δούμε κάποια βασικάπράγματα σε αυτή την ενότητα και θα τις αναλύσουμε περισσότερο αφού δούμε τους τρόπους αναπαράστασης αλγορίθμων:

1. Ακολουθιακή ΔομήΣτην ακολουθιακή δομή η μια εντολή ακολουθεί την άλλη με διαδοχικό τρόπο. Είναι, δηλαδή, δεδομένη η σειρά εκτέλεσης του συνόλου των εντολών, οι οποίες εκτελούνται σειριακά, δηλαδή, βήμα προςβήμα. Ένα παράδειγμα ακολουθιακής δομής, είναι το παράδειγμα του CD-PLAYER που είδαμε στην προηγούμενη ενότητα. Ένα ακόμη παράδειγμα ακολουθιακής δομής είναι τα βήματα πουακολουθούμε όταν θέλουμε να φτιάξουμε ένα φλιτζάνι μέτριο ελληνικό καφέ.

2. Δομή ΕπιλογήςΗ διαδικασία επίλυσης ενός προβλήματος, περιλαμβάνει συνήθως διάφορες ιδιαιτερότητες ,οι οποίες θα πρέπει να ληφθούν υπόψιν. Έτσι ,λοιπόν, μπορεί να χρειαστεί να ληφθούν κάποιεςαποφάσεις με βάση κάποια κριτήρια. Με άλλα λόγια, κάποια βήματα του αλγορίθμου μπορεί να ισχύουν και να πρέπει να εκτελεστούν για κάποια περίπτωση του προβλήματος, ενώ για κάποια άλληπερίπτωση, να πρέπει να ακολουθηθούν άλλα βήματα ή κάποια άλλη διαδικασία. Ένα απλό παράδειγμα, είναι η διαίρεση δυο αριθμών η οποία μπορεί να εκτελεστεί μόνο αν ο διαιρέτης δεν είναιμηδέν

Η δομή επιλογής, περιλαμβάνει τον έλεγχο κάποιας συνθήκης η οποία θα είναι αληθής ή ψευδής (δηλαδή θα ισχύει ή όχι). Με βάση την τιμή αυτής της λογικής συνθήκης, αποφασίζεται ποια θα είναι ηεπόμενη εντολή που θα εκτελεστεί. Για να γίνει πιο κατανοητή η λειτουργία της δομής επιλογής, ας δούμε δυο απλά παραδείγματα: Παράδειγμα 1 , Παράδειγμα 2.

3. Δομή ΕπανάληψηςΚατά την διαδικασία επίλυσης ενός προβλήματος, μπορεί να χρειαστεί να επαναληφθεί η εκτέλεση μιας ή και περισσοτέρων εντολών. Ο πιο απλός λόγος για να υπάρχει επανάληψη, είναι γιατίκάποια ακολουθία εντολών πρέπει να εκτελεστεί παραπάνω από μια φορά. Για παράδειγμα, στον αλγόριθμο που χρησιμοποιήσαμε για να φτιάξουμε ένα φλιτζάνι ελληνικό καφέ, οι παρακάτωεντολές θα έπρεπε να εκτελεστούν τρεις φορές αν φτιάχναμε τρεις ελληνικούς μέτριους καφέδες:

Εντολή 1: γεμίζουμε το φλιτζανάκι με νερό από τη βρύση και το αδειάζουμε στο μπρίκιΕντολή 2: γεμίζουμε ένα κουταλάκι ελληνικό καφέ από το δοχείο και το αδειάζουμε στο μπρίκιΕντολή 3: γεμίζουμε μισό κουταλάκι ζάχαρη από το δοχείο και το αδειάζουμε στο μπρίκι

Ένας άλλος λόγος που μπορεί να χρειαστεί να επαναληφθεί η εκτέλεση μιας ή περισσοτέρων εντολών, είναι όσο ισχύει κάποια συνθήκη ή μέχρι να ισχύσει κάποια συνθήκη. Δυο απλά παραδείγματααυτών των δύο περιπτώσεων, βλέπουμε στους απλούς αλγόριθμους παρακάτω.

Επανάληψη με Έλεγχο Στην Αρχή

Όσο υπάρχουν στάσεις στο φίλμ Επανέλαβε Εντολή 1: Εστίασε. Εντολή 2: Βγάλε φωτογραφία.Τέλος_Επανάληψης

Στο συγκεκριμένο παράδειγμα, οι δύο εντολές Εστίασε και Βγάλε φωτογραφίαεπαναλαμβάνονται συνέχεια όσο η συνθήκη στην αρχή ισχύει, δηλαδή όσο υπάρχουνστάσεις μέσα στο φίλμ.

Επανάληψη με Έλεγχο Στο Τέλος

Επανέλαβε τα εξής Εντολή 1: Πάρε την μπάλα μπάσκετ. Εντολή 2: Σούταρε προς το καλάθι.Μέχρι να βάλεις δέκα καλάθια.

Σε αυτό παράδειγμα, οι δύο εντολές Πάρε την μπάλα μπάσκετ και Σούταρε προς τοκαλάθι επαναλαμβάνονται μέχρι η συνθήκη που είναι στο τέλος να ισχύει, δηλαδή μέχρινα πετύχει κάποιος δέκα καλάθια.

Στην επόμενη ενότητα, θα δούμε πώς μπορούμε να αναπαραστήσουμε τα βήματα και τις δομές ενός αλγορίθμου, καθώς και τις εντολές που χρησιμοποιούνται για επίλυση προβλημάτων μεηλεκτρονικό υπολογιστή.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 11: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.8 - Τρόποι Αναπαράστασης Αλγορίθμων

Τα περισσότερα παραδείγματα που έχουμε δει μέχρι τώρα, είναι από την καθημερινή μας ζωή και χρησιμοποιήσαμε απλή, φυσική γλώσσα για να περιγράψουμε βήμα προς βήμα τη διαδικασίαεπίλυσης, δηλαδή, τον αλγόριθμο. Αυτός είναι ένας από τους τρόπους που μπορεί να χρησιμοποιηθεί για την περιγραφή ενός αλγορίθμου. Ένας άλλος τρόπος, είναι με ελεύθερο κείμενο, δηλαδή τησυγγραφή μιας μορφής έκθεσης που παρουσιάζει τον τρόπο επίλυσης ενός προβλήματος. Όμως, και οι δυο αυτές μέθοδοι, εγκυμονούν κινδύνους. Στο ελεύθερο κείμενο, δεδομένου του αδόμητουτρόπου παρουσίασης, είναι πολύ δύσκολο να απομονωθούν και να οριστούν οι εντολές. Με τη χρήση της φυσικής γλώσσας κατά βήματα, μπορούμε να απομονώσουμε καλύτερα τα βήματα και τιςεντολές του αλγορίθμου αλλά μπορεί να δημιουργηθούν αμφιβολίες για τον ορισμό, αλλά και για τον τρόπο εκτέλεσης κάποιας εντολής. Ο λόγος είναι, ότι οι λέξεις του φυσικού λεξιλογίου μπορούνεύκολα να παρερμηνευτούν. Αρα, λοιπόν, η χρήση του ελευθέρου κειμένου και της φυσικής γλώσσας κατά βήματα δε συνιστάται για την περιγραφή αλγορίθμων, διότι μπορούν εύκολα να οδηγήσουνσε ένα μη εκτελέσιμο αλγόριθμο.

Ένας τρίτος τρόπος αναπαράστασης αλγορίθμων, είναι με διαγραμματικές τεχνικές. Με αυτόν τον τρόπο, τα βήματα, οι εντολές και η ροή του αλγορίθμου παρουσιάζονται χρησιμοποιώντας κάποιασχήματα και σύμβολα. Η πιο γνωστή διαγραμματική τεχνική, είναι τα διαγράμματα ροής (flow charts) που δείχνουν τη διαχρονική δομή του προγράμματος, δηλαδή τα βήματα τα οποία πρέπει ναακολουθήσει κανείς για να φτάσει στην λύση ενός προβλήματος. Ένα διάγραμμα ροής ,αποτελείται από συγκεκριμένα γεωμετρικά σχήματα καθένα από τα οποία δηλώνει μια αλγοριθμική ενέργεια.Τα κυριότερα είναι τα εξής:

Έλλειψη: δηλώνει την αρχή και το τέλος ενός αλγορίθμουΡόμβος: δηλώνει μια λογική συνθήκηΟρθογώνιο: δηλώνει την εκτέλεση πράξεων καθώς και την ανάθεση τιμών σε στοιχεία του αλγορίθμουΠλάγιο παραλληλόγραμμο: δηλώνει είσοδο ή έξοδο στοιχείων και δεδομένωνΒελάκια: δηλώνουν τη σειρά εκτέλεσης (τη ροή) των ενεργειών του αλγορίθμου

Η αξία των διαγραμμάτων ροής, βρίσκεται στην ευκολία αντίληψής τους και στην ευνόητη παρουσίασή τους. Ένα παράδειγμα αναπαράστασης ενός αλγορίθμου με διάγραμμα ροής μπορείτε να δείτεσε αυτή την εικόνα.

Aν και τα διαγράμματα ροής, είναι λειτουργικά και αποδοτικά, ο πιο διαδεδομένος τρόπος αναπαράστασης αλγορίθμων είναι ο ψευδοκώδικας. Με τον ψευδοκώδικα (pseudocode), τα βήματα μιαςλύσης ή η μορφή ενός αλγόριθμου περιγράφονται με σύντομες και περιεκτικές προτάσεις που όμως υπακούουν σε μια τυποποίηση που πλησιάζει την τυποποίηση μιας γλώσσας προγραμματισμού.Σε αυτήν την εικόνα, βλέπουμε ένα παράδειγμα της αναπαράστασης ενός αλγορίθμου σε ψευδοκώδικα. Το μεγαλύτερο πλεονέκτημα της χρήσης του ψευδοκώδικα είναι ότι δεν ασχολούμαστε με τιςλεπτομέρειες υλοποίησης σε κάποια συγκεκριμένη γλώσσα προγραμματισμού που όπως αναφέραμε και στην ενότητα 1.4 συνήθως επιλέγεται ανάλογα με την φύση του προβλήματος και την λύση,την οποία προτείνουμε. Τα κυριότερα στοιχεία του ψευδοκώδικα είναι τα εξής:

Τελεστές (operators): σύμβολα που χρησιμοποιούνται για διάφορες πράξεις. Οι πιο σημαντικοί τελεστές, είναι οι αριθμητικοί (+, -, /, *), οι συγκριτικοί (<, >, =, , , ), οι λογικοί (και - σύζευξη,ή - διάζευξη, όχι - άρνηση), και ο τελεστής εκχώρησης (ή αλλιώς ανάθεσης) τιμής ( ).

Μεταβλητές (variables): αντικείμενα τα οποία χρησιμοποιούνται για να αναπαραστήσουν δεδομένα. Σε μια μεταβλητή μπορούμε ν' αναθέσουμε κάποια τιμή, η οποία φυσικά μπορεί ν' αλλάξει κατάτην διάρκεια εκτέλεσης του αλγορίθμου (π.χ. στην έκφραση η μεταβλητή παίρνει την τιμή 5). Αν και όλα τα στοιχεία του ψευδοκώδικα θα τα εξετάσουμε διεξοδικά όταν θ' αναφερθούμε στηγλώσσα προγραμματισμού Pascal, οι μεταβλητές είναι ένα πολύ σημαντικό στοιχείο και αυτό το παράδειγμα απεικονίζει τη χρησιμότητά αλλά και τη χρήση τους.

Εκφράσεις (expressions): διαμορφώνονται από μεταβλητές και τελεστές. Η τιμή μιας έκφρασης υπολογίζεται για τις τρέχουσες τιμές των μεταβλητών που περιέχει. Συνήθως οι εκφράσεις είναιαριθμητικές και λογικές (π.χ. είναι μία αριθμητική έκφραση ενώ είναι μία λογική έκφραση). Είναι πολύ σημαντικό να αναφέρουμε ότι πρέπει πρώτα να έχουν ανατεθεί τιμές σε όλες τιςμεταβλητές που χρησιμοποιούνται σε λογικές εκφράσεις, καθώς και σε όλες τις μεταβλητές που βρίσκονται στο δεξιό μέρος μιας εντολής εκχώρησης τιμής. Για παράδειγμα, για να μπορέσει ναυπολογιστεί η λογική έκφραση , αν δηλαδή το είναι μεγαλύτερο του , πρέπει οι μεταβλητές και να έχουν τιμές. Εξίσου, για να μπορέσει να υπολογιστεί η έκφραση , πρέπει οιμεταβλητές , και να έχουν τιμές, έτσι ώστε να προσθέσουμε την τιμής της μεταβλητής με την τιμής της μεταβλητής , να πολλαπλασιάσουμε το άθροισμα με την τιμή της μεταβλητής , και ναεκχωρήσουμε το αποτέλεσμα ως τη νέα τιμή της μεταβλητής .

Πολύ σημαντική είναι, επίσης, η εντολή Διάβασε η οποία δηλώνει την εισαγωγή τιμών σε μεταβλητές (από τον χρήστη κυρίως) καθώς και η εντολή Τύπωσε η οποία δίνει τα αποτελέσματα τωνμεταβλητών (κυρίως στην οθόνη). Για παράδειγμα, η εντολή Διάβασε σημαίνει ότι στη μεταβλητή θα ανατεθεί κάποια τιμή, ενώ η εντολή Τύπωσε σημαίνει ότι θα εμφανιστεί η τρέχουσα τιμή τηςμεταβλητής .

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 12: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.9 - Αναπαράσταση Βασικών Δομών Ενός Αλγορίθμου

Στην ενότητα 1.7, είχαμε μιλήσει για τις βασικές δομές ενός αλγορίθμου. Τώρα ,όμως, που έχουμε εξετάσει και τους δυο βασικούς τρόπους αναπαράστασης, μπορούμε να δούμε αναλυτικά ποιέςείναι αυτές οι δομές και πώς θα τις αναπαραστήσουμε με διαγράμματα ροής και ψευδοκώδικα.

1. Δομή Απλής Επιλογής

Ο ψευδοκώδικας της απλής δομής επιλογής είναι:

Αν <συνθήκη> τότε ομάδα εντολών Τέλος_αν

Στην πιο απλή μορφή δομής επιλογής, αν η συνθήκη ισχύει (είναι αληθής), τότε εκτελείται η ομάδα εντολών. Αλλιώς, ο αλγόριθμος συνεχίζει με τη πρώτη εντολήπου υπάρχει μετά το Τέλος αν. Στη δεξιά εικόνα βλέπετε το διάγραμμα ροής της απλής δομής επιλογής. Τέλος, θα αναφέρουμε ότι με τον όρο ομάδα εντολώνενοούμε μια ή περισσότερες εντολές.

2. Δομή Σύνθετης Επιλογής

Ο ψευδοκώδικας της σύνθετης δομής επιλογής είναι ο ακόλουθος:

Αν <συνθήκη> τότε ομάδα εντολών 1 Αλλιώς ομάδα εντολών 2 Τέλος_αν

Σε αυτήν τη δομή επιλογής, αν η συνθήκη ισχύει (είναι αληθής), τότε εκτελείται η ομάδα εντολών και στη συνέχεια η ο αλγόριθμος συνεχίζει με τηνπρώτη εντολή που υπάρχει μετά το Τέλος αν. Στην αντίθετη περίπτωση, αν η συνθήκη δεν ισχύει (είναι ψευδής), τότε εκτελείται η ομάδα εντολών

, αγνοώντας την ομάδα εντολών , και στη συνέχεια η εκτέλεση μεταφέρεται στην πρώτη εντολή που υπάρχει μετά το Τέλος αν.

3. Δομή Πολλαπλής Επιλογής

Ο ψευδοκώδικας της δομής πολλαπλής επιλογής είναι ο ακόλουθος:

Αν <συνθήκη 1> τότε ομάδα εντολών 1 Αλλιώς_Αν <συνθήκη 2> τότε ομάδα εντολών 2 . . . . . . . . Αλλιώς_Αν <συνθήκη ν> τότε ομάδα εντολών ν Αλλιώς ομάδα εντολών αλλιώς Τέλος_αν

Η δομή πολλαπλής επιλογής μας επιτρέπει να ελέγξουμε πολλές περιπτώσεις. Αν αληθεύει η συνθήκη , τότε εκτελείται η ομάδα εντολών και ο αλγόριθμος συνεχίζει με την πρώτη εντολή πουβρίσκεται μετά το Τέλος αν. Αν δεν αληθεύει η συνθήκη αλλά αληθεύει η συνθήκη , τότε εκτελείται η ομάδα εντολών και μετά συνεχίζουμε μετά το Τέλος αν. Αν δεν αληθεύουν οι συνθήκες 1 και

Page 13: All Chapters

2, τότε εξετάζεται η συνθήκη 3 κ.ο.κ. έως την συνθήκη ν. Αν τώρα θέλουμε μια ομάδα εντολών να εκτελείται σε περίπτωση που δεν ισχύει καμία από τις συνθήκες 1, 2, ... ν, τότε μπορούμε να έχουμεμια γενική συνθήκη Αλλιώς και να έχουμε εκεί την ομάδα εντολών που θέλουμε να εκτελείται. Να σημειώσουμε ότι η χρήση του Αλλιώς είναι προαιρετική.

4. Δομή Επανάληψης με Έλεγχο στην Αρχή

Ο ψευδοκώδικας της δομής επανάληψης με έλεγχο στην αρχή είναι ο ακόλουθος:

Όσο <συνθήκη> επανέλαβε ομάδα εντολών Τέλος_επανάληψης

Με τη συγκεκριμένη δομή επανάληψης, η εκτέλεση της ομάδας εντολών επαναλαμβάνεται όσο η συνθήκη ισχύει, δηλαδή είναι αληθής. Όταν η συνθήκη δε θαισχύει πια (γίνει ψευδής), τότε ο αλγόριθμος θα συνεχίζει με την εντολή που βρίσκεται αμέσως μετά το Τέλος επανάληψης. Στην εικόνα δεξιά βλέπουμε τοδιάγραμμα ροής.

5. Δομή Επανάληψης με Έλεγχο στο Τέλος

Ο ψευδοκώδικας της δομής επανάληψης με έλεγχο στο τέλος είναι ο ακόλουθος:

Αρχή_επανάληψης ομάδα εντολών Μέχρις_ότου <συνθήκη>

Με τη δομή αυτή, η εκτέλεση της ομάδας εντολών επαναλαμβάνεται όσο η συνθήκη στο τέλος δεν ισχύει, δηλαδή είναι ψευδής. Η επανάληψη, θα σταματήσει όταν ησυνθήκη γίνει αληθής και ο αλγόριθμος θα συνεχίζει με την εντολή που βρίσκεται αμέσως μετά. Παρατηρούμε επίσης ότι η ομάδα εντολών θα εκτελεστεί τουλάχιστον μιαφορά εφόσον ο έλεγχος για επανάληψη γίνεται στο τέλος.

6. Δομή Επανάληψης με Συγκεκριμένο Αριθμό Επαναλήψεων

Ο ψευδοκώδικας αυτής της δομής επανάληψης είναι:

Για μεταβλητή από m1 μέχρι m2 με_βήμα k ομάδα εντολών Τέλος_επανάληψης

Τη συγκεκριμένη δομή επανάληψης δε την εξετάσαμε στην ενότητα 1.7, αλλά είχαμε αναφέρει ότι μπορεί να χρειαστεί να επαναλάβουμε την εκτέλεση μιας ομάδας εντολών για ένα συγκεκριμένοαριθμό φορών. Πιο συγκεκριμένα, η ομάδα εντολών επαναλαμβάνεται [DIV(m2-m1)/k]+1 φορές (η συνάρτηση DIV επιστρέφει το ακέραιο πηλίκο μιας διαίρεσης). Την πρώτη φορά, η μεταβλητή έχειτην τιμή m1, τη δεύτερη m1+k, την τρίτη m1+k+k, έως την τιμή m2 και άρα δουλεύει ως μετρητής. Αν, για παράδειγμα, είχαμε, Για από μέχρι με βήμα , η ομάδα εντολών θαεκτελούνταν 10 φορές, ενώ αν είχαμε Για από μέχρι με βήμα , η ομάδα εντολών θα εκτελούνταν 5 φορές.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 14: All Chapters

Κεφάλαιο 1

ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΩΝ , ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΑ

1.10 - Παραδείγματα Αλγορίθμων

Τα παρακάτω έξι παραδείγματα παρουσιάζουν βήμα προς βήμα την εκτέλεση αλγορίθμων. Τα συγκεκριμένα παραδείγματα είναι παρουσιάσεις PowerPoint και για να μπορέσετε να τα δείτε θαπρέπει να έχετε εγκατεστημένο στον υπολογιστή σας το Microsoft Powerpoint. Η εγκατάσταση του συγκεκριμένου προγράμματος γίνεται κατά την διάρκεια εγκατάστασης της σουίτας προγραμμάτωνOffice. Σε περίπτωση που δεν έχετε το πρόγραμμα PowerPoint, θα πρέπει να εγκαταστήσετε τον PowerPoint Viewer της Microsoft το οποίο μπορείτε να το βρείτε στον φάκελο \Programs\Powerpoint_Viewer\ του CD.

Μόλις κάνετε ένα αριστερό click πάνω σε κάποιο από τα παραδείγματα θα εμφανιστεί ένα μικρό παράθυρο. Επιλέξετε την επιλογή Ανοιγμα (Open) και περιμένετε μερικά δευτερόλεπτα μέχρι ναξεκινήσει η παρουσίαση.

ΠΑΡΑΔΕΙ ΓΜΑ 1Σύντομη Περιγραφή: Μετατροπή από βαθμούς Φαρενάιτ σε βαθμούς ΚελσίουΑλγοριθμικές Δομές: Δομή ακολουθίας

ΠΑΡΑΔΕΙ ΓΜΑ 2Σύντομη Περιγραφή: Υπολογισμός αθροίσματος και γινομένου τριών αριθμώνΑλγοριθμικές Δομές: Δομή ακολουθίας

ΠΑΡΑΔΕΙ ΓΜΑ 3Σύντομη Περιγραφή: Βαθμολογία τριών εργασιώνΑλγοριθμικές Δομές: Σύνθετη Δομή επιλογής

ΠΑΡΑΔΕΙ ΓΜΑ 4Σύντομη Περιγραφή: Αθροισμα και μέσος όρος αριθμώνΑλγοριθμικές Δομές: Δομή επανάληψης Όσο_Επανέλαβε

ΠΑΡΑΔΕΙ ΓΜΑ 5Σύντομη Περιγραφή: Συνεχής πολλαπλασιασμός αριθμώνΑλγοριθμικές Δομές: Δομή επανάληψης Μέχρις_Ότου

ΠΑΡΑΔΕΙ ΓΜΑ 6Σύντομη Περιγραφή: Βαθμολογία έξι μαθητών στις εξετάσεις για το πτυχίο αγγλικών του LowerΑλγοριθμικές Δομές: Δομή επανάληψης με συγκεκριμένο αριθμό επαναλήψεων και δομή πολλαπλής επιλογής

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 1 Επόμενη Ενότητα

Page 15: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟΙ ΤΟΥ ΚΕΦΑΛΑ ΙΟΥ

2.1 - Εισαγωγή

2.2 - Λεξιλόγιο της Pascal

2.2.1 - Αναγνωριστικά

2.3 - Μεταβλητές

2.3.1 - Ανάθεση Τιμής σε Μεταβλητή

2.4 - Σταθερές

2.5 - Δομή ενός Προγράμματος Pascal

2.5.1 - Ανάλυση Δομής ενός Προγράμματος Pascal

2.6 - Σχόλια

2.7 - Προκαθορισμένοι Τύποι Δεδομένων

2.7.1 - Ακέραιοι Αριθμοί2.7.2 - Πραγματικοί Αριθμοί2.7.3 - Χαρακτήρες και Λογικός Τύπος

2.8 - Τελεστές και Παραστάσεις

2.9 - Εντολές Εισόδου και Εξόδου

2.9.1 - Εντολές Εξόδου2.9.2 - Μορφοποίηση Εξόδου2.9.3 - Εντολές Εισόδου

2.10 - Παραδείγματα Προγραμμάτων

2.11 - Τεστ Αυτοαξιολόγησης Κεφαλαίου

Προηγούμενο Κεφάλαιο Κεντρική Σελίδα Επόμενη Ενότητα

Page 16: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.1 - Εισαγωγή

Στο προηγούμενο κεφάλαιο, εξετάσαμε την έννοια πρόβλημα και είδαμε πώς συσχετίζεται ο προγραμματισμός με την επίλυση προβλημάτων. Είδαμε, επίσης, τί είναι αλγόριθμος, τις τρεις βασικέςαλγοριθμικές δομές, καθώς και τους τρόπους αναπαράστασης αλγορίθμων. Από αυτό το κεφάλαιο, θα δούμε στην πράξη τον τρόπο με τον οποίο υλοποιείται ένα πρόγραμμα στη γλώσσαπρογραμματισμού Pascal. Όπως αναφέραμε στην ενότητα 2.1 του εγχειριδίου χρήσης, η Pascal είναι μια γλώσσα υψηλού επιπέδου και υποστηρίζει τις αρχές του δομημένου προγραμματισμού.

Είναι πολύ σημαντικό να πούμε, ότι πριν προχωρήσετε σε αυτό ή και τα επόμενα κεφάλαια, πρέπει οπωσδήποτε να έχετε διαβάσει το εγχειρίδιο χρήσης. Πιο συγκεκριμένα, θα πρέπει να έχετεεγκαταστήσει τη Free Pascal ακολουθώντας τις οδηγίες που υπάρχουν στην ενότητα 2.3 του εγχειριδίου χρήσης. Θα πρέπει, επίσης, να γνωρίζετε πώς να κάνετε τη μεταγλώττιση και την εκτέλεσηενός προγράμματος Pascal χρησιμοποιώντας τον κειμενογράφο EditPlus (ενότητες 3.1, 3.2, και 3.3) ή τον κειμενογράφο NotePad (ενότητες 4.1 και 4.2).

Το πρώτο μας πρόγραμμα στην Pascal, ονομάζεται και το βλέπουμε στο πλαίσιο που υπάρχει δεξιά. Είναι ένα πολύ απλό πρόγραμμα, τοοποίο όταν το μεταγλωττίσετε και το εκτελέσετε, θα εμφανιστεί στην οθόνη, το μήνυμα Hallo World όπως φαίνεται σε αυτή την εικόνα. Φυσικά, έναπρόγραμμα το οποίο χρησιμοποιείται για να εφαρμόσει τη λύση ενός προβλήματος αποτελείται από πολύ περισσότερες εντολές και είναι πολύ πιοπολύπλοκο από ένα απλό πρόγραμμα το οποίο εμφανίζει μηνύματα στην οθόνη.

program Hallo (output); begin writeln('Hallo World.');end.

Το κεφάλαιο αυτό, συμπεριλαμβάνει αρκετά βασικά στοιχεία του προγραμματισμού, τα οποία όμως, είναι απαραίτητο να γνωρίζουμε ακόμη και για τη συγγραφή σχετικά απλών προγραμμάτων.Πριν, λοιπόν, μπορέσουμε να υλοποιήσουμε ένα ολοκληρωμένο πρόγραμμα, θα πρέπει να εξετάσουμε τη δομή και τα στοιχεία ενός προγράμματος Pascal, τους τύπους δεδομένων, τις εντολέςεισόδου/εξόδου κ.α. Το πρώτο πράγμα, όμως, που θα πρέπει να γνωρίζουμε για να γράψουμε ένα πρόγραμμα σε μια γλώσσα προγραμματισμού, είναι το λεξιλόγιο της γλώσσας το οποίο καιεξετάζουμε στην επόμενη ενότητα.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 17: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.2 - Λεξιλόγιο της Pascal

Επιτρεπτοί Χαρακτήρες στην PascalΓια να γράψουμε ένα πρόγραμμα σε οποιαδήποτε γλώσσα προγραμματισμού, πρέπει πρώτα να γνωρίζουμε το σύνολο των χαρακτήρων που μπορούμε να χρησιμοποιήσουμε για να γράψουμε τιςεντολές του προγράμματος. Το σύνολο των χαρακτήρων που υποστηρίζει η Pascal είναι:

Τα κεφαλαία γράμματα του λατινικού αλφάβητου (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z)Τα μικρά γράμματα του λατινικού αλφάβητου (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)Τα δέκα αριθμητικά ψηφία (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)Τους ακόλουθους χαρακτήρες διαχωρισμού και ενοποίησης Τους ειδικούς χαρακτήρες και το κενό

Κάποιοι συνδυασμοί μεταξύ των παραπάνω ομάδων από χαρακτήρες είναι πιθανοί αλλά υπάρχουν ορισμένοι κανόνες όπως θα δούμε παρακάτω. Τέλος, ν αναφέρουμε ότι οι Ελληνικοί χαρακτήρεςμπορούν να χρησιμοποιηθούν μόνο μέσα στα σχόλια ενός προγράμματος.

Δεσμευμένες ΛέξειςΔεσμευμένες λέξεις (reserved words), είναι οι λέξεις εκείνες που η σημασία τους για το μεταγλωττιστή της Pascal είναι ειδική και αμετάβλητη. Αποτελούν το βασικό λεξιλόγιο της γλώσσας καιχρησιμοποιούνται για να ελέγχουν τη ροή και τη λειτουργία του προγράμματος. Περιλαμβάνουν όρους, οι οποίοι εκτελούν ελέγχους, επαναλήψεις, συγκρίσεις, υπολογισμούς κτλ. Είναι, δηλαδή, λέξεις-κλειδιά που χρησιμοποιούνται για να γραφεί ένα πρόγραμμα και η λειτουργία τους είναι προκαθορισμένη. Αυτό σημαίνει, ότι ο προγραμματιστής δε μπορεί να χρησιμοποιήσει τις λέξεις αυτές γιαοποιοδήποτε άλλο σκοπό. Το σύνολο των δεσμευμένων λέξεων της Pascal παρουσιάζεται σε αυτό τον πίνακα.

Πρότυπα ΑναγνωριστικάΤα πρότυπα αναγνωριστικά, είναι οι λέξεις εκείνες που απαρτίζουν το υπόλοιπο του λεξιλογίου των λέξεων που έχουν προκαθορισμένο όνομα. Η σημασία των λέξεων αυτών, αν και είναι ειδική για τομεταγλωττιστή, δεν είναι όμως και αμετάβλητη. Μπορεί, δηλαδή, ένας προγραμματιστής για κάποιο συγκεκριμένο πρόγραμμα, να επαναπροσδιορίσει τη λειτουργία που εκτελούν κάποιες από αυτέςτις λέξεις, έτσι ώστε να ταιριάζουν στις ανάγκες του προγράμματος. Σε αυτό τον πίνακα παρουσιάζονται τα πρότυπα αναγνωριστικά της Pascal, μερικά από τα οποία θα χρησιμοποιήσουμε σεμετέπειτα κεφάλαια.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 18: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.2.1 - Αναγνωριστικά

Στην προηγούμενη ενότητα, είδαμε τα βασικά στοιχεία του λεξιλογίου της Pascal. Πιο συγκεκριμένα, είδαμε τους χαρακτήρες που μπορούμε να χρησιμοποιήσουμε για να γράψουμε ένα πρόγραμμα,καθώς και τις δεσμευμένες λέξεις και τα πρότυπα αναγνωριστικά. Σε αυτή την ενότητα, θα εξετάσουμε ένα ακόμα στοιχείο του λεξιλογίου της Pascal που είναι τα αναγνωριστικά.

Αναγνωριστικά (identifiers), είναι όλες οι λέξεις που χρησιμοποιεί ο προγραμματιστής μέσα σε ένα πρόγραμμα για την αναπαράσταση των δεδομένων ή των λειτουργιών. Πιο απλά, είναι τα ονόματαπου δίνουμε στις μεταβλητές, τις διαδικασίες, τις συναρτήσεις και τα υπόλοιπα μέρη του προγράμματος. Κάποια παραδείγματα αναγνωριστικών βλέπουμε παρακάτω:

- το αναγνωριστικό όνομα ενός προγράμματος το οποίο τυπώνει στην οθόνη τους μισθούςC - το όνομα μιας διαδικασίας η οποία υπολογίζει το μέσο όρο

- το αναγνωριστικό όνομα μιας μεταβλητής που καταχωρεί θερμοκρασία

Τα ονόματα που δίνονται στα αναγνωριστικά είναι στην κρίση του προγραμματιστή. Όμως, υπόκεινται στους παρακάτω κανόνες:

Το μέγιστο μήκος ενός αναγνωριστικού είναι 32 χαρακτήρες.Για τη δημιουργία ενός αναγνωριστικού μπορούμε να χρησιμοποιήσουμε τα γράμματα του λατινικού αλφάβητου που είδαμε στην προηγούμενη ενότητα (κεφαλαία και μικρά), τους αριθμούς καιτέλος τον χαρακτήρα υπογράμμισης '_' (underscore). (Σημείωση: δε μπορούμε να χρησιμοποιήσουμε τους χαρακτήρες διαχωρισμού και ενοποίησης ή τους ειδικούς χαρακτήρες)Ένα αναγνωριστικό, πρέπει ν' αρχίζει μ' ένα γράμμα ή με τον χαρακτήρα υπογράμμισης.Τα αναγνωριστικά, δε μπορούν να περιέχουν κενά.

Επίσης, είναι πολύ σημαντικό να σημειώσουμε ότι η δημιουργία καλών αναγνωριστικών (για μεταβλητές, διαδικασίες, συναρτήσεις κτλ), συμβάλει στην αναγνωσιμότητα και την κατανόηση τουπρογράμματός μας. Αν για παράδειγμα, πρέπει ένα πρόγραμμα να μετατρέπει κάποια μια θερμοκρασία από βαθμούς Κελσίου σε βαθμούς Φάρεναϊτ, θα μπορούσαμε να είχαμε τις μεταβλητές και που θα αποθήκευαν τους βαθμούς Κελσίου και Φάρεναϊτ αντίστοιχα. Όμως τα αναγνωριστικά και δεν είναι εύκολα κατανοητά και θα ήταν προτιμότερο να είχαμε χρησιμοποιήσει τααναγνωριστικά και ή και ως ονόματα των μεταβλητών.

Τελειώνοντας αυτήν την ενότητα, πρέπει να γνωρίζουμε ότι η Pascal δεν κάνει διαχωρισμό ανάμεσα σε κεφαλαία και πεζά γράμματα ούτε στις δεσμευμένες λέξεις και τα πρότυπα αναγνωριστικάαλλά ούτε και στα αναγνωριστικά. Αυτό σημαίνει ότι η δεσμευμένη λέξη μπορεί να γραφεί ως ή και δε θα δημιουργηθεί κανένα συντακτικό λάθος. Το ίδιο ισχύει και για μιαμεταβλητή ορισμένη από τον προγραμματιστή.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 2 .1

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 19: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.3 - Μεταβλητές

Κατά την διάρκεια της εκτέλεσης ενός προγράμματος, χρησιμοποιούνται ή εισάγονται κάποιες πληροφορίες τις οποίες το πρόγραμμά μας θα πρέπει να επεξεργαστεί, έτσι ώστε να παράγει κάποιααποτελέσματα. Αυτές οι πληροφορίες, ονομάζονται δεδομένα και αντιπροσωπεύουν γεγονότα, μετρήσεις, αριθμούς κτλ. Τα δεδομένα, εισάγονται σ' ένα πρόγραμμα (π.χ. από το πληκτρολόγιο) καιαποθηκεύονται στη μνήμη του υπολογιστή.

Ο όρος μεταβλητή (variable), αναφέρεται σε κάποια θέση μνήμης η οποία θα περιέχει την τιμή κάποιου δεδομένου και ο τρόπος που αναφερόμαστε σε αυτή τη θέση μνήμης, είναι μέσω ενόςαναγνωριστικού (π.χ. ). Εκτός, όμως, από τ' όνομα της μεταβλητής, πρέπει να καθοριστεί και ο τύπος του δεδομένου που θ' αποθηκευτεί, αν δηλαδή θα είναι ένας ακέραιοςαριθμός, δεκαδικός αριθμός, χαρακτήρας κτλ.

Δήλωση ΜεταβλητήςΓια να δηλώσουμε μια μεταβλητή, πρέπει να χρησιμοποιήσουμε την δεσμευμένη λέξη (variable), το αναγνωριστικό (δηλαδή το όνομα) της μεταβλητής, το χαρακτήρα ':' (άνω-κάτω τελεία) καιτέλος τον τύπο των δεδομένων, από τον οποίο μπορεί να πάρει τιμές. Η σύνταξη της δήλωσης μιας μεταβλητής είναι η ακόλουθη:

var Όνομα Μεταβλητής : Τύπος Δεδομένων

Αν και για τους τύπους δεδομένων, θ' αναφερθούμε αναλυτικά στην ενότητα 2.7, τρεις από τους βασικούς τύπους δεδομένων είναι ο ακέραιος αριθμός ( ), ο δεκαδικός αριθμός ( ) και οχαρακτήρας ( ). Ας δούμε μερικά παραδείγματα δηλώσεων μεταβλητών.

Παραδείγματα

var ArithmosMathimatwn : integer; Δήλωση μίας μεταβλητής με το όνομα στην οποία θα καταχωρηθεί ένας ακέραιος αριθμός.

var ArithmosMathimatwn : integer; mesos_oros : real; vathmos : char;

Όταν υπάρχουν περισσότερες από μία μεταβλητές, τα ονόματά τους γράφονται συνήθως το ένα κάτω από το άλλο. Στο συγκεκριμένοπαράδειγμα, έχουμε μια μεταβλητή ακεραίου τύπου ( ), μια μεταβλητή πραγματικού τύπου ( ) και μίαμεταβλητή τύπου χαρακτήρα ( ).

var Etos, Minas, Hmera : integer;Στην περίπτωση που έχουμε να διαχειριστούμε πολλές μεταβλητές του ιδίου τύπου δεδομένων, μπορούμε να γράψουμε τα ονόματά τους τοένα δίπλα στο άλλο και να τα χωρίζουμε με κόμματα. Στο συγκεκριμένο παράδειγμα, οι μεταβλητές , , και είναι και οι τρειςτύπου ακεραίου αριθμού.

Είναι σημαντικό, επίσης, να πούμε ότι η Pascal έχει αυστηρό καθορισμό τύπων δεδομένων. Αυτό σημαίνει, ότι αν μι μεταβλητή έχει δηλωθεί ότι είναι ενός συγκεκριμένου τύπου, δε μπορούμε ν'αποθηκεύσουμε σε αυτήν μια τιμή η οποία δεν ανήκει σε αυτόν τον συγκεκριμένο τύπο. Στο παραπάνω παράδειγμα, δε μπορούμε να δώσουμε ως τιμή τον χαρακτήρα στην μεταβλητή γιατίαυτή έχει δηλωθεί ότι είναι τύπου ακέραιου αριθμού. Ο λόγος για τον αυστηρό καθορισμό των τύπων δεδομένων, είναι ότι απαιτείται λιγότερη εκσφαλμάτωση (ανεύρεση λαθών) του προγράμματόςμας.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 20: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.3.1 - Ανάθεση Τιμής σε Μεταβλητή

Κατά την εκτέλεση ενός προγράμματος, οι μεταβλητές που έχουν δηλωθεί, δεν έχουν ανατεθεί κάποια τιμή. Πιο συγκεκριμένα, κατά την δημιουργία μιας μεταβλητής, η τιμή της είναι αόριστη (το τυχαίοπεριεχόμενο της συγκεκριμένης θέσης μνήμης του υπολογιστή τη στιγμή που δημιουργείται η μεταβλητή). Για να αναθέσουμε (ή αλλιώς να καταχωρήσουμε) μια τιμή σε κάποια μεταβλητή,χρησιμοποιούμε τον τελεστή ανάθεσης . Η σύνταξη της εντολής ανάθεσης τιμής είναι η ακόλουθη:

Μεταβλητή := Παράσταση

όπου Παράσταση μπορεί να είναι μια συγκεκριμένη τιμή που ανήκει στον τύπο δεδομένων της μεταβλητής, μια άλλη μεταβλητή του ίδιου τύπου δεδομένων ή μια παράσταση που συνδυάζει άλλεςμεταβλητές.

Παραδείγματα

1. temperature := 36; Ανάθεση της τιμής 36 στη μεταβλητή ακεραίου τύπου

2. mesosOros := 8.57; Ανάθεση της τιμής 8.57 στη μεταβλητή πραγματικού τύπου

3. gramma := 'A'; Ανάθεση του χαρακτήρα Α στην τύπου χαρακτήρα μεταβλητή gramma

4. score := points; Ανάθεση της τιμής της μεταβλητής στη μεταβλητή

5. scor := pos - neg; Ανάθεση του αποτελέσματος της αφαίρεσης στη μεταβλητή

6. result := (X+Y)/2; Ανάθεση του αποτελέσματος της πράξης στην μεταβλητή

Από τα παραπάνω παραδείγματα, βλέπουμε ότι η εντολή ανάθεσης, αλλάζει την τιμή της μεταβλητής που βρίσκεται στο αριστερό σκέλος της εντολής (π.χ. η μεταβλητή στο παράδειγμα 4).Αν, δηλαδή, η μεταβλητή είχε την τιμή 12 και η μεταβλητή είχε την τιμή 36 πριν την εκτέλεση του παραδείγματος 4, όταν εκτελεστεί η εντολή ανάθεσης , η μεταβλητή

παίρνει την τιμή 36 ενώ η τιμή της μεταβλητής παραμένει 36. Η τιμή 12, που είχε η μεταβλητή πριν από την εκτέλεση της εντολής ανάθεσης χάνεται για πάντα. Αν και στηνενότητα 2.5 θα εξετάσουμε αναλυτικά την δομή ενός προγράμματος Pascal, αυτό το παράδειγμα εξηγεί την σχέση μεταβλητών και της κύριας μνήμης του υπολογιστή.

Πρέπει, επίσης, ν' αναφέρουμε ότι οι μεταβλητές που υπάρχουν σε μια εντολή ανάθεσης πρέπει να είναι του ιδίου τύπου δεδομένων (ή τουλάχιστο συμβατού τύπου). Στο παράδειγμα 4, η μεταβλητή και η μεταβλητή πρέπει να είναι του ιδίου τύπου (π.χ. ακέραιοι αριθμοί - integers). Αν η μεταβλητή είναι τύπου ακεραίου αριθμού (integer) και η μεταβλητή είναι τύπου

χαρακτήρα (char), ο μεταγλωττιστής θα σας ενήμερώσει με ένα μήνυμα λάθους. Στο παράδειγμα 6 όμως, οι μεταβλητές και Υ μπορούν να είναι τύπου ακεραίου αριθμού, και η μεταβλητή να είναι τύπου πραγματικού αριθμού (real), γιατί η διαίρεση μπορεί να έχει ως αποτέλεσμα ένα δεκαδικό αριθμό.

Τέλος, αν και ο μεταγλωττιστής θα σας ενημερώνει με κάποιο προειδοποιητικό μήνυμα, θα αναφέρουμε ότι μια μεταβλητή που βρίσκεται στο δεξιό μέρος μιας εντολής ανάθεσης πρέπει οπωσδήποτενα έχει ήδη πάρει κάποια τιμή. Στο παράδειγμα 4, η μεταβλητή πρέπει να έχει ήδη κάποια τιμή που θα ανατεθεί στην μεταβλητή .

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 21: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.4 - Σταθερές

Εκτός από τις μεταβλητές που είδαμε στην προηγούμενη ενότητα, πολύ κοινή μέσα σε ένα πρόγραμμα είναι και η χρήση σταθερών. Σταθερά (constant), είναι μια συγκεκριμένη τιμή που συνδέεται μεένα αναγνωριστικό, που έχει δημιουργήσει ο προγραμματιστής. Είναι, δηλαδή, ένα δεδομένο του οποίου η τιμή παραμένει αμετάβλητη καθ' όλη τη διάρκεια της εκτέλεσης του προγράμματος. Μιασταθερά, δηλώνεται με τον ακόλουθο τρόπο:

Const Όνομα Σταθεράς = Τιμή Σταθεράς;

Η δεσμευμένη λέξη , δηλώνει ότι το αναγνωριστικό που ακολουθεί είναι μια σταθερά. Η ανάθεση της τιμής στη σταθερά γίνεται στην ίδια γραμμή με τη δήλωση της. Προσέξτε, όμως, ότιχρησιμοποιείται ο χαρακτήρας ίσον ' ' και όχι ο τελεστής ανάθεσης ' ' που χρησιμοποιείται στις μεταβλητές.

Παραδείγματα

1. Const FPA = 0.19; Δήλωση της σταθεράς τύπου πραγματικού αριθμού και τιμή 0.19

2. Const Orofos = 5; Δήλωση της σταθεράς τύπου ακεραίου αριθμού και τιμή 5

3. Const letter = 'Α'; Δήλωση της σταθεράς τύπου χαρακτήρα και τιμή το γράμμα 'Α'

4. Const Msg = 'Error 401'; Δήλωση της σταθεράς που περιέχει το αλφαριθμητικό μήνυμα ' '

Η χρήση της δεσμευμένης λέξης μπορεί να χρησιμοποιηθεί μόνο μια φορά, όταν υπάρχουν περισσότερες από μια σταθερές, οι οποίεςδηλώνονται η μία κάτω από την άλλη όπως βλέπουμε και στο παράδειγμα δεξιά.

Const ArithmosMathimatwn = 3; OresDidaskalias = 7.8; Onoma = 'Giorgos Georgiou';

Η τιμή μιας σταθεράς δεν μπορεί ν' αλλάζει μέσα στο πρόγραμμά μας. Αν για παράδειγμα, δηλώσουμε τη σταθερά και μέσα στο πρόγραμμά μας έχουμε την εντολή ο μεταγλωττιστής της Pascal θα τυπώσει ένα μήνυμα λάθους και η μεταγλώττιση του προγράμματος δεν θα μπορέσει να ολοκληρωθεί.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 22: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.5 - Δομή ενός Προγράμματος Pascal

Είδαμε μέχρι τώρα, κάποια βασικά πράγματα από τα στοιχεία της γλώσσας Pascal καθώς επίσης και για το λεξιλόγιο που χρησιμοποιεί. Που όμως θα δηλώσουμε τις μεταβλητές και τις σταθερέςπου θέλουμε να χρησιμοποιήσουμε; Σε ποιό σημείο του προγράμματος μπορούμε ν' αναθέσουμε τιμές; Πού μπορούμε να γράψουμε κώδικα που εκτελεί κάποιους υπολογισμούς;

Η δομή ενός Pascal προγράμματος χαρακτηρίζεται από δύο κύρια μέρη: το τμήμα δηλώσεων και το κύριο τμήμα (ή αλλιώς εκτελέσιμο). Πριν από τα δύο μέρη αυτά όμως υπάρχει τ' όνομα τουπρογράμματος. Στις παρακάτω δύο εικόνες βλέπουμε αυτή τη δομή καθώς και ένα πρόγραμμα ως παράδειγμα.

ΕΠΙΚΕΦΑΛΙΔΑ ΠΡΟΓΡΑΜΜΑΤΟΣ

ΤΜΗΜΑ ΔΗΛΩΣΕΩΝ

ΚΥΡΙΟ ΜΕΡΟΣ

Πριν εξετάσουμε λεπτομερώς τα μέρη του προγράμματος, θ' αναφερθούμε πρώτα στη μορφοποίηση του. Παρατηρήστε ότι στο πρόγραμμα όλες οι εντολές ανάμεσα στο και το είναι μετακινημένες κατά ένα χαρακτήρα στηλοθέτη (tab) προς τα μέσα. Αυτή η μορφοποίηση κάνει το πρόγραμμα πιο αναγνώσιμο. Ο μεταγλωττιστής αγνοεί τα κενά, τους χαρακτήρες

στηλοθέτη και τις αλλαγές γραμμών. Συνεπώς, το παραπάνω πρόγραμμα θα μπορούσε να γραφεί με τον εξής τρόπο:

program Addition (input, output); var num1, num2 : integer; begin num1 := 15; num2 := 8; writeln(num1 + num2); end.

Όπως καταλαβαίνουμε, ο παραπάνω τρόπος εγγραφής κώδικα δεν είναι καλή πρακτική αφού κάνει το πρόγραμμα δύσκολο στην ανάγνωση και στην κατανόηση.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 23: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.5.1 - Ανάλυση Δομής ενός Προγράμματος Pascal

Στην προηγούμενη ενότητα, είδαμε ότι ένα πρόγραμμα Pascal αποτελείται από 3 βασικά τμήματα: την επικεφαλίδα, το τμήμα δηλώσεων και το κύριο μέρος. Ας δούμε τώρα πιο αναλυτικά αυτά τατρία τμήματα.

Επικεφαλίδα ΠρογράμματοςΚάθε πρόγραμμα, θα πρέπει να ξεκινάει με την επικεφαλίδα του προγράμματος. Η δήλωση της επικεφαλίδας, αρχίζει με τη δεσμευμένη λέξη ακολουθούμενη από το όνομα τουπρογράμματος. Το όνομα του προγράμματος, το οποίο επιλέγεται από τον προγραμματιστή, θα πρέπει να υποδηλώνει τη χρήση του προγράμματος και υπόκειται στους κανόνες δημιουργίας πουαναφέραμε στην ενότητα 2.2.1 εφόσον το όνομα του προγράμματος είναι και αυτό ένα αναγνωριστικό. Κάτω δεξιά, μπορούμε να δούμε τρία παραδείγματα από ονόματα προγραμμάτων.

Μετά το όνομα του προγράμματος ακολουθούν οι λέξεις και , μέσα σε παρενθέσεις και χωρισμένες με ένα κόμμα,και στη συνέχεια ένα ερωτηματικό. Η χρήση αυτού του μέρους της επικεφαλίδας είναι προαιρετική. Η λέξη υποδηλώνει ότιτο πρόγραμμα θα τυπώσει αποτελέσματα (π.χ. στην οθόνη ή σε κάποιο αρχείο) ενώ η λέξη υποδηλώνει ότι το πρόγραμμαθα διαβάσει δεδομένα (π.χ. από το πληκτρολόγιο ή από ένα αρχείο). Δεδομένου ότι τα περισσότερα προγράμματα εκτελούναυτές τις δύο λειτουργίες, εμείς θα χρησιμοποιούμε στα προγράμματά μας όλα τα μέρη της επικεφαλίδας.

Παραδείγματα

1. program Misthodosia (input, output);

2. program Rain_Statistics (input, output);

3. program YpologismosForon (input, output);

Τμήμα ΔηλώσεωνΣτο τμήμα δηλώσεων περιγράφουμε όλα τα στοιχεία (π.χ. μεταβλητές) που θα χρησιμοποιηθούν για την αναπαράσταση των δεδομένων του προβλήματος καθώς και όλες τις λειτουργικές μονάδες(π.χ. συναρτήσεις).

Οποιοδήποτε στοιχείο χρησιμοποιηθεί στο κύριο (εκτελέσιμο) μέρος του προγράμματος, πρέπει πρώτα να έχει δηλωθεί, δηλαδή, νακαθορίσουμε το είδος των δεδομένων που θα αναπαραστήσουν όλα τα σύμβολα που θα χρησιμοποιήσουμε. Η δήλωση τωνδεδομένων, ενημερώνει το μεταγλωττιστή της Pascal για το ποιά ακριβώς είναι τα δεδομένα που θα επεξεργαστεί το πρόγραμμα καικατά συνέπεια πόση μνήμη θα χρειαστεί για την καλύτερη εκτέλεση του προγράμματος. Όπως βλέπουμε και στην εικόνα δεξιά, τοτμήμα δηλώσεων ενός προγράμματος χωρίζεται σε κάποιες υποενότητες. Πρώτα γίνονται οι δηλώσεις των σταθερών, μετά οιδηλώσεις των μεταβλητών και τέλος οι δηλώσεις διαδικασιών και συναρτήσεων. Τις μεταβλητές και τις σταθερές, τις καλύψαμε στιςενότητες 2.3 και 2.4 αντίστοιχα ενώ για διαδικασίες και συναρτήσεις θα μιλήσουμε εκτενέστατα στο κεφάλαιο 6.

ΔΗΛΩΣΕ ΙΣ ΣΤΑΘΕΡΩΝ

ΔΗΛΩΣΕ ΙΣ ΜΕΤΑΒΛΗΤΩΝ

ΔΗΛΩΣΕ ΙΣ ΔΙΑΔΙΚΑΣ ΙΩΝ

ΔΗΛΩΣΕ ΙΣ ΣΥΝΑΡΤΗΣΕΩΝ

Κύριο ΜέροςΤο κύριο μέρος του προγράμματος περιέχει όλες τις εντολές που θα εκτελέσει το πρόγραμμά μας. Περικλείεται από τη λέξη και τη λέξη η οποία ακολουθείται από μία τελεία για ναδηλώσει το τέλος του προγράμματος. Όλες οι εντολές που υπάρχουν στο κύριο μέρος, δηλαδή μεταξύ του και του , χωρίζονται μεταξύ τους με τον χαρακτήρα (ερωτηματικό).

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 24: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.6 - Σχόλια

Αναφέραμε στην ενότητα 2.2.1 ότι η χρήση σωστών αναγνωριστικών συμβάλει στην αναγνωσιμότητακαι στην κατανόηση του προγράμματός μας. Εκτός όμως της χρήσης σωστών αναγνωριστικών, ηχρήση σχολίων βοηθάει επίσης στην κατανόηση ενός προγράμματος. Σχόλια μέσα σε ένα Pascalπρόγραμμα μπορούν να εισαχθούν είτε κλεισμένα μέσα σε άγκιστρα π.χ. Ένα σχόλιο σε Pascal ,είτε σε παρενθέσεις με αστερίσκους π.χ. (* Ένα σχόλιο σε Pascal *).

Τα σχόλια μπορούν να τοποθετηθούν σε οποιοδήποτε σημείο του προγράμματος και ο σκοπός τουςείναι να δώσουν στον αναγνώστη του προγράμματος πληροφορίες σχετικά με το πρόγραμμα ήοδηγίες χρήσης ή να εξηγήσουν σημεία τα οποία είναι δύσκολο να κατανοηθούν. Επίσης, τα σχόλιαδεν επιβραδύνουν την εκτέλεση ή την μεταγλώττιση ενός προγράμματος αλλά ούτε καταναλώνουνμνήμη γιατί ο μεταγλωττιστής τα αφαιρεί από τον εκτελέσιμο κώδικα που παράγει. Στο πρόγραμμα

δεξιά βλέπουμε κάποια επεξηγηματικά σχόλια ως παράδειγμα.

Ημερομηνία Δημιουργίας: 10/12/2005 Προγραμματιστής: Γιώργος Γεωργίου Το πρόγραμμα αυτό υπολογίζει το άθροισμα δύο ακεραίων αριθμών program Prosthesi (input, output); Δήλωση των μεταβλητών που χρειάζεται το πρόγραμμα var num1, num2, athroisma : integer;

begin Ανάθεση ακεραίων τιμών στις μεταβλητές num1 := 10; num2 := 5;

Υπολογισμός του αθροίσματος athroisma := num1 + num2;

Τύπωση του αποτελέσματος στην οθόνη writeln('To apotelesma einai: ', athroisma);end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 25: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.7 - Προκαθορισμένοι Τύποι Δεδομένων

Μέχρι τώρα, έχουμε αναφέρει ότι μέσα στο πρόγραμμά μας μπορούμε να έχουμε ακέραιους αριθμούς, πραγματικούς αριθμούς, χαρακτήρες κτλ. Δεν εξετάσαμε, όμως, με λεπτομέρεια αυτούς τουςτύπους δεδομένων που είναι και ο σκοπός αυτής της ενότητας. Η Pascal παρέχει στον προγραμματιστή μια σειρά προκαθορισμένων τύπων δεδομένων. Η αναφορά στους προκαθορισμένους αυτούςτύπους δεδομένων, γίνεται με το πρότυπο αναγνωριστικό που έχει οριστεί από τη γλώσσα. Σε αυτό το κεφάλαιο, θα εξετάσουμε τους απλούς τύπους δεδομένων, ενώ σε μετέπειτα κεφάλαια θαδούμε και πιο σύνθετους.

2.7.1 - Ακέραιοι ΑριθμοίΌπως είναι κατανοητό, τα δεδομένα ακεραίου τύπου είναι οι γνωστοί ακέραιοι αριθμοί, θετικοί και αρνητικοί,χωρίς δεκαδικό μέρος, συμπεριλαμβανομένου του μηδενός (π.χ. -9, 7, 0, 234 κτλ). Οι ακέραιοι αριθμοί πουδιαθέτει η Pascal είναι ένα πεπερασμένο υποσύνολο του συνόλου των ακεραίων αριθμών. Υπάρχουνδιαφορετικά είδη τύπων ακεραίων αριθμών κυρίως για οικονομία της κύριας μνήμης του υπολογιστή και γιαμεγαλύτερη ταχύτητα στους υπολογισμούς.

Τα πέντε πιο σημαντικά είδη ακεραίων αριθμών παραθέτονται στον πίνακα 2.1 δεξιά.

Τύπος Διάστημα Τιμών Χώρος Μνήμης Shortint -128 ... 127 1 byte Byte 0 ... 255 1 byte Integer -32768 ... 32767 2 bytes Word 0 ... 65535 2 bytes LongInt -2147483648 ... 2147483647 4 bytesΠίνακας 2.1: Τύποι Ακεραίων Αριθμών

Αν ένα πρόγραμμά μας χρειάζεται να διαχειριστεί δεδομένα ακεραίου τύπου, τότε στο τμήμα δηλώσεων του προγράμματός μας πρέπει να δηλώσουμε τις μεταβλητές στις οποίες θα καταχωρηθούνοι ακέραιοι αριθμοί που θα χρειαστούν, όπως φαίνεται στα παρακάτω παραδείγματα.

program Programma1;var number : integer;

begin Εντολές προγράμματοςend.

program Programma2;var num1,num2 : integer;

begin Εντολές προγράμματοςend.

program Programma3;var num1,num2 : integer; num3 : byte; num4 : longint;begin Εντολές προγράμματοςend.

Παράδειγμα 1: Programma1 Παράδειγμα 2: Programma2 Παράδειγμα 3: Programma3

Στο σημείο αυτό, θ' αναφέρουμε ότι σε όλα τα υπόλοιπα κεφάλαια, όταν αναφερόμαστε σε έναν ακέραιο αριθμό θα χρησιμοποιούμε τον τύπο .

Επανερχόμενοι στον παραπάνω πίνακα 2.1, είναι πολύ σημαντικό να πούμε ότι ένας ακέραιος αριθμός που δεν ανήκει στο διάστημα τιμών του αντίστοιχου τύπου,δεν μπορεί να καταχωρηθεί σε μια ακέραια μεταβλητή του τύπου αυτού (όπως για παράδειγμα στο ). Στην περίπτωση αυτή θα υπάρξει ένα λογικόλάθος στους υπολογισμούς του προγράμματος και αυτό γιατί θα καταχωρηθεί από τον μεταγλωττιστή ένας τυχαίος αριθμός από το επιτρεπτό διάστημα τιμών τουτύπου.

program Programma4;var num1 : integer; num2 : byte;begin num1 := 57849; num2 := 468;end.

Παράδειγμα 4: Programma4

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 26: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.7.2 - Πραγματικοί Αριθμοί

Πραγματικοί, είναι οι αριθμοί με υποδιαστολή και δεκαδικό μέρος. Ότανχρειαστεί να εκφράσουμε τις τιμές 12.745, 0.00000761 ή -55.9323πρέπει να χρησιμοποιήσουμε πραγματικούς αριθμούς.

Η Pascal παρέχει πέντε τύπους πραγματικών αριθμών για ανάλογεςχρήσεις τους οποίους παραθέτουμε στον πίνακα 2.2 δεξιά.

Τύπος Διάστημα Τιμών Ψηφία Χώρος Μνήμης Real 2.9 x 10-39 ... 1.7 x 1038 11-12 6 bytes

Single 1.5 x 10-45 ... 3.4 x 1038 7-8 4 bytes

Double 5.0 x 10-324 ... 1.7 x 10308 15-16 8 bytes

Extended 3.4 x 10-4932 ... 1.1 x 104932 19-20 10 bytes

Comp -263 + 1 ... 263 - 1 19-20 8 bytesΠίνακας 2.2: Τύποι Πραγματικών Αριθμών

Εσωτερικά, η επεξεργασία και η αποθήκευση ενός πραγματικού αριθμού γίνεται μ' εκθετική μορφή χρησιμοποιώντας ένα προκαθορισμένο αριθμό ψηφίων και δυνάμεις του δέκα ή του δύο. Οπραγματικός αριθμός 0.00978 για παράδειγμα, μετατρέπεται σε 9.78 x 10-3. Σε μετέπειτα ενότητα του κεφαλαίου, όταν θα εξετάσουμε πώς τυπώνουμε δεδομένα στην οθόνη, θα δούμε ότι ο αριθμός9.78 θα εμφανίζεται στην οθόνη ως 9.780000000000000Ε-003 που είναι η εκθετική αναπαράσταση του αριθμού, και φυσικά πώς να μετατρέψουμε την αναπαράσταση αυτή στην οικεία προς εμάςδεκαδική μορφή. Ας δούμε όμως μερικά παραδείγματα δήλωσης και ανάθεσης τιμών σε μεταβλητές πραγματικού τύπου.

program Programma5;var num1 : real;

begin Εντολές προγράμματοςend.

program Programma6;var num1 : real;

begin num1 := 85.3176; Εντολές προγράμματοςend.

program Programma7;var num1,num2 : real; num3 : single; num4 : double;begin num3 := 0.00000342; Εντολές προγράμματοςend.

Παράδειγμα 5: Programma5 Παράδειγμα 6: Programma6 Παράδειγμα 7: Programma7

Η Pascal δεν επιτρέπει την καταχώρηση πραγματικών τιμών σε μεταβλητές ακεραίου τύπου. Ωστόσο, επειδή ένας ακέραιος αριθμός μπορεί να θεωρηθεί ως πραγματικός (με δεκαδικό μέρος μηδέν),η Pascal επιτρέπει ακέραιες τιμές να καταχωρηθούν σε μεταβλητές πραγματικού τύπου.

Όπως και για τους ακεραίους αριθμούς και τον τύπο , για όλα τα μετέπειτα κεφάλαια, όταν θα αναφερόμαστε σε πραγματικό αριθμό, θα χρησιμοποιούμε τον τύπο . Θα πρέπει,επίσης, να τονίσουμε το γεγονός ότι τα δεδομένα ακεραίου τύπου παριστάνονται με τέλεια ακρίβεια στην μνήμη του υπολογιστή, σε αντίθεση με τα δεδομένα πραγματικού τύπου τα οποίαπαριστάνονται συνήθως με ένα πολύ μικρό σφάλμα. Τέλος, πρέπει να αναφέρουμε ότι οι πράξεις με ακεραίους αριθμούς γίνονται πολύ πιο γρήγορα από εκείνες με πραγματικούς αριθμούς.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 27: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.7.3 - Χαρακτήρες και Λογικός Τύπος

ΧαρακτήρεςΜια μεταβλητή τύπου χαρακτήρα ( ), δεσμεύει μια θέση μνήμης μεγέθους ενός byte. Η τιμή που μπορεί να πάρει είναι ένας από τους χαρακτήρες του πίνακα ASCII. Μέσα στο πρόγραμμά μας, ηανάθεση ενός χαρακτήρα σε μια μεταβλητή τύπου , μπορεί να γίνει με δύο τρόπους:

τοποθετώντας το χαρακτήρα μέσα σε δύο αποστρόφους (π.χ. Τ )με το σύμβολο # ακολουθούμενο από τη θέση του χαρακτήρα στον πίνακα ASCII

Ο δεύτερος τρόπος, είναι ιδιαίτερα χρήσιμος όταν θέλουμε να επεξεργαστούμε πλήκτρα που δεν έχουν άμεση οπτική παρουσία στην οθόνη (π.χ. το #27 συμβολίζει το ESC). Ας δούμε όμως μερικάπαραδείγματα δήλωσης μεταβλητών τύπου χαρακτήρα καθώς και την ανάθεση τιμών.

program Programma8;var letter : char;

begin letter := 'e';end.

program Programma9;var letter1,letter2 : char;

begin letter1 := '9'; letter2 := ' ';end.

program Programma10;var let1,let2,let3 : char;

begin let1 := #9; let2 := #109; let3 := 'F';end.

Παράδειγμα 8: Programma8 Παράδειγμα 9: Programma9 Παράδειγμα 10: Programma10

Λογικός ΤύποςΜια μεταβλητή λογικού τύπου ( ), δεσμεύει μια θέση μνήμης μεγέθους ενός byte. Οι τιμές που μπορεί να πάρει μια τέτοια μεταβλητή είναι οι λογικέςτιμές αληθής ( ) και ψευδής ( ) που συναντάμε στην άλγεβρα BOOLE. Δεξιά βλέπουμε ένα απλό παράδειγμα δύο μεταβλητών τύπου Boolean.

Οι μεταβλητές λογικού τύπου χρησιμοποιούνται κυρίως όταν εξετάζουμε λογικές παραστάσεις όπως για παράδειγμα το οποίο ισχύει (έχει τιμή )και θα τις συζητήσουμε εκτενέστερα στο τρίτο κεφάλαιο.

program Programma11;var x, y : boolean;

begin x := TRUE; y := FALSE;end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 28: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.8 - Τελεστές και Παραστάσεις

Τελεστές, ονομάζονται σύμβολα ειδικής σημασίας που χρησιμοποιούνται για τη σύνδεση διαφόρων πληροφοριών. Η Pascal υποστηρίζει πέντε είδη τελεστών:

Αριθμητικούς τελεστές, για τη σύνδεση και επεξεργασίας αριθμητικών δεδομένωνΤελεστές μετατόπισης, για γρηγορότερους υπολογισμούς μεταξύ ακεραίων αριθμώνΤελεστές συσχέτισης, για τη σύγκριση διαφόρων δεδομένων του ίδιου τύπουΛογικούς τελεστές, για τη σύνδεση και επεξεργασίας λογικών παραστάσεωνΤελεστή διεύθυνσης, ο οποίος επιστρέφει μια θέση της μνήμης του υπολογιστή

Τους τελεστές μετατόπισης και τον τελεστή διεύθυνσης, δε θα τους καλύψουμε αλλά τους τελεστές συσχέτισης καθώς και τους λογικούςτελεστές θα τους εξετάσουμε στο τρίτο κεφάλαιο. Οι αριθμητικοί τελεστές που υποστηρίζει η Pascal απεικονίζονται στον πίνακα 2.3. Ηιεραρχία των αριθμητικών τελεστών είναι: 1) πρόσημο, 2) πολλαπλασιασμός ή διαίρεση και 3) πρόσθεση ή αφαίρεση. Να σημειώσουμε ότιδεν υπάρχει ιεραρχία μεταξύ των ζευγαριών πρόσθεσης/αφαίρεσης και πολλαπλασιασμού/διαίρεσης. Εκτελείται όποιο σύμβολο από τα δυοσυναντήσει πρώτο ο μεταγλωττιστής από δεξιά προς τα αριστερά.

+ Πρόσθεση (ή θετικό πρόσημο)

- Αφαίρεση (ή αρνητικό πρόσημο)

* Πολλαπλασιασμός

/ Διαίρεση

Πίνακας 2.3: Αριθμητικοί Τελεστές

Τέλος, η Pascal παρέχει δυο ακόμα αριθμητικούς τελεστές, που χρησιμοποιούνται στην επεξεργασία ακεραίων και είναι οι ακόλουθοι:

ΤΕΛΕΣΤΗΣ ΛΕΙΤΟΥΡΓΙΑ ΠΑΡΑΔΕΙΓΜΑ

DIV επιστρέφει το ακέραιο πηλίκο μιας διαίρεσης 9 DIV 4 = 2

MOD επιστρέφει το ακέραιο υπόλοιπο μιας διαίρεσης 9 MOD 4 = 1

Με τους τελεστές, μπορούμε να συνδέσουμε μεταβλητές, σταθερές και αριθμούς σε μια ενιαία μορφή που ονομάζεται παράσταση ή έκφραση. Το αποτέλεσμα μιας παράστασης καθορίζεται απότην ιεραρχία των τελεστών που εμπεριέχονται μέσα σε αυτήν, αλλά και από τα δεδομένα τα οποία επεξεργάζεται. Μπορούμε δηλαδή να έχουμε παραστάσεις οι οποίες είναι λογικές, αριθμητικές,αλφαριθμητικές κτλ. Μια αριθμητική παράσταση συνδέει αριθμητικά δεδομένα χρησιμοποιώντας αριθμητικούς τελεστές (όπως μία αλγεβρική παράσταση στα μαθηματικά).

Στον πίνακα δεξιά, βλέπουμε μερικές μαθηματικές παραστάσεις και πώς αυτές εκφράζονται στην Pascal. Όπωςβλέπουμε, η χρήση των παρενθέσεων είναι απαραίτητη αν κάποιες συγκεκριμένες πράξεις πρέπει να υπολογιστούνπρώτα. Τελειώνοντας αυτήν την ενότητα, θ' αναφέρουμε επίσης ότι η Pascal προσφέρει στον χρήστη κάποιεςπροκαθορισμένες μαθηματικές συναρτήσεις έτσι ώστε να γίνει απλούστερη η λύση κάποιων μαθηματικών προβλημάτων.

ΜΑΘΗΜΑΤΙΚΗ ΠΑΡΑΣΤΑΣΗ ΕΚΦΡΑΣΗ ΣΤΗΝ PASCAL

2x + 7y - 5 2*Χ + 7*Υ - 5

xy - 4z Χ*Υ - 4*Ζ

3(x + 2) + 8(y - 4) 3*(Χ+2) + 8*(Υ-4)

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 29: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.9 - Εντολές Εισόδου και Εξόδου

Μέχρι τώρα, έχουμε δει κάποια βασικά στοιχεία της γλώσσας προγραμματισμού Pascal. Είδαμε το λεξιλόγιο της γλώσσας, τους βασικούς τύπους δεδομένων, τη δομή ενός προγράμματος, καθώςκαι πώς μπορούμε να δημιουργήσουμε παραστάσεις χρησιμοποιώντας μεταβλητές, τελεστές και αριθμούς. Δεν έχουμε εξετάσει, όμως, πώς μπορούμε να δούμε τ' αποτελέσματα ενόςπρογράμματος, καθώς και τη συμβολή του χρήστη ενός προγράμματος.

Η είσοδος και η έξοδος δεδομένων, είναι κρίσιμης σπουδαιότητας στον προγραμματισμό. Οι υπολογιστές, είναι πολύ γρήγοροι στην εκτέλεση υπολογισμών, αλλά κάνουν ακριβώς ότι τους λέγεται νακάνουν και τίποτε παραπάνω. Μπορούμε να γράψουμε ένα πρόγραμμα για να εκτελέσουμε άψογα έναν περίπλοκο υπολογισμό. Εντούτοις, τ' αποτελέσματα θα παραμείνουν κρυμμένα στη μνήμη τουυπολογιστή, εκτός αν περιλαμβάνουμε μια εντολή για να δείξουμε τα αποτελέσματα π.χ. στην οθόνη. Αυτός ακριβώς, είναι και ο ρόλος των εντολών εξόδου στην Pascal.

Οι εντολές εξόδου είναι επίσης πολύ χρήσιμες στο να τυπώνουμε τίτλους, επικεφαλίδες, μηνύματα επικοινωνίας με το χρήστη ή οτιδήποτε άλλο κείμενο το οποίο θα βοηθήσει στην κατανόηση τωναποτελεσμάτων του προγράμματός μας. Αν για παράδειγμα, ένα πρόγραμμά μας έβρισκε το τετράγωνο ενός ακεραίου αριθμού, η έξοδος του προγράμματος θα μπορούσε να ήταν απλά τοοποίο και θα σήμαινε ότι υπολογίσαμε το τετράγωνο του αριθμού 3. Θα ήταν όμως πολύ πιο ευκολονόητο αν η έξοδος του προγράμματος ήταν: Το τετράγωνο του είναι . Πρέπει λοιπόνσυνήθως να υπάρχει τουλάχιστον μια εντολή εξόδου σε κάθε πρόγραμμα που γράφουμε έτσι ώστε μπορούμε να δούμε τα τελικά αποτελέσματα.

Όπως ήδη αναφέραμε, ένα πρόγραμμα υπολογιστή χρησιμοποιείται από κάποιον χρήστη ο οποίος συνήθως χρειάζεται να παρέχει κάποια δεδομένα ή εντολές. Μια εντολή εισόδου επιτρέπει σ' έναπρόγραμμα να λάβει τιμές για τα στοιχεία τα οποία χρησιμοποιεί μέσω μιας εξωτερικής συσκευής εισαγωγής δεδομένων, όπως το πληκτρολόγιο. Καθώς ο υπολογιστής εκτελεί το πρόγραμμα, αυτέςοι τιμές στοιχείων εισάγονται και ορίζονται σε ορισμένες μεταβλητές μέσα στο πρόγραμμα. Αυτό, επιτρέπει την πραγματοποίηση κάποιου υπολογισμού για πολλές διαφορετικές τιμές, χωρίς αλλαγήτου ίδιου του προγράμματος (μόνο οι τιμές οι οποίες εισάγονται πρέπει ν' αλλάξουν). Ως παράδειγμα, θεωρείστε ότι επιθυμούμε να γράψουμε ένα πρόγραμμα ( ) που υπολογίζει καιτυπώνει στην οθόνη την τετραγωνική ρίζα ενός ακέραιου αριθμού.

Είχαμε αναφέρει στην ενότητα 2.8 ότι υπάρχουν προκαθορισμένες μαθηματικές συναρτήσεις που η χρήση τους απλοποιεί την λύσηκάποιων μαθηματικών προβλημάτων. Μια από αυτές τις συναρτήσεις είναι η η οποία υπολογίζει τη τετραγωνική ρίζα τουαριθμού . Εάν γράψουμε το συγκεκριμένο αυτό αριθμό μέσα στο πρόγραμμά μας (π.χ. το 9), τότε, μόλις εκτελέσουμε το πρόγραμμακαι πάρουμε το αποτέλεσμα (τον αριθμό 3), το πρόγραμμα δεν έχει πια καμία αξία εκτός αν αλλάξουμε τον αριθμό 9 μέσα στοπρόγραμμα.

program TetRiza1 (output);

begin Sqrt(9); Τύπωση του αποτελέσματος στην οθόνη;end.

Όπως βλέπουμε στο παράδειγμα του προγράμματος ( ) δεξιά, μια πολύ καλύτερη τεχνική είναινα γραφτεί το πρόγραμμα έτσι ώστε να υπολογίζεται η τετραγωνική ρίζα μιας μεταβλητής (π.χ. ), τηςοποίας η τιμή εισάγεται από τον χρήστη μέσω μιας εντολής εισόδου. Αυτό σημαίνει ότι το ίδιο πρόγραμμαμπορεί να εκτελεσθεί πολλές φορές χρησιμοποιώντας διαφορετικά δεδομένα κάθε φορά (τον εκάστοτεαριθμό του οποίου θέλουμε να βρούμε την τετραγωνική ρίζα).

program TetRiza2 (input, output);var num : integer;

begin Εισαγωγή της τιμής της μεταβλητής num από το πληκτρολόγιο; Sqrt(num); Τύπωση του αποτελέσματος στην οθόνη;end.

Ας δούμε, όμως, αναλυτικά ποιές είναι οι εντολές εισόδου και εξόδου στην Pascal και πώς τις χρησιμοποιούμε.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 30: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.9.1 - Εντολές Εξόδου

Οι εντολές με τις οποίες μπορούμε να τυπώσουμε στην οθόνη είναι η και η . Η πιο απλή μορφή της σύνταξης των δύο αυτών εντολών είναι:

WRITE( Όνομα Μεταβλητής ); και WRITELN( Όνομα Μεταβλητής );

Η μοναδική διαφορά μεταξύ των δύο εντολών, είναι η θέση του δρομέα (cursor) μετά την εκτέλεση της εντολής. Μετά την εμφάνιση των δεδομένων μας, με την εντολή ο δρομέας τοποθετείταιστον αμέσως επόμενο χαρακτήρα της οθόνης ενώ με την εντολή ο δρομέας τοποθετείται στον πρώτο χαρακτήρα της επόμενης γραμμής. Ας δούμε τα παρακάτω παραδείγματα για νακατανοήσουμε καλύτερα τη χρήση των εντολών εξόδου και τις διαφορετικές μορφές σύνταξης.

Παραδείγμα 1Το πρόγραμμα δεξιά, χρησιμοποιεί τέσσερις μεταβλητές οι οποίες δηλώνονται στο τμήμα δηλώσεων του προγράμματός μας:δύο ακεραίου τύπου ( , ) και δύο χαρακτήρες ( , ).

Κατόπιν, στο κύριο μέρος του προγράμματος, αναθέτουμε τιμές στις τέσσερις αυτές μεταβλητές.

Ύστερα, τυπώνουμε στην οθόνη την τιμή της κάθε μιας μεταβλητής, χρησιμοποιώντας την εντολή στη βασική της μορφή. Οι τιμές8, 5, Α και Ε, θα εμφανιστούν κολλητές μεταξύ τους γιατί δεν υπάρχει κάποιο κενό και δε χρησιμοποιούμε την η οποία θαμετέφερε το δρομέα στην επόμενη γραμμή.

Η εντολή που υπάρχει μετά (χωρίς μεταβλητή ή παρενθέσεις) μεταφέρει τον δρομέα (cursor) στην επόμενη γραμμή.

Τέλος, βλέπουμε ότι μπορούμε να τυπώσουμε τις τιμές και των τεσσάρων μεταβλητών μαζί, χρησιμοποιώντας μόνο μια εντολή ή αλλά σε πιο σύνθετη μορφή, ξεχωρίζοντας τις μεταβλητές με κόμματα.

Το τελικό αποτέλεσμα που θα δούμε στην οθόνη φαίνεται σε αυτήν την εικόνα.

program Exodos1 (input, output);var num1, num2 : integer; let1, let2 : char;

begin num1 := 8; num2 := 5; let1 := 'A'; let2 := 'E';

write(num1); write(num2); write(let1); write(let2); writeln; write(num1, num2, let1, let2);end.

Παραδείγμα 2Το δεύτερο παράδειγμα, είναι το πρόγραμμα , το οποίο όπως βλέπουμε δε διαφέρει και πολύ από το προηγούμενο πρόγραμμα . Χρησιμοποιούνται oi ίδιες μεταβλητές με τις ίδιεςακριβώς τιμές και η μόνη διαφορά τους είναι, ότι αντί της εντολής , τυπώνουμε τις τιμές των μεταβλητών χρησιμοποιώντας τη . Δεδομένου ότι η μετακινεί τον δρομέα στηνεπόμενη γραμμή, το αποτέλεσμα το οποίο θα τυπωθεί στην οθόνη φαίνεται σε αυτήν την εικόνα.

program Exodos2 (input, output); var num1, num2 : integer; let1, let2 : char;

begin num1 := 8; num2 := 5; let1 := 'A'; let2 := 'E';

writeln(num1); writeln(num2); writeln(let1); writeln(let2); writeln; writeln(num1, num2, let1, let2);end.

Παραδείγμα 3Το τρίτο παράδειγμα (πρόγραμμα ) χρησιμοποιεί και αυτό τις ίδιες μεταβλητές με τις ίδιες τιμές. Ο σκοπός program Exodos3 (input, output);

Page 31: All Chapters

όμως αυτού του παραδείγματος είναι να δούμε πώς μπορούμε να τυπώσουμε κάποια μηνύματα ή να συνδυάσουμεμεταβλητές με μηνύματα.

Βλέπουμε λοιπόν ότι μπορούμε να τυπώσουμε ένα οποιοδήποτε μήνυμα αν το εσωκλείσουμε μέσα σε αποστρόφουςείτε με την εντολή είτε με την .

Η τελευταία εντολή (που φυσικά θα μπορούσε να είναι και ) είναι μια πιο σύνθετη μορφή, η οποίαμας επιτρέπει σε μια μόνο εντολή, να συνδυάσουμε μηνύματα και μεταβλητές ξεχωρίζοντας τα με κόμματα.Χρειάζεται μια ιδιαίτερη προσοχή, γιατί τα μηνύματα πρέπει να περικλείονται από αποστρόφους ενώ οι μεταβλητέςόχι.

Το τελικό αποτέλεσμα που θα δούμε στην οθόνη φαίνεται σε αυτήν την εικόνα.

var num1, num2 : integer; let1, let2 : char;

begin num1 := 8; num2 := 5; let1 := 'A'; let2 := 'E';

write('Hallo World'); write(' '); write('Pascal.'); writeln; writeln(num1, '-', num2, '-', let1, '-', let2);end.

Τελειώνοντας αυτή την ενότητα θ' αναφέρουμε ότι δεν επιτρέπεται να διασπάμε κάποιο μήνυμα (συμβολοσειρά) που υπάρχει σε μια εντολή εξόδου σε δύο διαφορετικές γραμμές. Για παράδειγμα, ηεντολή εξόδου περιέχει το μήνυμα . Δεν μπορούμε, λοιπόν, να γράψουμε στη μια γραμμή

και στην επόμενη γραμμή το υπόλοιπο της εντολής, δηλαδή

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 2 .2

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 32: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.9.2 - Μορφοποίηση Εξόδου

Είδαμε, λοιπόν, στην προηγούμενη ενότητα, ότι με τις εντολές και μπορούμε να εμφανίσουμε δεδομένα στην οθόνη. Η εμφάνιση των δεδομένων αυτών μπορεί να μορφοποιηθεί ανστις δυο αυτές εντολές εξόδου προσθέσουμε έναν αριθμό ο οποίος αντιπροσωπεύει τον αριθμό των χαρακτήρων που επιθυμούμε να δεσμεύσουμε για την εμφάνιση του συγκεκριμένου δεδομένου. Ησύνταξη των εντολών και , γίνεται λοιπόν:

WRITE( Όνομα Μεταβλητής : Αριθμός Χαρακτήρων); - για παράδειγμα

WRITELN( Όνομα Μεταβλητής : Αριθμός Χαρακτήρων); - για παράδειγμα

Φυσικά, αντί για κάποια μεταβλητή μπορεί να χρησιμοποιηθεί κάποιο μήνυμα που περικλείεται από αποστρόφους (π.χ. ). Το οπτικό αποτέλεσμα θα είναι η δεξιάστοίχιση του στοιχείου που θέλουμε να τυπώσουμε μέσα στο διάστημα χαρακτήρων που ορίζει ο αριθμός μετά τον χαρακτήρα (άνω κάτω τελεία).

Παράδειγμα 1Στο πρώτο μας παράδειγμα χρησιμοποιούμε μια μεταβλητή τύπου στην οποία έχουμε δώσει την τιμή 10. Βλέπουμε, ότι στην εντολή δεσμεύουμε 5χαρακτήρες για την τύπωση της τιμής της μεταβλητής . Ο ακέραιος αριθμός 10, αποτελείται από 2 ψηφία που σημαίνει ότι θα τυπωθούν πρώτα 3 κενά (spaces) καιμετά ο αριθμός 10. Δείτε το οπτικό αποτέλεσμα.

num := 10;write(num:5);

Παράδειγμα 2Στο συγκεκριμένο παράδειγμα, τυπώνουμε το μήνυμα το οποίο αποτελείται από συνολικά 11 χαρακτήρες. Έχουμε δεσμεύσει όμως 15χαρακτήρες που σημαίνει ότι πρώτα θα τυπωθούν 4 κενά. Δείτε το οπτικό αποτέλεσμα.

write('Hallo World':15);

Παράδειγμα 3Μπορούμε φυσικά να χρησιμοποιήσουμε τη σύνθετη μορφή της και να τυπώσουμε πολλά στοιχεία μαζί (τα οποία ξεχωρίζονται μεκόμματα) και να μορφοποιήσουμε κάθ' ένα από αυτά με ξεχωριστό τρόπο. Το οπτικό αποτέλεσμα του παραδείγματος δεξιά φαίνεται εδώ.

num1 := 10;num2 := 8;write(num1:4, 'Pascal':9, num2:3);

Στα παραπάνω παραδείγματα είναι ευνόητο ότι θα μπορούσε να χρησιμοποιηθεί και η εντολή με τα ίδια ακριβώς αποτελέσματα, εκτός του ότι ο δρομέας θα είχε μετακινηθεί στην επόμενηγραμμή. Επίσης, αξίζει να σημειώσουμε, ότι αν ο αριθμός χαρακτήρων που δεσμεύουμε για την τύπωση ενός στοιχείου είναι μικρότερος από τους χαρακτήρες του στοιχείου, δεν επηρεάζεται τοαποτέλεσμα (εκτός φυσικά το ότι δεν υπάρχουν αρχικά κενά). Αν, για παράδειγμα, είχαμε την εντολή το αποτέλεσμα στην οθόνη, θα ήταν η λέξη , παρόλο που αυτήαποτελείται από 6 χαρακτήρες και εμείς δεσμεύσαμε μόνο 2.

Στην ενότητα 2.7.2 είχαμε μιλήσει για τους πραγματικούς αριθμούς (με δεκαδικά ψηφία) και ότι τέτοιοι αριθμοί αποθηκεύονται σε εκθετική μορφή. Αν επιχειρήσουμε να τυπώσουμε στην οθόνη ένανπραγματικό αριθμό, θα εμφανιστεί στην εκθετική του μορφή η οποία είναι δύσκολο να την κατανοήσουμε με την πρώτη ματιά. Αν, για παράδειγμα, έχουμε μια πραγματικού τύπου μεταβλητή στην οποία αναθέτουμε την τιμή 78.5641 και εκτελέσουμε την εντολή , στην οθόνη θα εμφανιστεί ο αριθμός 7.856410000000000E+001 ο οποίος είναι ο αριθμός 78.5641, αλλάστην εκθετική του μορφή. Μπορούμε, όμως, να έχουμε και εδώ μορφοποίηση της εμφάνισης ενός πραγματικού αριθμού όπου ο χρήστης, εκτός από το συνολικό αριθμό των χαρακτήρων πουδεσμεύει, μπορεί επίσης να προσδιορίσει και τον αριθμό των δεκαδικών ψηφίων (δηλαδή την ακρίβεια) που επιθυμεί να εμφανιστούν στην οθόνη. Αυτό επιτυγχάνεται με την παρακάτω σύνταξη.

WRITE( Όνομα Μεταβλητής : Αριθμός Χαρακτήρων : Αριθμός Δεκαδικών Ψηφίων); - για παράδειγμα

WRITELN( Όνομα Μεταβλητής : Αριθμός Χαρακτήρων : Αριθμός Δεκαδικών Ψηφίων); - για παράδειγμα

Ας δούμε δυο παραδείγματα χρησιμοποιώντας τη μεταβλητή που προαναφέραμε στην οποία έχουμε αναθέσει την τιμή 78.5641.

Παράδειγμα 1Σε αυτό το παράδειγμα δεσμεύουμε 10 συνολικά χαρακτήρες για την τύπωση της τιμής της μεταβλητής . Το δεκαδικό μέρος του αριθμού 78.5641 είναι το 5641από το οποίο όμως, εμείς ζητάμε να εμφανιστούν μόνο 2 δεκαδικά ψηφία δηλαδή το 56. Κατά συνέπεια, θα τυπωθεί ο αριθμός 78.56 ο οποίος αποτελείται από 5χαρακτήρες και εφόσον έχουμε δεσμεύσει 10, θα τυπωθούν πρώτα 5 κενά (spaces). Δείτε το οπτικό αποτέλεσμα.

write(grade:10:2);

Παράδειγμα 2Στο δεύτερο παράδειγμα, δεσμεύουμε 11 συνολικά χαρακτήρες για την τύπωση της τιμής της μεταβλητής . Αυτή τη φορά όμως, ζητάμε να δούμε 7 δεκαδικάψηφία από τον αριθμό 78.5641 που έχει όμως μόνο 4. Αυτό σημαίνει, ότι το δεκαδικό μέρος του αριθμού θα γίνει 5641000 και ο τελικός αριθμός που θα τυπωθεί είναι78.5641000 που αποτελείται από 10 χαρακτήρες. Εφόσον δεσμεύσαμε 11 χαρακτήρες συνολικά, θα εμφανιστεί πρώτα ένα κενό. Δείτε το οπτικό αποτέλεσμα.

write(grade:11:7);

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 2 .3

Page 33: All Chapters

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 34: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.9.3 - Εντολές Εισόδου

Όλα τα προγράμματα, επεξεργάζονται κάποια δεδομένα τα οποία "διαβάζονται" από το πρόγραμμα, ή αν προτιμάτε "εισάγονται" στο πρόγραμμα από βάσεις δεδομένων, αρχεία, διάφοραμηχανήματα κτλ. Όμως, ο πιο συνηθισμένος τρόπος εισαγωγής δεδομένων σ ένα πρόγραμμα, είναι όταν κάποιος χρήστης δίνει στοιχεία μέσω κάποιας συσκευής όπως το πληκτρολόγιο. Η Pascal,παρέχει δυο εντολές, με τις οποίες μπορούμε να εισάγουμε και να καταχωρήσουμε δεδομένα από το πληκτρολόγιο στη μνήμη του υπολογιστή (μέσω μιας μεταβλητής φυσικά). Οι εντολές αυτές, είναιη και η των οποίων η βασική σύνταξη είναι η ακόλουθη:

READ( Όνομα Μεταβλητής ); και READLN( Όνομα Μεταβλητής );

Όπως και με τις εντολές εξόδου και , η μόνη διαφορά μεταξύ της και της είναι ότι με τη ο δρομέας (cursor) μετακινείται στην επόμενη γραμμή μετά τηνεισαγωγή του στοιχείου και το πάτημα του πλήκτρου ελέγχου . Ας δούμε μερικά παραδείγματα.

Παραδείγμα 1Στο πρόγραμμα δεξιά, χρησιμοποιούμε δυο μεταβλητές ακεραίου τύπου ( , ) και μια μεταβλητή τύπου χαρακτήρα ( )και βλέπουμε ότι στις μεταβλητές αυτές, δεν έχει ανατεθεί κάποια συγκεκριμένη τιμή μέσα από το πρόγραμμα. Μέσω των τριών εντολών,ο χρήστης είναι αυτός ο οποίος θα εισάγει τις τιμές για τις τρεις αυτές μεταβλητές. Έτσι, λοιπόν, αν κατά την εκτέλεση του προγράμματοςγράψουμε το γράμμα και πατήσουμε , και και και τότε στη μεταβλητή καταχωρείται το γράμμα ,στη μεταβλητή καταχωρείται ο αριθμός 34 και στη μεταβλητή καταχωρείται ο αριθμός 67. Ένας άλλος τρόπος που μπορούμε ναεισάγουμε τα δεδομένα (που όμως ισχύει μόνο με τη και όχι με τη ) είναι αν ξεχωρίσουμε τις τιμές που εισάγουμε με κενά. Αν,δηλαδή, είχαμε γράψει και θα είχαμε τις ίδιες ακριβώς καταχωρήσεις.

program Eisodos1 (input); var num1, num2 : integer; let1 : char;

begin read(let1); read(num1); read(num2);end.

Παραδείγμα 2Το πρόγραμμα όμως, δεν είναι και τόσο φιλικό προς το χρήστη. Και αυτό γιατί δεν υπάρχει κάποιο ενημερωτικό μήνυμα για το τί ακριβώς πρέπει να εισάγουμε και φυσικά δεν τυπώθηκανπουθενά τα αποτελέσματα. Στο παρακάτω πρόγραμμα, χρησιμοποιούμε την εντολή για να εμφανίσουμε κάποια απλά μηνύματα τα οποία καθοδηγούν το χρήστη για το τίακριβώς πρέπει να εισάγει. Τέλος, τυπώνουμε στην οθόνη τις τιμές των μεταβλητών.

program Eisodos2 (input); var num1, num2 : integer; let1 : char;

begin write('Dwste ena gramma: '); readln(let1); write('Dwste enan arithmo: '); readln(num1); write('Dwste enan arithmo: '); readln(num2);

writeln('Dwsate to gramma: ', let1); writeln('Dwsate ton arithmo: ', num1); writeln('Dwsate ton arithmo: ', num2);end.

Οι εντολές εισόδου και , μπορούν και αυτές να χρησιμοποιηθούν σε πιο σύνθετη μορφή, όπως και οι εντολές και . Αν, δηλαδή, υποθέσουμε ότι το Α είναι μια μεταβλητήτύπου χαρακτήρα και τα Β και είναι μεταβλητές ακεραίου τύπου, μπορούμε να έχουμε εντολές όπως ή και να εισάγουμε τα δεδομένα ξεχωρίζοντας τα μεκενά (π.χ. ). Κάτι τέτοιο όμως, μπορεί να δημιουργήσει προβλήματα, ιδιαίτερα όταν οι μεταβλητές είναι τύπου . Γι' αυτό ακριβώς το λόγο, αλλά και για άλλους λόγους όπως το να είναιευανάγνωστο το πρόγραμμά μας αλλά και φιλικό προς το χρήστη, θα πρέπει να ακολουθούνται οι παρακάτω τρεις κανόνες στη χρήση των εντολών εισόδου και εξόδου:

πριν από την εισαγωγή κάποιου δεδομένου, θα πρέπει να υπάρχει ένα ενημερωτικό μήνυμα που να καθοδηγεί τον χρήστη για το τί ακριβώς πρέπει να εισάγει π.χ.

να χρησιμοποιείται η απλή μορφή της ή της στις οποίες μπορούμε να εισάγουμε τιμή για μια μόνο μεταβλητή π.χ.

Page 35: All Chapters

Όταν τυπώνουμε δεδομένα ή κάποια αποτελέσματα υπολογισμών, καλό είναι να συνοδεύονται από κάποιο ενημερωτικό μήνυμα π.χ. ή

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 2 .4

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 36: All Chapters

Κεφάλαιο 2

ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

2.10 - Παραδείγματα Προγραμμάτων

Έχοντας δει πολλά από τα βασικά στοιχεία της Pascal, έχουμε πλέον τη δυνατότητα να γράψουμε απλά προγράμματα, σαν αυτό της άσκησης αυτοαξιολόγησης της προηγούμενης ενότητας. Στοπρώτο κεφάλαιο, είχαμε αναφέρει ότι οι τρεις βασικές δομές που χρησιμοποιούνται για την επίλυση ενός προβλήματος, είναι η δομή ακολουθίας, η δομή επιλογής και η δομή επανάληψης. Μέχριστιγμής, μπορούμε να γράψουμε απλά προγράμματα τα οποία χρησιμοποιούν τη δομή ακολουθίας όπως τα παραδείγματα που υπάρχουν παρακάτω. Σε μετέπειτα κεφάλαια, θα εξετάσουμε τιςδομές επιλογής και επανάληψης για να λύσουμε πιο πολύπλοκα προβλήματα.

Παραδείγμα 1Στο πρώτο παράδειγμα, θα γράψουμε ένα απλό πρόγραμμα το οποίο υπολογίζει το άθροισμα, τη διαφορά και το γινόμενο δύο αριθμών τους οποίους εισάγει ο χρήστης από το πληκτρολόγιο. Στοτέλος, θα πρέπει να εμφανίζονται ενημερωτικά μηνύματα των αποτελεσμάτων του προγράμματος. Ένας από τους σκοπούς αυτού του προγράμματος, είναι να εξοικειωθούμε στη συνύπαρξημηνυμάτων και μεταβλητών σε μια εντολή εξόδου. Γι' αυτό ακριβώς το λόγο, τα μηνύματα που υπάρχουν στις εντολές εξόδου. εμφανίζονται με ροζ γράμματα. Το αποτέλεσμα του προγράμματος. ανο χρήστης δώσει τους αριθμούς 50 και 15 φαίνεται σε αυτή την εικόνα.

program Prakseis (input, output); var num1, num2, sum, dif, mul : integer;

begin write('Eisagete ton prwto akeraio arithmo: '); readln(num1); write('Eisagete ton deftero akeraio arithmo: '); readln(num2);

sum := num1 + num2; dif := num1 - num2; mul := num1 * num2;

writeln('To athroisma twn arithmwn ', num1, ' kai ', num2, ' einai: ', sum); writeln('H diafora twn arithmwn ', num1, ' kai ', num2, ' einai: ', dif); writeln('To ginomeno twn arithmwn ', num1, ' kai ', num2, ' einai: ', mul);end.

Παραδείγμα 2Σε αυτό το δεύτερο παράδειγμα, θα γράψουμε ένα πρόγραμμα το οποίο υπολογίζει το τελικό ποσό ενός λογαριασμού του ΟΤΕ. Ο λογαριασμός αυτός, περιλαμβάνει αστικές, υπεραστικές καιδιεθνείς κλήσεις καθώς και κλήσεις προς κινητά και το Ίντερνετ. Υποθέστε, λοιπόν, ότι κάποιος υπάλληλος του ΟΤΕ εισάγει το χρηματικό ποσό για κάθ' ένα από τα πέντε είδη κλήσεων πουαναφέραμε προηγουμένως. Για να υπολογιστεί το τελικό οφειλούμενο ποσό του λογαριασμού, προσθέτουμε τα ποσά για τα πέντε είδη κλήσεων καθώς και το πάγιο των 25 ευρώ. Στο τελικόαποτέλεσμα προστίθεται και ο ΦΠΑ (19%). Σε αυτή την εικόνα μπορείτε να δείτε την μορφή που πρέπει να έχει η εκτέλεση και το αποτέλεσμα του προγράμματος.

program Ote (input, output); const pagio = 25; FPA = 1.19;

var total, astikes, yperastikes : real; diethneis, kinita, Internet : real;

begin write('1. Eisagete to poso gia Astikes Klhseis: '); readln(astikes); write('2. Eisagete to poso gia Yperastikes Klhseis: '); readln(yperastikes); write('3. Eisagete to poso gia Diethneis Klhseis: '); readln(diethneis); write('4. Eisagete to poso gia Klhseis Pros Kinita: '); readln(kinita); write('5. Eisagete to poso gia Klhseis Pros Internet: ');

Page 37: All Chapters

readln(Internet);

total := 0; total := astikes + yperastikes + diethneis + kinita + Internet + pagio; total := total * FPA;

writeln; writeln; writeln(' ---------------------------------------'); writeln(' KLHSEIS: ', 'POSO':17, 'ME FPA':13); writeln(' ------------', '------':14, '------':13); writeln(' Astikes: ', astikes:17:3, astikes*FPA:13:3); writeln(' Yperastikes: ', yperastikes:13:3, yperastikes*FPA:13:3); writeln(' Diethneis: ', diethneis:15:3, diethneis*FPA:13:3); writeln(' Pros Kinita: ', kinita:13:3, kinita*FPA:13:3); writeln(' Pros Internet: ', Internet:11:3, Internet*FPA:13:3); writeln; writeln(' Pagio: ', pagio:19, pagio*FPA:13:3); writeln; writeln(' Teliko Poso: ':29, total:12:3); writeln(' ---------------------------------------'); writeln; writeln;end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 2 Επόμενη Ενότητα

Page 38: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟΙ ΤΟΥ ΚΕΦΑΛΑ ΙΟΥ

3.1 - Εισαγωγή

3.2 - Τελεστές Συσχέτισης και Απλές Λογικές Παραστάσεις

3.2.1 - Υπολογισμός Απλών Λογικών Παραστάσεων

3.3 - Λογικοί Τελεστές και Σύνθετες Λογικές Παραστάσεις

3.3.1 - Υπολογισμός Σύνθετων Λογικών Παραστάσεων

3.4 - Η Δομή Επιλογής IF

3.4.1 - Παραδείγματα Δομής IF

3.5 - Επέκταση της Δομής Επιλογής IF: IF/THEN/ELSE

3.6 - Εμφωλευμένη Δομή IF

3.6.1 - Παράδειγμα Εμφωλευμένης Δομής IF

3.7 - Δομή IF/THEN/ELSE και Πολλαπλές Επιλογές

3.8 - Η Δομή Επιλογής CASE

3.9 - Τεστ Αυτοαξιολόγησης Κεφαλαίου

Προηγούμενο Κεφάλαιο Κεντρική Σελίδα Επόμενη Ενότητα

Page 39: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.1 - Εισαγωγή

Στα προηγούμενα κεφάλαια, εξετάσαμε βασικά στοιχεία του προγραμματισμού και της επίλυσης προβλημάτων. Είδαμε πώς μπορούμε να γράφουμε απλά προγράμματα σε Pascal και ναπραγματοποιούμε εντολές εισόδου (εισαγωγή δεδομένων από το χρήστη μέσω του πληκτρολογίου), εντολές επεξεργασίας (πραγματοποίηση αριθμητικών υπολογισμών) καθώς και εντολές εξόδου(εκτύπωση δεδομένων στην οθόνη).

Όπως είδαμε στην ενότητα 1.7, κατά τη διάρκεια επίλυσης ενός προβλήματος, υπάρχουν περιπτώσεις όπου εκτελείται μια ενέργεια ή λαμβάνεται μια απόφαση αν ισχύει μια ή περισσότερεςσυνθήκες. Για παράδειγμα, η ανάληψη 50 Ευρώ από το λογαριασμό μας σε μια τράπεζα, επιτρέπεται από το μηχάνημα ATM μόνο αν το υπόλοιπο του λογαριασμού μας είναι ίσο ή μεγαλύτερο από50 Ευρώ.

Στις περισσότερες γλώσσες προγραμματισμού, υπάρχουν συγκεκριμένες δομές ελέγχου οι οποίες επιτρέπουν τον έλεγχο κάποιων συνθηκών και ανάλογα με το αποτέλεσμα του ελέγχου, επιτρέπουντην επιλογή συγκεκριμένων εντολών, που θα πρέπει να εκτελεστούν. Αυτές οι δομές ελέγχου, ονομάζονται δομές επιλογής και δίνουν τη δυνατότητα στον προγραμματιστή να ελέγχει και να επιλέγειτη ροή της εκτέλεσης των εντολών ενός προγράμματος. Πριν όμως μελετήσουμε τις δομές επιλογής, είναι απαραίτητο να εξετάσουμε τις λογικές παραστάσεις ή αλλιώς εκφράσεις Boolean και πώςαυτές μπορούν να συγκριθούν.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 40: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.2 - Τελεστές Συσχέτισης και Απλές Λογικές Παραστάσεις

Όπως γνωρίζουμε, οι ακέραιοι και οι πραγματικοί αριθμοί μπορούν να συγκριθούν μεταξύτους. Για παράδειγμα, ο αριθμός 5 είναι μικρότερος από τον αριθμό 12, ενώ ο αριθμός23.48 είναι μεγαλύτερος από τον 17.36. Οι τελεστές που χρησιμοποιούνται για σύγκρισηονομάζονται τελεστές συσχέτισης και παραθέτονται στον πίνακα 3.1.

Όταν δυο αριθμοί ή δυο μεταβλητές στις οποίες έχουμε ορίσει τιμές, συγκρίνονται μεκάποιο τελεστή συσχέτισης, η έκφραση που προκύπτει ονομάζεται λογική παράσταση.Μια απλή λογική παράσταση, μπορεί να είναι αληθής ή ψευδής, ανάλογα με τηνεγκυρότητα της έκφρασης. Το αποτέλεσμα, δηλαδή μιας σύγκρισης, μπορεί να πάρει τηνboolean τιμή TRUE ή την boolean τιμή FALSE. Στον πίνακα 3.2, μπορούμε να δούμεπαραδείγματα απλών λογικών παραστάσεων καθώς και το boolean αποτέλεσμά τους.

Όπως ακριβώς και με τους αριθμητικούς τελεστές, ιδιαίτερη προσοχή πρέπει να δίνεταιστους τύπους δεδομένων των μεταβλητών που εμπεριέχονται σε μια λογική παράσταση.Οι τελεστές συσχέτισης μπορούν να χρησιμοποιηθούν για να συγκρίνουνμεταβλητές/ορίσματα που έχουν δηλωθεί ως integer, real, char ή boolean, αλλά όταν δυοορίσματα συγκρίνονται θα πρέπει να είναι του ίδιου τύπου δεδομένων. Προσοχή επίσηςχρειάζεται η διαφοροποίηση του τελεστή ανάθεσης ( := ) που αλλάζει τις τιμές τωνορισμάτων με τον τελεστή ισότητας ( = ) όπου απλά τις εξετάζει.

ΑΛΓΕΒΡΙΚΟΣΤΕΛΕΣΤΗΣ

ΤΕΛΕΣΤΗΣΣΥΣΧΕΤΙΣΗΣ ΕΡΜΗΝΕΙΑ

= = Είναι ίσο με

≠ <> Δεν είναι ίσο με

< < Είναι μικρότερο από

> > Είναι μεγαλύτερο από

≤ <= Είναι μικρότερο από ή ίσο με

≥ >= Είναι μεγαλύτερο από ή ίσο με

Πίνακας 3.1: Τελεστές Συσχέτισης στην Pascal

ΑΠΛΗ ΛΟΓΙΚΗ ΠΑΡΑΣΤΑΣΗ BOOLEAN ΤΙΜΗ

4 = 8 FALSE

4 <> 8 TRUE

18 <= 15 FALSE

32 >= 32 TRUE

x >= y όπου x=5 and y=3 TRUE

'E' > 'N' FALSE

12.28 < 15.875 FALSE

Πίνακας 3.2: Παραδείγματα Λογικών Παραστάσεων

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 41: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.2.1 - Υπολογισμός Απλών Λογικών Παραστάσεων

Οι απλές λογικές παραστάσεις μπορούν να χρησιμοποιηθούν μαζί με αριθμητικές εκφράσεις. Έτσι, λοιπόν, το αποτέλεσμα της παράστασης 4 < (3+2) είναι TRUE. Η ύπαρξη των παρενθέσεων,δηλώνει ότι η πράξη μέσα σε αυτές πρέπει να υπολογιστεί πρώτα. Αρα, ο υπολογιστής βρίσκει πρώτα ότι 3+2 είναι 5 και μετά ότι 4 < 5 είναι TRUE.

Τί θα είχε γίνει όμως αν δεν είχαμε χρησιμοποιήσει τις παρενθέσεις; Θα μπορούσε να είχε χρησιμοποιηθεί η παράσταση 4 < 3 + 2; Μιατέτοιου είδους παράσταση, καθιστά αναγκαία την ανάθεση ιεραρχίας στους τελεστές συσχέτισης και στους αριθμητικούς τελεστές ηοποία παρατίθεται στον πίνακα 3.3. Όπως, λοιπόν, βλέπουμε και στον πίνακα, οι τελεστές συσχέτισης υπολογίζονται τελευταίοι. Αρα ηπαράσταση 4 < 3 + 2 θα μπορούσε να υπολογιστεί και χωρίς παρενθέσεις και θα είχε το ίδιο ακριβώς αποτέλεσμα (TRUE). Ας δούμεόμως βήμα προς βήμα ένα ακόμη παράδειγμα το οποίο είναι λίγο πιο περίπλοκο.

ΤΕΛΕΣΤΕΣ - ΣΥΜΒΟΛΑ ΙΕΡΑΡΧΙΑ

( ) 1

*, /, DIV, MOD 2

+, - 3

=, <>, <, >, <=, >= 4

Πίνακας 3.3: Ιεραρχiα Τελεστών

Παράδειγμα

Να δείξετε να όλα τα βήματα για τον υπολογισμό της λογικής παράστασης:

10 MOD 4 * 3 - 8 <= 18 + 30 / 4 - 20

Όπως βλέπουμε στη λύση του παραδείγματος δεξιά, οι παρενθέσεις δεν είναιαπαραίτητες για τον υπολογισμό μιας παράστασης που εμπεριέχει τελεστέςσυσχέτισης και αριθμητικούς τελεστές.

Η ύπαρξη των παρενθέσεων όμως είναι κάτι θεμιτό και θα πρέπει ναχρησιμοποιούνται πάντα γιατί βοηθούν πολύ στην αναγνωσιμότητα μιαςπαράστασης και στην αποφυγή δημιουργίας λανθασμένων παραστάσεων. Θαήταν λοιπόν, πιο σωστό αν η παραπάνω λογική παράσταση είχε εκφραστεί ωςεξής:

( ( ( 10 MOD 4 ) * 3 ) - 8 ) <= ( 18 + ( 30 / 4 ) - 20 )

10 MOD 4 * 3 - 8 <= 18 + 30 / 4 - 20

¯

2 * 3 - 8 <= 18 + 30 / 4 - 20

¯

6 - 8 <= 18 + 30 / 4 - 20

¯

-2 <= 18 + 30 / 4 - 20

¯

-2 <= 18 + 7 - 20

¯

-2 <= 25 - 20

¯

-2 <= 5

¯

TRUE

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 42: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.3 - Λογικοί Τελεστές και Σύνθετες Λογικές Παραστάσεις

Όπως είδαμε, οι τελεστές συσχέτισης εφαρμόζονται σε μεταβλητές τύπου integer, real, char ή boolean και παράγουν ένα boolean αποτέλεσμα TRUE ή FALSE. Υπάρχουν όμως, και τρεις λογικοίτελεστές, οι οποίοι εφαρμόζονται σε boolean τιμές και παράγουν κι αυτοί ένα boolean αποτέλεσμα. Οι τρεις αυτοί λογικοί τελεστές είναι:

AND - η σύζευξη δυο Boolean ορισμάτωνOR - η διάζευξη δυο Boolean ορισμάτωνNOT - η άρνηση (ή αλλιώς το συμπλήρωμα) ενός Boolean ορίσματος

ΠΑΡΑΣΤΑΣΗ E1 ΠΑΡΑΣΤΑΣΗ E2 (E1) AND (E2) (E1) OR (E2)

TRUE TRUE TRUE TRUE

TRUE FALSE FALSE TRUE

FALSE TRUE FALSE TRUE

FALSE FALSE FALSE FALSE

Πίνακας 3.4: Λογικοί Τελεστές AND και OR

Όταν ένας από τους παραπάνω λογικούς τελεστές χρησιμοποιείται για να ενώσει δυο απλές λογικέςπαραστάσεις, η έκφραση που δημιουργείται ονομάζεται σύνθετη λογική παράσταση.

Όπως βλέπουμε από τον πίνακα 3.4, όταν δυο απλές παραστάσεις συνδέονται με το λογικό τελεστή AND, το αποτέλεσμα είναι TRUEμόνο όταν και οι δυο απλές παραστάσεις είναι TRUE. Η τιμή της πράξης OR είναι TRUE αν είτε η μια ή και οι δυο παραστάσεις είναιTRUE. Το αποτέλεσμα της επίδρασης του τελεστή NOT (πίνακας 3.5), είναι η άρνηση της παράστασης, δηλαδή αν έχει τιμή TRUE τότεη τιμή της NOT πράξης είναι FALSE.

ΠΑΡΑΣΤΑΣΗ E NOT (E)

TRUE FALSE

FALSE TRUE

Πίνακας 3.5: Λογικός Τελεστής NOT

Για παράδειγμα, η Boolean τιμή της σύνθετης παράστασης:

(a=8) or (b>3)

θα είναι TRUE, αν η μεταβλητή a είναι ίση με το 8, ή αν η μεταβλητή b έχει τιμή μεγαλύτερη του 3 ή αν ισχύουν και ταδύο. Αντίστοιχα, η παράσταση

(a=8) and (b>3)

θα είναι TRUE μόνο αν η μεταβλητή a είναι ίση με το 8 και η μεταβλητή b έχει τιμή μεγαλύτερη του 3. Περισσότεραπαραδείγματα παραθέτονται στον πίνακα 3.6.

ΣΥΝΘΕΤΗ ΛΟΓΙΚΗ ΠΑΡΑΣΤΑΣΗ BOOLEAN ΤΙΜΗ

(4.2 >= 5.0) AND (8 = (3+5)) FALSE

(4.2 >= 5.0) OR (8 = (3+5)) TRUE

(-2 < 0) AND (18 >= 20) FALSE

(-2 < 0) OR (18 >= 20) TRUE

( 3 > 5) AND (8.76 = 1.45) FALSE

( 3 > 5) OR (8.76 = 1.45) FALSE

(18 = (10 + 8)) TRUE

NOT (18 = (10 + 8)) FALSE

Πίνακας 3.6: Παραδείγματα Σύνθετων Λογικών Παραστάσεων

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 43: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.3.1 - Υπολογισμός Σύνθετων Λογικών Παραστάσεων

Επειδή μέσα σε μια σύνθετη λογική παράσταση είναι δυνατόν να εμφανίζονται ταυτόχρονα λογικοί τελεστές, αριθμητικέςπαραστάσεις και τελεστές συσχέτισης, θα πρέπει να υπάρχει κάποια σειρά με την οποία θα υπολογιστούν. Παρατηρούμε λοιπόν,στον πίνακα 3.7 της ιεραρχίας των τελεστών, ότι οι λογικές πράξεις and και or προηγούνται των τελεστών συσχέτισης. Έτσι,λοιπόν, η σύνθετη λογική παράσταση 3 > 5 or 65 < 8 δε θα υπολογιστεί ως (3 > 5) or (65 < 8) αλλά λανθασμένα ως 3 > (5 or65) < 8 . Αρα, λοιπόν, για να έχει νόημα η ανάμιξη αυτών των πράξεων, είναι απαραίτητη η κατάλληλη χρήση παρενθέσεων. Στοπαρακάτω παράδειγμα φαίνονται βήμα προς βήμα οι υπολογισμοί μιας σύνθετης λογικής παράστασης.

ΤΕΛΕΣΤΕΣ - ΣΥΜΒΟΛΑ ΙΕΡΑΡΧΙΑ

( ) 1

ΝΟΤ 2

*, /, DIV, MOD, AND 3

+, -, OR 4

=, <>, <, >, <=, >= 5

Πίνακας 3.7: Ιεραρχiα Τελεστών

Παράδειγμα

Να δείξετε να όλα τα βήματα για τον υπολογισμό της σύνθετης λογικής παράστασης:

NOT ( (-5.0 >= -6.2) OR ( (7 > 3) AND (6 = (3 + 3) ) )

Όπως βλέπουμε στη λύση του παραδείγματος δεξιά, οι παρενθέσεις είναι απαραίτητες γιατον υπολογισμό μιας σύνθετης λογικής παράστασης και σύμφωνα με τον πίνακα ιεραρχίαςτων τελεστών οι παραστάσεις μέσα στις παρενθέσεις πρέπει να υπολογιστούν πρώτα.

NOT ( (-5.0 >= -6.2) OR ( (7 > 3) AND (6 = (3 + 3) ) )

¯ ¯ ¯NOT ( TRUE OR ( TRUE AND TRUE ) )

NOT ( TRUE OR ( ¯ ) )

NOT ( TRUE OR TRUE )

NOT ¯

NOT TRUE

¯

FALSE

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 44: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.4 - Η Δομή Επιλογής IF

Όπως γνωρίζουμε, οι εντολές ενός προγράμματος εκτελούνται η μια μετά την άλλη. Είδαμε επίσης, ότι πολλές φορές η λύση των προβλημάτων απαιτεί τη λήψη αποφάσεων ανάλογα με κάποιεςσυνθήκες που επικρατούν. Οι συνθήκες αυτές, εξαρτώνται από τις τρέχουσες τιμές των μεταβλητών. Έτσι αλλάζοντας αυτές τις τιμές είναι δυνατό να εκτελούνται διαφορετικοί υπολογισμοί σ' έναπρόγραμμα. Πιο συγκεκριμένα, ανάλογα με ποιά συνθήκη ισχύει, μπορούν να παραλειφθούν ή να εκτελεστούν ορισμένες εντολές κι αυτό μπορεί να επιτευχθεί χρησιμοποιώντας δομές επιλογής. Ηπρώτη δομή επιλογής που θα εξετάσουμε, είναι η δομή IF. Η απλούστερη μορφή της δομής επιλογής IF είναι:

IF <Λογική Παράσταση> THEN <Εντολή>

όπου IF και THEN είναι δεσμευμένες λέξεις, η <Εντολή> μπορεί να είναι οποιαδήποτε απλή ή σύνθετη εντολή Pascal, και η <Λογική Παράσταση>μπορεί να είναι οποιαδήποτε απλή η σύνθετη λογική παράσταση που η τιμή της είναι TRUE ή FALSE.

Μέσα σ' ένα πρόγραμμα το πιο πιθανό είναι να υπάρχουν εντολές πριν και μετά τη δομή επιλογής IF. Αρα, λοιπόν, ο κώδικαςθα έχει την μορφή:

<Εντολή 1> IF <Λογική Παράσταση> THEN <Εντολή 2> <Εντολή 3>

Όπως φαίνεται και από το λογικό διάγραμμα ροής της εικόνας 3.1, εκτελούνται κατά σειρά πρώτα η <Εντολή 1> και κατόπιν ηδομή επιλογής IF. Aν η <Λογική Παράσταση> της δομής IF είναι TRUE τότε θα εκτελεστεί η εντολή <Εντολή 2> που βρίσκεταιμετά το THEN. Έπειτα, θα εκτελεστεί η <Εντολή 3> που βρίσκεται έξω από τη δομή επιλογής. Αν όμως η <Λογική Παράσταση>έχει την τιμή FALSE τότε η <Εντολή 2> παρακάμπτεται και εκτελείται η <Εντολή 3>. Ας δούμε ένα παράδειγμα.

Εικόνα 3.1: Διάγραμμα ροής για τη δομή IF

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 45: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.4.1 - Παραδείγματα Δομής IF

Παράδειγμα 1Να γραφεί ένα πρόγραμμα σε Pascal, το οποίο ζητάει από το χρήστη να μαντέψει έναν κρυφό αριθμό, ο οποίος έχει οριστεί μέσα στο πρόγραμμα. Αν ο αριθμός που δώσει ο χρήστης είναι όντως οκρυφός αριθμός, τότε έχει μαντέψει σωστά και θα πρέπει να εμφανιστεί ένα συγχαρητήριο μήνυμα. Αν μαντέψει λάθος, δεν εμφανίζεται τίποτα. Τέλος, ανεξάρτητα από τον αριθμό που δίνει οχρήστης, να εμφανίζεται ένα μήνυμα που να ενημερώνει για το τέλος του προγράμματος.

program IF_DEMO_1 (input,output); var number : integer;var guess : integer;

begin number := 8; writeln('Mantepste ton kryfo arithmo:'); readln(guess); if guess = number then writeln('Mantepsate sosta. Mpravo.'); writeln('Telos tou programmatos.');end.

Παράδειγμα 2Αν θέλαμε να εκτελέσουμε περισσότερες από μια εντολές όταν η λογική παράσταση της δομής IF είναι TRUE, τότε αυτές θα πρέπει να περικλείονται μεταξύ των λέξεων begin και end. Αν, λοιπόν, στοπαραπάνω πρόγραμμα θέλαμε να εκτυπώσουμε περισσότερα μηνύματα όταν ο χρήστης μαντεύει σωστά τότε αυτό θα γινόταν ως εξής:

program IF_DEMO_2 (input,output); var number : integer;var guess : integer;

begin number := 8; writeln('Mantepste ton kryfo arithmo:'); readln(guess); if guess = number then begin writeln('O kryfos arithmos itan ontos to ', number); writeln('Mantepsate sosta.'); writeln('Mpravo.'); end; writeln('Telos tou programmatos.');end.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 3 .1

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 46: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.5 - Επέκταση της Δομής Επιλογής IF: IF/THEN/ELSE

Στο προηγούμενο παράδειγμα, είδαμε, ότι αν ο χρήστης μαντέψει σωστά τον κρυφό αριθμό, τότε εκτυπώνεται στην οθόνη ένα συγχαρητήριο μήνυμα. Αν, όμως, μαντέψει λάθος, δεν εκτυπώνεταικάποιο μήνυμα που να τον ενημερώνει για τη λανθασμένη επιλογή του. Πολλές φορές, λοιπόν, είναι χρήσιμο να εκτελούνται διαφορετικές εντολές ανάλογα με την τιμή της λογικής παράστασης. Για τηνπερίπτωση αυτή, χρησιμοποιείται ο δεύτερος τύπος της δομής επιλογής IF ο οποίος έχει τη μορφή:

IF <Λογική Παράσταση> THEN <Εντολή 1> ELSE <Εντολή 2>

όπου ELSE είναι μια δεσμευμένη λέξη, και όπως και προηγουμένως, η <Εντολή 1> και η <Εντολή 2> μπορεί να είναι οποιαδήποτε απλή εντολή ήακολουθία εντολών που περικλείονται από begin και end.

Όπως παρατηρούμε στο λογικό διάγραμμα ροής της εικόνας 3.2, εκτελούνται κατά σειρά πρώτα η <Προηγούμενη Εντολή> και κατόπιν η δομή επιλογής IF. Aν η <Λογική Παράσταση> της δομής IFέχει τιμή TRUE τότε θα εκτελεστεί η εντολή <Εντολή 1> που βρίσκεται μετά το THEN, ενώ η <Εντολή 2> μετά το ELSE παραλείπεται. Αν, όμως, η <Λογική Παράσταση> έχει την τιμή FALSE, τότεεκτελείται η <Εντολή 2> και παραλείπεται η <Εντολή 1>. Φυσικά στο τέλος και στις δυο περιπτώσεις, θα εκτελεστεί η <Επόμενη Εντολή> που βρίσκεται έξω από τη δομή επιλογής.

Ας συνεχίσουμε λοιπόν, το παράδειγμά μας και ας προσθέσουμε κάποιο ενημερωτικό μήνυμα το οποίο θαεμφανίζεται στην οθόνη όταν ο χρήστης δε μαντεύει σωστά τον κρυφό αριθμό.

program IF_DEMO_3 (input,output); var number : integer;var guess : integer;

begin number := 8; writeln('Mantepste ton kryfo arithmo:'); readln(guess); if guess = number then begin writeln('O kryfos arithmos itan ontos to ', number); writeln('Mantepsate sosta.'); writeln('Mpravo.'); end else writeln('Distixos den mantepsate sosta.'); writeln('Telos tou programmatos.');end. Εικόνα 3.2: Διάγραμμα ροής για τη δομή IF/THEN/ELSE

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 3 .2

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 47: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.6 - Εμφωλευμένη Δομή IF

Στην προηγούμενη ενότητα είδαμε ότι η δομής επιλογής IF/THEN/ELSE έχει τη μορφή:

IF <Λογική Παράσταση> THEN <Εντολή 1> ELSE <Εντολή 2>

Η <Εντολή 1> και η <Εντολή 2> μπορεί να είναι μια απλή εντολή ή μια ακολουθία εντολών που περικλείονται από begin και end. Μπορεί όμως ναείναι σύνθετες εντολές που σημαίνει ότι η <Εντολή 1>, για παράδειγμα, να είναι κι αυτή μια άλλη δομή επιλογής IF/THEN/ELSE. Είναι πιθανόν,λοιπόν, να έχουμε περιπτώσεις σαν τις ακόλουθες:

IF <Λογική Παράσταση 1> THEN IF <Λογική Παράσταση 2> THEN <Εντολή 1> ELSE <Εντολή 2>

Παράδειγμα Εμφωλευμένου IF/THEN/ELSE 1.

IF <Λογική Παράσταση 1> THEN IF <Λογική Παράσταση 2> THEN <Εντολή 1> ELSE IF <Λογική Παράσταση 3> THEN <Εντολή 2> ELSE <Εντολή 3>

Παράδειγμα Εμφωλευμένου IF/THEN/ELSE 2.

IF <Λογική Παράσταση 1> THEN IF <Λογική Παράσταση 2> THEN <Εντολή 1> ELSE <Εντολή 2> ELSE IF <Λογική Παράσταση 3> THEN <Εντολή 3> ELSE <Εντολή 4>

Παράδειγμα Εμφωλευμένου IF/THEN/ELSE 3.

Μια δομή IF ή IF/THEN/ELSE η οποία βρίσκεται μέσα σε κάποια άλλη δομή IF, ονομάζεται εμφωλευμένο IF. Στις παραπάνω περιπτώσεις, είναι φανερό ότι ο τρόπος γραφής του προγράμματοςείναι σημαντικός. Επίσης, αν τυχόν υπάρχει σύγχυση με τις IF/THEN/ELSE εντολές, τότε ένας γενικός κανόνας είναι ότι κάθε ELSE αντιστοιχεί με το πιο πρόσφατο IF.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 48: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.6.1 - Παράδειγμα Εμφωλευμένης Δομής IF

Το πρόγραμμα IF_DEMO_3 που δημιουργήσαμε σε προηγούμενη ενότητα είναι αρκετά ολοκληρωμένο. Είδαμε πώς μπορούμε να εκτυπώσουμε στην οθόνη το κατάλληλο μήνυμα ανάλογα με το αν οχρήστης μάντεψε σωστά ή όχι τον κρυφό αριθμό. Υποθέστε, όμως, ότι θα θέλαμε να βοηθήσουμε το χρήστη όταν δεν μαντεύει σωστά και να τον ενημερώνουμε με κάποιο μήνυμα ότι ο κρυφόςαριθμός είναι μικρότερος ή μεγαλύτερος από αυτόν που εισήγαγε. Στην περίπτωση αυτή, τα πιθανά αποτελέσματα είναι τρία:

να μαντέψει ο χρήστης σωστά τον κρυφό αριθμόνα μαντέψει λάθος, δίνοντας κάποιον αριθμό μικρότερο του κρυφού αριθμούνα μαντέψει λάθος, δίνοντας κάποιον αριθμό μεγαλύτερο του κρυφού αριθμού

Θα πρέπει, λοιπόν, να τροποποιήσουμε το παράδειγμά μας ως εξής:

program IF_DEMO_4 (input,output); var number : integer;var guess : integer;

begin number := 8; writeln('Mantepste ton kryfo arithmo:'); readln(guess); if number <> guess then if (number < guess) then begin writeln('Distixos den mantepsate sosta.'); writeln('O arithmos pou psaxnoume einai mikroteros tou ', guess); end else begin writeln('Distixos den mantepsate sosta.'); writeln('O arithmos pou psaxnoume einai megalyteros tou ', guess); end else begin writeln('O kryfos arithmos itan ontos to ', number); writeln('Mantepsate sosta.'); writeln('Mpravo.'); endend.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 3 .3

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 49: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.7 - Δομή IF/THEN/ELSE και Πολλαπλές Επιλογές

Στην ενότητα 3.5, είδαμε πώς μπορούμε να έχουμε τον έλεγχο της ροής εκτέλεσης με τη δομή IF/THEN/ELSE και ανάλογα με το αν η συνθήκη που εξετάζονταν ήταν TRUE ή FALSE είχαμε δυοεναλλακτικές επιλογές (στο προηγούμενο παράδειγμα η μεταβλητή guess ή ήταν ίση με τον κρυφό αριθμό ή δεν ήταν). Τι θα γινόταν, όμως, αν η μεταβλητή που εξετάζονταν στη λογική συνθήκηέπρεπε να ελεγχθεί για περισσότερες από δύο τιμές; Θεωρείστε, για παράδειγμα, ότι θέλουμε να ελέγξουμε μια μεταβλητή για τις τιμές 1,2,3 και 4.

Όπως φαίνεται στο διπλανό περιθώριο, μια λύσηείναι να χρησιμοποιήσουμε μια ακολουθία απόδομές IF, στη βασική τους μορφή, και ναελέγξουμε την μεταβλητή και για τις τέσσεριςπιθανές τιμές. Η λύση αυτή όμως, δεν είναιαποτελεσματική, γιατί θα γίνει έλεγχος και στατέσσερα IFs ανεξάρτητα από την τιμή τηςμεταβλητής.

if (metavliti=1) then <Εντολή>

if (metavliti=2) then <Εντολή>

if (metavliti=3) then <Εντολή>

if (metavliti=4) then <Εντολή>

Όπως είδαμε στην ενότητα 3.6, μπορούμε επίσης ναχρησιμοποιήσουμε εμφωλευμένα IFs όπως φαίνεταιδεξιά. Ο έλεγχος γίνεται και πάλι σειριακά, αλλά μεαυτόν τον τρόπο, αν βρεθεί μια από τις λογικέςπαραστάσεις να είναι TRUE, παρακάμπτονται όλες οιμετέπειτα παραστάσεις (αν δηλαδή η μεταβλητή έχειτην τιμή 2, δε θα γίνει έλεγχος για τιμές 3 και 4).

if (metavliti=1) then <Εντολή>else if (metavliti=2) then <Εντολή> else if (metavliti=3) then <Εντολή> else if (metavliti=4) then <Εντολή>

Το πρόβλημα, όμως, που δημιουργείται με τη μορφή των εμφωλευμένων IFs (επάνω δεξιά), είναι ότι μπορεί το πρόγραμμα να γίνειδυσανάγνωστο και δυσνόητο. Γι' αυτό το λόγο, λοιπόν υπάρχει μια παραλλαγή της μορφής των εμφωλευμένων IF που επιτρέπει μιαακολουθία ελέγχων λογικών παραστάσεων ενώ παράλληλα διατηρεί τον κώδικά μας ευανάγνωστο.

Όπως βλέπουμε στο μπλε περιθώριο δεξιά, χρησιμοποιώντας IF..THEN..ELSE IF..THEN..ELSE μπορούμε να ελέγξουμε πολλαπλέςλογικές συνθήκες οι οποίες μεταξύ τους είναι αμοιβαία αποκλειστικές (mutually exclusive) δηλαδή, αν ισχύει έστω και μια τότε δενισχύει καμία άλλη. Η χρήση του τελευταίου ELSE είναι προαιρετική. Η συγκεκριμένη μορφή εμφωλευμένων IFs χρησιμοποιείται συχνάόταν θέλουμε να γίνει έλεγχος κριτηρίων που είναι ιεραρχικά δομημένα (όπως στο παράδειγμα παραπάνω) ή όταν θέλουμε ναελέγξουμε κατηγορίες τιμών (π.χ. αν η τιμή μιας μεταβλητής είναι μεταξύ 10 και 20 ή 20 και 30 ή 30 και 40).

IF <Λογική Παράσταση 1> THEN <Εντολή 1> ELSE IF <Λογική Παράσταση 2> THEN <Εντολή 2> ELSE IF <Λογική Παράσταση 3> THEN <Εντολή 3> ELSE IF <Λογική Παράσταση N> THEN <Εντολή N> ELSE <Εντολή 2>

ΠαράδειγμαΝα γράψετε ένα πρόγραμμα Pascal το οποίο ζηταέι από ένα φοιτητή-χρήστη να εισάγει τον βαθμό των εξετάσεων του σε κάποιο μάθημα κι εκτυπώνει ένα μήνυμα ανάλογα με τον βαθμό.

program Vathmologia (input,output); var vathmos : integer;

begin writeln('Eisagete ton vathmo ton eksetaseon (0 ews 10):'); readln(vathmos);

if (vathmos = 10) then writeln('Sygxaritiria. Phrate to megisto dynato vathmo.') else if (vathmos = 8) or (vathmos = 9) then writeln('Aristefsate stis eksetaseis.') else if (vathmos = 7) then writeln('Phgate poly kala stis eksetaseis.') else if (vathmos = 6) then writeln('Phgate arketa kala stis eksetaseis.') else if (vathmos = 5) then writeln('Kataferate kai perasate tis eksetaseis.') else if (vathmos >= 0) and (vathmos <= 4) then writeln('Dystixws den kataferate na perasate tis eksetaseis.') else writeln('O arithmos pou dwsate den antistoixei se vathmologia.');end.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 3 .4

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 50: All Chapters

Κεφάλαιο 3

ΔΟΜΕΣ ΕΠΙΛΟΓΗΣ

3.8 - Η Δομή Επιλογής CASE

Είδαμε σε προηγούμενες ενότητες τη δομή επιλογής IF. Η Pascal έχει μια ακόμη δομή επιλογής, η οποία ονομάζεται CASE. Με τη δομή επιλογής CASE έχουμε τη δυνατότητα να επιλέξουμε γιαεκτέλεση μόνο μια εντολή μέσα από ένα σύνολο εντολών, κάνοντας έτσι τη λογική των επιλογών και κατά συνέπεια του προγράμματός μας, πιο ευανάγνωστη. Η γενική μορφή της δομής CASE είναι:

CASE επιλογέας OF <Λίστα Τιμών 1> : <Εντολή 1> <Λίστα Τιμών 2> : <Εντολή 2> . . . . <Λίστα Τιμών N> : <Εντολή N> OTHERWISE <Εντολή X> END;

όπου CASE, OF, και OTHERWISE είναι δεσμευμένες λέξεις. Ο επιλογέας μετά τη λέξη CASE μπορεί να είναι μια οποιουδήποτε τύπουμεταβλητή εκτός από real, δηλαδή integer, boolean και char. Η <Λίστα Τιμών 1> αποτελεί μια πιθανή τιμή του επιλογέα ή περισσότερεςξεχωριστές τιμές που χωρίζονται με κόμματα (π.χ. 5, 10, 20) ή και και μια ακολουθία συνεχόμενων τιμών που χωρίζονται με δυο τελείες (π.χ.3..10). Τέλος, η <Εντολή Α> (όπου Α είναι 1, 2, .., Ν) είναι μια απλή ή σύνθετη εντολή.

Το αποτέλεσμα της εκτέλεσης της εντολής CASE, είναι το ακόλουθο. Υπολογίζεται η τιμή του επιλογέα με κάθε μια λίστα τιμών. Αν η τιμή του επιλογέα είναι στη <Λίστα Τιμών i> τότε εκτελείται η<Εντολή i> κι ο έλεγχος του προγράμματος μεταφέρεται στην πρώτη εντολή μετά το END της δομής CASE. Στην περίπτωση όπου η τιμή του επιλογέα δε βρίσκεται σε καμία λίστα, τότε μετά τη λέξηOTHERWISE μπορούμε να έχουμε μια απλή η σύνθετη εντολή <Εντολή X> η οποία θέλουμε να εκτελείται. Η χρήση του OTHERWISE είναι προαιρετική.

ΠαράδειγμαΑς υποθέσουμε ότι οι ημέρες της εβδομάδας Δευτέρα έως Κυριακή αντιστοιχούν στους αριθμούς 1 έως 7. Γράψτε ένα πρόγραμμα που να διαβάζει έναν ακέραιο αριθμό και να τυπώνει το όνομα τηςαντίστοιχης μέρας, αν υπάρχει.

program WEEKDAYS_CASE_DEMO (input,output); var number : integer;

begin writeln('Doste enan arithmo apo 1 eos 7:'); readln(number);

case number of 1 : writeln('To 1 einai h Deftera.'); 2 : writeln('To 2 einai h Triti.'); 3 : writeln('To 3 einai h Tetarti.'); 4 : writeln('To 4 einai h Pempti.'); 5 : writeln('To 5 einai h Paraskevi.'); 6 : writeln('To 6 einai to Savvato.'); 7 : writeln('To 7 einai h Kyriakh.'); otherwise writeln('Patisate lathos arithmo.'); end;end.

Κωδικοποίηση του παραδείγματος χρησιμοποιώντας δομή CASE.

Βλέπουμε, λοιπόν, ότι το πρόγραμμα είναι πολύ πιο ευανάγνωστο χρησιμοποιώντας τη δομή CASE. Η χρήση της όμως,χρειάζεται προσοχή γιατί μπορεί να έχουμε τα εντελώς αντίθετα αποτελέσματα (δηλαδή να γίνει ένα πρόγραμμαδυσανάγνωστο και δυσνόητο) αν οι εντολές που εκτελούνται για κάθε λίστα τιμών είναι πολυσύνθετες.

program WEEKDAYS_IF_DEMO (input,output); var number : integer;

begin writeln('Doste enan arithmo apo 1 eos 7:'); readln(number);

if number = 1 then writeln('To 1 einai h Deftera.') else if number = 2 then writeln('To 2 einai h Triti.') else if number = 3 then writeln('To 3 einai h Tetarti.') else if number = 4 then writeln('To 4 einai h Pempti.') else if number = 5 then writeln('To 5 einai h Paraskevi.') else if number = 6 then writeln('To 6 einai to Savvato.') else if number = 7 then writeln('To 7 einai h Kyriakh.') else writeln('Patisate lathos arithmo.')end.

Κωδικοποίηση του παραδείγματος χρησιμοποιώντας δομή IF.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 3 .5

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 3 Επόμενη Ενότητα

Page 51: All Chapters
Page 52: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟΙ ΤΟΥ ΚΕΦΑΛΑ ΙΟΥ

4.1 - Εισαγωγή

4.2 - Επαναληπτικές Δομές - Βρόχοι

4.3 - Η Επαναληπτική Δομή FOR

4.3.1 - Εναλλακτικές Συντάξεις της Δομής FOR4.3.2 - Εμφωλευμένες Επαναληπτικές Δομές FOR

4.4 - Η Επαναληπτική Δομή WHILE

4.4.1 - Παραδείγματα Επαναληπτικής Δομής WHILE4.4.2 - Σημεία Προσοχής στη Δομή WHILE

4.5 - Η Επαναληπτική Δομή REPEAT

4.5.1 - Αναγκαιότητα της Δομής REPEAT4.5.2 - Παραδείγματα Επαναληπτικής Δομής REPEAT

4.6 - Ανακεφαλαίωση των Δομών Επανάληψης

4.7 - Ενοποίηση Δομών Επιλογής και Δομών Επανάληψης

4.8 - Τεστ Αυτοαξιολόγησης Κεφαλαίου

Προηγούμενο Κεφάλαιο Κεντρική Σελίδα Επόμενη Ενότητα

Page 53: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.1 - Εισαγωγή

Στο προηγούμενο κεφάλαιο, εξετάσαμε τις δομές επιλογής οι οποίες επιτρέπουν τον έλεγχο κάποιων συνθηκών κι ανάλογα με το αποτέλεσμα του ελέγχου, επιτρέπουν την επιλογή των εντολών πουθα εκτελεστούν. Είχαμε αναφέρει στην εισαγωγή του κεφαλαίου 3 ότι οι δομές επιλογής είναι το πρώτο μέρος των δομών ελέγχου που είναι ένα σύνολο μηχανισμών που δίνουν τη δυνατότητα στονπρογραμματιστή να ελέγχει και να επιλέγει τη ροή της εκτέλεσης των εντολών ενός προγράμματος. Το δεύτερο μέρος, λοιπόν, των δομών ελέγχου είναι οι δομές επανάληψης που είναι και το θέμαπου θα εξετάσουμε στο κεφάλαιο αυτό.

Εισαγωγικό ΠρόβλημαΟι δομές επανάληψης, δημιουργήθηκαν λόγω της ανάγκης της επανάληψης υπολογισμών και κατά συνέπεια της επαναληπτικής εκτέλεσης ορισμένων κομματιών ενόςπρογράμματος. Ως ένα απλό παράδειγμα που δημιουργεί την ανάγκη για επαναληπτική εκτέλεση εντολών θεωρείστε ότι θέλουμε να εμφανίσουμε στην οθόνη τη διάταξητης εικόνας 5.1 δηλαδή να εκτυπώσουμε τρεις γραμμές που η κάθε μια αποτελείται από έξι αστεράκια.

****** ****** ******

Εικόνα 5.1

Όπως ξέρουμε, η εντολή της Pascal που τυπώνει στην οθόνη και μετά αλλάζει γραμμή είναι η WRITELN. Συνεπώς, το πρόγραμμα για τηλύση του παραπάνω προβλήματος θα έχει τη μορφή που βλέπουμε δεξιά στο πρόγραμμα . Aν, όμως, θέλαμε νατροποποιήσουμε το παραπάνω πρόγραμμα ώστε να τυπώνει 40 γραμμές από έξι αστεράκια, τότε το καινούργιο πρόγραμμά μας( ) θα είχε την εξής μορφή. Παρατηρούμε λοιπόν, ότι το πρόγραμμα είναι πολύ μεγάλο σε έκταση καιουσιαστικά αποτελείται από μια εντολή που επαναλαμβάνεται 40 φορές. Φανταστείτε δε, τη μορφή που θα έχει το πρόγραμμα αν πρέπεινα τυπωθούν 1000 γραμμές ή και περισσότερες.

program Asterakia1 (output); begin writeln('******'); writeln('******'); writeln('******'); writeln('******');end.

Θα ήταν, λοιπόν, πολύ πιο βολικό αν υπήρχε κάποιος τρόπος να προγραμματίσουμε κάποια δομή της μορφής:

Για φορέςεκτέλεσε την εντολή

Η Pascal υποστηρίζει μια τέτοια λειτουργία με τρεις διαφορετικές επαναληπτικές δομές οι οποίες παρουσιάζονται στην επόμενη ενότητα.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 54: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.2 - Επαναληπτικές Δομές - Βρόχοι

Μια επαναληπτική δομή ή αλλιώς βρόχος (loop) επιτρέπει την επαναλαμβανόμενη εκτέλεση μιας ή και περισσοτέρων εντολών. Σε μια επαναληπτικήδομή, ο αριθμός των διαδοχικών εκτελέσεων καθορίζεται από κάποιο κριτήριο το οποίο μπορεί να είναι κάποιος μετρητής ή κάποια λογική συνθήκη. Ηεικόνα 5.2 δεξιά παρουσιάζει μια γενική μορφή μιας επαναληπτικής δομής. Συγκεκριμένες εντολές, ανάλογα με το είδος του βρόχου πουχρησιμοποιούμε, υποδηλώνουν την αρχή και το τέλος μιας επαναληπτικής δομής. Το σύνολο των εντολών το οποίο περικλείεται από τις εντολέςεκκίνησης και τερματισμού του βρόχου, ονομάζεται σώμα του βρόχου και όπως προαναφέραμε μπορεί να αποτελείται από μια ή και περισσότερεςεντολές.

Εντολή εκκίνησης βρόχου Εντολή 1 Εντολή 2 .... Εντολή x Εντολή τερματισμού βρόχου

Εικόνα 5.2

Η Pascal υποστηρίζει τρία είδη επαναληπτικών δομών (βρόχων) οι οποίες καλύπτουν διαφορετικούς τρόπους ανάλυσης και επίλυσης ενός προβλήματος και χρησιμοποιούνται ανάλογα με τιςκατάλληλες συνθήκες. Οι τρεις, λοιπόν, επαναληπτικές δομές της Pascal είναι:

Η δομή FOR, στην οποία ο αριθμός των εκτελέσεων του σώματος του βρόχου είναι καθορισμένος εξ' αρχής1.

Η δομή WHILE, στην οποία η εκτέλεση του σώματος του βρόχου επαναλαμβάνεται εφόσον είναι αληθής μια συγκεκριμένη λογική παράσταση (συνθήκη)2.

Η δομή REPEAT, στην οποία η εκτέλεση του σώματος του βρόχου επαναλαμβάνεται μέχρις ότου γίνει αληθής μια συγκεκριμένη λογική παράσταση (συνθήκη)3.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 55: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.3 - Η Επαναληπτική Δομή FOR

Η επαναληπτική δομή FOR χρησιμοποιείται κυρίως όταν γνωρίζουμε ακριβώς πόσες φορές πρέπει να επαναληφθεί μια εντολή ή ένα κομμάτι προγράμματος. Η βασική σύνταξη της δομής FOR είναι:

For <ΜΕΤ>:= <ΑΤ> TO <ΤΤ> DO <εντολή>;

Εικόνα 5.3: Διάγραμμα Ροής της FOR

όπου:οι λέξεις , , και είναι δεσμευμένες λέξειςΜΕΤ αντιπροσωπεύει το όνομα μιας μεταβλητής και παίζει το ρόλο του μετρητήΑΤ είναι συνήθως ένας ακέραιος αριθμός και δηλώνει την αρχική τιμή του μετρητήΤΤ είναι συνήθως ένας ακέραιος αριθμός και δηλώνει την τελική τιμή του μετρητήεντολή είναι μια απλή εντολή ή μια ομάδα εντολών (σύνθετη εντολή) οι οποίες επαναλαμβάνονται τόσες φορές, όσα βήματα χρειάζονται για

να φτάσει ο μετρητής από την αρχική στην τελική τιμή αυξανόμενος κάθε φορά κατά ένα (βήμα=1).

Στην εικόνα 5.3 δεξιά βλέπουμε το διάγραμμα ροής της επαναληπτικής δομής FOR.

Παράδειγμα Program Asterakia3 (Input,Output);var i : integer;

beginfor i:=1 TO 40 Do Writeln(' ****** ');end.

Είχαμε αναφέρει, ότι το πρόγραμμα Asterakia2 που χρησιμοποιήσαμε στην εισαγωγή του κεφαλαίου και το οποίο τυπώνει στηνοθόνη έξι αστεράκια σε σαράντα γραμμές, είναι πολύ μεγάλο σε έκταση. Μπορούμε να επιτύχουμε το ίδιο αποτέλεσμα ένα βρόχοFOR όπως φαίνεται στο παρακάτω δεξιά.

Ας δούμε τί γίνεται εσωτερικά κατά την εκτέλεση της επαναληπτικής δομής. Ο μετρητής (μεταβλητή ), παίρνει κατ' αρχήν τηναρχική τιμή 1. Η τιμή αυτή συγκρίνεται με την τελική τιμή, δηλαδή το 40.Αφού είναι μικρότερη, εκτελείται η εντολή που περιέχεται στο σώμα του βρόχου, που έχει σαν αποτέλεσμα την τύπωση των έξι αστεριών και τη μετακίνηση του δρομέα στην επόμενη γραμμή. Στησυνέχεια, η τιμή του μετρητή (μεταβλητή ) αυξάνεται κατά ένα, δηλ. γίνεται 2 και συγκρίνεται με την τελική τιμή (40). Αφού είναι μικρότερη, εκτελείται πάλι η εντολή, η οποία τυπώνει τα έξι αστεράκιαγι' άλλη μια φορά και τη μετακίνηση του δρομέα στην επόμενη γραμμή. Αυτό επαναλαμβάνεται, μέχρις ότου ο μετρητής πάρει την τιμή 41 (που σημαίνει ότι ήδη έχουν τυπωθεί έξι αστεράκια 40φορές σε 40 διαφορετικές γραμμές). Τότε, αφού η τιμή του μετρητή είναι μεγαλύτερη από την τελική τιμή, σταματά η επανάληψη της εκτέλεσης της εντολής και ο έλεγχος του προγράμματοςμεταφέρεται μετά την επαναληπτική δομή.

Φυσικά, μέσα στο σώμα ενός βρόχου FOR μπορούμε να έχουμε περισσότερες από μια εντολές οι οποίες θα επαναλαμβάνονται, χρησιμοποιώντας μιασύνθετη εντολή. Στον κώδικα δεξιά, για παράδειγμα, το σώμα του βρόχου αποτελείται από δυο εντολές οι οποίες επαναλαμβάνονται και φυσικά πρέπει ναπερικλείονται από τις λέξεις και .

for i:=1 to 10 dobegin j:= i+5; writeln(j);end;

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .1

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 56: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.3.1 - Εναλλακτικές Συντάξεις της Δομής FOR

Αρχικές και Τελικές ΤιμέςΣτο πρόγραμμα Asterakia3, που είδαμε στην προηγούμενη ενότητα, χρησιμοποιήσαμε μια επαναληπτική δομή για να τυπώσουμε στην οθόνη σαράντα γραμμές από έξι αστεράκια. Ο μετρητήςτης συγκεκριμένη δομής ξεκινούσε από το 1 και έφτανε μέχρι το 40 αυξάνοντας πάντα κάθε φορά κατά 1.

Η αρχική τιμή του μετρητή μιας δομής δεν είναι απαραίτητο να είναι το 1, αλλά μπορεί να είναι οποιαδήποτε τιμή. Στοπαράδειγμα δεξιά βλέπουμε ότι ο μετρητής ξεκινάει από τον αριθμό 3 και φτάνει μέχρι το 9 για 6 συνολικά επαναλήψεις.

for i:=3 to 9 do writeln('O metritis exei timi:', i);

Επίσης, δεν είναι απαραίτητο η αρχική και η τελική τιμή του μετρητή να είναι σταθεροί αριθμοί, αλλά μπορούν να είναι και μεταβλητές.Στο παράδειγμα δεξιά βλέπουμε ότι και η αρχική αλλά και η τελική τιμή του μετρητή είναι μεταβλητές ( και αντίστοιχα). Θα πρέπειόμως να προσέχουμε ότι οι μεταβλητές αυτές να έχουν αρχικοποιηθεί δηλαδή τους έχει οριστεί κάποια τιμή.

j := 3;k := 9;for i:=j to k do writeln('H timi tou i einai', i);

Εναλλακτική ΣύνταξηΜέχρι στιγμής είδαμε, ότι ο μετρητής σε ένα βρόχο ξεκινάει από κάποια αρχική τιμή και αυξάνεται κατά 1 έως ότου φτάσει κάποια τελική τιμή. Τι γίνεται, όμως, στην περίπτωση που θέλουμε, γιακάποιο λόγο, ο μετρητής να μειώνεται αντί να αυξάνεται κατά 1; Η Pascal διαθέτει μια τέτοια δυνατότητα στην επαναληπτική δομή , της οποίας μια εναλλακτική σύνταξη είναι η εξής:

For <ΜΕΤ>:= <ΑΤ> DOWNTO <ΤΤ> DO <εντολή>;

Στο παράδειγμα δεξιά, ο μετρητής παίρνει αρχικά την τιμή 10 και επειδή 10>1 εκτελείται η εντολή. Στη συνέχεια, μειώνεται κατά 1 σεκάθε επανάληψη και η τιμή του συγκρίνεται με την τελική τιμή. Αν η τιμή του είναι μεγαλύτερη από ή ίση με την τελική, τότε εκτελείται ηεντολή, αλλιώς η επανάληψη τερματίζεται.

for i:=10 downto 1 do writeln('H timi tou i einai ', i );

Βήμα EπανάληψηςΕίδαμε ότι ο μετρητής σε μια επαναληπτική δομή αυξάνεται ή μειώνεται κατά 1. Αν, όμως, θέλουμε ο μετρητής ν'αυξάνεται ή να μειώνεται κατά βήμα μεγαλύτερο από 1; Η Pascal δε διαθέτει άμεσα τέτοια δυνατότητα με τη δομή .Αυτό μπορεί να γίνει επιλέγοντας κατάλληλα τις τιμές του μετρητή μέσα στο σώμα της επαναληπτικής δομής, καιενδεχομένως την αρχική και τελική τιμή του. Αν θέλουμε, για παράδειγμα, να χρησιμοποιήσουμε τις τιμές 2, 4 και 6 ενόςμετρητή που έχει αρχική τιμή 1 και τελική τιμή 7 να γράψουμε τον κώδικα που βλέπουμε δεξιά.Με τη χρήση του και του τελεστή , επιλέγονται μόνο όσες τιμές είναι πολλαπλάσια του 2. Δεξιά, βλέπουμε τοαποτέλεσμα της εκτέλεσης του παραπάνω κώδικα.

for i:=1 to 7 do if (i MOD 2) = 0 then writeln('H timi tou metriti i einai', i);

H timi tou metriti i einai 2 H timi tou metriti i einai 4 H timi tou metriti i einai 6

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

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .2

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 57: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.3.2 - Εμφωλευμένες Επαναληπτικές Δομές FOR

Στις ενότητες 3.6 και 3.6.1 του κεφαλαίου 3, είχαμε δει ότι μια δομή επιλογής μπορεί να είναι εμφωλευμένη μέσα σε μια άλλη δομή . To ίδιο ακριβώς μπορεί να συμβεί και με τις επαναληπτικέςδομές. Έτσι λοιπόν, πολλές φορές μπορεί να απαιτείται να χρησιμοποιήσουμε εμφωλευμένη επαναληπτική δομή , δηλαδή μια δομή μέσα σε μια άλλη δομή .

Παράδειγμα 1Το παρακάτω πρόγραμμα, υπολογίζει και τυπώνει στην οθόνη, τον πίνακα της προπαίδειας, χρησιμοποιώντας δυο δομές εκ των οποίων η μια είναι εμφωλευμένη. Το αποτέλεσμα τουπρογράμματος φαίνεται σε αυτή την εικόνα.

program Prodaideia (input,output); var i, j : integer;

begin for i:=1 to 9 do begin for j:=1 to 9 do write(j*i:4); writeln; end;end.

Παράδειγμα 2Να γράψετε ένα πρόγραμμα Pascal που να τυπώνει στην οθόνη 20 γραμμές από τόσα αστεράκια όσα ζητά ο χρήστης.

program Asterakia4(input, output); var i, j, asteria: integer;

begin write('Dwste ton arithmo twn asteriwn: '); readln(asteria); for i:=1 to 20 do begin for j:=1 to asteria do write('*'); writeln; end;end.

Εμφωλευμένοι βρόχοι, μπορούν να δημιουργηθούν σε οποιοδήποτε βάθος. Ένας βρόχος δηλαδή, μπορεί να είναι μέσα σε ένα βρόχο, οποίος είναι μέσα σε ένα βρόχο κτλ. Επίσης, όπως θα δούμεκαι σε μετέπειτα ενότητες, οποιοσδήποτε από τους τρεις τύπους βρόχων ( , , ) μπορεί να τοποθετηθεί μέσα σε οποιοδήποτε βρόχο. Εντούτοις, πρέπει να είμαστε προσεκτικοί διότιη χρήση πολλαπλών εμφωλευμένων βρόχων μπορούν να κάνουν το πρόγραμμά μας πάρα πολύ σύνθετο και δύσκολο στην κατανόηση.

Ο σύνθετος κώδικας δεξιά, παρουσιάζει τρεις βρόχους από του οποίους οι δυο είναι εμφωλευμένοι. Εκτός του ότι δεν είναι εύκολο νακατανοήσουμε σχετικά γρήγορα τί ακριβώς κάνει ο κώδικας, αναδεικνύεται και κάποιο άλλο σοβαρό πρόβλημα που μπορούν να δημιουργήσουν οιεμφωλευμένες επαναληπτικές δομές: μεγάλο αριθμό των επαναλήψεων που επηρεάζει την υπολογιστική ισχύ που ξοδεύει το πρόγραμμά μας.

Η εντολή εκτελείται 10 φορές λόγω του , για κάθε μια από τις 100 επαναλήψεις του , και για κάθε μια από τις 1000επαναλήψεις του . Συνολικά, η εντολή θα εκτελεστεί 1000*100*10 δηλαδή ένα εκατομμύριο φορές. Αν οι μεταβλητές/μετρητές

, και είχαν και οι τρεις τελικές τιμές 1000, τότε η εντολή θα εκτελούνταν ένα δισεκατομμύριο φορές. Κατά συνέπεια, ηχρήση πολλαπλών εμφωλευμένων απαιτεί ιδιαίτερη προσοχή.

for i:=1 to 1000 dobegin for j:=1 to 100 do begin for k:=1 to 10 do writeln(i, j, k); end;end;

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .3

Page 58: All Chapters

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 59: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.4 - Η Επαναληπτική Δομή WHILE

Η δεύτερη επαναληπτική δομή της Pascal, είναι η δομή . Ο συγκεκριμένος τύπος βρόχου δε χρησιμοποιεί κάποιο μετρητή για τον καθορισμό των επαναλήψεων άλλα μια λογική παράσταση(συνθήκη). Η βασική σύνταξη της δομής είναι:

WHILE <Λογική Παράσταση> DO <εντολή>;

όπου:οι λέξεις και είναι δεσμευμένες λέξειςΛογική Παράσταση είναι μια απλή ή σύνθετη λογική παράσταση της οποίας η τιμή είναι ή εντολή είναι μια απλή εντολή ή μια σύνθετη εντολή (δηλ. μια ομάδα εντολών) που περικλείεται από και , και αποτελεί το σώμα του βρόχου

Όπως φαίνεται και στο λογικό διάγραμμα της εικόνας 5.4, αν η τιμή της λογικής παράστασης είναι αληθής ( ), τότε εκτελείται η εντολή ή οιεντολές που βρίσκονται στο σώμα του βρόχου. Μετά την εκτέλεση των εντολών του σώματος του βρόχου η τιμή της λογικής παράστασης ελέγχεταικαι πάλι. Η διαδικασία έλεγχος λογικής παράστασης εκτέλεση εντολών σώματος βρόχου επαναλαμβάνεται όσο η τιμή της λογικήςπαράστασης είναι αληθής. Οι επαναλήψεις του βρόχου τερματίζονται μόνο αν η τιμή της λογικής παράστασης βρεθεί να είναι ψευδής( ).

Είχαμε δει ότι το εισαγωγικό πρόγραμμα Asterakia2 το οποίο τυπώνει στην οθόνη 6 αστεράκια σε 40 γραμμές, είναι πολύ μεγάλο σε έκταση. Στηνενότητα 4.3, και συγκεκριμένα με το πρόγραμμα Asterakia3, είδαμε πώς μπορούμε να βελτιστοποιήσουμε τον κώδικα χρησιμοποιώντας ένα βρόχο

. Θα μπορούσαμε επίσης να είχαμε λύσει το πρόβλημα του προγράμματος χρησιμοποιώντας βρόχο όπως φαίνεται στοπρόγραμμα παρακάτω:

Εικόνα 5.4: Διάγραμμα Ροής της WHILE

program Asterakia5 (input,output); var i : integer;

begin i := 40; while (i>0) do begin writeln('******'); i := i - 1; end; writeln('Telos');end.

Παρατηρούμε, λοιπόν, στο πρόγραμμα ότι αρχικά αρχικοποιούμε την μεταβλητή δίνοντας την τιμή 40. Μπαίνονταςλοιπόν στην επαναληπτική δομή γίνεται πρώτα ο έλεγχος της λογικής παράστασης η οποία είναι , και άραεκτελούνται οι εντολές που βρίσκονται μέσα στο σώμα του βρόχου. Πιο συγκεκριμένα πρώτα εκτελείται η εντολή

η οποία τυπώνει 6 αστεράκια σε μια γραμμή, και στην συνέχεια η εντολή η οποία μειώνει κατά ένα τηντιμή της μεταβλητής που στην ουσία έχει και πάλι το ρόλο του μετρητή. Στην συνέχεια, η ροή του προγράμματος μεταφέρεται καιπάλι στην εντολή και στον επανέλεγχο της λογικής παράστασης . Η διαδικασία αυτή συνεχίζεται έως ότου η τιμή τηςμεταβλητής γίνει μηδέν, οπότε στον επόμενο έλεγχο της λογικής παράστασης το αποτέλεσμα θα είναι . Εκεί θατερματιστεί η επαναληπτική δομή και η ροή του προγράμματος θα μεταφερθεί στην εντολή .

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 60: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.4.1 - Παραδείγματα Επαναληπτικής Δομής WHILE

Αν εξετάσουμε πιο προσεκτικά τα προγράμματα Asterakia3 και Asterakia5, θα δούμε ότι το πρόγραμμα που χρησιμοποιεί την επαναληπτική δομή είναι πιο μικρό, πιοευανάγνωστο και πιο εύκολο στην κατανόηση από ότι το πρόγραμμα το οποίο χρησιμοποιεί την επαναληπτική δομή . Αυτό συμβαίνει γιατί η επαναληπτική δομή χρησιμοποιείται όταν ο αριθμός των επαναλήψεων του βρόχου είναι γνωστός εκ των προτέρων, ενώ η χρήση της επαναληπτικής δομής συνιστάται όταν δεν είναι γνωστός ο αριθμός τωνεπαναλήψεων.

Παράδειγμα 1Το παρακάτω πρόγραμμα, παρουσιάζει τη χρήση του βρόχου όταν ο αριθμός των επαναλήψεων δεν είναι γνωστός. Πιο συγκεκριμένα, το πρόγραμμα ζητάει από το χρήστη να εισάγει ένανχαρακτήρα, τον οποίο στη συνέχεια εμφανίζει στην οθόνη. Κατόπιν, το πρόγραμμα ρωτάει αν ο χρήστης θέλει να επαναλάβει τη διαδικασία αυτή. Όσο ο χρήστης στην ερώτηση αυτή εισάγει τοναριθμό 1, η διαδικασία επαναλαμβάνεται, ενώ αν ο χρήστης δώσει κάποιον άλλο αριθμό, τότε η διαδικασία τερματίζεται.

program Grammata (input,output); var num : integer;var letter : char;

begin num := 1; while (num = 1) do begin write('Grapste ena xarakthra: '); readln(letter); writeln('Grapsate to gramma: ', letter); writeln('Synexeia: 1 - Telos: allon arithmo'); readln(num); end; writeln('Telos tou programmatos.');end.

Βλέπουμε, λοιπόν, ότι στο παραπάνω πρόγραμμα , ο αριθμός των επαναλήψεων δεν είναι προκαθορισμένος και γνωστός εκ των προτέρων αλλά εξαρτάται από την εισαγωγή δεδομένωντου χρήστη (στη συγκεκριμένη περίπτωση αν θα δώσει ο χρήστης την τιμή 1 στην μεταβλητή ). Είχαμε, επίσης, αναφέρει στο τέλος της ενότητας 4.3.1, ότι όταν το βήμα επανάληψης του βρόχουχρειάζεται να είναι μεγαλύτερο από το 1, τότε δεν συνιστάται η χρήση της επαναληπτικής δομής , αλλά ένας βρόχος ή όπως θα δούμε αργότερα, ένας βρόχος .

Παράδειγμα 2Το παρακάτω πρόγραμμα, τυπώνει όλους του ζυγούς αριθμούς από το 0 μέχρι και το 50 χρησιμοποιώντας ως βήμα επανάληψης το 2.

program Zygoi (input,output); var i : integer;

begin i := 0; while (i<=50) do begin writeln(i); i := i + 2; end;end.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .4

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 61: All Chapters
Page 62: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.4.2 - Σημεία Προσοχής στη Δομή WHILE

Στην επαναληπτική δομή , υπάρχουν δυο σημεία στα οποία αν δε δοθεί ιδιαίτερη προσοχή, μπορεί να υπάρξουν απρόβλεπτα αποτελέσματα στο πρόγραμμά μας.

Σημείο Προσοχής 1Το πρώτο σημείο στο οποίο πρέπει να δώσουμε προσοχή είναι ότι αν μέσα στο σώμα του βρόχου δεν υπάρχει κάποιος τρόπος ο οποίος θα μεταβάλλει την τιμή της συνθήκης από αληθή σεψευδή, τότε οι εντολές του σώματος του βρόχου θα εκτελούνται επ' άπειρον.

Στο παράδειγμα δεξιά βλέπουμε ότι η μεταβλητή έχει τιμή 10 και η λογική παράσταση του βρόχου ελέγχει αν το είναι μικρότερο του 20. Αυτόσημαίνει ότι η τιμή της λογικής παράστασης είναι και άρα θα εκτελεστούν οι εντολές και . Όταν όμωςθα ξαναγίνει ο έλεγχος της παράστασης θα βρεθεί και πάλι και θα επανεκτελεστούν οι εντολές του σώματος του βρόχου. Αυτό το μοτίβο θαγίνεται συνέχεια γιατί μέσα στο σώμα του βρόχου δεν υπάρχει κάποια εντολή η οποία θα αλλάζει την τιμή του σε έναν ακέραιο αριθμό μεγαλύτερο του 20έτσι ώστε η λογική παράσταση να γίνει και να "βγούμε" από τον βρόχο.

k := 10;while (k < 20) dobegin write(k, ' '); writeln('*****');end;writeln('Pascal');

Σημείο Προσοχής 2Το δεύτερο σημείο το οποίο πρέπει να προσέχουμε, είναι ότι αν κατά τη στιγμή της εισόδου στο βρόχο , η τιμή της λογικής παράστασης είναι ,τότε δε θα εκτελεστούν ποτέ οι εντολές που βρίσκονται μέσα στο σώμα του βρόχου. Κάτι τέτοιο είναι πολύ πιθανό να συμβεί όταν η λογική παράσταση τουβρόχου είναι σύνθετη.

Στο απλό παράδειγμα δεξιά, παρατηρούμε ότι η μεταβλητή έχει τιμή 10 και η λογική παράσταση του βρόχου ελέγχει αν το είναι μικρότερο του 8.Αρα, η λογική συνθήκη δεν ισχύει, αφού η τιμή της είναι , με αποτέλεσμα η ροή του προγράμματος θα μεταφερθεί μετά το τέλος του βρόχου

και συγκεκριμένα στην εντολή .

k := 10;while (k < 8) dobegin writeln(k, ' **'); k := k+1;end;writeln('Pascal');

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .5

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 63: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.5 - Η Επαναληπτική Δομή REPEAT

Η τρίτη και τελευταία επαναληπτική δομή της Pascal είναι η δομή . Όπως και η επαναληπτική δομή , έτσι και o συγκεκριμένος τύπος βρόχου δε χρησιμοποιεί κάποιο μετρητή για τονκαθορισμό των επαναλήψεων άλλα μια λογική παράσταση. Η σύνταξη της επαναληπτικής δομής είναι:

REPEAT <Εντολή>; UNTIL <Λογική Παράσταση>;

όπου:οι λέξεις και είναι δεσμευμένες λέξειςΛογική Παράσταση είναι μια απλή ή σύνθετη λογική παράσταση της οποίας η τιμή είναι ή Εντολή είναι μια απλή εντολή ή μια σύνθετη εντολή (δηλ. μια ομάδα εντολών) και αποτελεί το σώμα του βρόχου. Να σημειώσουμε

ότι αν υπάρχει ομάδα εντολών μέσα στο σώμα του βρόχου δεν χρησιμοποιούμε και

Στο λογικό διάγραμμα της εικόνας 5.5 βλέπουμε ότι στη δομή έχουμε επαναλαμβανόμενη εκτέλεση του σώματος του βρόχου, οοποίος μπορεί να αποτελείται από μια ή περισσότερες εντολές, εφόσον δεν ισχύει (είναι ψευδής) μια λογική παράσταση. Η λογικήπαράσταση αυτή ονομάζεται και συνθήκη τερματισμού του βρόχου γιατί μόλις πάρει την τιμή έχουμε έξοδο από τον βρόχο.Παρατηρούμε επίσης ότι η εντολή ή οι εντολές που βρίσκονται στο σώμα του βρόχου θα εκτελεστούν τουλάχιστον μια φορά μέχρις ότουυπολογισθεί η τιμή της λογικής παράστασης. Θα πρέπει επίσης να αναφέρουμε ότι αν στο σώμα του βρόχου υπάρχουν παραπάνω απόμια εντολές αυτές δε χρειάζεται να περικλείονται από και .

Εικόνα 5.5: Διάγραμμα Ροής της REPEAT

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 64: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.5.1 - Αναγκαιότητα της Δομής REPEAT

Ας υποθέσουμε ότι ένα πρόγραμμα χρειάζεται να δέχεται συνεχώς από το χρήστη ακέραιους αριθμούς μέσα σε ορισμένα όρια (π.χ. από 0 μέχρι 9) έως ότου ο χρήστης εισάγει ένα μη αποδεκτόαριθμό. Μια λύση στο συγκεκριμένο πρόβλημα είναι να χρησιμοποιήσουμε την επαναληπτική δομή και να υλοποιήσουμε ένα πρόγραμμα σαν το που βλέπουμε παρακάτω.

program WhileOria (input, output); var num : integer;

begin write('Dwste enan arithmo (0-9): '); readln(num);

while ( (num>=0) and (num<=9) ) do begin writeln('Dwsate ton arithmo:', num); write('Dwste enan arithmo (0-9): '); readln(num); end;end.

Παρατηρείστε τις δυο εντολές που είναι σκιαγραφημένες κόκκινες. Οι δυο αυτές εντολές που περιέχονται μέσα στη δομή είναι υποχρεωτικό να υπάρχουν και πριν από αυτήν έτσι ώστε ημεταβλητή να έχει τιμή την πρώτη φορά που εξετάζεται από τη λογική παράσταση της δομής . Αυτό συμβαίνει γιατί η δομή εξετάζει την λογική παράσταση πριν αρχίσει ηεπανάληψη. Για περιπτώσεις σαν αυτές, χρειαζόμαστε μια δομή επανάληψης η οποία να πραγματοποιεί το έλεγχο μετά το τέλος των εντολών που επαναλαμβάνονται. Ας δούμε λοιπόν, πώςδιαμορφώνεται το προηγούμενο πρόγραμμα αν χρησιμοποιήσουμε τη δομή επανάληψης .

program RepeatOria (input, output); var num : integer;

begin repeat write('Dwste enan arithmo (0-9): '); readln(num); writeln('Dwsate ton arithmo:', num); until ( (num<0) or (num>9) );end.

Παρατηρούμε στο παραπάνω πρόγραμμα , ότι πρώτα ξεκινάει η δομή επανάληψης και ύστερα ζητάμε από το χρήστη να εισάγει τιμή για τη μεταβλητή num η οποία ελέγχεται στο τέλοςτης δομής. Η διαδικασία επαναλαμβάνεται όσο ο χρήστης δίνει ως τιμές ακέραιους αριθμούς από 0 μέχρι 9.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 65: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.5.2 - Παραδείγματα Επαναληπτικής Δομής REPEAT

Πριν δούμε ένα ακόμη παράδειγμα της δομής , πρέπει ν' αναφέρουμε ότι όπως με την επαναληπτική δομή έτσι και με την πρέπει να δίνεται ιδιαίτερη προσοχή στη λογικήπαράσταση. Μέσα στις εντολές του σώματος του βρόχου πρέπει να υπάρχει κάποιος τρόπος ο οποίος "επηρεάζει" την τιμή της λογικής παράστασης της δομής έτσι ώστε μπορέσουμε να"βγούμε" από τον βρόχο. Κι αυτό, γιατί αν η λογική παράσταση είναι πάντα ψευδής (έχει τιμή ), οι εντολές του σώματος του βρόχου θα εκτελούνται επ' άπειρον.

Ένα παράδειγμα αυτής της περίπτωσης, μπορούμε να δούμε στο κώδικα δεξιά. Βλέπουμε, λοιπόν, ότι δεν υπάρχει κάποια εντολή μέσα στο σώμα του βρόχουη οποία να μεταβάλει την τιμή της μεταβλητής που υπάρχει στη λογική παράσταση. Αυτό σημαίνει, ότι η εντολή θα εκτελείται συνέχειαεφόσον η τιμή της λογικής παράστασης θα είναι πάντα . Υπάρχει, δηλαδή, ένας ατέρμων βρόχος.

num := 1;repeat writeln(num);until (num<0);

Ένα ακόμη παράδειγμα όπου έχουμε ατέρμων βρόχο υπάρχει στον κώδικα δεξιά. Βλέπουμε, λοιπόν, ότι παρόλο που υπάρχουν εντολές στοσώμα του βρόχου οι οποίες μεταβάλουν τις τιμές των μεταβλητών που εμπεριέχονται στη λογική παράσταση, εντούτοις δεν είναι σωστάδιατυπωμένες (ούτε η μεταβλητή θα πάρει ποτέ αρνητική τιμή αλλά κι ούτε η μεταβλητή θα γίνει ποτέ θετικός αριθμός). Αρα, η τιμήτης λογικής παράστασης θα είναι πάντα FALSE κι οι εντολές που βρίσκονται στο σώμα του βρόχο θα εκτελούνται επ' άπειρον.

Ας δούμε, όμως, ένα παράδειγμα το οποίο χρησιμοποιεί μια δομή REPEAT με μια πιο σύνθετη λογική παράσταση.

num1 := 0;num2 := 0;repeat num1 := num1 + 1; num2 := num2 - 1; writeln(num1, ' ', num2);until ((num1<0) or (num2>0));

ΠαράδειγμαΝα γράψετε ένα πρόγραμμα το οποίο ζητάει από το χρήστη να εισάγει ένα χαρακτήρα, τυπώνει τον χαρακτήρα που έδωσε ο χρήστης και ρωτάει τον χρήστη αν θέλει να επαναλάβει τη διαδικασία.Το μοτίβο αυτό επαναλαμβάνεται μέχρι είτε ο χρήστης δε θέλει να συνεχίαει την διαδικασία, είτε δώσει ένα μη αποδεκτό χαρακτήρα, δηλαδή που δεν είναι μεταζύ a και z.

program Xaraktires (input, output); var xaraktiras, answer : char;

begin repeat write('Dwste ena xaraktira: '); readln(xaraktiras); writeln('Dwsate to xaraktira: ', xaraktiras); write('Thelete na synexisete? (y/n): '); readln(answer); until ( (answer='n') OR ( (xaraktiras<'a') or (xaraktiras>'z') ) );end.

Το πρόβλημα που παρουσιάζει το παραπάνω πρόγραμμα, είναι ότι αν ο χρήστης δώσει μη αποδεκτό χαρακτήρα (δηλ. όχι μεταξύ a και z), το πρόγραμμα θα έπρεπε να τερματίζει κι όχι να ρωτάειαν θέλει ο χρήστης να συνεχίσει την διαδικασία. Κάτι τέτοιο είναι εφικτό έχοντας εμφωλευμένες δομές όπως μπορείτε να δείτε στην παρακάτω άσκηση αυτοαξιολόγησης.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .6

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 66: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.6 - Ανακεφαλαίωση των Δομών Επανάληψης

Ας συνοψίσουμε τα κύρια χαρακτηριστικά των δομών επανάληψης της Pascal:

Δομή Επανάληψης FORΧρησιμοποιείται, όταν ο αριθμός των εκτελέσεων του σώματος του βρόχου είναι γνωστός εκ των προτέρων.Το βήμα επανάληψης που χρησιμοποιείται ευκολότερα είναι το 1

Δομές Επανάληψης REPEAT και WHILEΧρησιμοποιούνται, όταν είναι άγνωστος ο αριθμός των ζητούμενων εκτελέσεων του σώματος του βρόχουΗ χρησιμοποίηση βήματος επανάληψης μεγαλύτερου από το 1, γίνεται ευκολότερα από ότι στην επαναληπτική δομή .

Δομή Επανάληψης WHILEΣτην επαναληπτική δομή , η εκτέλεση του βρόχου αρχίζει με τον έλεγχο της λογικής παράστασης, επιτρέποντας ή όχι την εκτέλεση των εντολών που βρίσκονται στο σώμα του βρόχου.Για να υπάρξει νέα εκτέλεση του σώματος του βρόχου, πρέπει η λογική παράσταση να ισχύει, δηλαδή να έχει τιμή .

Δομή Επανάληψης REPEATΣτην επαναληπτική δομή ο έλεγχος της λογικής παράστασης γίνεται στο τέλος κάθε εκτέλεσης των εντολών του σώματος του βρόχου που πάντα εκτελείται τουλάχιστον μια φορά.Για να υπάρξει νέα εκτέλεση του σώματος του βρόχου πρέπει η λογική παράσταση να μην ισχύει, δηλαδή να έχει τιμή .

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 67: All Chapters

Κεφάλαιο 4

ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ

4.7 - Ενοποίηση Δομών Επιλογής και Δομών Επανάληψης

Η λύση ενός προβλήματος, απαιτεί συνήθως τη χρήση αλλά και πολλές φορές την ενοποίηση και των δυο δομών ελέγχου. Ας δούμε, λοιπόν, κάποια πιο ολοκληρωμένα παραδείγματα τα οποίαεμπεριέχουν δομές επιλογής και δομές επανάληψης.

Παράδειγμα 1Να υλοποιήσετε ένα πρόγραμμα, το οποίο λειτουργεί ως απλός αριθμητικός υπολογιστής. Πιο συγκεκριμένα, το πρόγραμμα θα ζητάει από το χρήστη να εισάγει δύο ακέραιους αριθμούς και τοσύμβολο της πράξης (+,-,*,/) που επιθυμεί και τυπώνει στην οθόνη το αποτέλεσμα της πράξης. Η διαδικασία αυτή, θα επαναλαμβάνεται όσο ο χρήστης το επιθυμεί.

program Calculator (input,output); var num1, num2 : integer;var symvolo, answer : char;

begin repeat write('Dwste ton prwto arithmo: '); readln(num1); write('Dwste ton deftero arithmo: '); readln(num2); write('Dwste symbolo gia thn praksi (+,-,*,/): '); readln(symvolo);

case symvolo of '+' : writeln(num1+num2); '-' : writeln(num1-num2); '*' : writeln(num1*num2); '/' : if (num2<>0) then writeln(num1/num2)

else writeln('Adynath h diairesh me to mhden.'); else writeln('Den dwsate swsto symvolo.'); end;

write('Thelete kai alli praksi?'); readln(answer); until ( (answer<>'Y') and (answer<>'y') ); writeln('Telos tou programmatos.');end.

Παράδειγμα 2Να υλοποιήσετε ένα πρόγραμμα, το οποίο υπολογίζει πόσα μαθήματα έχει περάσει και πόσα μαθήματα χρωστάει ένας φοιτητής, ανάλογα με τον τελικό βαθμό του. Το πρόγραμμα αρχικά θα ζητάειαπό το χρήστη να εισάγει τον αριθμό των μαθημάτων στα οποία έχει εξεταστεί. Κατόπιν, για κάθ' ένα από τα μαθήματα, το πρόγραμμα θα ζητάει από το χρήστη να εισάγει τον τελικό βαθμό. Αν οβαθμός είναι μεταξύ του 5 και του 10, ο φοιτητής περνάει το μάθημα, ενώ αν ο βαθμός είναι μεταξύ 0 και 4 τότε το μάθημα θεωρείται χρεωστούμενο. Οποιονδήποτε άλλο άκυρο βαθμό (μικρότεροτου 0 ή μεγαλύτερο του 10) εισάγει ο χρήστης για κάποιο μάθημα, το πρόγραμμα θα τυπώνει ένα ενημερωτικό μήνυμα και θα ξαναζητάει τον βαθμό για το συγκεκριμένο μάθημα. Στο τέλος, τοπρόγραμμα θα τυπώνει τον αριθμό των μαθημάτων που έχει περάσει ο φοιτητής, τον αριθμό των μαθημάτων που χρωστάει, καθώς και το μέσο όρο της βαθμολογίας του.

program Mathimata (input,output); var i, num, vathmos, sum : integer;var perasmena, xrewstoumena : integer;var average : real;

begin perasmena := 0; xrewstoumena := 0; sum := 0;

write('Dwste ton arithmo twn mathimatwn:');

Page 68: All Chapters

readln(num);

for i:=1 to num do begin repeat write('Dwste ton vathmo gia to ', i, 'o mathima: '); readln(vathmos);

if (vathmos>=5) and (vathmos<=10) then perasmena := perasmena + 1 else if (vathmos>=0) and (vathmos<=4) then xrewstoumena := xrewstoumena + 1 else writeln('Dwsate lathos vathmo gia to ', i, 'o mathima.'); until (vathmos>=0) and (vathmos<=10);

sum := sum + vathmos; end;

average := sum/num; writeln('Aritmos mathimatwn pou exete perasei: ', perasmena); writeln('Aritmos mathimatwn pou exete kopei: ', xrewstoumena); writeln('O mesos oros ths vathmologias sas einai: ', average:5:3);end.

AΣΚΗΣΗ ΑΥΤΟΑΞ ΙΟΛΟΓΗΣΗΣ 4 .7

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 4 Επόμενη Ενότητα

Page 69: All Chapters

ΠΙΝΑΚΕΣ

Κεφάλα ιο 5

Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟ Ι ΤΟΥ ΚΕΦΑΛΑ ΙΟΥ

5.1 - Εισαγωγή

5.2 - Αναγκαιότητα Πινάκων

5.3 - Περιγραφή και Ορισμός ενός Πίνακα

5.4 - Δήλωση Πινάκων

5.5 - Προσπέλαση Πινάκων

5.5.1 - Ανάθεση Τιμών σε Στοιχεία ενός Πίνακα5.5.2 - Ανάκτηση Τιμών των Στοιχείων ενός Πίνακα

5.6 - Παραδείγματα Χρήσης Πινάκων

5.7 - Πολυδιάστατοι Πίνακες

5.7.1 - Παράδειγμα Δισδιάστατου Πίνακα

5.8 - Τεστ Αυτοαξιολόγησης Κεφαλαίου

Προηγούμενο Κεφάλαιο Κεντρική Σελίδα Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 70: All Chapters

ΠΙΝΑΚΕΣ

5.1 - Εισαγωγή

Όπως είδαμε στο κεφάλαιο 2, οι τύποι δεδομένων integer, real, boolean και char ονομάζονται απλοί τύποι δεδομένων. Και αυτό γιατί σε μεταβλητές αυτών των τύπων μπορούμε να αναθέσουμε μόνο μία συγκεκριμένη τιμή σε κάποια χρονική στιγμή. Επίσης, δεν είναι δυνατή η δημιουργία κάποιας υψηλότερου επιπέδου σχέσης μεταξύ των μεταβλητών αυτών. Όταν δηλαδή κάνουμε τη δήλωση var x, y : integer; δηλώνουμε απλά ότι το x και το y είναι δύο ανεξάρτητες μεταβλητές στις οποίες μπορούν να ανατεθούν τιμές από το σύνολο των ακέραιων αριθμών. Η δήλωση όμως αυτή δεν υποδηλώνει τίποτα για οποιεσδήποτε έμφυτες σχέσεις μεταξύ του x και του y. Για παράδειγμα, δεν γνωρίζουμε αν υπάρχει κάποια λογική σχέση μεταξύ του x και του y ή αν υπάρχει κάποιου είδους ιεραρχίας όπου το x εμφανίζεται "πριν από" ή "μετά από" το y.

Συχνά, θέλουμε να δείξουμε στα προγράμματά μας ότι κάποιες μεταβλητές ή τιμές δεν είναι ανεξάρτητες μεταξύ τους αλλά ότι είναι μέρος μιας ενοποιημένης συλλογής συσχετισμένων στοιχείων. Μία τηλεφωνική ατζέντα που περιέχει 20 τηλέφωνα φίλων μας ή ένα βαθμολόγιο κάποιου μαθήματος που περιέχει τους βαθμούς 30 φοιτητών, περιέχουν στοιχεία που σχετίζονται μεταξύ τους (20 τηλεφωνικούς αριθμούς ή 30 βαθμολογίες). Αυτές οι πιο υψηλού επιπέδου σχέσεις δεν μπορούν να δημιουργηθούν με τους απλούς τύπους δεδομένων. Χρειαζόμαστε λοιπόν έναν τρόπο να καθορίσουμε πιο ενδιαφέρουσες αλλά και πιο σύνθετες αντιπροσωπεύσεις δεδομένων που ονομάζονται δομημένοι τύποι δεδομένων.

Οι δομημένοι τύποι δεδομένων είναι σύνθετοι, υψηλότερου επιπέδου τύποι δεδομένων που δημιουργούνται από τις συλλογές στοιχείων απλού τύπου, οι οποίες περιέχουν μερικές πρόσθετες σχέσεις μεταξύ τους. Ο απλούστερος δομημένος τύπος της Pascal είναι ο πίνακας (array). Πριν όμως αναλύσουμε τι είναι οι πίνακες, πως τους κατασκευάσουμε και πως τους χρησιμοποιούμε, ας δούμε μερικά παραδείγματα που δημιουργούν την ανάγκη του δομημένου αυτού τύπου δεδομένων.

Κεφάλα ιο 5

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 71: All Chapters

ΠΙΝΑΚΕΣ

5.2 - Αναγκαιότητα Πινάκων

Ας υποθέσουμε ότι ένας φοιτητής πανεπιστημίου έχει περάσει δέκα μαθήματα και θέλει να υπολογίσει τον μέσο όρο της βαθμολογίας του. Θέλουμε λοιπόν να φτιάξουμε ένα πρόγραμμα το οποίο επιτρέπει στον φοιτητή αυτόν να εισάγει δέκα ακέραιους αριθμούς που όλοι τους αντιπροσωπεύουν βαθμούς μαθημάτων.

Λύση Πρώτη

Λύση Δεύτερη

Κεφάλα ιο 5

Όπως βλέπουμε στο πρόγραμμα ComputeAverage1 δεξιά, μπορούμε να δηλώσουμε 10 μεταβλητές τύπου integer (g1, g2 ... g10) και μετά να έχουμε μία ακολουθία writeln και readln εντολών οι οποίες τυπώνουν ένα κατάλληλο μήνυμα στην οθόνη και επιτρέπουν την εισαγωγή των δέκα βαθμολογιών. Στο τέλος, με έναν απλό υπολογισμό βρίσκουμε τον μέσο όρο της βαθμολογίας.

Το πρόβλημα που υπάρχει με αυτήν την λύση είναι το μέγεθός του. Δηλώσαμε 10 μεταβλητές τύπου integer και γράψαμε μια ακολουθία 10 writeln και readln εντολών. Τι θα γινόταν όμως αν ο φοιτητής ήθελε να εισάγει την βαθμολογία 30 μαθημάτων; Θα έπρεπε να δηλώσουμε 30 μεταβλητές τύπου integer και να γράψουμε μια ακολουθία 30 writeln και readln εντολών. Τι θα γινόταν αν κάποιο άλλο πρόγραμμα ζητούσε να διαχειριστούμε 100 ή και 1000 integers;

Πρέπει επίσης να πούμε ότι το πρόγραμμα ComputeAverage1 δεν είναι ολοκληρωμένο και ο λόγος είναι ότι δεν ελέγχουμε αν η βαθμολογία που εισάγει ο φοιτητής είναι έγκυρη (από 0 έως 10). Θα μπορούσαμε λοιπόν είτε μετά το τελευταίο readln να έχουμε μία μακροσκελής σύνθετη λογική παράσταση του τύπου

if ( (g1<0) OR (g1>10) ) OR ( (g2<0) OR (g2>10) ) .....

που να έλεγχει όλους του βαθμούς και αν είναι όλοι έγκυροι μόνο τότε να υπολογίζει το μέσο όρο, είτε να ελέγχουμε ένα προς ένα τους βαθμούς καθώς τους εισάγει ο χρήστης, με αποτέλεσμα το πρόγραμμά μας να μεγαλώσει ακόμη περισσότερο και να πάρει την εξής μορφή. Είναι φανερό ότι αυτή η λύση δεν είναι λειτουργική και δεν θα μπορούσε να είναι αποδεκτή. Το πρόγραμμα καταλήγει να είναι πολύ εκτενές και φυσικά δυσανάγνωστο και δυσνόητο. Θα πρέπει λοιπόν να βρεθεί κάποιος άλλος τρόπος ο οποίος μας επιτρέπει να διαχειριστούμε εκατοντάδες, χιλιάδες ή όσα στοιχεία χρειαζόμαστε, χωρίς να πρέπει να δηλώσουμε τον αντίστοιχο αριθμό μεταβλητών.

program ComputeAverage1(input,output); var g1,g2,g3,g4,g5,g6,g7,g8,g9,g10 : integer; var mesos_oros : real; begin writeln('Doste ton vathmo gia to mathima 1:'); readln(g1); writeln('Doste ton vathmo gia to mathima 2:'); readln(g2); writeln('Doste ton vathmo gia to mathima 3:'); readln(g3); writeln('Doste ton vathmo gia to mathima 4:'); readln(g4); writeln('Doste ton vathmo gia to mathima 5:'); readln(g5); writeln('Doste ton vathmo gia to mathima 6:'); readln(g6); writeln('Doste ton vathmo gia to mathima 7:'); readln(g7); writeln('Doste ton vathmo gia to mathima 8:'); readln(g8); writeln('Doste ton vathmo gia to mathima 9:'); readln(g9); writeln('Doste ton vathmo gia to mathima 10:'); readln(g10); mesos_oros:=(g1+g2+g3+g4+g5+g6+g7+g8+g9+g10)/10; writeln('O mesos oros einai: ', mesos_oros:5:2); end.

Μία δεύτερη λύση στο συγκεκριμένο πρόβλημα η οποία μειώνει αισθητά το μέγεθος του προγράμματός μας, είναι η χρήση δομών επανάληψης.

Όπως βλέπουμε στο πρόγραμμα ComputeAverage2 δεξιά, υπάρχει μία δομή FOR η οποία εκτελείται 10 φορές ζητώντας από το χρήστη να εισάγει τους βαθμούς για τα δέκα μαθήματα. Μέσα στη δομή FOR υπάρχει μία ακόμη επαναληπτική δομή REPEAT-UNTIL η εντολές της οποίας επαναλαμβάνονται αν ο φοιτητής δεν εισάγει έγκυρο βαθμό από 0 έως 10 για κάποιο

program ComputeAverage3(input,output); var mesos_oros : real; var i, vathmos, synolo : integer; begin synolo := 0;

Page 72: All Chapters

Η απάντηση είναι όχι. Η μεταβλητή vathmos της δεύτερης λύσης χρησιμοποιείται για όλους τους βαθμούς που εισάγει ο χρήστης και παίρνει διαφορετική τιμή σε κάθε μία από τις δέκα εκτελέσεις της δομής FOR. Μετά τη δέκατη εκτέλεση του FOR, η μεταβλητή vathmos έχει την τιμή που έδωσε ο χρήστης για το δέκατο μάθημα και όλες οι προηγούμενες εννιά έχουν χαθεί.

Διαπιστώνουμε λοιπόν ότι καμία από αυτές τις δύο λύσεις δεν είναι ικανοποιητική για το συγκεκριμένο πρόβλημα. Χρειαζόμαστε κάποιον άλλο τρόπο ο οποίος δεν δημιουργεί μεγάλα και δυσανάγνωστα προγράμματα όταν πρέπει να δουλέψουμε με πάρα πολλές μεταβλητές, και παράλληλα να επιτρέπει την επαναχρησιμοποίηση τους.

συγκεκριμένο μάθημα (δηλαδή για κάποια από τις 10 εκτελέσεις της δομής FOR). Παρατηρούμε επίσης ότι χρησιμοποιούμαι μόνο μία μεταβλητή (vathmos) για να αποθηκεύουμε τους βαθμούς που εισάγει ο χρήστης, οι οποίοι αθροίζονται στη μεταβλητή synolo. Τέλος, ο μέσος όρος της βαθμολογίας υπολογίζεται διαιρώντας το άθροισμα των βαθμών με τον αριθμό των μαθημάτων (10).

Με την συγκεκριμένη λύση όμως δημιουργείται ένα άλλο πρόβλημα. Στην πρώτη λύση είχαμε δηλώσει δέκα μεταβλητές (g1, g2, ... g10) για τους δέκα βαθμούς των μαθημάτων και μπορούσαμε να ξαναχρησιμοποιήσουμε τον βαθμό κάποιου μαθήματος μέσω της μεταβλητής που του είχε οριστεί. Με την δεύτερη λύση, μπορούμε να ξαναχρησιμοποιήσουμε τον βαθμό που έβαλε ο χρήστης για το δεύτερο ή για το τρίτο μάθημα;

for i:=1 to 10 do begin repeat write('Doste to vathmo gia to mathima ', i, ': '); readln(vathmos); until (vathmos>=0) and (vathmos <= 10); synolo := synolo + vathmos; end; mesos_oros := synolo/10; writeln('O mesos oros einai: ', mesos_oros:5:2); end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 73: All Chapters

ΠΙΝΑΚΕΣ

5.3 - Περιγραφή και Ορισμός ενός Πίνακα

Ένας πίνακας (array) είναι μία δομή δεδομένων που χρησιμεύει για την καταχώρηση ενός προκαθορισμένου αριθμού δεδομένων (ή αλλιώς στοιχείων) του ίδιου τύπου δεδομένων. Μπορούμε για παράδειγμα να αποθηκεύσουμε σε έναν πίνακα 15 ακέραιους αριθμούς ή 20 πραγματικούς αριθμούς ή 12 χαρακτήρες, αλλά δεν μπορούμε να αποθηκεύσουμε 4 ακέραιους αριθμούς και 5 χαρακτήρες στον ίδιο πίνακα.

Κεφάλα ιο 5

Ένας πίνακας μπορεί να θεωρηθεί ως μια διάταξη συνδεδεμένων και αριθμημένων κουτιών όπου το κάθε κουτί περιέχει ένα μόνο στοιχείο. Στην εικόνα 5.1 βλέπουμε τρεις διαφορετικούς πίνακες οι οποίοι αποθηκεύουν έναν αριθμό στοιχείων του ίδιου τύπου δεδομένων.

Ο αριθμός που συνδέεται με το κάθε κουτί ονομάζεται δείκτης (index). Ο δείκτης είναι συνήθως ένας ακέραιος αριθμός και προσδιορίζει μία μόνο θέση στην διάταξη του πίνακα, και κατά συνέπεια το στοιχείο που είναι αποθηκευμένο στην συγκεκριμένη θέση. Όπως θα δούμε αργότερα, η προσπέλαση σε κάποιο συγκεκριμένο στοιχείο ή θέση του πίνακα γίνεται μόνο μέσω του δείκτη.

Εικόνα 5.1 : Σχηματικές Παραστάσεις Πινάκων

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 74: All Chapters

ΠΙΝΑΚΕΣ

5.4 - Δήλωση Πινάκων

όπου οι λέξεις ARRAY και OF είναι δεσμευμένες λέξεις όνομα-πίνακα είναι το όνομα της μεταβλητής του πίνακα τύπος-στοιχείων είναι ο τύπος δεδομένων των στοιχείων που επιθυμούμε να καταχωρήσουμε από..έως είναι οι τιμές των ορίων (ακέραιοι αριθμοί) που δηλώνουν το μέγεθος του πίνακα, και οι οποίες περικλείονται από αγκύλες και χωρίζονται με δύο τελείες.

Βέβαια, σε αυτό το σημείο είναι σημαντικό να αναφέρουμε ότι ο παραπάνω τρόπος δήλωσης αναφέρεται σε μονοδιάστατο πίνακα. Θα δούμε σε μετέπειτα ενότητες ότι ένας πίνακας μπορεί να έχει παραπάνω από μία διάσταση και ότι ο τρόπος δήλωσης πολυδιάστατων πινάκων έχει κάποιες μικρές διαφορές.

Παραδείγματα Δηλώσεων 1

Παρατηρείστε τις τιμές των ορίων του κάθε πίνακα που υπάρχουν στο πράσινο πλαίσιο. Βλέπουμε λοιπόν ότι όλες ξεκινάνε από τον αριθμό ένα (1). Αυτό δεν σημαίνει ότι το κάτω όριο του πίνακα πρέπει να είναι οπωσδήποτε ο αριθμός 1. Είναι απλά ο πιο λογικός τρόπος καταμέτρησης - σε μία συλλογή 10 στοιχείων, για παράδειγμα, υπάρχει 1ο, 2ο, 3ο, ... 9ο, και 10ο στοιχείο.

Παραδείγματα Δηλώσεων 2

Παρόλο που ο μεταγλωττιστής δεν θα βρει κάποιο συντακτικό λάθος στις δηλώσεις των πινάκων του κόκκινου πλαισίου, ο συγκεκριμένος τρόπος χρήσης των ορίων δεν χρησιμοποιείται συχνά και δεν θεωρείται καλή προγραμματιστική τεχνική διότι κάνει το πρόγραμμά μας δυσνόητο.

Θα πρέπει να αναφέρουμε ότι τα όρια ενός πίνακα πρέπει να έχουν σταθερές (constant) τιμές. Αυτό δεν σημαίνει ότι δεν μπορούμε να χρησιμοποιήσουμε κάποια μεταβλητή. Στην δήλωση var pinakas : array [1..MAXSIZE] of integer; για παράδειγμα το MAXSIZE είναι μία μεταβλητή η οποία προσδιορίζει το πάνω όριο του πίνακα. Κάτι τέτοιο όμως μπορούμε να κάνουμε μόνο εφόσον η μεταβλητή έχει δηλωθεί ως σταθερή και έχει πάρει κάποια τιμή πριν από την δήλωση του πίνακα. Θα πρέπει να υπάρχει δηλαδή η δήλωση const MAXSIZE = 100; πριν από την δήλωση του πίνακα. Η χρήση μιας σταθερής μεταβλητής ως το πάνω όριο ενός πίνακα θεωρείται καλή προγραμματιστική τεχνική. Ο λόγος είναι ότι αν κατά την διάρκεια της κωδικοποίησης ή της συντήρησης του προγράμματος χρειαστεί να αλλάξει το πάνω όριο και κατά συνέπεια το μέγεθος του πίνακα, θα έχουμε να κάνουμε μόνο μία

Κεφάλα ιο 5

Ο τρόπος που γίνεται η δήλωση ενός πίνακα είναι λίγο διαφορετικός από τον τρόπο δήλωσης των μεταβλητών που έχουμε δει μέχρι τώρα. Για να δηλώσουμε μία μεταβλητή τύπουπίνακα πρέπει να ορίσουμε πόσα στοιχεία θα περιέχει ο πίνακας καθώς και τον τύπο δεδομένων των στοιχείων που θα αποθηκεύει. Η γενική μορφή της δήλωσης ενός πίνακα είναι:

var όνομα-πίνακα : ARRAY [από..έως] OF τύπος-στοιχείων;

Στο πράσινο πλαίσιο δεξιά βλέπουμε παραδείγματα δηλώσεων διαφόρων πινάκων. Παρατηρούμε λοιπόν ότι ο πίνακας vathmoi θα καταχωρεί τιμές για 10 πραγματικούς (real) αριθμούς, ο πίνακας kodikos θα αποθηκεύει 4 ακέραιους (integer) αριθμούς, ο πίνακας alphabet 26 χαρακτήρες (char) και ο πίνακας parousies θα αποτελείται από 15 boolean τιμές.

var vathmoi : array [1..10] of real; var kodikos : array [1..4] of integer; var alphabet : array [1..26] of char; var parousies : array [1..15] of boolean;

Στο κόκκινο πλαίσιο βλέπουμε παραδείγματα δηλώσεων πινάκων των οποίων οι τιμές των ορίων διαφέρουν από εκείνους του πράσινου πλαισίου. Παρατηρούμε λοιπόν ότι ο πίνακας monades θα καταχωρεί τιμές για 9 πραγματικούς αριθμούς (από 4 έως 12), ο πίνακας thermokrasia θα αποθηκεύει 8 ακέραιους αριθμούς (από -2 έως 5), και ο πίνακας game 10 χαρακτήρες (από 0 έως 9).

var monades : array [4..12] of real; var temp : array [-2..5] of integer; var game : array [0..9] of boolean;

Page 75: All Chapters

αλλαγή στον κώδικά μας. Αυτή η αλλαγή θα είναι στη δήλωση της τιμής της σταθερής μεταβλητής όπως φαίνεται και σε αυτό το παράδειγμα

Τέλος, αξίζει να σημειώσουμε ότι ένας πίνακας θεωρείται μία στατική δομή δεδομένων επειδή τόσο μέγεθος του όσο και οι διαστάσεις του ορίζονται από τον προγραμματιστή και παραμένουν τα ίδια σε όλη τη διάρκεια εκτέλεσης του προγράμματος χωρίς να μπορούν να αλλάξουν. Ο πίνακας vathmoi για παράδειγμα που βρίσκεται στο πράσινο πλαίσιο μπορεί να αποθηκεύσει μέχρι 10 πραγματικούς αριθμούς και αν δημιουργηθεί η ανάγκη να αποθηκευθεί και ενδέκατος αριθμός δυστυχώς αυτό δεν θα είναι εφικτό. Γι' αυτό το λόγο πρέπει να δίνεται ιδιαίτερη προσοχή κατά την διάρκεια καθορισμού ενός προβλήματος (ενότητα 1.κάτι) έτσι ώστε να αναγνωριστούν οι σαφείς απαιτήσεις και προϋποθέσεις.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 76: All Chapters

ΠΙΝΑΚΕΣ

5.5 - Προσπέλαση Πινάκων

Είδαμε στην προηγούμενη ενότητα ότι όταν δηλώνουμε ένα πίνακα πρέπει να ορίσουμε το όνομα της μεταβλητής του πίνακα. Στην δήλωση δηλαδή var vathmologia : array [1..4] of integer; η λέξη vathmologia είναι το όνομα της μεταβλητής του πίνακα. Αυτό το όνομα όμως αναφέρεται σε μια συλλογή από στοιχεία και πρέπει να είμαστε προσεκτικοί έτσι ώστε να αποφεύγουμε λανθασμένες εντολές όπως:

Και αυτό γιατί στις τρεις παραπάνω εντολές, δεν είναι σαφές αν αναφερόμαστε σε κάποιο συγκεκριμένο στοιχείο ή στοιχεία του πίνακα vathmologia. Η προσπέλαση ενός πίνακα γίνεται μέσω των δεικτών. Είτε δηλαδή θέλουμε να ανακτήσουμε την τιμή κάποιου στοιχείου του πίνακα, είτε θέλουμε να αναθέσουμε μια τιμή σε κάποιο από τα στοιχεία του πίνακα, πρέπει να χρησιμοποιήσουμε τον δείκτη που αναφέρεται σε μία συγκεκριμένη θέση του πίνακα. Η γενική μορφή της χρήσης των δεικτών είναι όνομα-πίνακα[δείκτης] δηλαδή αναγράφουμε πρώτα το όνομα της μεταβλητής του πίνακα και έπειτα τον δείκτη ο οποίος περικλείεται από αγκύλες.

Ένα σημείο στο οποίο πρέπει να δοθεί προσοχή είναι ότι οι τιμές του δείκτη πρέπει οπωσδήποτε να κυμαίνονται μέσα στο πεδίο τιμών που έχει οριστεί από τις οριακές τιμές του πίνακα. Διαφορετικά το πρόγραμμά μας μπορεί να σταματήσει απροσδόκητα κατά την διάρκεια της εκτέλεσής του και να τυπώσει ένα διαγνωστικό μήνυμα ή να μην έχουμε δυνατότητα ανάκτησης της τιμής κάποιου στοιχείου. Για παράδειγμα, εάν μέσα στο πρόγραμμά μας υπάρχει η εντολή vathmologia[6] ο μεταγλωττιστής δεν θα βρει συντακτικό λάθος εφόσον η τιμή του δείκτη είναι ακέραιος αριθμός. 'Ομως οι τιμές των ορίων του παραπάνω πίνακα vathmologia έχουν οριστεί να είναι από 1 μέχρι 5 και κατά συνέπεια δεν υπάρχει έκτη θέση στον πίνακα και η εντολή vathmologia[6] είναι λανθασμένη.

Κεφάλα ιο 5

vathmologia := vathmologia + 1; ή if (vathmologia = 2) then ή writeln(vathmologia);

Παράδειγματα

Έστω ότι έχουμε δηλώσει μέσα στο πρόγραμμά μας τον πίνακα var vathmologia : array [1..5] of integer;

Όπως βλέπουμε και στην εικόνα 5.2 δεξιά, η πρώτη θέση του πίνακα προσδιορίζεται με την εντολή vathmologia[1] και στηνσυγκεκριμένη θέση υπάρχει ένα στοιχείο τύπου integer με τιμή 23. Στην δεύτερη θέση του πίνακα που προσδιορίζεται με τηνεντολή vathmologia[2] έχει αποθηκευθεί ο αριθμός 14.

Στις θέσεις 3, 4 και 5 οι οποίες προσδιορίζονται με τις εντολές vathmologia[3], vathmologia[4] και vathmologia[5]αντίστοιχα, δεν υπάρχει καταχωρημένο κάποιο στοιχείο.

Εικόνα 5.2: Πίνακας 5 ακεραίων αριθμών

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 77: All Chapters

ΠΙΝΑΚΕΣ

5.5.1 - Ανάθεση Τιμών σε Στοιχεία ενός Πίνακα

Εφόσον έχουμε δει πως μπορούμε να προσπελάσουμε ένα πίνακα χρησιμοποιώντας τους δείκτες, ας δούμε μέσω ενός παραδείγματος πως μπορούμε να αναθέσουμε τιμές στα στοιχεία ενός πίνακα.

Κεφάλα ιο 5

Το πρόγραμμα Vathmologia3 δεξιά, χρησιμοποιεί έναν πίνακα πέντε ακεραίων αριθμών. Βλέπουμε λοιπόν ότι στο πρώτο στοιχείο του πίνακα αναθέτουμε την τιμή 7, στο δεύτερο στοιχείο του πίνακααναθέτουμε την τιμή 5, και στο τρίτο στοιχείο την τιμή 9, χρησιμοποιώντας τον τελεστή ανάθεσης.

Μπορούμε επίσης να αναθέσουμε άμεσα σε ένα στοιχείο του πίνακα μια τιμή η οποία έχει δωθείαπό τον χρήστη όπως γίνεται στο παράδειγμα μας με το τέταρτο στοιχείο του πίνακα. Και αυτο γιατί το όνομα vathmologia[4] θεωρείτε πλέον μία ξεχωριστή μεταβλητή.

Τέλος, βλέπουμε ότι δεν χρειάζεται οι τιμές του δείκτη είναι σταθερές (πχ. 1, 2, 3 ή 4). Μπορεί να είναι μια μεταβλητή αρκεί να είναι τύπου integer όπως γίνεται στο παράδειγμα με την μεταβλητή pos. Το ίδιο συμβαίνει και με τις τιμές που αναθέτονται σε στοιχεία του πίνακα. Δεν χρειάζεται δηλαδή να είναι σταθερές τιμές (πχ. 7, 5, ή 9). Μπορούν να είναι μεταβλητές εφόσον όμως είναι τουίδιου τύπου με αυτόν του πίνακα. Βλέπουμε λοιπόν ότι ο χρήστης εισάγει μία τιμή για την μεταβλητή pos η οποία χρησιμοποιείται ως δείκτης (vathmologia[pos]) και προσδιορίζει ένα στοιχείο τουπίνακα στο οποίο θα ανατεθεί η τιμή της μεταβλητής num που επίσης εισάγεται από το χρήστη. Αν λοιπόν ο χρήστης εισάγει τον αριθμό 5 ως τιμή της μεταβλητής pos και τον αριθμό 76 ως τιμή της μεταβλητής num, τότε στο πέμπτο στοιχείο του πίνακα θα ανατεθεί η τιμή 76. Αν όμως ο χρήστης εισάγει 1 αντί για 5 ως τιμή της μεταβλητής pos, τότε η τιμή 76 θα ανατεθεί στο πρώτο στοιχείο του πίνακα σβήνοντας την προηγούμενη τιμή του στοιχείου που ήταν 7.

program Vathmologia3 (input, output); var vathmologia : array [1..5] of integer; var num, pos : integer; begin vathmologia[1] := 7; vathmologia[2] := 5; vathmologia[3] := 9; write('Eisagete to vathmo gia to 4o mathima: '); readln(vathmologia[4]); write('Eisagete ton arithmo tou mathimatos: '); readln(pos); write('Eisagete vathmo gia to ', pos, 'o mathima: '); readln(num); vathmologia[pos] := num; end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 78: All Chapters

ΠΙΝΑΚΕΣ

5.5.2 - Ανάκτηση Τιμών των Στοιχείων ενός Πίνακα

ΠΡΑΚΤΙΚΗ ΕΦΑΡΜΟΓΗ

Κεφάλα ιο 5

Η ανάκτηση των τιμών των στοιχείων ενός πίνακα γίνεται και αυτή χρησιμοποιώντας τους δείκτες. Το πρόγραμμα Vathmologia4 δεξιά, χρησιμοποιεί έναν πίνακα πέντε ακεραίων αριθμών. Χρησιμοποιώντας τον τελεστή ανάθεσης, αναθέτουμε την τιμή 7 στο πρώτο στοιχείο του πίνακα, την τιμή 5 στο δεύτεροστοιχείο, την τιμή 9 στο τρίτο στοιχείο, την τιμή 6 στο τέταρτο και τέλος την τιμή 8 στο πέμπτο στοιχείο του πίνακα.

Μπορούμε λοιπόν να ανακτήσουμε και να τυπώσουμε άμεσα στην οθόνη την τιμή ενός στοιχείου όπωςγίνεται στο παράδειγμα για τον πρώτο στοιχείο.

Μπορούμε επίσης να αναθέσουμε την τιμή ενός στοιχείου του πίνακα σε μια άλλη μεταβλητή η οποίαπρέπει όμως να είναι του ίδιου τύπου με τα στοιχεία του πίνακα. Στο παράδειγμα δεξιά, γίνεται ανάθεση της τιμής του δεύτερου στοιχείου του πίνακα στην μεταβλητή pos η οποία κατόπιν τυπώνεται στην οοθόνη.

Τέλος, βλέπουμε ότι εφόσον έχουν ανατεθεί τιμές σε κάποια στοιχεία του πίνακα, μπορούμε να χρησιμοποιήσουμε τα στοιχεία αυτά και σε άλλες προγραμματιστικές διαδικασίες. Μπορούμε γιαπαράδειγμα να τα συγκρίνουμε όπως φαίνεται στο παράδειγμα με την σύγκριση του πρώτου και τουδεύτερου στοιχείου του πίνακα.

program Vathmologia4 (input, output); var vathmologia : array [1..5] of integer; var num, pos : integer; begin vathmologia[1] := 7; vathmologia[2] := 5; vathmologia[3] := 9; vathmologia[4] := 6; vathmologia[5] := 8; writeln(vathmologia[1]); num := vathmologia[2]; writeln(num); if ( vathmologia[1] < vathmologia[2] ) then write('To 2o mathima exei magalytero vathmo.'); end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 79: All Chapters

ΠΙΝΑΚΕΣ

5.6 - Παραδείγματα Χρήσης Πινάκων

Παράδειγμα 1 Στην ενότητα 5.2 είχαμε προσπαθήσει να γράψουμε ένα πρόγραμμα που υπολογίζει τον μέσο όρο δέκα ακεραίων αριθμών οι οποίοι αντιπροσώπευαν τους βαθμούς ενός φοιτητή για δέκα μαθήματα. Είχαμε λοιπόν γράψει τρία προγράμματα το κάθε ένα από τα οποία είχε τα δικά του μειονεκτήματα. Θα προσπαθήσουμε λοιπόν να λύσουμε το ίδιο πρόβλημα χρησιμοποιώντας έναν πίνακα.

Παράδειγμα 2 Να γραφεί ένα πρόγραμμα σε Pascal το οποίο ζητάει από τον χρήστη να εισάγει έναν θετικό ακέραιο αριθμό temp και στην συνέχεια ψάχνει αν ο συγκεκριμένος αριθμός temp υπάρχει μέσα σε ένα πίνακα 100 ακεραίων αριθμών. Το πρόγραμμα θα πρέπει πρώτα να αναθέτει τυχαίες τιμές στα 100 στοιχεία ενός πίνακα ακεραίων αριθμών και στο τέλος να τυπώνει

Κεφάλα ιο 5

program ComputeAverage4(input,output); var i, synolo : integer; var mesos_oros : real; var sostos_vathmos : boolean; var vathmoi : array [1..10] of integer; begin for i:=1 to 10 do begin repeat write('Doste ton vathmo gia to mathima ', i, ': '); readln(vathmoi[i]); if ( vathmoi[i]<0 ) or ( vathmoi[i]>10 ) then begin writeln('O vathmos pou dosate den einai sostos.'); sostos_vathmos := false; end else sostos_vathmos := true; until ( sostos_vathmos = true ); end; synolo := 0; for i:=1 to 10 do begin synolo := synolo + vathmoi[i]; end; mesos_oros := synolo/10; writeln('O mesos oros einai: ', mesos_oros:5:2); end.

Page 80: All Chapters

στην οθόνη ένα κατάλληλο μήνυμα ανάλογα με το αν ο αριθμός temp υπάρχει ή δεν υπάρχει στον πίνακα.

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 5 . 1

program Anazitisi(input,output); var i, temp : integer; var exists : boolean; var pinakas : array [1..100] of integer; begin Randomize; for i:=1 to 100 do pinakas[i] := Random(1000); write('Doste enan arithmo gia anazitisi: '); readln(temp); exists := false; for i:=1 to 100 do begin if (pinakas[i] = temp) then exists := true end; if (exists = true ) then writeln('O arithmos ', temp, ' yparxei ston pinaka.') else writeln('O arithmos ', temp, ' den yparxei ston pinaka.'); end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 81: All Chapters

ΠΙΝΑΚΕΣ

5.7 - Πολυδιάστατοι Πίνακες

Ορισμός Πολυδιάστατων Πινάκων

Προσπέλαση Πολυδιάστατων Πινάκων

Κεφάλα ιο 5

Οι πίνακες που έχουμε δει μέχρι τώρα ονομάζονται μονοδιάστατοι πίνακες. Περιλαμβάνουν δηλαδή μία σειρά (διάσταση) από στοιχεία, οι τιμές των οποίων είναι προσπελάσιμες μέσω ενόςδείκτη. Στην ενότητα 5.4 είχαμε αναφέρει ότι οι μονοδιάστατοι πίνακες είναι μία μόνο περίπτωση πινάκων. Μπορούμε να έχουμε πίνακες οι οποίοι είναι δυσδιάστατοι, τρισδιάστατοι και γενικά n διαστάσεων.

Στην εικόνα 5.3 παρατηρούμε την γραφική αναπαράσταση ενός μονοδιάστατου, ενός δυσδιάστατου και ενός τρισδιάστατου πίνακα. Έχουμε ήδη μάθει ότι τα στοιχεία ενός πίνακαπρέπει να είναι του ιδίου τύπου δεδομένων και φυσικά αυτό ισχύει ανεξάρτητως τωνδιαστάσεων του πίνακα.

Εικόνα 5.3: Αναπαράσταση πινάκων διαφόρων διαστάσεων

Για την δημιουργία ενός πίνακα απαιτείται ο προσδιορισμός των στοιχείων (ή πιο σωστά των ορίων) για κάθε διάσταση. Ας δούμε λοιπόν πως ορίζονται οι τρεις πίνακες της εικόνας5.3 υποθέτοντας ότι αποθηκεύουν ακέραιους αριθμούς:

Ορισμός Μονοδιάστατου Πίνακα Ορισμός Δυσδιάστατου Πίνακα Ορισμός Τρισδιάστατου Πίνακα var pinakas : array [1..6] of integer; var pinakas : array [1..5,1..6] of integer; var pinakas : array [1..3,1..5,1..4] of integer;

Ο ορισμός του μονοδιάστατου πίνακα μας είναι ήδη γνωστός. Παρατηρούμε στους άλλους δύο ορισμούς ότι οι διαστάσεις του δυσδιάστατου και του τρισδιάστατου πίνακα χωρίζονταιμε κόμματα. Έτσι λοιπόν, ο δυσδιάστατος πίνακας αποτελείται από 5 γραμμές και 6 στήλες. Το όριο δηλαδή 1..5 είναι η διάσταση 1 και το όριο 1..6 είναι η διάσταση 2. Με άλλα λόγιαείναι ένας πίνακας 5x6 με συνολικά 30 στοιχεία. Για τον τρισδιάστατο πίνακα της εικόνας 6.3, το όριο 1..3 είναι η διάσταση 1, το όριο 1..5 είναι η διάσταση 2 και το όριο 1..4 είναι η διάσταση 3. Είναι δηλάδη ένας πίνακας 3x5x4 με συνολικά 60 στοιχεία.

Για τον προσδιορισμό ενός στοιχείου του πίνακα (για ανάθεση ή ανάκτηση τιμής), απαιτούνται τόσοι δείκτες όσες είναι και οι διαστάσεις του. Έτσι λοιπόν, ενώ η εντολή pinakas[2] προσδιορίζει το δεύτερο στοιχείο ενός μονοδιάστατου πίνακα χρησιμοποιώντας μόνο ένα δείκτη, για να μπορέσουμε να προσδιορίσουμε κάποιο στοιχείο ενός δυσδιάστατου πίνακααπαιτούνται δύο δείκτες.

Στον δυσδιάστατο πίνακα της εικόνας 5.4 μπορούμε να προσπελάσουμε τα χρωματιστά στοιχεία γράφοντας:

pinakas[2,2] για το κόκκινο στοιχείο, εφόσον βρίσκεται στην 2η γραμμή και την 2η στήλη pinakas[4,2] για το κίτρινο στοιχείο, εφόσον βρίσκεται στην 4η γραμμή και την 2η στήλη pinakas[3,4] για το μαύρο στοιχείο, εφόσον βρίσκεται στην 3η γραμμή και την 4η στήλη

Αντίστοιχα, για τον τρισδιάστατο πίνακα της εικόνας 5.4, χρησιμοποιώντας 3 δείκτες μπορούμε να προσπελάσουμε τα χρωματιστά στοιχεία γράφοντας:

pinakas[2,2,1] για το μπλε στοιχείο, εφόσον βρίσκεται στην 2η γραμμή της διάστασης 1, στην 2η στήλη της

Page 82: All Chapters

διάστασης 2, και στην 1η θέση της διάστασης 3

Εικόνα 5.4: Στοιχεία πολυδιάστατων πινάκων

pinakas[1,4,2] για το πράσινο στοιχείο, εφόσον βρίσκεται στην 1η γραμμή της διάστασης 1, στην 4η στήλη της διάστασης 2, και στην 2η θέση της διάστασης 3 pinakas[1,1,4] για το ροζ στοιχείο, εφόσον βρίσκεται στην 1η γραμμή της διάστασης 1, στην 1η στήλη της διάστασης 2, και στην 4η θέση της διάστασης 3

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 83: All Chapters

ΠΙΝΑΚΕΣ

5.7.1 - Παράδειγμα Δυσδιάστατου Πίνακα

Υποθέστε ότι έχετε αναλάβει να υλοποιήσετε ένα πρόγραμμα για έναν μετεωρολόγο το οποίο θα αναλύει δεδομένα μηνιαίων βροχοπτώσεων για μια διάρκεια 5 ετών. Μία από τις πρώτες αποφάσεις που θα πρέπει να πάρετε είναι πως θα αναπαραστήσετε τα δεδομένα. Μία επιλογή είναι να χρησιμοποιήσετε μία μεταβλητή για τον κάθε μήνα δηλαδή να υπάρχουν 60 συνολικά μεταβλητές τις οποίες και θα επεξεργαζόμαστε. Έχουμε όμως ήδη αναφέρει στην ενότητα 12123 ότι αυτή η λύση δεν είναι ικανοποιητική. Η χρήση ενός πίνακα με 60 στοιχεία αποτελεί βέβαια μία βελτίωση αλλά θα ήταν πολύ καλύτερο αν μπορούσαν να κρατηθούν ξεχωριστά τα δεδομένα του κάθε χρόνου. Θα μπορούσαν βέβαια να χρησιμοποιηθούν 5 πίνακες όπου ο καθένας θα είχε 12 στοιχεία αλλά όμως ούτε αυτή είναι μία ικανοποιητική λύση. Και αυτό γιατί ο μετεωρολόγος θα μπορούσε να είχε ζητήσει να μελετήσει την βροχόπτωση 80 χρόνων αντί για 5. Χρειαζόμαστε λοιπόν κάτι καλύτερο.

Κεφάλα ιο 5

Μια καλή απάντηση είναι να χρησιμοποιήσουμε έναν πίνακα από πίνακες. Ο κύριος πίνακας θα έχει 5 στοιχεία και το κάθε στοιχείο του θα είναι ένας πίνακας με 12 στοιχεία. Δημιουργούμε με αυτόν τον τρόπο έναν δυσδιάστατο πίνακα που αποτελείται από 5 σειρές και 12 στήλες όπως φαίνεται στην εικόνα 5.5 (τυχαίες τιμές για τις μηνιαίες βροχοπτώσεις απεικονίζονται μέσα στα κουτάκια).

Στην εικόνα 5.5 οι δείκτες εμφανίζονται κάτω από τα στοιχεία. Αλλάζοντας τον δεύτερο δείκτη μετακινούμαστε σε μία σειρά, ενώ αλλάζοντας τον πρώτο δείκτη μετακινούμαστε σεμια στήλη. Στο παράδειγμά μας, ο δεύτερος δείκτης αφορά τους μήνες ενώ ο πρώτοςδείκτης αναφέρετε στα έτη.

Ας υποθέσουμε λοιπόν ότι το πρόγραμμά μας πρέπει να υπολογίζει την συνολικήβροχόπτωση για το κάθε έτος, την μέση βροχόπτωση για το κάθε έτος και τέλος την μέση βροχόπτωση για τον κάθε μήνα. Για να βρούμε την συνολική βροχόπτωση ενός έτουςπρέπει να προσθέσουμε όλα τα στοιχεία μιας σειράς. Για να βρούμε την μέση βροχόπτωση ενός μήνα πρέπει να προσθέσουμε όλα τα στοιχεία μιας στήλης. Με έναν δυσδιάστατο πίνακα είναι πολύ πιο εύκολο να καταλάβουμε και να πραγματοποιήσουμε αυτές τιςδραστηριότητες όπως φαίνεται στο παρακάτω πρόγραμμα.

Εικόνα 5.5: Αναπαράσταση Πίνακα Βροχοπτώσεων

program RainStatistics (input,output); var rain : array [1..5,1..12] of real; var i, j, minas, etos : integer; var sumMinas, averageMinas, sumEtos, averageEtos : real; begin Randomize; for i:=1 to 5 do for j:=1 to 12 do rain[i,j] := Random(10);

Page 84: All Chapters

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 5 . 2

writeln('Ta dedomena gia tis vroxoptoseis einai:'); for i:=1 to 5 do begin for j:=1 to 12 do write(rain[i,j]:5:2, ' '); writeln; end; write('Doste to etos gia ypologismo mesis-synolikis vroxoptosis (1 eos 5):'); readln(etos); sumEtos := 0; for j:=1 to 12 do sumEtos := sumEtos + rain[etos,j]; averageEtos := sumEtos/12; writeln('Synoliki vroxoptosi gia to etos ', etos, ': ', sumEtos:5:2); writeln('Mesi vroxoptosi gia to etos ', etos, ': ', averageEtos:5:2); write('Doste to mina gia ypologismo tis mesis vroxoptosis sta 5 eti (1 eos 12):'); readln(minas); sumMinas := 0; for i:=1 to 5 do sumMinas := sumMinas + rain[i,minas]; averageMinas := sumMinas/5; writeln('Mesi vroxoptosi gia to mina ', minas, ': ', averageMinas:5:2); end.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 5 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 85: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Κεφάλα ιο 6

Περιεχόμενα Κεφαλαίου : ΣΤΟΧΟ Ι ΤΟΥ ΚΕΦΑΛΑ ΙΟΥ

6.1 - Εισαγωγή

6.2 - Χαρακτηριστικά και Πλεονεκτήματα Υποπρογραμμάτων

6.3 - Παράμετροι

6.4 - Διαδικασίες

6.4.1 - Απλές Διαδικασίες6.4.2 - Διαδικασίες με Τοπικές και Καθολικές Μεταβλητές6.4.3 - Διαδικασίες με Παραμέτρους Τιμής6.4.4 - Διαδικασίες με Παραμέτρους Αναφοράς

6.5 - Συναρτήσεις

6.5.1 - Παραδείγματα Συναρτήσεων

6.6 - Ομοιότητες και Διαφορές Συναρτήσεων και Διαδικασιών

6.7 - Τεστ Αυτοαξιολόγησης Κεφαλαίου

Προηγούμενο Κεφάλαιο Κεντρική Σελίδα Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 86: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.1 - Εισαγωγή

Υποθέστε ότι μια ομάδα από πέντε καθηγητές πληροφορικής αποφασίζουν να γράψουν ένα βιβλίο για την εκμάθηση της γλώσσας προγραμματισμού Pascal. Από που θα ξεκινήσουν; Τι ύλη θα συμπεριλάβουν; Πώς θα μοιραστεί η συγγραφή του βιβλίου; Όπως καταλαβαίνετε, μία τέτοια εργασία είναι πολύ μεγάλη και πρέπει να οργανωθεί καταλλήλως. Θα πρέπει λοιπόν να διασπαστεί σε μικρότερα τμήματα όπως για παράδειγμα κεφάλαια, ενότητες και υποενότητες του βιβλίου απλοποιώντας αρκετά την αρχική μεγάλη εργασία.

Αν και το παραπάνω παράδειγμα δεν είναι προγραμματιστικό, παρουσιάζει μία κατάσταση που υφίσταται και στην υλοποίηση προγραμμάτων. Τα προβλήματα τα οποία εξετάσαμε στα προηγούμενα κεφάλαια ήταν αρκετά απλά και η επίλυση τους ήταν εφικτή με ένα μικρό πρόγραμμα. Πώς όμως θα μπορούσαμε να υλοποιήσουμε και να διαχειριστούμε ένα πρόγραμμα το οποίο απαιτούσε χιλιάδες γραμμές κώδικα; Θα μπορούσαμε να διασπάσουμε ένα τέτοιο τεράστιο ενιαίο πρόγραμμα έτσι ώστε να μοιράσουμε την εργασία σε μία ομάδα προγραμματιστών;

Η Pascal (όπως και άλλες γλώσσες προγραμματισμού) μας δίνει την δυνατότητα να καθορίσουμε μικρές, ανεξάρτητες και αυτόνομα κατανοητές μονάδες προγράμματος αποκαλούμενες υποπρογράμματα. Κάθε μία από αυτές τις μικρές μονάδες προγράμματος πραγματοποιούν μία συγκεκριμένη εργασία και στην συνέχεια μπορούν να όλες μαζί να συνδυαστούν κατάλληλά για να αποτελέσουν το κύριο πρόγραμμα. Με άλλα λόγια, ένα μεγάλο προγραμματιστικό πρόβλημα διασπάται διαδοχικά σε μικρότερα και απλούστερα υποπροβλήματα, κάθε ένα από τα οποία επιλύεται εύκολα με ένα συγκεκριμένο υποπρόγραμμα.

Αυτή η τεχνική υλοποίησης ενός προγράμματος, της διαδοχικής δηλαδή διάσπασης σε ολοένα μικρότερα και απλούστερα υποπρογράμματα, είναι γνωστή ως τεχνική του τμηματικού προγραμματισμού (modular programming) και αποτελεί ένα από τα βασικότερα χαρακτηριστικά του δομημένου προγραμματισμού (structured programming). Πριν δούμε όμως πώς μπορούμε να δημιουργήσουμε υποπρογράμματα στην Pascal, θα εξετάσουμε τα χαρακτηριστικά και τα πλεονεκτήματα των υποπρογραμμάτων και γενικότερα του τμηματικού προγραμματισμού.

Κεφάλα ιο 6

Υποθέστε για παράδειγμα ότι μας έχει ζητηθεί να υλοποιήσουμε το κλασσικό παιχνίδι της κρεμάλας. Παρόλο που δεν είναι πολύ μεγάλο πρόγραμμα, μπορεί να διασπαστεί σε μικρότερα, απλούστερα, και ανεξάρτητα μεταξύ τους υποπρογράμματα. Μερικά από αυτά είναι η εισαγωγή ενός χαρακτήρα από τον χρήστη, ο έλεγχος αν ένας χαρακτήρας είναι γράμμα, ο έλεγχος αν ένα γράμμα υπάρχει μέσα σε μια λέξη, η καταμέτρηση των προσπαθειών του χρήστη, ο έλεγχος αν οι λανθασμένες επιλογές του χρήστη έχουν φτάσει το όριο των προσπαθειών κτλ. Όπως βλέπουμε, το αρχικό πρόβλημα έχει διασπαστεί σε αρκετά απλούστερα υποπροβλήματα. Για να δημιουργήσουμε το τελικό πρόγραμμα θα πρέπει να υλοποιήσουμε τα επί μέρους μικρότερα τμήματα (υποπρογράμματα) και να τα συνδέσουμε μεταξύ τους. Μερικά από αυτά τα τμήματα, όπως για παράδειγμα ο έλεγχος αν ένας αλφαριθμητικός χαρακτήρας είναι γράμμα, μπορούν πιθανώς να χρησιμοποιηθούν χωρίς καμία αλλαγή και στην επίλυση κάποιου άλλου προβλήματος. Έτσι, εκμεταλλευόμενοι κώδικα που έχουμε ήδη γράψει και ελέγξει, μειώνουμε την εργασία που απαιτείται για την επίλυση άλλων προβλημάτων.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 87: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.2 - Χαρακτηριστικά και Πλεονεκτήματα Υποπρογραμμάτων

Για να μπορέσει να διασπαστεί ένα πρόγραμμα σε υποπρογράμματα πρέπει πρώτα να γίνει η ανάλυση και ο σχεδιασμός του αρχικού προβλήματος σε μικρότερα υποπροβλήματα τα οποία μπορούν να αντιμετωπιστούν το ένα ανεξάρτητα από το άλλο. Τα υποπρογράμματα που θα υλοποιηθούν για να επιλύσουν τα υποπροβλήματα πρέπει να έχουν τα εξής χαρακτηριστικά:

Κάθε υποπρόγραμμα πρέπει να είναι όσο το δυνατό ανεξάρτητο και αυτόνομο. Θα πρέπει δηλαδή να σχεδιάσουμε και να υλοποιήσουμε το υποπρόγραμμά μας έτσι ώστε να είναι αυτόνομο και να μην εξαρτάται από άλλα υποπρογράμματα ή δεδομένα. Κάθε υποπρόγραμμα πρέπει να εκτελεί μία συγκεκριμένη λειτουργία. Ένα υποπρόγραμμα θα πρέπει να είναι σχετικά μικρό σε μέγεθος, εύκολα κατανοητό και να εκτελεί μία συγκεκριμένη λειτουργία. Αν εκτελεί περισσότερες αυτό συνήθως σημαίνει ότι μπορεί να διασπαστεί σε μικρότερα υποπρογράμματα.

Η σωστή χρήση του τμηματικού προγραμματισμού μας εξασφαλίζει πολλά πλεονεκτήματα:

Διευκολύνει τον προγραμματισμό σε ομάδες. Η τεχνική της τμηματοποίησης επιτρέπει τον προγραμματισμό σε ομάδες, όπου διάφοροι προγραμματιστές εργάζονται ανεξάρτητα στα υποπρογράμματά τους και στο τέλος τα συνδυάζουν όλα σε ένα ενιαίο πρόγραμμα.

Τα προγράμματα γίνονται πιο κατανοητά και ευανάγνωστα. Όπως ακριβώς ένα τμηματικός σχεδιασμός βοηθάει έναν προγραμματιστή να αντιμετωπίσει τις περιπλοκές της επίλυσης ενός προβλήματος, έτσι και ένα τμηματικά υλοποιημένο πρόγραμμα βοηθάει έναν αναγνώστη να καταλαβαίνει πώς τη λειτουργία του. Ένα καλογραμμένο υποπρόγραμμα μπορεί να γίνει αρκετά κατανοητό μόνο από το όνομά του και από κάποια σχόλια που περιγράφουν συνοπτικά την λειτουργία του.

Απομονώνει τις Διορθώσεις και τις Τροποποιήσεις. Μια μικρή αλλαγή στη λειτουργία του προγράμματος πρέπει να μπορεί να υλοποιηθεί με μόνο μια μικρή αλλαγή στον κώδικα. Εάν αυτό δεν ισχύει, είναι πιθανό ότι το πρόγραμμα δεν έχει γίνει σωστή ή αρκετή τμηματοποίηση. Για την υλοποίηση μιας μικρής αλλαγής ή μιας διόρθωσης σε ένα σωστά τμηματοποιημένο πρόγραμμα χρειάζεται συνήθως μια αλλαγή μόνο σε μερικά υποπρογράμματα, ιδιαίτερα όταν τα υποπρογράμματα είναι ανεξάρτητα μεταξύ τους και εκτελεί το κάθε ένα κάποια συγκεκριμένη λειτουργία.

Μειώνει το μεγέθους του προγράμματος. Είναι συχνό το φαινόμενο να χρειάζεται να εκτελείται μία συγκεκριμένη ομάδα εντολών σε διαφορετικά σημεία ενός προγράμματος. Αυτή η ομάδα εντολών θα μπορούσε να υλοποιηθεί ως ένα υποπρόγραμμα το οποίο θα καλούσαμε στα διαφορετικά σημεία του προγράμματος. Με αυτό τον τρόπο μειώνεται το μέγεθος του προγράμματος, εφόσον δεν επαναλαμβάνουμε τις ίδιες εντολές, όπως μειώνεται επίσης και ο χρόνος που απαιτείται για τη συγγραφή του προγράμματος και οι πιθανότητες λάθους.

Επαναχρησιμοποίηση Κώδικα. Ένα υποπρόγραμμα το οποίο έχει υλοποιηθεί σωστά (ανεξάρτητο από άλλα υποπρογράμματα και εκτελεί μία συγκεκριμένη λειτουργία) και έχει δοκιμαστεί για την ορθότητά του, μπορεί να χρησιμοποιηθεί πολύ εύκολα και σε άλλα προγράμματα. Αυτό έχει ως αποτέλεσμα την μείωση του χρόνου που απαιτείται για την συγγραφή προγραμμάτων αλλά και την επέκταση της γλώσσας προγραμματισμού.

Κεφάλα ιο 6

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 88: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.3 Παράμετροι

Όπως αναφέραμε στην εισαγωγή του κεφαλαίου, ένα υποπρόγραμμα είναι ένα αυτόνομο τμήμα εντολών το οποίο εκτελεί μία συγκεκριμένη λειτουργία. Ένα υποπρόγραμμα ενεργοποιείται ή πιο σωστά καλείται, από το κυρίως πρόγραμμα ή από ένα άλλο υποπρόγραμμα, και παρόλο που είναι ένα ανεξάρτητο και αυτόνομο τμήμα προγράμματος, πολύ συχνά πρέπει να επικοινωνεί με το υπόλοιπο πρόγραμμα. Με τον όρο “επικοινωνεί” εννοούμε ότι ένα υποπρόγραμμα μπορεί να δέχεται τιμές από το τμήμα του προγράμματος που το καλεί, όπως επίσης και να επιστρέφει κάποια αποτελέσματα σε αυτό μετά την εκτέλεσή του. Αυτές οι τιμές και τα αποτελέσματα που περνούν από το ένα υποπρόγραμμα στο άλλο λέγονται παράμετροι.

Ας δούμε δύο καθημερινά παραδείγματα. Για να φτιάξει κάποιος καφέ χρειάζεται καφέ, νερό και ζάχαρη. Αυτές είναι οι παράμετροι τις διαδικασίας "φτιάχνω καφέ". Για να έχουμε ως "αποτέλεσμα" να πάρουμε ένα κουτάκι πορτοκαλάδα από ένα μηχάνημα αναψυκτικών, θα πρέπει να δώσουμε τις κατάλληλες "παραμέτρους" δηλαδή να βάλουμε κάποια κέρματα και να πατήσουμε την επιλογή της πορτοκαλάδας. Με την ίδια ακριβώς λογική, για να εκτελεστεί σωστά ένα υποπρόγραμμα μπορεί να χρειάζεται κάποιες εξωτερικές παραμέτρους έτσι ώστε να μπορέσει να επιστρέψει κάποια αποτελέσματα.

Δεν θα εξετάσουμε ακόμα τους τρόπους με τον οποίους συντάσσουμε στην Pascal τις παραμέτρους ενός υποπρογράμματος και πώς παίρνουμε αποτελέσματα από αυτό, γιατί ο τρόπος εξαρτάται από τον τύπο του υποπρογράμματος. Θα χρησιμοποιήσουμε όμως ένα απλό, παραπλήσιο τρόπο σύνταξης παραμέτρων για να εξηγήσουμε την διαφορά μεταξύ τυπικών και πραγματικών παραμέτρων.

Παρατηρείστε το παρακάτω πρόγραμμα Parametroi. Στο τμήμα δηλώσεων του προγράμματος έχουν δηλωθεί οι μεταβλητές a και b ακεραίου τύπου και η μεταβλητή x τύπου χαρακτήρα. Στη συνέχεια υπάρχει ένα υποπρόγραμμα με το όνομα Test το σώμα του οποίου υποδηλώνεται με τις εκφράσεις "Αρχή υποπρογράμματος" και "Τέλος υποπρογράμματος". Δίπλα στο αναγνωριστικό όνομα Test υπάρχουν μέσα σε παρενθέσεις οι παράμετροι που χρησιμοποιεί το συγκεκριμένο υποπρόγραμμα. Πιο συγκεκριμένα υπάρχουν δύο μεταβλητές ακεραίου τύπου (num1, num2) και μία μεταβλητή τύπου χαρακτήρα (let); Οι μεταβλητές αυτές ονομάζονται τυπικές παράμετροι γιατί για να εκτελεστεί σωστά το υποπρόγραμμα, κατά την κλήση του θα πρέπει να οπωσδήποτε να περαστούν τρεις παράμετροι στην συγκεκριμένη σειρά (2 ακέραιοι αριθμοί και ένας χαρακτήρας).

Κεφάλα ιο 6

Η εκτέλεση του κυρίως προγράμματος ξεκινάει στην γραμμή 10 και βλέπουμε ότι δίνονται τιμές στις μεταβλητές a, b και x. Στην συνέχεια στις γραμμές 15 και 16 υπάρχουν δύο κλήσεις στο υποπρόγραμμα Test αναγράφοντας το όνομά του και περνώντας κάποιες παραμέτρους. Οι συγκεκριμένες τιμές που υπάρχουν μέσα στις παρενθέσεις κατά την κλήση του υποπρογράμματος Test στην γραμμή 15, καθώς και οι μεταβλητές που υπάρχουν στις παρενθέσεις κατά την κλήση του υποπρογράμματος Test στην γραμμή 16, ονομάζονται πραγματικές παράμετροι. Ο λόγος είναι ότι οι εντολές που υπάρχουν μέσα στο σώμα του υποπρογράμματος Test θα χρησιμοποιήσουν τις συγκεκριμένες αυτές τιμές με τις οποίες καλείται το υποπρόγραμμα.

Στην κλήση του υποπρογράμματος Test στην γραμμή 15 οι παράμετροι που περνιούνται είναι οι τιμές 6, 4, και το γράμμα 'a', ενώ στην κλήση του Test στην γραμμή 16 οι παράμετροι που περνιούνται είναι οι μεταβλητές a, b και x, που όμως αντιστοιχούν στις τιμές 7, 3, και 'g' αντίστοιχα. Και στις δύο περιπτώσεις παρατηρούμε ότι οι πραγματικές παράμετροι αντιστοιχούν στον αριθμό και στην σειρά των τυπικών παραμέτρων του υποπρογράμματος.

1 PROGRAM Parametroi; 2 var a,b : integer; 3 var x : char; 4 5 ΥΠΟΠΡΟΓΡΑΜΜΑ Test (x,y:Integer; let:Char); 6 Αρχή υποπρογράμματος 7 Εντολές υποπρογράμματος 8 Τέλος υποπρογράμματος; 9 10 begin 11 a := 7; 12 b := 3; 13 c := 'g'; 14 15 Test(6, 4, 'a'); 16 Test(a, b, c); 17 End.

Page 89: All Chapters

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 90: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.4 Διαδικασίες

Το πρώτο είδος υποπρογράμματος που θα εξετάσουμε είναι οι διαδικασίες (procedures). Μια διαδικασία μπορεί να εκτελέσει όλες τις λειτουργίες που μπορεί να εκτελέσει ένα κυρίως πρόγραμμα. Μπορεί δηλαδή να χρησιμοποιηθεί για να εκτελεστούν κάποιοι υπολογισμοί, να τυπωθούν αποτελέσματα, να εισαχθούν δεδομένα από τον χρήστη κτλ.

Ένα κύριο πρόγραμμα έχει ένα όνομα και κάποιες παραμέτρους (συνήθως input και output αρχεία) οι οποίες εξασφαλίζουν επικοινωνία με το εξωτερικό περιβάλλον του υπολογιστή. Παρόμοια, μία διαδικασία έχει και αυτή ένα όνομα καθώς και παραμέτρους οι οποίες χρησιμοποιούνται για μετάδοση και λήψη δεδομένων με το υπόλοιπο πρόγραμμα. Υπάρχει φυσικά περίπτωση να μην υπάρχουν παράμετροι, γι αυτό και η παρένθεση με τη λίστα των τυπικών παραμέτρων είναι προαιρετική.

Στην συνέχεια, όπως και σε ένα κύριο πρόγραμμα δηλώνουμε τις μεταβλητές που θα χρησιμοποιήσουμε, έτσι και σε μια διαδικασία μετά την επικεφαλίδα ακολουθεί το τμήμα δηλώσεων στο οποίο δηλώνονται οι τοπικές μεταβλητές που θα χρησιμοποιηθούν από την διαδικασία. Τέλος, οι εντολές που εκτελεί η διαδικασία περικλείονται από τις δεσμευμένες λέξεις BEGIN και END όπως ακριβώς και οι εντολές ενός κύριου προγράμματος. Μια μικρή διαφορά είναι ότι η λέξη END ακολουθείται από ερωτηματικό (;) και όχι με τελεία όπως συμβαίνει με ένα κυρίως πρόγραμμα.

Κεφάλα ιο 6

Όπως βλέπουμε δεξιά, η τυπική σύνταξη μίας διαδικασίας μοιάζει αρκετά με την δομή ενός κυρίου προγράμματος. Όπως και ένα κύριο πρόγραμμα ξεκινάει με την επικεφαλίδα χρησιμοποιώντας την δεσμευμένη λέξη PROGRAM, έτσι και μία διαδικασία ξεκινάει με μία επικεφαλίδα με την δεσμευμένη λέξη PROCEDURE.

PROCEDURE <όνομα_διαδικασίας> (<παράμετροι> : <τύπος>); <Τμήμα δηλώσεων τοπικών μεταβλητών> BEGIN <Εντολές διαδικασίας> END;

Η υλοποίηση διαδικασιών γίνεται στο τμήμα δηλώσεων του κυρίως προγράμματος όπως φαίνεται στην εικόνα δεξιά όπου υπάρχουν δύο διαδικασίες Proc1 και Proc2. Επίσης, μια διαδικασία εκτελείται όταν καλείται από το κύριο πρόγραμμα ή μια άλλη διαδικασία. Η κλήση μιας διαδικασίας πραγματοποιείται με το όνομα της και αν υπάρχουν παράμετροι, ακολουθούν μέσα σε παρενθέσεις. Όταν καλείται μία διαδικασία, η ροή της εκτέλεσης του προγράμματος μεταφέρεται στις εντολές που υπάρχουν στο σώμα της διαδικασίας. Μετά το τέλος της διαδικασίας η εκτέλεση του προγράμματος συνεχίζεται από την εντολή που ακολουθεί. Στο παράδειγμα δεξιά, η εκτέλεση ξεκινά με την πρώτη εντολή του κυρίου προγράμματος και στην συνέχεια ακολουθεί η κλήση στην διαδικασία Proc (χωρίς παραμέτρους). Όταν ολοκληρωθούν οι εντολές που βρίσκονται στο σώμα της διαδικασίας Proc1, το πρόγραμμα συνεχίζει με την δεύτερη εντολή του κυρίου προγράμματος. Κατόπιν, καλείται η διαδικασία Proc2, (με παράμετρο τον αριθμό 5) και εκτελούνται οι εντολές που βρίσκονται μέσα στην διαδικασία Proc2, οι οποίες όταν ολοκληρωθούν το πρόγραμμα εκτελεί την τρίτη εντολή του κυρίου προγράμματος και τερματίζει.

Θα πρέπει να τονίσουμε ότι μια διαδικασία Α μπορεί να καλέσει μια άλλη διαδικασία Β εφόσον η διαδικασία Β έχει δηλωθεί πριν από την διαδικασία Α. Στο παράδειγμα δεξιά, μέσα στις εντολές της διαδικασίας Proc1 δεν θα μπορούσαμε να έχουμε μία κλήση στην διαδικασία Proc2, γιατί η Proc2 εμφανίζεται μετά την Proc1.

Στην συνέχεια θα εξετάσουμε διαδικασίες που χρησιμοποιούν τοπικές και καθολικές μεταβλητές, καθώς και διαδικασίες που χρησιμοποιούν παραμέτρους με τιμή και αναφορά. Θα ξεκινήσουμε όμως με την πιο απλή μορφή διαδικασιών στις οποίες δεν χρησιμοποιούνται παράμετροι.

Page 91: All Chapters

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 92: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.4.1 - Απλές Διαδικασίες

Στην πιο απλή της μορφή, μια διαδικασία δεν δέχεται παραμέτρους και ούτε χρησιμοποιεί τοπικές (local) ή καθολικές (global) μεταβλητές. Μία τέτοια περίπτωση είναι όταν θέλουμε να τυπώσουμε στην οθόνη κάποια συγκεκριμένα μηνύματα ή κάποιο μενού επιλογών όπως συμβαίνει με την διαδικασία DisplayMenu που βλέπουμε παρακάτω.

Στο παρακάτω πρόγραμμα Proc1 μπορούμε να δούμε την χρήση της διαδικασίας Proc1 μέσα σε ένα ολοκληρωμένο πρόγραμμα καθώς και το αποτέλεσμα της εκτέλεσης του προγράμματος.

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 6 . 1

Κεφάλα ιο 6

PROCEDURE DisplayMenu; BEGIN writeln('1. Epexergasia'); writeln('2. Antigrafi'); writeln('3. Apothikefsi'); writeln('4. Ektyposi'); writeln('Epilekste mia apo tis parapano epiloges:'); END;

PROGRAM Proc1 (output); PROCEDURE DisplayMenu; BEGIN writeln('1. Epexergasia'); writeln('2. Antigrafi'); writeln('3. Apothikefsi'); writeln('4. Ektyposi'); writeln('Epilekste mia apo tis parapano epiloges:'); END; BEGIN writeln('Prin thn klhsh tis diadikasias'); DisplayMenu; writeln('Meta thn klhsh tis diadikasias'); END.

Αποτέλεσμα προγράμματος Proc1

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 93: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.4.2 Διαδικασίες με Τοπικές και Καθολικές Μεταβλητές

Όπως αναφέραμε στην ενότητα 6.4, μια διαδικασία μπορεί να ορίζει και να χρησιμοποιεί της δικές της τοπικές (local) μεταβλητές οι οποίες είναι κατανοητές και προσπελάσιμες μόνο μέσα στο σώμα της συγκεκριμένης διαδικασίας. Στο παρακάτω πρόγραμμα ProcLocal υπάρχει μια διαδικασία με το όνομα athroisma στην οποία ορίζουμε και χρησιμοποιούμε τρεις μεταβλητές ακεραίου τύπου (num1, num2 και sum). Οι τρεις αυτές μεταβλητές είναι προσπελάσιμες μόνο μέσα στην διαδικασία athroisma. Αν επιχειρούσαμε να εκτελέσουμε την εντολή writeln(num1) μέσα στο κυρίως πρόγραμμα, για παράδειγμα μετά την κλήση στην διαδικασία athroisma, ο μεταγλωττιστής θα μας ενημέρωνε ότι η μεταβλητή num1 δεν αναγνωρίζεται και άρα η μεταγλώττιση θα αποτύγχανε.

Σε αντίθεση με τις τοπικές μεταβλητές, οι καθολικές (global) μεταβλητές είναι αυτές που δηλώνονται στο τμήμα δηλώσεων του κυρίως προγράμματος και είναι ορατές και προσπελάσιμες σ’ ολόκληρο το πρόγραμμα και φυσικά και από οποιαδήποτε διαδικασία. Στο παρακάτω παράδειγμα, το πρόγραμμα ProcGlobal είναι μια παραλλαγή του προηγούμενου προγράμματος ProcLocal έτσι ώστε να χρησιμοποιούνται καθολικές μεταβλητές.

Κεφάλα ιο 6

PROGRAM ProcLocal (input, output); PROCEDURE athroisma; var num1, num2, sum : Integer; BEGIN write('Eisagete ton prwto arithmo: '); readln(num1); write('Eisagete ton deftero arithmo: '); readln(num2); sum := num1 + num2; writeln('Athroisma: ', sum ); END; BEGIN athroisma; END.

Page 94: All Chapters

Πιο συγκεκριμένα, βλέπουμε ότι οι μεταβλητές ακεραίου τύπου num1, num2 και sum έχουν δηλωθεί στο τμήμα δηλώσεων του κύριου προγράμματος και άρα είναι προσπελάσιμες από παντού.

Ξεκινώντας την εκτέλεση του προγράμματος, βλέπουμε ότι στην πρώτη εντολή η μεταβλητή sum παίρνει την τιμή μηδέν και ακολουθεί η εντολή η οποία τυπώνει την τιμή της μεταβλητής sum στην οθόνη. Στην συνέχεια καλείται η διαδικασία athroisma και η εκτέλεση του προγράμματος μεταφέρεται στις εντολές που υπάρχουν μέσα στο σώμα της διαδικασίας. Παρατηρούμε λοιπόν ότι οι μεταβλητές num1 και num2 παίρνουν τιμές από τον χρήστη και η μεταβλητή sum ορίζεται να είναι το άθροισμα των τιμών των μεταβλητών num1 και num2. Κατόπιν, τυπώνονται οι τιμές των μεταβλητών num1 και num2 και παρατηρούμε από το αποτέλεσμα του προγράμματος ότι οι τιμές που πήραν από τον χρήστη μέσα στην διαδικασία athroisma, είναι ορατές από το κυρίως πρόγραμμα. Τέλος τυπώνεται η καινούργια τιμή της μεταβλητής sum (το άθροισμα των τιμών των μεταβλητών num1 και num2).

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 6 . 2

PROGRAM ProcGlobal (input, output); var num1, num2, sum : Integer; PROCEDURE athroisma; BEGIN write('Eisagete ton prwto arithmo: '); readln(num1); write('Eisagete ton deftero arithmo: '); readln(num2); sum := num1 + num2; END; BEGIN sum := 0; writeln('Sum=', sum); athroisma; writeln('Grapsate: ', num1, ' kai ', num2); writeln('Sum=', sum); END.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 95: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.4.3 - Διαδικασίες με Παραμέτρους Τιμής

Tο σημαντικό γεγονός όταν μια παράμετρος περνάει με τιμή, είναι ότι στην διαδικασία μεταβιβάζεται ένα αντίγραφο της τιμής της πραγματικής παραμέτρου. Έτσι λοιπόν, η διαδικασία που κλήθηκε δεν έχει πρόσβαση στην πραγματική μεταβλητή και έτσι δεν μπορεί να την τροποποιήσει. Κατά την κλήση μιας διαδικασίας και πριν από την είσοδο στο σώμα της, δεσμεύεται μία νέα περιοχή μνήμης για κάθε παράμετρο τιμής και αντιγράφονται εκεί οι πραγματικές παράμετροι. Η τιμή μιας μεταβλητής δεν επηρεάζεται μετά τον τερματισμό της διαδικασίας ενώ ο χώρος που δεσμεύτηκε για την αντιγραφή ελευθερώνεται.

Στην διαδικασία Ypologismoi του προγράμματος PrakseisD, οι μεταβλητές x και y είναι οι πραγματικές παράμετροι ενώ οι μεταβλητές num1 και num2 που βρίσκονται στην επικεφαλίδα της διαδικασίας Ypologismoi είναι οι τυπικές παράμετροι. Όταν καλούμε την διαδικασία Ypologismoi(x,y) και περνάμε τις μεταβλητές x και y, δεν μεταβιβάζονται οι συγκεκριμένες μεταβλητές αλλά αντίγραφα των τιμών των μεταβλητών αυτών. Με άλλα λόγια, οι τυπικές παράμετροι num1 και num2 παίρνουν αρχικές τιμές από τις πραγματικές παραμέτρους x και y όταν καλείται η διαδικασία. Η αλλαγή των τιμών των παραμέτρων x και y μέσα στη διαδικασία δεν επηρεάζουν τις τιμές των πραγματικών παραμέτρων.

Το αρχείο PassByValue.pps το οποίο χρησιμοποιεί το πρόγραμμα PassValue.pas εξηγεί βήμα προς βήμα την διαδικασία που ακολουθείται όταν σε μια διαδικασία υπάρχει μεταβίβαση παραμέτρων με τιμή.

Κεφάλα ιο 6

Όπως είχαμε αναπτύξει στην ενότητα 6.2, είναι πολύ πιθανό να χρειάζεται να υπάρχει επικοινωνία μεταξύ των διαφόρων υποπρογραμμάτων και του κυρίου προγράμματος, και ότι αυτό επιτυγχάνετε με την χρήση παραμέτρων. Υπάρχουν δύο τρόποι να περνάμε παραμέτρους σε μια διαδικασία: με τιμή και με αναφορά. Στην ενότητα αυτή θα εξετάσουμε το πέρασμα παραμέτρων με τιμή.

Ας υποθέσουμε ότι ένα πρόγραμμα χρειάζεται σε πολλά σημεία του να εκτελεί τις ακόλουθες πράξεις: να βρίσκει και να τυπώνει στην οθόνη το άθροισμα, το υπόλοιπο και το γινόμενο δύο θετικών ακεραίων αριθμών. Αν και οι συγκεκριμένες πράξεις είναι εύκολες, το γεγονός ότι χρειάζεται να εκτελούνται σε πολλά σημεία του προγράμματος υποδηλώνει ότι θα πρέπει να υλοποιήσουμε μία διαδικασία έτσι ώστε να μην επαναλαμβάνουμε τις ίδιες εντολές. Ας δούμε λοιπόν το παρακάτω πρόγραμμα PrakseisD το οποίο υλοποιεί μία τέτοια διαδικασία.

Όπως βλέπουμε, το πρόγραμμα χρησιμοποιεί δύο καθολικές (global) μεταβλητές (x,y) τύπου ακέραιου αριθμού στις οποίες ο χρήστης δίνει τιμές μέσα στο κυρίως πρόγραμμα. Στη συνέχεια, καλείται η διαδικασία Ypologismoi στην οποία περνάμε τις μεταβλητές x και y. Στην συνέχεια εκτελείται η διαδικασία μέσα στην οποία υπολογίζεται το άθροισμα, το υπόλοιπο και το γινόμενο των δύο ακεραίων αριθμών. Σε αυτή την εικόνα βλέπουμε το αποτέλεσμα του προγράμματος αν δώσουμε τις τιμές 8 και 4 στις μεταβλητές x και y αντίστοιχα.

Η συγκεκριμένη μέθοδος διοχέτευσης παραμέτρων στην διαδικασία Ypologismoi ονομάζεται Πέρασμα Παραμέτρων με Τιμή. Στην συγκεκριμένη μέθοδο, στην επικεφαλίδα της διαδικασίας αναγράφονται μέσα σε παρενθέσεις οι παράμετροι που διοχετεύονται καθώς και ο τύπος των παραμέτρων. Μερικά ακόμη παραδείγματα είναι τα εξής:

program PrakseisD (input, output); var x,y : integer; procedure Ypologismoi(num1, num2 : integer); var sum, ypo, gin : integer; begin sum := num1 + num2; ypo := num1 - num2; gin := num1 * num2; writeln('To athroisma einai: ', sum); writeln('To ypoloipo einai: ', ypo); writeln('To ginomeno einai: ', gin); end; begin write('Eisagete ton prwto arithmo: '); readln(x); write('Eisagete ton deftero arithmo: '); readln(y); Ypologismoi(x,y); end.

Procedure ProcName1 (x,y,z : integer); Procedure ProcName2 (x : integer ; y : char); Procedure ProcName3 (x : integer ; y : char; z : real); Procedure ProcName4 (a,b : integer ; x : char ; y,z : real);

Παρατηρούμε ότι αν υπάρχουν περισσότερες από μία μεταβλητές τότε χωρίζονται με κόμματα, μετά το σύμβολο άνω-κάτω τελεία (:) και μετά ο τύπος των μεταβλητών. Αν θέλουμε να έχουμε μεταβλητές διαφορετικών τύπων τότε αυτές διαχωρίζονται μέσα στις παρενθέσεις με τοερωτηματικό (;).

Page 96: All Chapters

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 6 . 3

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 97: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.4.4 Διαδικασίες με Παραμέτρους Αναφοράς

Στην προηγούμενη ενότητα είδαμε τον τρόπο με τον οποίο μπορούμε να μεταβιβάσουμε δεδομένα μέσα σε μία διαδικασία περνώντας παραμέτρους με τιμή. Τι γίνεται όμως στην περίπτωση που θέλουμε να πάρουμε κάποια αποτελέσματα από την διαδικασία; Πώς μπορεί μια διαδικασία να γυρίσει δεδομένα πίσω στο πρόγραμμα που την κάλεσε; Υπάρχει τρόπος να αλλάξουν οι τιμές των πραγματικών μεταβλητών μετά την κλήση της διαδικασίας; Τις απαντήσεις σε όλα αυτά τα ερωτήματα θα τις εξετάσουμε σε αυτήν την ενότητα στην οποία θα δούμε τον δεύτερο τρόπο μεταβίβασης παραμέτρων που ονομάζεται πέρασμα παραμέτρων με αναφορά.

Ας υποθέσουμε ότι ένα πρόγραμμα χρειάζεται σε πολλά σημεία του να ανταλλάσσει τις τιμές δύο μεταβλητών (αν δηλαδή x=5 και y=8 να ανταλλάσσονται σε x=8 και y=5). Θα πρέπει λοιπόν να υλοποιήσουμε μία διαδικασία η οποία θα πρέπει να μπορεί να καλείται από οποιοδήποτε τμήμα του προγράμματός μας και να μπορεί να ανταλλάσσει τις τιμές των δύο μεταβλητών. Το παρακάτω πρόγραμμα Swap περιέχει μία τέτοια διαδικασία με το όνομα SwapValues.

Το αρχείο PassByReference.pps το οποίο χρησιμοποιεί το πρόγραμμα PassReference.pas εξηγεί βήμα προς βήμα την διαδικασία που ακολουθείται όταν σε μια διαδικασία υπάρχει μεταβίβαση παραμέτρων με αναφορά. Ας δούμε όμως ένα ακόμα παράδειγμα παρόμοιο με αυτό που είδαμε στην ενότητα 6.4.3.

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 6 . 4

Κεφάλα ιο 6

Στο σώμα του κυρίως προγράμματος βλέπουμε ότι υπάρχει μόνο μία κλήση σε μια απλή διαδικασία με το όνομα TestDiadikasia. Μέσα στην TestDiadikasia ζητάμε από τον χρήστη να εισάγει δύο ακέραιους αριθμούς τους οποίους αποθηκεύουμε στις τοπικές μεταβλητές x και y. Η διαδικασία στην συνέχεια τυπώνει στην οθόνη τις τιμές των μεταβλητών αυτών πριν και μετά την κλήση στην διαδικασία SwapValues. Παρατηρείστε ότι στην SwapValues περνάμε ως πραγματικές παραμέτρους τις τοπικές μεταβλητές x και y που όμως αλλάζουν τιμές μετά την εκτέλεση της SwapValues, όπως φαίνεται και σε αυτή την εικόνα στην οποία απεικονίζεται το αποτέλεσμα του προγράμματος.

Στην διαδικασία SwapValues γίνεται μεταβίβαση παραμέτρων με αναφορά. Όταν σε μία διαδικασία εισάγουμε μεταβλητές χρησιμοποιώντας πέρασμα με αναφορά, τότε στην επικεφαλίδα της διαδικασίας χρησιμοποιούμε την δεσμευμένη λέξη var πριν τα ονόματα των παραμέτρων. Στο πέρασμα με αναφορά, κατά την κλήση της διαδικασίας δίνονται σε αυτήν οι διευθύνσεις των πραγματικών παραμέτρων και αντιστοιχούνται σε αυτές οι τυπικές παράμετροι. Έτσι, υπάρχει αλληλεπίδραση ανάμεσα στις πραγματικές και στις τυπικές παραμέτρους.

Στο παράδειγμά μας, η διαδικασία SwapValues έχει απ' ευθείας πρόσβαση στις πραγματικές παραμέτρους x και y, γιατί αντί για αντίγραφο των τιμών των παραμέτρων x και y, μεταβιβάζονται οι διευθύνσεις τους. Έτσι λοιπόν, οι τυπικές παράμετροι num1 και num2 αντιστοιχούν στις διευθύνσεις των πραγματικών παραμέτρων x και y, και η τροποποίησή τους είναι ορατή στο καλούν πρόγραμμα. Με αυτό τον τρόπο επιτυγχάνουμε να παίρνουμε τα αποτελέσματα των υπολογισμών της διαδικασίας.

program Swap (input, output); procedure SwapValues(var num1,num2 : integer); var temp : integer; begin temp := num1; num1 := num2; num2 := temp; end; procedure TestDiadikasia; var x, y : integer; begin write('Eisagete ton 1o arithmo: '); readln(x); write('Eisagete ton 2o arithmo: '); readln(y); writeln('Dwsate x=',x,' kai y=',y); SwapValues(x,y); writeln('Meta thn diadikasia x=',x,' kai y=',y); end; begin TestDiadikasia; end.

Page 98: All Chapters

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 99: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.5 Συναρτήσεις

Έχοντας τελειώσει την εξέταση των διαδικασιών, μπορούμε να προχωρήσουμε στο δεύτερο είδος υποπρογράμματος που προσφέρει η Pascal: τις συναρτήσεις (functions). Η ουσιαστική διαφορά των συναρτήσεων με τις διαδικασίες είναι ότι οι συναρτήσεις επιστρέφουν πάντοτε μία τιμή στο πρόγραμμα ή στο υποπρόγραμμα που τις κάλεσε. Η τιμή αυτή ονομάζεται αποτέλεσμα της συνάρτησης.

Κάποιες προκαθορισμένες μαθηματικές συναρτήσεις που παρέχονται από την Pascal είχαμε συναντήσει στην ενότητα 2.8. Αν για παράδειγμα θέλαμε να βρούμε την τετραγωνική ρίζα του 9, θα καλούσαμε την προκαθορισμένη συνάρτηση της Pascal Sqrt(9) η οποία θα επέστρεφε ως αποτέλεσμα την τιμή 3, ενώ αν θέλαμε να υπολογίσουμε το τετράγωνο του 9, θα καλούσαμε την προκαθορισμένη συνάρτηση της Pascal Sqr(9) η οποία θα επέστρεφε ως αποτέλεσμα την τιμή 81.

Function είναι μία δεσμευμένη λέξη η οποία ακολουθείται από το όνομα της συνάρτησης στην συνέχεια ακολουθούν οι παράμετροι που προαιρετικά μπορεί να χρησιμοποιούνται από μια συνάρτηση. Μέσα σε παρενθέσεις λοιπόν υπάρχουν οι τυπικές παράμετροι καθώς και ο τύπος δεδομένων τους. Στο τέλος της επικεφαλίδας μιας συνάρτησης υπάρχει ο τύπος του αποτελέσματος που θα επιστρέψει η συνάρτηση Το υπόλοιπο μέρος του ορισμού μιας συνάρτησης είναι ίδιο με ένα κανονικό πρόγραμμα εκτός του ότι το τελευταίο END ακολουθείται από ερωτηματικό και όχι τελεία. Οι εντολές που υπάρχουν μέσα στο σώμα της συνάρτησης (μετά το BEGIN) είναι εκείνες που χρειάζονται για τον υπολογισμό της τιμής που θα επιστέψει. Για να επιστρέψει μία συνάρτηση μία τιμή στο πρόγραμμα που την καλεί, πρέπει να καταχωρείται στο όνομά της το τελικό αποτέλεσμα. Πρέπει λοιπόν να υπάρχει μία εντολή της μορφής όνομα_συνάρτησης := παράσταση

Όπως συμβαίνει και με τις διαδικασίες, η υλοποίηση των συναρτήσεων γίνεται στο τμήμα δηλώσεων του κυρίως προγράμματος. Επίσης, μια συνάρτηση εκτελείται όταν καλείται από το κύριο πρόγραμμα, μια διαδικασία ή μια άλλη συνάρτηση. Η κλήση μιας συνάρτησης πραγματοποιείται με το όνομα της και αν υπάρχουν παράμετροι, ακολουθούν μέσα σε παρενθέσεις. Η εκτέλεση του προγράμματος διακόπτεται και εκτελούνται οι εντολές της συνάρτησης που καλείται. Μετά το τέλος της συνάρτησης η εκτέλεση του προγράμματος συνεχίζεται από την εντολή που ακολουθεί. Στην επόμενη ενότητα εξετάζουμε κάποια παραδείγματα συναρτήσεων και την χρήση τους μέσα σε ένα πρόγραμμα.

Κεφάλα ιο 6

Μία συνάρτηση, λοιπόν, είναι ένα είδος υποπρογράμματος το οποίο επεξεργάζεται κάποια δεδομένα με σκοπό να υπολογίσει και να επιστρέψει ένα συγκεκριμένο αποτέλεσμα. Η τυπική σύνταξη μιας συνάρτησης απεικονίζεται δεξιά στην οποία:

FUNCTION <όνομα_συνάρτησης> (<παραμέτροι>:<τύπος>):<τύπος_αποτελέσματος>; <Τμήμα δηλώσεων τοπικών μεταβλητών> BEGIN <Εντολές συνάρτησης> <όνομα_συνάρτησης> := <παράσταση> END;

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 100: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.5.1 Παραδείγματα Συναρτήσεων

Παράδειγμα 1ο: Να γράψετε ένα πρόγραμμα το οποίο χρησιμοποιεί μία συνάρτηση για να υπολογίζει το εμβαδόν ενός τετραγώνου.

Το εμβαδόν ενός τετραγώνου υπολογίζεται με τον τύπο πλευρά*πλευρά. Παρατηρείστε ότι το αποτέλεσμα αυτού του υπολογισμού ανατίθεται στο όνομα της συνάρτησης EmbadoTetragwnou.

Παράδειγμα 2ο: Να γράψετε ένα πρόγραμμα το οποίο χρησιμοποιεί μία συνάρτηση για να προσδιορίσει τον μεγαλύτερο από τρεις ακεραίους αριθμούς.

Κεφάλα ιο 6

Στο τμήμα δηλώσεων του προγράμματος Embadon δεξιά, υπάρχουν δύο μεταβλητές ακεραίου τύπου (num και result) και μία συνάρτηση με το όνομα EmbadoTetragwnou. Το πρόγραμμα ξεκινάει την εκτέλεση του ζητώντας από τον χρήστη να εισάγει έναν ακέραιο αριθμό ο οποίος αντιπροσωπεύει το μήκος της μιας πλευράς του τετραγώνου. Στην συνέχεια καλείται η συνάρτηση EmbadoTetragwnou η οποία δέχεται ως πραγματική παράμετρο τον αριθμό που εισήγαγε ο χρήστης (μεταβλητή num) και επιστρέφει ως αποτέλεσμα το εμβαδόν του τετραγώνου το οποίο αποθηκεύεται στην μεταβλητή result. Τέλος, ακολουθεί η τύπωση του αποτελέσματος στην οθόνη.

Κατά την κλήση την συνάρτησης EmbadoTetragwnou η εκτέλεση του προγράμματος μεταφέρεται στην συγκεκριμένη συνάρτηση η οποία όπως βλέπουμε στην επικεφαλίδα, δέχεται ως τυπική παράμετρο τη μεταβλητή plevra τύπου ακεραίου αριθμού και επιστρέφει ως αποτέλεσμα μία τιμή επίσης ακεραίου αριθμού.

Program Embadon (input, output); var num, result : integer; function EmbadoTetragwnou(plevra : integer) : integer; begin EmbadoTetragwnou := plevra * plevra; end; Begin write('Eisagete to mikos ths plevras tou tetragwnou: '); readln(num); result := EmbadoTetragwnou(num); writeln('To embadon einai: ', result); End.

Program MaxOfThree (input, output); var ar1, ar2, ar3 : integer; function Maximum(num1, num2, num3 : integer) : integer; var maxnum : integer; begin if ( num1 > num2 ) then maxnum := num1 else maxnum := num2; if ( num3 > maxnum ) then maxnum := num3; Maximum := maxnum; end;

Page 101: All Chapters

AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 6 . 5 AΣΚΗΣΗ ΑΥΤΟΑΞΙΟΛΟΓΗΣΗΣ 6 . 6

Begin write('Eisagete ton 1o akeraio arithmo: '); readln(ar1); write('Eisagete ton 2o akeraio arithmo: '); readln(ar2); write('Eisagete ton 3o akeraio arithmo: '); readln(ar3); writeln('O megalyteros arithmos einai to: ', Maximum(ar1,ar2,ar3)); End.

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου

Page 102: All Chapters

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

6.6 Ομοιότητες και Διαφορές Συναρτήσεων και Διαδικασιών

Κάποιες ομοιότητες που μπορούμε να διακρίνουμε μεταξύ των διαδικασιών και των συναρτήσεων είναι οι εξής:

Και οι δύο είναι υποπρογράμματα δηλαδή αυτόνομες μονάδες προγράμματος που εκτελούν μια συγκεκριμένη εργασία.

Και οι δύο δηλώνονται στο τμήμα δηλώσεων του προγράμματος.

Μέσα σε μια διαδικασία ή μια συνάρτηση μπορούμε να καλέσουμε άλλες διαδικασίες ή συναρτήσεις.

Όπως οι διαδικασίες έτσι και οι συναρτήσεις έχουν πρόσβαση σε καθολικές (global) μεταβλητές του προγράμματος.

Όπως και με τις διαδικασίες, οι τοπικές μεταβλητές που χρησιμοποιούνται από μία συνάρτηση είναι προσπελάσιμες μόνο μέσα στην συνάρτηση.

Και στα δύο είδη υποπρογραμμάτων, η μεταβίβαση παραμέτρων είναι προαιρετική.

Μπορούμε επίσης να διακρίνουμε τις παρακάτω σημαντικές διαφορές:

Μία συνάρτηση επιστρέφει πάντα μία μόνο τιμή ενώ μία διαδικασία μπορεί να επιστρέφει πολλές ή και καμία τιμή.

Σε μία συνάρτηση δεν έχει νόημα να περνάμε παραμέτρους αναφοράς (ενότητα 6.4.4) εφόσον μία συνάρτηση επιστρέφει μία μόνο τιμή. Όλες οι παράμετροι που δέχεται μία συνάρτηση πρέπει να είναι παράμετροι τιμής (ενότητα 6.4.3).

Στη δήλωση της συνάρτησης περιλαμβάνεται και ο τύπος της τιμής που υπολογίζει (το αποτέλεσμα), ενώ στη διαδικασία κάτι τέτοιο δεν έχει νόημα.

Μία διαδικασία καλείται γράφοντας το όνομά της σαν εντολή μέσα στο πρόγραμμα, ενώ η κλήση μίας συνάρτησης μπορεί να γίνει και μέσα σε μια παράσταση.

Κεφάλα ιο 6

Προηγούμενη Ενότητα Πίνακας Περιεχομένων Κεφαλαίου 6 Επόμενη Ενότητα © Η. Παρασκάκης - Θ. Χατζηαποστόλου