Κωδικοποίηση δένδρων απόφασης



Σχετικά έγγραφα
2.2.3 Η εντολή Εκτύπωσε

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

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

scanf() scanf() stdin scanf() printf() int float double %lf float

ΗΜΙΟΥΡΓΙΑ ΠΑΙΧΝΙ ΙΟΥ ΣΤΟ SCRATCH ΒΗΜΑ ΠΡΟΣ ΒΗΜΑ

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

3 Αναδροµή και Επαγωγή

Κεφάλαιο 10 ο Υποπρογράµµατα

2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

ζωγραφίζοντας µε τον υπολογιστή

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Σκοπός. Αλγεβρικοί και Λογικοί Υπολογισμοί στη PASCAL

ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ Γ ΤΑΞΗ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

Πειραματιζόμενοι με αριθμούς στο περιβάλλον του Microworlds Pro: διαθεματική προσέγγιση περί «πολλαπλασίων και διαιρετών»

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

a = 10; a = k; int a,b,c; a = b = c = 10;

Κεφάλαιο 5ο: Εντολές Επανάληψης

for for for for( . */

Επιµέλεια Θοδωρής Πιερράτος

3. Σηµειώσεις Access. # Εισαγωγή ψηφίου ή κενού διαστήµατος. Επιτρέπονται τα ση-

Α. Ερωτήσεις Ανάπτυξης

HY118- ιακριτά Μαθηµατικά

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

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

Ενότητα 1: «Εισαγωγή στην Αλγοριθμική και τον Προγραμματισμό. Απλές ασκήσεις με γλώσσα Pascal»

επιµέλεια Θοδωρής Πιερράτος

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

ΚΕΦΑΛΑΙΟ 1ο 3ο. ΚΕΦΑΛΑΙΟ 5ο 6ο. ΚΕΦΑΛΑΙΟ 7ο. Δομημένος Προγραμματισμός - Γενικές Ασκήσεις Επανάληψης

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

Επαναληπτικό ιαγώνισµα Πληροφορικής Γ Γυµνασίου Γιώργος Λιακέας Σχολικός Σύµβουλος Πληροφορικής Ερωτήσεις

ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραµµατισµός στην Basic

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

Outlook Express-User Instructions.doc 1

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

BloodShed Dev C++ Οδηγίες Χρήσης (Συγγραφέας: Πάρις Πολύζος)

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

ιαφάνειες παρουσίασης #4

Γενικές Παρατηρήσεις. Μη Κανονικές Γλώσσες - Χωρίς Συµφραζόµενα (1) Το Λήµµα της Αντλησης. Χρήση του Λήµµατος Αντλησης.

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Ψευδοκώδικας. November 7, 2011

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

ΗΜΟΚΡΙΤΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΡΑΚΗΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΟΡΓΑΝΩΣΗΣ. Ο ΗΓΙΕΣ ΧΡΗΣΗΣ ΕΦΑΡΜΟΓΗΣ e-university/ classweb

Παιδαγωγική προσέγγιση: Πρόταση για την διδασκαλία της έννοιας αλγόριθµός στο περιβάλλον MicroWorlds Pro

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

Επιµέλεια Θοδωρής Πιερράτος

ΠΕΡΙΕΧΟΜΕΝΑ. Μονοδιάστατοι πίνακες Πότε πρέπει να χρησιμοποιούνται πίνακες Πολυδιάστατοι πίνακες Τυπικές επεξεργασίες πινάκων

char name[5]; /* define a string of characters */

Pascal, απλοί τύποι, τελεστές και εκφράσεις

ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ Η/Υ

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δοµές Δεδοµένων και Αλγόριθµοι - Εισαγωγή

(GNU-Linux, FreeBSD, MacOsX, QNX

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 10 : Εντολές επιλογής και αποφάσεων

Κεφάλαιο 9 : Βασικές εντολές

ΠΕΡΙΕΧΟΜΕΝΑ. Εντολές επιλογής Εντολές επανάληψης

Microsoft Excel Κεφάλαιο 1. Εισαγωγή. Βιβλίο εργασίας

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Κεφάλαιο 14: Συμβουλές προς έναν νέο προγραμματιστή

Κεφάλαιο 7 ο Βασικές Έννοιες Προγραμματισμού (σελ )

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59

η σύνθεση ενός υπολογιστή

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο

Εισαγωγή στον Προγραµµατισµό. Σύντοµες Σηµειώσεις. Γιώργος Μανής

Πώς μπορούμε να δημιουργούμε γεωμετρικά σχέδια με τη Logo;

Ανάπτυξη και Σχεδίαση Λογισμικού

lab5 -Ο κώδικάς σου είναι σωστός αλλά από εδώ και στο εξής προσπάθησε να βάζεις σχόλια στην µορφή που ζητάει το φυλλάδιο

Προγραµµατισµός 2 The shell

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

Τεχνικές Αναπαράστασης αλγορίθµων Ψευδοκώδικας Διάγραµµα Ροής Αλγοριθµικές δοµές (Ακολουθία Επιλογή Επανάληψη)

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ττιαογή και επανάληψη

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Οι δείκτες στη γλώσσα C

Μαλούτα Θεανώ Σελίδα 1

ΠΕΡΙΕΧΟΜΕΝΑ. Περιγραφή της αρχικής οθόνης κάθε τάξης α. Εικονίδια επιλογής θεµατικών ενοτήτων β. Εικονίδια διαφυγής...

Εντολές της LOGO (MicroWorlds Pro)

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Transcript:

1 Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης 1.1 Καλά νέα (A) Παλαιότερα, πριν από την εµφάνιση των υπολογιστών,η διεκπεραίωση κάθε εργασίας απαιτούσε την εκτέλεσή της από εµάς τους ίδιους. Σήµερα, όµως, µε τους υπολογιστές, µπορούµε πλέον να εκτελούµε πολλές εργασίες απλώς καταγράφοντας τις ενέργειες που πρέπει να γίνουν. Την υλοποίηση των ενεργειών αναλαµβάνει να την φέρει σε πέρας ένας υπολογιστής. Για παράδειγµα, εάν θέλουµε να προσθέσουµε αριθµούς, να αναζητήσουµε κάποια δεδοµένα, να συντάξουµε και να εκτυπώσουµε ένα έγγραφο, να στείλουµε µηνύµατα σε συναδέλφους, να ελέγξουµε µια βιοµηχανική διεργασία, ή να φέρουµε σε πέρας άλλες εργασίες, µπορούµε να συντάξουµε ένα σύνολο οδηγιών, δηλαδή µια ακολουθία από ενέργειες που πρέπει να γίνουν, και να αναθέσουµε την εκτέλεσή τους σε έναν υπάκουο και ακούραστο υπολογιστή. Μπορούµε επίσης να µοιράσουµε αυτό το σύνολο οδηγιών σε πολλούς υπολογιστές, οι οποίοι θα συνεργαστούν για την υλοποίησή τους. Ακόµη και όταν χρειαστεί οι υπολογιστές να εργαστούν χωρίς την επίβλεψή µας, θα συνεχίσουν να εκτελούν τις ίδιες εργασίες,ακολουθώνταςπιστάτις εντολές που τους έχουµε δώσει. Ηπροετοιµασίακαιησύνταξη ενός τέτοιου συνόλου οδηγιών ονοµάζεται προγραµ- µατισµός (programming), και οδηγεί σε «πολλαπλασιασµό εργασίας» ο οποίος αλλάζει ριζικά τις δοµές της ανθρώπινης κοινωνίας. ίνει τη δυνατότητα σε ένα µόνο άτοµο να παραγάγει µε τη βοήθεια των υπολογιστών απεριόριστο πλήθος αποτελεσµάτων καταβάλλοντας πεπερασµένη προσπάθεια (για τη δηµιουργία του σχετικού υπολογιστικού προγράµµατος). Γίνεται λοιπόν φανερό ότι η παραγωγικότητά µας δεν είναι πλέον συνάρτηση µόνον του πλήθους των απασχολούµενων προσώπων είναι συνάρτηση και του πλήθους των διαθέσιµων υπολογιστών. Τα καλά νέα, όµως, δεντελειώνουν εδώ: οι υπολογιστές είναι πλέον σχετικά φθηνοί και επιπλέον το κόστος τους συνεχώς µειώνεται. Πριν από τρεις δεκαετίες, υπολογιστές µε µνήµη 64000 λέξεις και χρόνο εκτέλεσης εντολών 1 µικροδευτερόλεπτο (µsec) κόστιζαν 1 εκατοµµύριο δολάρια. Σήµερα µπορούµε να αγοράσουµε έναν υπολογιστή µε εκατονταπλάσια µνήµη και ταχύτητα, µε λίγες χιλιάδες δολάρια. Πληρώνοντας ποσό ίσο µε τον µισθό ενός ανειδίκευτου εργάτη, µπορούµε να αποκτήσουµε έναν υπολογιστή που έχει τη δυνατότητα να διεκπεραιώνει ορισµένες εργασίες ταχύτερα από χίλιους ανθρώπους µαζί. Με τη µελέτη του προγραµµατισµού µέσα από τις σελίδες αυτού του βιβλίου θα κατανοήσουµε πώς µπορεί να επιτευχθεί αυτός ο πολλαπλασιασµός της εργασίας µέσω των υπολογιστών. Θα µελετήσουµε θεµελιώδεις δοµές πληροφοριών και τεχνικές επε-

2 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης ξεργασίας µε στόχο να αναπτύξουµε την ικανότητά µας να επισηµαίνουµε και να απο- µονώνουµε την ουσία των προβληµάτων, και να µεταγράφουµετα προβλήµατα αυτάσε κώδικα µηχανής ώστε οι εργασίεςµαςναγίνονται αυτόµατα. εν θα µελετήσουµε τον προγραµµατισµό µε τον συνήθη τρόπο, δηλαδή µέσωτης εκµάθησης όλων των λεπτοµερειών µιας συγκεκριµένης γλώσσας προγραµµατισµού. εν θα αναφερθούµε, για παράδειγµα, στο σύνολο των κανόνων για την τοποθέτηση των σηµείων στίξης, ή στη γενικότερη µορφή κάθε γλωσσικής δοµής, ούτε θα εξετάσουµε το µέγιστο πλήθος χαρακτήρων που επιτρέπονται στα ονόµατα µεταβλητών, ή τα µέγιστα επιτρεπόµενα µεγέθη αριθµών και συµβολοσειρών. Αντίθετα, θα προσπαθήσουµε να αποκοµίσουµε όλη την απόλαυση που πηγάζει από τη µελέτη και τη δηµιουργία απλών προγραµµάτων, παρακάµπτοντας κατά το δυνατόν την κουραστική εµµονή στη συντακτική ακρίβεια και την εξαντλητική περιγραφή. Στα παραδείγµατακαι στις ασκήσειςχρησιµοποιούµε τη γλώσσα προγραµµατισµού Pascal. Ωστόσο, θα περιοριστούµε σε ένα υποσύνολο των στοιχείων της γλώσσας αυτής, ώστε ο φόρτος της εκµάθησής της από τον αναγνώστη να παραµείνει σε λογικά πλαίσια. Εάν καλύπταµε το σύνολο των δυνατοτήτων της Pascal, δεν θα µας έµενε καθόλου χρόνος να αναφερθούµε στο κεντρικό θέµα αυτού του βιβλίου, τις σπουδαίες ιδέες στην επιστήµη των υπολογιστών. Μιας και στο βιβλίο αυτό δίνονται µόνον οι έννοιες που είναι απαραίτητες για την κατανόηση των παρατιθέµενων προγραµµάτων και για τη δηµιουργία προγραµµάτων ανάλογηςδυσκολίας, συνιστάται σε όσους σκοπεύουν να δηµιουργήσουν πιο πολύπλοκα προγράµµατα να προµηθευτούν ένα εγχειρίδιο της Pascal ως βιβλίο µελέτης και αναφοράς. Αφού πρόκειται να µελετήσουµε προγραµµατισµό, θα πρέπει προφανώς να προγραµ- µατίσουµε κάτι. Θα ήταν καλό να γράψουµε προγράµµατα που να περιλαµβάνουν κάποιες χρήσιµες δοµές επεξεργασίας πληροφοριών. Θα ήταν επίσης σκόπιµο και χρήσιµο να γράψουµε πολλά είδη προγραµµάτων, φροντίζοντας όµως να έχουν αρκετά απλή δοµή ώστε να µπορεί να τα κατανοήσει και να τα συντάξει εύκολα ένας αρχάριος. Θα θέλαµε ακόµη να εξοικειωθούµε µε ορισµένες θεµελιώδεις έννοιες που είναι απαραίτητες για µια πιο προχωρηµένη µελέτη. Με βάση αυτά, επιλέγουµε ως πρώτο πεδίο της µελέτης µας τα δένδρα απόφασης (decision trees). Τα δένδρα αυτά µπορούν να χρησιµοποιηθούν για ταξινόµηση αντικειµένων σε κατηγορίες, για τυπική αξιολόγηση προσώπων υπό τη µορφή συνέντευξης και για πολλά άλλα πράγµατα. Αρχικά θα µελετήσουµε τα δένδρα απόφασης, και στη συνέχεια θα µάθουµε πώς να συντάσσουµε προγράµµατα γι αυτά. 1.2 ένδρα απόφασης (B) Ας υποθέσουµε ότι θέλουµε να αποφασίσουµε ποιο βιβλίο να υποδείξουµε σε κάποιον που ενδιαφέρεται να αρχίσει σπουδές στην επιστήµη των υπολογιστών. Ένας καλός τρόπος να καταλήξουµε σε µια απόφαση είναι να απευθύνουµε στον ενδιαφερόµενο µια σειρά από ερωτήσεις µέσω των οποίων θα καταλήξουµε στο κατάλληλο βιβλίο. Η πρώτη ερώτηση θα µπορούσε να αφορά τον προτιµώµενο τρόπο προσέγγισης των θεµάτων της επιστήµης των υπολογιστών, π.χ. αν θα ήθελε να ακολουθήσει µια µαθηµατική προσέγγιση. ιατυπώνουµε, λοιπόν, τη σχετική ερώτηση και στη συνέχεια δηλώνουµε µε βέλη την κατεύθυνση που θα ακολουθήσουµε για την επόµενη ερώτηση: Δένδρο απόφασης για υπόδειξη βιβλίου:

1.2. ένδρα απόφασης 3 Στη συνέχεια, ανάλογα µε την πρώτη απάντηση, αποφασίζουµε τι ερωτήσεις θα πρέπει να τεθούν αµέσως µετά: Δένδρο απόφασης για υπόδειξη βιβλίου: Ας υποθέσουµε ότι µετά από δύο ερωτήσεις είµαστε σε θέση να υποδείξουµε το κατάλληλο βιβλίο. Στην περίπτωση αυτή, το δένδρο απόφασης µπορεί να συµπληρωθεί ως εξής: Δένδρο απόφασης για υπόδειξη βιβλίου: Ακολουθώντας µια διαδροµή στο δένδρο απόφασης, µπορούµε να καταστρώσουµε έναν ενδεικτικό «διάλογο». Εάν το συγκεκριµένο πρόσωπο έχει µαθηµατικό προσανατολισµό µε ενδιαφέρον στα θεωρητικά θέµατα, η διαδροµή διά µέσου του δένδρου έχει ως εξής: Επιλογή βιβλίου µε θέµα την επιστήµη των υπολογιστών: Ερώτηση του δένδρου απόφασης: Απάντηση: Ερώτηση του δένδρου απόφασης: Απάντηση: Υπόδειξη του δένδρου απόφασης: Επιθυµείτε µια µαθηµατική προσέγγιση; Ναι Σας ενδιαφέρει ο προγραµµατισµός ή τα θεωρητικά θέµατα; Θεωρητικά θέµατα Μια καλή επισκόπηση δίδεται στο βιβλίο Algorithmics του D. Harel. Το παραπάνωδένδρο µάς οδηγεί στην τελική απόφαση µετά από δύο µόνο διαδοχικές ερωτήσεις. Εύκολα όµως µπορεί να φανταστεί κανείς ένα µεγάλο δένδρο µε πολλές ερωτήσεις και µεγάληποικιλία συνιστώµενων βιβλίω ν στο τέλος των διαφόρων διαδρο- µών. Είναι επίσης προφανές ότι δένδρα αυτού τουτύπουµπορούν να χρησιµοποιηθούν

4 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης για παροχή συµβουλών σχεδόν για οποιοδήποτε ζήτηµα, από την υπόδειξη µιας θεραπευτικής αγωγής µέχρι την πρόβλεψη του µέλλοντος. Ιδού µερικά παραδείγµατα: Δένδρο απόφασης για την παροχή ιατρικής συµβουλής: Δένδρο απόφασης για πρόβλεψη του µέλλοντος: Τα δένδρα απόφασης µπορούν επίσης να χρησιµοποιηθούν για την ταξινόµηση διαφόρων πραγµάτων σε κατηγορίες. Ας υποθέσουµε ότι γνωρίζουµε τα ταξινοµικά χαρα-

1.2. ένδρα απόφασης 5 κτηριστικά των διαφόρων ειδών γλάρων και επιθυµούµε να προσδιορίσουµε µε ακρίβεια το είδος οποιουδήποτε ατόµου µε βάση τα χαρακτηριστικά του. Θα µπορούσαµε να κατασκευάσουµε ένα δένδρο της παρακάτωµορφής: Δένδρο απόφασης για ταξινόµηση γλάρων: Μπορούµε ακόµη να κατασκευάσουµε έναν οδηγό για τη συµπλήρωση της φορολογικής µας δήλωσης, µε τη µορφή δένδρου απόφασης. Ας δούµε τι µορφή θα είχε ένα µικρό τµήµα του: Οδηγός για τη συµπλήρωση φορολογικής δήλωσης: Τι θα λέγατε να κατασκευάσουµε ένα δένδρο απόφασης για ένα παιγνίδι; Ένα καλό παράδειγµα είναι το απλό παιγνίδι Nim, το οποίο έχει τους εξής κανόνες: Το παιγνίδι παίζεται από δύο παίκτες. Ο πρώτος παίκτης µπορεί να τοποθετήσει από ένα έως τρία Χστοαριστερό άκρο µιας οριζόντιας σειράς από τετράγωνα, την οποία θα ονοµάζουµε πίνακα. Ο αντίπαλος µπορεί να τοποθετήσει από ένα έως τρία Ο στα αµέσως επόµενα τετράγωνα του πίνακα. Αυτή η διαδοχή κινήσεων επαναλαµβάνεται συνεχώς, µέχρι να συµπληρωθεί ο πίνακας από αριστερά προς τα δεξιά µε Χ και Ο. Νικητής είναι ο παίκτης που θα καταφέρει να τοποθετήσει το δικό του σύµβολο στο τελευταίο τετράγωνο

6 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης του πίνακα. Για παράδειγµα, ας θεωρήσουµε ένα παιγνίδι Nim µε πίνακα µήκους επτά τετραγώνων: Έστωότι ο πρώτος παίκτης παίζει τρία Χ: Ας υποθέσουµε ότι ο δεύτερος παίκτης παίζει δύο Ο: Τότε ο πρώτος παίκτης µπορεί να κερδίσει το παιγνίδι τοποθετώντας δύο Χ στα δύο τελευταία τετράγωνα: Ας δούµε τώρα ένα δένδρο απόφασης που θα παίξει τον ρόλο του δεύτερου παίκτη για ένα παιγνίδι Nim µε επτά τετράγωνα: Δένδρο απόφασης για το παιγνίδι Nim:

1.3. Τα πρώτα βήµατα στον προγραµµατισµό 7 Στη φύση, τα δένδρα φυτρώνουν από το έδαφος και αναπτύσσονται απλώνοντας τα κλαδιά τους προς τον ουρανό. Τα δένδρα αυτού του κεφαλαίου, για λόγους καλύτερης εποπτείας, αναπτύσσονται από τα αριστερά προς τα δεξιά. Οι διαδροµές που θα εξετάσουµε σε αυτά τα δένδρα ξεκινούν από το ακραίο αριστερό παραλληλόγραµµο, τη ρίζα (root node), και συνεχίζονται προς τα δεξιά. Σε κάθε κόµβο (node) του δένδρου υποβάλλεται µια ερώτηση στον χρήστη, και µε βάση την απάντηση που δίνεται επιλέγεται οεπόµενοςκλάδοςπουθα ακολουθηθεί. Η διαδροµή συνεχίζεται προς τα δεξιά µέχρι την άφιξη σε κάποιον τερµατικό κόµβο ή φύλλο (leaf node), δηλαδή έναν κόµβο που δεν έχει διακλαδώσεις προςταδεξιά.αυτόςοκόµβοςπεριέχει ένα µήνυµα το οποίο δίνει το αποτέλεσµα της ακολουθίας των ερωταποκρίσεων και σηµατοδοτεί το τέλος της διαδικασίας. Τέτοια δένδρα απόφασης έχουν πληθώρα εφαρµογών σε δραστηριότητες που απαιτούν επεξεργασία πληροφοριών, όπως είναι η παροχή συµβουλών, η ταξινόµηση αντικειµένων, η διδασκαλία, ακόµη και η ψυχαγωγία (παιχνίδια). Ο στόχος µας στο κεφάλαιο αυτό είναι η σύνταξη προγραµµάτων τα οποία θα καταγράφουν τη δοµή κάποιου δένδρου απόφασης, θα κατευθύνουν τον χρήστη στις σωστές διαδροµές και θα εκτυπώνουν τα αποτελέσµατα. Η ικανότητα σχεδιασµού και προγραµµατισµού τέτοιων δένδρων είναι ένα σηµαντικό προσόν για ένα µεγάλο πλήθος εφαρµογών. Ασκήσεις 1. Συµπληρώστε ένα από τα ηµιτελή δένδρα απόφασης αυτής της ενότητας. 2. Σχεδιάστε ένα πλήρες δένδρο απόφασης που να υποδύεται τον δεύτερο παίκτη σε ένα παιγνίδι Nim µε εννέα τετράγωνα. 3. Εντοπίστε ένα πρόβληµα σε κάποιον τοµέα των προσωπικών σας ενδιαφερόντων και σχεδιάστε ένα δένδρο απόφασης που να επιλύει το πρόβληµα αυτό. 1.3 Τα πρώτα βήµατα στον προγραµµατισµό (B) Ένα πρόγραµµα (computer program) είναι µια ακολουθία εντολών που µπορεί να εκτελέσει ένας υπολογιστής. Πρόκειται για µια αλληλουχία ενεργειών τις οποίες θα φέρει σε πέρας ο υπολογιστής και, εποµένως, θα πρέπει να είναι γραµµένες σε γλώσσα κατανοητή από τον υπολογιστή. Τα περισσότερα προγράµµατα αυτού του βιβλίου είναι γραµ- µένα στην Pascal, µια γλώσσα αρκετά διαδεδοµένη και εύχρηστη. Ένα πρόγραµµα ή ένα τµήµα προγράµµατος ονοµάζεται επίσης κώδικας (code). Στο βιβλίο αυτό χρησιµοποιούµε και τους δύο όρους. Ας δούµε ένα παράδειγµα προγράµµατος γραµµένου σε Pascal. program FirstCode; writeln(' Σπουδαίες ιδέες '); writeln(' στην '); writeln('επιστήµη των υπολογιστών'); Εάν θέλουµε να πραγµατοποιηθούν οι ενέργειες που περιγράφονται στο παραπάνω πρόγραµµα, εκτελούµε (ή τρέχουµε, όπω ς επίσης λέγεται) το πρόγραµµα στον υπολογιστή. Για την εκτέλεση του προγράµµατος απαιτούνται τα εξής: ένας υπολογιστής, λογισµικό (software) που επιτρέπει στον υπολογιστήµαςνα«καταλαβαίνει» και να επεξεργάζεται προγράµµατα Pascal,

8 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης ένα εγχειρίδιο χρήσης µε οδηγίες για να θέσουµε σε λειτουργία τον υπολογιστή µας, ένας δάσκαλος ή φίλος µε εµπειρία στη χρήση υπολογιστών. Για την εκτέλεση του παραπάνωπρογράµµατος µπορεί να χρησιµοποιηθεί οποιοδήποτε µοντέλο υπολογιστή, αρκεί να είναι εφοδιασµένο µε τη γλώσσα προγραµµατισµού Pascal. Τα δύο πιο δηµοφιλή µοντέλα, όµως, είναι ο Macintosh της Apple και ο Personal Computer της IBM. 1 Κάθε υπολογιστής έχει τη δική του γλώσσα µηχανής, και ως εκτούτουµαςχρειάζεται ένα σύστηµα λογισµικού που να µπορεί να µεταφράζει τη γλώσσα της επιλογής µας, εν προκειµένωτηνpascal, στη γλώσσα µηχανής του υπολογιστή. Η µετάφραση γίνεται µε ένα πρόγραµµα που ονοµάζεται µεταγλωττιστής (compiler), το οποίο συνήθως µπορεί να το προµηθευτεί κανείς από ένα κατάστηµα υπολογιστών. Τα παραδείγµατα του βιβλίου αυτού έχουν γραφεί στην Turbo Pascal, µια «διάλεκτο» της Pascal που έχει αναπτυχθεί από την εταιρεία Borland International. Εάν επιλέξουµε κάποιο άλλο σύστηµα Pascal, θα διαπιστώσουµε ενδεχοµένως ότι τα περισσότερα προγράµµατα εκτελούνται χωρίς να απαιτείται καµία τροποποίηση. Για παράδειγµα, η Think Pascal σε υπολογιστές Apple Macintosh εκτελείται όπως η Turbo Pascal εκτός από ελάχιστες εντολές, στις περισσότερες από τις οποίες θα αναφερθούµε όταντις συναντήσουµε σε επόµενα κεφάλαια. Για άλλα συστήµατα της Pascal, πιθανόν να χρειαστείτε τη βοήθεια κάποιου ειδικού για να εκτελέσετε κάποια από τα προγράµµατα, καθώς υπάρχουν σηµαντικές διαφορές. Το εγχειρίδιο χρήσης είναι απαραίτητο γιατί θα σας υποδείξει πώς θα θέσετε σε λειτουργία τον υπολογιστή σας και πώς θα πληκτρολογήσετε και θα εκτελέσετε το πρόγραµµά σας. Τέλος, ο δάσκαλος ή ο φίλος χρειάζεται για να σας πει όσα δεν αναφέρονται στο εγχειρίδιο. Στην επιστήµη των υπολογιστών, όπως και σε πολλές άλλες επιστήµες, ορισµένα από τα σπουδαιότερα «µυστικά» κοινωνούνται µόνο µέσω του προφορικού λόγου. Πιθανόν να τα καταφέρετε και χωρίς αυτή τη βοήθεια, αλλά εάν την εξασφαλίσετε το έργο σας µάλλον θα απλοποιηθεί αρκετά. Για να αποκοµίσετε το µέγιστο δυνατό όφελος από αυτό το κεφάλαιο, θα πρέπει να πληκτρολογήσετε και να εκτελέσετε µερικά από τα προγράµµατα που παρατίθενται σε αυτό, και να µελετήσετε τα αποτελέσµατά τους. Για παράδειγµα, εάν εκτελέσετε το ενδεικτικό πρόγραµµα που δίνεται πιο πάνω, θα εµφανιστεί στην οθόνη σας το εξής αποτέλεσµα: Σπουδαίες ιδέες στην επιστήµη των υπολογιστών Από ορισµένες απόψεις, το πρόγραµµα αυτό είναι πολύ απλό. Υπάρχουν όµως πολλές λεπτοµέρειες σχετικές µε τη µορφή και την εκτέλεσή του που χρειάζεται να αποσαφηνιστούν: η συγκρότηση του προγράµµατος από εντολές, η σειρά εκτέλεσης των εντολών, το νόηµα και η δοµή τους. Μορφή του προγράµµατος Τα κύρια µέρη αυτού του προγράµµατος είναι η επικεφαλίδα (header), η ειδική λέξη («έναρξη»), µια σειρά από εντολές ακολουθούµενες από τον χαρακτήρα «;» (η άνωτελεία στην αγγλική γλώσσα), και η ειδική λέξη («λήξη») ακολουθούµενη από µια τελεία που σηµατοδοτεί το τέλος του προγράµµατος. Η επικεφαλίδα θα πρέπει να αρχίζει πάντοτε µε τη λέξη program («πρόγραµµα»), και περιλαµβάνει επίσης το όνοµα του προγράµµατος (που το επιλέγει ο χρήστης) ακολουθούµενο από τον χαρακτήρα «;». Έτσι, η πρώτη γραµµή 1 Σ.τ.Μ.: Θα πρέπει να σηµειωθεί ότι η ραγδαία εξέλιξη της τεχνολογίας των υπολογιστών οδηγεί στην ανάπτυξη νέων και ολοένα ισχυρότερων µοντέλων, γεγονός που έχει ως αποτέλεσµα την απαξίωση σε σύντοµο χρονικό διάστηµα των εκάστοτε δηµοφιλών µοντέλων.

1.3. Τα πρώτα βήµατα στον προγραµµατισµό 9 program FirstCode; δηλώνει στον υπολογιστή ότι έχουµε ένα πρόγραµµα που ονοµάζεται «FirstCode». Η δεύτερη γραµµή λέει στον υπολογιστή ότι ακολουθούν οι εντολές του προγράµµατος. Στη συνέχεια, έχου- µε τέσσερεις γραµµές, µε µία εντολή σε κάθε γραµµή. Η τελευταία γραµµή δηλώνει στον υπολογιστή το τέλος του προγράµµατος. Το πρόγραµµα Σχόλια program FirstCode; Επικεφαλίδα του προγράµµατος Ένδειξη ότι ακολουθούν εντολές writeln( Σπουδαίες ιδέες ); Εντολή ακολουθούµενη από «;» writeln( στην ); Εντολή ακολουθούµενη από «;» writeln( επιστήµη των υπολογιστών ); Εντολή ακολουθούµενη από «;» Εντολή ακολουθούµενη από «;» Το πρόγραµµα έχει ολοκληρωθεί Εντολές Κάθε εντολή του προγράµµατοςαποτελείµιαξεχωριστήοδηγία στον υπολογιστή. Στην ελληνική γλώσσα αντιστοιχεί σε µια προστακτική πρόταση. Λέει στον υπολογιστή «κάνε αυτό». Στο παράδειγµά µας υπάρχουν τέσσερεις εντολές. Η πρώτη είναι: writeln(' Σπουδαίες ιδέες ') και λέει στον υπολογιστή να τυπώσει στην οθόνη τις λέξεις «Σπουδαίες ιδέες». Πριν και µετά από αυτές τις λέξεις έχουµε πληκτρολογήσει κάποια κενά διαστήµατα, για λόγους στοίχισης. (Η εντολή writeln είναι συντοµογραφία του «write a line», και σηµαίνει «γράψε µια γραµµή».) Κάθε εντολή σε ένα πρόγραµµα ακολουθείται συνήθως από τον χαρακτήρα «;». Έτσι, η πλήρης εντολή έχει την εξής µορφή: writeln(' Σπουδαίες ιδέες '); Ηδεύτερηκαιητρίτη εντολή είναι επίσης εντολές writeln. Η τέταρτη εντολή,readln (συντοµογραφία του «read a line», που σηµαίνει «διάβασε µια γραµµή»), ζητά από τον υπολογιστή να σταµατήσει και να περιµένει από τον χρήστη να πληκτρολογήσει κάτι. Αυτή η εντολή δεν είναι απαραίτητη για το πρόγραµµα ο ρόλος της είναι απλώς να αναγκάσει τον υπολογιστή να σταµατήσει και να περιµένει προτού κάνει οτιδήποτε άλλο. Χωρίς την εντολή readln, σε ένα τυπικό σύστηµα της TurboPascal οι τρεις γραµµές θα τυπώνονταν γρήγορα στην οθόνη και το πρόγραµµα θα τερµατιζόταν πριν προλάβουµε να διαβάσουµε τι έχει γραφεί. Τα περισσότερα προγράµµατα σε αυτό το βιβλίο θα περιέχουν µια εντολή readln πριν από τη δήλωση λήξης, δηλαδή πριν από το,ώστεναέχουµετηδυνατότητα να µελετήσουµε τα εµφανιζόµενα µηνύµατα προτού τερµατιστεί το πρόγραµµα. Έτσι, στο παράδειγµά µας, µετά από την εµφάνιση των τριών γραµµών το πρόγραµµα θα σταµατήσει, περιµένοντας από τον χρήστη να γράψει κάτι. Μόλις ο χρήστης πληκτρολογήσει οτιδήποτε (συνήθως ένα απλό Return ή Enter), το πρόγραµµα τερµατίζει.

10 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης Εκτέλεση του προγράµµατος Ηλειτουργίατου υπολογιστή συνίσταται στην εκτέλεση των εντολών του προγράµµατος µε τη σειρά που εµφανίζονται στο πρόγραµµα. Η εκτέλεση ακολουθεί πάντα τη σειρά παράθεσηςτων εντολών, εκτόςανυπάρχουνειδικέςεντολέςπουεπιβάλλουν παρέκκλιση από τη σειρά αυτή. Νόηµα και δοµή των εντολών Ηεντολή writeln(' Σπουδαίες ιδέες '); αποτελείται από δύο µέρη: το συντακτικό µέρος, που καθορίζει επακριβώς τη σωστή αλληλουχία χαρακτήρων της εντολής, δηλαδή τον σωστό τρόπο γραφής της, και κάποια δεδοµένα που έχει εισαγάγει ο προγραµµατιστής: Ηεντολήορίζειστονυπολογιστή να γράψει τους χαρακτήρες που υπάρχουν µεταξύ των εισαγωγικών, και στη συνέχεια να προχωρήσει στην επόµενη γραµµή του προγράµµατος. Όταν το πρόγραµµα εκτελεστεί, η εντολή writeln θα εµφανίσει τους χαρακτήρες στην οθόνη του υπολογιστή. Όταν πληκτρολογείτε ένα πρόγραµµα, θα πρέπει να φροντίζετε ώστε το συντακτικό µέρος κάθε εντολής να είναι σωστό. εν επιτρέπεται κανενός είδους τυπογραφικό λάθος. Κανένα από τα παρακάτωπρογράµµατα δεν θα εκτελεστεί κανονικά, διότι έχει παραβιαστεί κάπου η ορθότητα της σύνταξης: program FirstCode; writein(' Σπουδαίες ιδέες '); writeln(' στην '); writeln('επιστήµη των υπολογιστών'); (Στην πρώτη εντολή writeln υπάρχει τυπογραφικό λάθος.) program FirstCode; writeln(' Σπουδαίες ιδέες '); writeln(' στην ') writeln('επιστήµη των υπολογιστών'); (Στο τέλος της δεύτερης εντολής writeln λείπει ένας χαρακτήρας «;».) program FirstCode; please writeln(' Σπουδαίες ιδέες '); writeln(' στην '); writeln('επιστήµη των υπολογιστών');

1.3. Τα πρώτα βήµατα στον προγραµµατισµό 11 (Η λέξη «please» (= παρακαλώ) δεν έχει θέση στο συγκεκριµένο σηµείο.) Οιπερισσότερες γλώσσες προγραµµατισµούέχουναυστηρούς κανόνες σύνταξης, αν και ορισµένες επιτρέπουν κάποια ελαστικότητα. Στο µέλλον οι γλώσσες θα είναι κατά πάσα πιθανότητα λιγότερο αυστηρές. Εάν η σύνταξη της εντολής είναι σωστή, το πρόγραµµα θα την εκτελέσει ανεξάρτητα από τα δεδοµένα που περιέχει. Εποµένως, το επόµενο πρόγραµµα θα εκτελεστεί κανονικά. program FirstCode; writeln(' Πηγαίες ίδιες '); writeln(' στον '); writeln('e#7a-%%* '); Ουπολογιστήςδενέχειτρόπονακρίνειτηνορθότητα των δεδοµένων, και εποµένως θα εκτελέσει ευπειθώς τις εντολές, ανεξάρτητα από το περιεχόµενό τους. Θα κάνει ακριβώς ό,τι του λέµε, ακόµη και εάν αυτό δεν συµπίπτει µε ό,τι θα θέλαµε. Μια αλλαγή που δεν επηρεάζει την ορθότητα ενός προγράµµατος είναι η εισαγωγή κενών διαστηµάτων. Στα περισσότερα σηµεία ενός προγράµµατος µπορούν να παρεµβληθούν κενά διαστήµατα χωρίς να µεταβάλουν τη συµπεριφορά του. Το πρόγραµµα που ακολουθεί είναι ισοδύναµο µε το αρχικό. Παρά την κενή γραµµή και τα περιττά κενά διαστήµατα, θα εκτελεστεί χωρίς κανένα πρόβληµα. program FirstCode; writeln (' Σπουδαίες ιδέες '); writeln(' στην '); writeln('επιστήµη των υπολογιστών'); Φυσικά, θα πρέπει να αποφεύγετε να γράφετε προγράµµατα µε τέτοια άναρχη στοιχειοθεσία, καθώς µε τον τρόπο αυτό γίνονται ιδιαίτερα δυσανάγνωστα. Όµως, αυτό το παράδειγµα δείχνει την πλήρη ελευθερία που έχετε να µετακινείτε και να τοποθετείτε εντολές σε διάφορα σηµεία της σελίδας διαµορφώνοντας την εµφάνιση του προγράµµατός σας κατά βούληση. Ωστόσο, δεν θα πρέπει να παρεµβάλετε κενά διαστήµατα στο µέσο των ειδικών λέξεων, όπως ή,ήσεονόµατα ή δεδοµένα. Σε αυτήν την ενότητα µελετήσαµε ένα πρόγραµµα που τυπώνει τρεις γραµµές και τερµατίζει. Η πλήρης κατανόηση αυτού του απλού κώδικα αποτελεί ένα τεράστιο βήµα για την κατανόηση όλων των υπολογιστικών προγραµµάτων. Έχει µεγάλη σηµασία να καταλάβουµε τη µορφή των προγραµµάτων και την έννοια της εντολής ως θεµελιώδους µονάδας οδηγίας στον υπολογιστή. Κάθε εντολή προδιαγράφει µια ενέργεια, και κάθε ακολουθία εντολών προδιαγράφει µια ακολουθία ενεργειών και τη σειρά εκτέλεσής τους. Η σύνταξη της κάθε εντολής είναι αυστηρή και απαρέγκλιτη, µε µόνη εξαίρεση τη δυνατότητα παρεµβολής κενών διαστηµάτων µεταξύ των διαφόρων µερών της. Το πρόγραµµα που ακολουθεί τυπώνει και αυτό κάποιο µήνυµα:

12 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης program SecondCode; writeln('*****************************'); writeln('* *'); writeln('* δένδρα απόφασης *'); writeln('* *'); writeln('*****************************'); Στο σηµείο αυτό,θαπρέπειπλέον ναείστεέτοιµοινα γράψετεπρογράµµαταπουνα τυπώνουν στην οθόνη σχεδόν οτιδήποτε. Ασκήσεις 1. Γράψτε ένα πρόγραµµα που να τυπώνει το όνοµά σας και τη διεύθυνσή σας. 2. Γράψτε ένα πρόγραµµα που να τυπώνει τη λέξη ΕΙΡΗΝΗ στην ακόλουθη µορφή: EEEEE III PPPP H H N N H H E I P P H H NN N H H EEE I PPPP HHHHH N N N HHHHH E I P H H N NN H H EEEEE III P H H N N H H 3. Σχεδιάστε ένα σπίτι στο δάσος µε ένα µονοπάτι που να οδηγεί στην πόρτα του. Αποδώστε το σχέδιο µε µια κατάλληλη διάταξη χαρακτήρων, όπως στη λέξη ΕΙΡΗΝΗ παραπάνω, και γράψτε ένα πρόγραµµα για να το τυπώσετε στην οθόνη. 1.4 Ανάγνωση και αποθήκευση δεδοµένων (B) Στην προηγούµενη ενότητα εισαγάγαµε την έννοια των δεδοµένων των πληροφοριών που διαχειρίζεται ένα πρόγραµµα. Στα παραδείγµατα που δόθηκαν, τα δεδοµένα ήταν συµβολοσειρές (strings), δηλαδή ακολουθίες χαρακτήρων. Παραδείγµατα συµβολοσειρών είναι τα εξής: «επιστήµη των υπολογιστών», «***************», «E#7a-%%*». Σε αυτήν την ενότητα θα δούµε πώς µπορούµε να εισαγάγουµε στο πρόγραµµά µας δεδοµένα από το πληκτρολόγιο, δηλαδή πώς ο υπολογιστής µπορεί να διαβάζει ακολουθίες χαρακτήρων που δίνονται µέσω του πληκτρολογίου και να αποθηκεύει τα δεδοµένα αυτά στη µνήµη του. Πριν µελετήσουµε όµως την εντολή ανάγνωσης, είναι απαραίτητο να πούµε κάποια πράγµατα για τις θέσεις µνήµης του υπολογιστή. Τις θέσεις αυτές µπορείτε να τις φαντάζεστε σαν ταχυδροµικές θυρίδες στις οποίες έχετε δώσει ονόµατα και όπου µπορείτε να αποθηκεύσετεπληροφορίες ήαπό όπουµπορείτε να ανακτήσετεαποθηκευµένεςπληροφορίες. Για παράδειγµα, µπορείτε να έχετε µια θέση µνήµης την οποία έστωότι έχετε ονοµάσει «position1», για την αποθήκευση µιας συµβολοσειράς. Στη συνέχεια µπορείτε να αποθηκεύσετε δεδοµένα στη θέση αυτή και να τα χρησιµοποιήσετε µε διάφορους τρόπους. Μπορείτε π.χ. να δώσετε στον υπολογιστή την εντολή να καταχωρίσει δεδοµένα στη θέση position1 ή να µεταφέρει τα δεδοµένα από τη θέση position1 σε κάποια άλλη θέση. Οσωστόςτρόπος για να δηλωθεί στη γλώσσα Pascal η δέσµευση µιας τέτοιας θέσης είναι µε τη δήλωση,ωςεξής:

1.4. Ανάγνωση και αποθήκευση δεδοµένων 13 position1: string; Ηδήλωση αυτή λέει στον υπολογιστή να δεσµεύσει στη µνήµη µια θέση µε όνοµα «position1» για να φιλοξενήσει µια συµβολοσειρά η ονοµασία position1 λέγεται µεταβλητή (iable). Η δήλωση τοποθετείται µετά την επικεφαλίδα του προγράµµατος. Από τη στιγµή πουέχειδεσµευτείµια τέτοια θέση στη µνήµη, µπορείτε να διαχειρίζεστε το περιεχόµενό της ή να παραπέµπετε σεαυτόµέσωεντολών. Η νέα εντολή που θα µελετήσουµε έχει τη µορφή readln(position1) και σηµαίνει: 1. Πάρε τους χαρακτήρες που δίδονται από το πληκτρολόγιο (το τέλος της ακολουθίας χαρακτήρων καταδεικνύεται µε το πλήκτρο Return). 2. Καταχώρισε αυτή την ακολουθία χαρακτήρων στη θέση µε το όνοµα position1.(οι χαρακτήρες θα εµφανίζονται και στην οθόνη καθώς πληκτρολογούνται.) Υποθέστε ότι ο υπολογιστής εκτελεί την εντολή readln(position1) και ότι ο χρήστης πληκτρολογεί τη φράση «Μια προσιτή εισαγωγή» (χωρίς όµως τα εισαγωγικά και ακολουθούµενη από το πλήκτρο Return). Τότε, η θέση µνήµης µε το όνοµα «position1» θα λάβει την πληροφορία µε τον τρόπο που φαίνεται στο σχήµα: Εποµένως, µια απλή µέθοδος για να αποθηκεύσουµε µια πληροφορία στη µνήµη του υπολογιστή είναι η εξής: Κατ αρχάς, εισάγουµε στο πρόγραµµα µια δήλωση για να δηµιουργήσουµε και να ονοµατίσουµε µια θέση µνήµης. Στη συνέχεια γράφουµε µια εντολή readln για να δεχθεί ο υπολογιστής τους χαρακτήρες που πληκτρολογούµε και να τους καταχωρίσει στη θέση αυτή. Τέλος, εάν επιθυµούµε να ελέγξουµε κατά πόσο τα δεδοµένα καταχωρίστηκαν στη σωστή θέσηµνήµης,θαπρέπει να δώσουµε µια εντολή εκτύπωσης του περιεχοµένου αυτής της θέσης µνήµης. Το πλήρες πρόγραµµα έχει ως εξής:

14 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης program ReadData; position1: string; readln(position1); writeln(position1); Όταν εκτελέσετε το πρόγραµµα, αρχικά αυτό θα περιµένει να πληκτρολογήσετε κάποιους χαρακτήρες. Έστωότιπληκτρολογείτε τη φράση Πολύ προσιτή και πατάτε το πλήκτρο Return. Η φράση αυτή θα αποθηκευτεί στη θέση µνήµης position1. Στη συνέχεια, θα εµφανιστεί στην οθόνη το περιεχόµενο της θέσης position1.τέλος,το πρόγραµµα θα περιµένει να πληκτρολογήσετε κάτι ακόµη, λόγου χάριν το Return, και µετά θα τερµατίσει. Ορισµένες εκδόσεις της Pascal απαιτούν η λέξη string στο προηγούµενο πρόγραµµα να ακολουθείται από έναν ακέραιο αριθµό σε αγκύλες, ο οποίος θα δηλώνει το µέγιστο πλήθος των χαρακτήρων που µπορούν να καταχωριστούν στη δηλούµενη θέση µνήµης. Υποθέστε, για παράδειγµα, ότι στη θέση position1 επιτρέπεται να καταχωριστούν συµβολοσειρές µε µέγιστο µήκος 100 χαρακτήρες. Στην περίπτωση αυτή, η δήλωσηθα είχε την εξής µορφή: position1: string[100]; ΗTurbo Pascal δέχεται συµβολοσειρές µε µέγιστο µήκος 255 χαρακτήρες, εκτός και εάν δηλωθεί ρητά διαφορετικό πλήθος χαρακτήρων. Το πρόγραµµα µπορεί να τροποποιηθείκάπως, ώστε να είναι πιο κατανοητό από τον χρήστη. Μπορούν π.χ. να προστεθούν εντολές writeln για να διευκρινίζεται τι ακριβώς συµβαίνει: program ReadWriteDemo; position1: string; writeln('πληκτρολογήστε κάποια δεδοµένα.'); readln(position1); writeln('τα δεδοµένα έχουν καταχωριστεί.'); writeln('τώρα τα δεδοµένα θα εµφανιστούν στην οθόνη.'); writeln(position1); writeln('ολοκλήρωση της εκτέλεσης.'); Ας εκτελέσουµε αυτό το πρόγραµµα για να βεβαιω θούµε ότι καταλαβαίνουµε τη λειτουργία του:

1.4. Ανάγνωση και αποθήκευση δεδοµένων 15 Πληκτρολογήστε κάποια δεδοµένα. Μια εισαγωγή Τα δεδοµένα έχουν καταχωριστεί. Τώρα τα δεδοµένα θα εµφανιστούν στην οθόνη. Μια εισαγωγή Ολοκλήρωση της εκτέλεσης. (πάτηµα πλήκτρου Return) (µήνυµα του υπολογιστή στον χρήστη) (ο χρήστης πληκτρολογεί τα δεδοµένα) (µήνυµα του υπολογιστή στον χρήστη) (µήνυµα του υπολογιστή στον χρήστη) (ο υπολογιστής εκτυπώνει τα δεδοµένα) (µήνυµα του υπολογιστή στον χρήστη) (τέλος δεδοµένων εισόδου) Παρατηρήστε τις δύο διαφορετικές µορφές της εντολής writeln. Εάν χρησιµοποιήσουµε εισαγωγικά, θα εµφανιστούν στην οθόνη οι χαρακτήρες µεταξύ των εισαγωγικών. Έτσι, µε την εντολή writeln('position1') θα εµφανιστούν οι χαρακτήρες «position1» (χωρίς τα διπλά εισαγωγικά). Εάν όµως παραλείψουµε τα εισαγωγικά, ο επεξεργαστήςθαπάειστη θέσηµνήµης µε το όνοµαposition1 και θα εµφανίσει το περιεχόµενό της. Έτσι, η εντολή writeln(position1) θα εµφανίσει στην οθόνη τη φράση «Μια εισαγωγή», εφόσον βέβαια η θέση µνήµης position1 περιέχει αυτή τη συµβολοσειρά. Εάν µε την εντολή writeln ζητείται να εµφανιστεί κάτι που δεν περικλείεται σε εισαγωγικά και δεν είναι δηλωµένο ως θέση µνήµης, τότε έχουµε σφάλµα, όπως στην ακόλουθη περίπτωση: writeln(μια εισαγωγή) Χρησιµοποιώντας έναν συνδυασµό εντολών ανάγνωσης και εκτύπωσης δεδοµένων, µπορούµε να φτιάξουµε ένα απλό διαλογικό πρόγραµµα. Ιδού ένα παράδειγµα. Μπορείτε να καταλάβετε τι κάνει; program GetNameTown; PositionOfName, PositionOfTown: string; writeln('γεια, πες µου το όνοµά σου.'); readln(positionofname); writeln('σε ποια πόλη κατοικείς;'); readln(positionoftown); writeln(positionofname); writeln('πες µου κάτι: Σου αρέσει να κατοικείς στην πόλη'); writeln(positionoftown); writeln(';;;'); Τα ονόµατα των θέσεων µνήµης µπορούν να είναι οποιεσδήποτε συµβολοσειρές, αρκεί να ξεκινούν µε γράµµα του (αγγλικού) αλφαβήτου, να περιλαµβάνουν µόνον αλφαβητικούς και αριθµητικούς χαρακτήρες και να έχουν δηλωθεί κατάλληλα. Για παράδειγµα, θα µπορούσαν να χρησιµοποιηθούν τα ονόµατα A17 και c8zi: program GetNameTown; A17, c8zi: string;

16 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης writeln('γεια, πες µου το όνοµά σου.'); readln(a17); writeln('σε ποια πόλη κατοικείς;'); readln(c8zi); writeln(a17); writeln('πες µου κάτι: Σου αρέσει να κατοικείς στην πόλη'); writeln(c8zi); writeln(';;;'); Όσον αφορά τα ονόµατα των θέσεων µνήµης, θα πρέπει να έχουµε υπ όψιν δύο κανόνες: Πρώτον, δεν επιτρέπεται να υπάρχουν κενά διαστήµατα µεταξύ των χαρακτήρων των ονοµάτων. εύτερον, υπάρχει ένα σύνολο δεσµευµένων λέξεων για τη γλώσσα Pascal, οι λέξεις-κλειδιά (keywords), οι οποίες δεν µπορούν ναχρησιµοποιηθούν ως ονόµατα θέσεων µνήµης. Παραδείγµατα τέτοιων λέξεων είναι οι: program,,, if, else, and, or. Γιατονπλήρηκατάλογο αυτών των λέξεων συµβουλευτείτε το εγχειρίδιο της Pascal. Συνήθως, οι προγραµµατιστές δίνουν σε µια θέση µνήµης το όνοµα του αντικειµένου που πρόκειται να καταχωριστεί σε αυτήν. Στο παράδειγµά µας, οι θέσεις µνήµης που µας ενδιαφέρουν θα µπορούσαν να έχουν τα ονόµατα name και town, µιας και σε αυτές θα αποθηκευτεί το όνοµα και η πόλη διαµονής, αντίστοιχα, κάποιου προσώπου. Έτσι το πρόγραµµα γίνεται ευκολότερα κατανοητό: program GetNameTown; name, town: string; writeln('γεια, πες µου το όνοµά σου.'); readln(name); writeln('σε ποια πόλη κατοικείς;'); readln(town); writeln(name); writeln('πες µου κάτι: Σου αρέσει να κατοικείς στην πόλη'); writeln(town); writeln(';;;'); Είναι πολύ σηµαντικό να θυµάστε ότι οι θέσεις µνήµης δεν θα πρέπει να χρησιµοποιηθούν στο πρόγραµµα πριν καταχωριστεί σε αυτές κάποια πληροφορία, λ.χ. µέσω κάποιας εντολής εισόδου. Από τη στιγµή που θα συµβεί αυτό, διατηρούν τη συγκεκρι- µένη πληροφορία έως ότουκαταχωριστεί σεαυτές νέαπληροφορία, ενδεχοµένωςµε µια άλλη εντολή εισόδου. Στην περίπτωση αυτή, η προηγούµενη πληροφορία χάνεται για πάντα. Κάτι τέτοιο συµβαίνει στο πρόγραµµα που ακολουθεί. Τι κάνει το πρόγραµµα αυτό; program LoadDemo; x, y: string; writeln(' ώστε δεδοµένα για τη µεταβλητή x.'); readln(x);

1.4. Ανάγνωση και αποθήκευση δεδοµένων 17 writeln(' ώστε δεδοµένα για τη µεταβλητή y.'); readln(y); writeln('τα περιεχόµενα των x και y είναι:'); writeln(x); writeln(y); writeln(' ώστε δεδοµένα για τη µεταβλητή x.'); readln(x); * writeln('τα περιεχόµενα των x και y είναι:'); writeln(x); writeln(y); writeln(' ώστε δεδοµένα για τη µεταβλητή y.'); readln(y); ** writeln('τα περιεχόµενα των x και y είναι:'); writeln(x); writeln(y); Ακολουθεί µια ενδεικτική εκτέλεση του προγράµµατος: ώστε δεδοµένα για τη µεταβλητή x. (εµφανιζόµενο µήνυµα) Γιάννης (καταχώριση στην x) ώστε δεδοµένα για τη µεταβλητή y. (εµφανιζόµενο µήνυµα) Μαρία (καταχώριση στην y) Τα περιεχόµενα των x και y είναι: (εµφανιζόµενο µήνυµα) Γιάννης (περιεχόµενο της x) Μαρία (περιεχόµενο της y) ώστε δεδοµένα για τη µεταβλητή x. (εµφανιζόµενο µήνυµα) Νίκος (καταχώριση στην x) Τα περιεχόµενα των x και y είναι: (εµφανιζόµενο µήνυµα) Νίκος (περιεχόµενο της x) Μαρία (περιεχόµενο της y) ώστε δεδοµένα για τη µεταβλητή y. (εµφανιζόµενο µήνυµα) Ελένη (καταχώριση στην y) Τα περιεχόµενα των x και y είναι: (εµφανιζόµενο µήνυµα) Νίκος (περιεχόµενο της x) Ελένη (περιεχόµενο της y) Οι δύο πρώτες εντολές ανάγνωσης του παραπάνω προγράµµατος εισάγουν δεδοµένα στις θέσειςµνήµης µε ονόµατα x και y.στη συνέχεια εκτυπώνονται τα περιεχόµενα των θέσεων µνήµης x και y.ηεντολήµετην ένδειξη καταχωρίζει νέα πληροφορία στη θέση µνήµης x, καταστρέφοντας το τρέχον περιεχόµενό της. Η αλλαγή αυτή επιβεβαιώνεται µε την εκτύπωση των περιεχοµένων των x και y.ηεντολήµετην ένδειξη αλλάζει το περιεχόµενο της y και η τελευταία εντολή εκτύπωσηςδείχνει το αποτέλεσµα. Στην παρούσα ενότητα παρουσιάσαµε δύο βασικές έννοιες που είναι πολύ σηµαντικές για τον προγραµµατισµό: την εισαγωγή δεδοµένων από το πληκτρολόγιο και την αποθήκευσή τους στη µνήµη του υπολογιστή. Η κατανόηση αυτών των εννοιών απαιτεί προσεκτική µελέτη. Στην επόµενη ενότητα θα παρουσιάσουµε µία ακόµη έννοια προγραµµατισµού και θα δούµε πώς γίνεται ο προγραµµατισµός δένδρων απόφασης. Ασκήσεις 1. Γράψτε ένα πρόγραµµα που θα διαβάζει το ονοµατεπώνυµό σας και στη συνέχεια θα το εµφανίζει στην οθόνη. 2. Γράψτε ένα πρόγραµµα το οποίο θα συλλέγει στοιχεία για έναν υποψήφιο φοιτητή αναφορικά µε την επίδοσή του στο σχολείο, τους βαθµούς του στις εισαγωγικές εξετάσεις, τα τµήµατα στα οποία επιθυµεί να εισαχθεί, κ.λπ. Στη συνέχεια το πρόγραµµα θα παρουσιάζει τα στοιχεία σε

18 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης µορφή κατάλληλη για χρήση από την υπηρεσία του Υπουργείου Παιδείας η οποία καταρτίζει τους πίνακες εισακτέων. 1.5 Προγραµµατισµός δένδρων απόφασης (B) Ας αρχίσουµε µε τον προγραµµατισµό του απλούστερου δυνατού δένδρου απόφασης, ενός δένδρου µε έναν µόνο κόµβο: Στις προηγούµενες ενότητες µάθαµε πώς να προγραµµατίζουµε τον υπολογιστή για να εκτυπώνει τέτοια µηνύµατα και να διαβάζει τις απαντήσεις του χρήστη. Χρειαζόµαστε όµως µια επιπλέον εντολή, την εντολή if-then-else («εάν-τότε-διαφορετικά»), η οποία θα µας επιτρέψει να κωδικοποιήσουµε στο πρόγραµµά µας τη διακλάδωση για τη θετική ή αρνητική (ναι ή όχι) απάντηση του χρήστη. Ηαπαιτούµενηεντολήγιατοδένδροαπόφασηςεκτείνεται σε αρκετές γραµµές και έχει την εξής µορφή: if answer = 'ναι' then Κώδικας Α else Κώδικας Β Εδώ οι εκφράσεις Κώδικας Α και Κώδικας Β δηλώνουν δύο ακολουθίες εντολών Pascal. Πρόκειταιγια σύνθετες εντολές,ο ορισµόςτω ν οποίων δίνεται στην επόµενηπαράγραφο. Ας υποθέσουµε ότι το πρόγραµµα έχει εκτελέσει την εντολή readln(answer) όπου η answer έχει δηλωθεί ως θέση µνήµης για την καταχώριση συµβολοσειρών, και ότι το πρόγραµµα έχει αποθηκεύσει στη θέση µνήµης answer είτε «ναι» είτε «όχι». Εάν ηµεταβλητήanswer περιέχει «ναι» εκτελείται η ακολουθία εντολών Κώδικας Α, ενώ εάν περιέχει «όχι» εκτελείται η ακολουθία εντολών Κώδικας Β. Πλέον, µπορούµε να γράψουµε ένα πρόγραµµα για αυτό το απλό δένδρο απόφασης. program FirstTree; answer: string; writeln('είστε εξοικειωµένος µε συστήµατα τυπικού συµβολισµού;'); readln(answer); if answer = 'ναι' then writeln('στον προγραµµατισµό, θα έχετε την ευκαιρία'); writeln('να τα εφαρµόσετε στην πράξη!');

1.5. Προγραµµατισµός δένδρων απόφασης 19 else writeln('η µελέτη της Pascal θα σας επιτρέψει να'); writeln('εξοικειωθείτε επαρκώς µε ένα τέτοιο σύστηµα.'); ; Παρατηρήστε ότι η ακολουθία εντολών Κώδικας Α εκτείνεται σε τέσσερεις γραµµές και έχει ως εξής: writeln('στον προγραµµατισµό, θα έχετε την ευκαιρία'); writeln('να τα εφαρµόσετε στην πράξη!'); Ηακολουθίααυτήπεριέχει δύο εντολές writeln, τοποθετηµένες µεταξύ των λέξεωνκλειδιών και Τοίδιο συµβαίνει µετηνακολουθίαεντολών Κώδικας Β.Γενικά, κάθε ακολουθία εντολών µεταξύ των λέξεων-κλειδιών και ονοµάζεται σύνθετη εντολή (compound statement) αυτός είναι ο τύπος εντολής που επιτρέπεται στα σηµεία του προγράµµατος µε ενδείξεις Κώδικας Α και Κώδικας Β. Στο Κεφάλαιο 4 θα αναφέρουµε µια παραλλαγή αυτού του κανόνα. (Στην πραγµατικότητα το συγκεκριµένο πρόγραµµα έχει συνολικά τρεις σύνθετες εντολές, τις δύο που µόλις αναφέραµε και το κύριο µέρος του ίδιου του προγράµµατος, το οποίο αποτελείται επίσης από µια ακολουθία εντολών που περικλείεται µεταξύ των λέξεων-κλειδιών και ) Παρ όλο που αυτό το σύντοµο πρόγραµµα φαίνεται αρκετά εύκολο, θα πρέπει να το µελετήσετε µε προσοχή. Τι θα συνέβαινε εάν απαντούσατε στην αρχική ερώτηση «Ναι, κάπως» αντί για «ναι» ή «όχι»; Τι θα συνέβαινε εάν πληκτρολογούσατε «Ναι» αντί για «ναι»; Σχετικά µε το πρόγραµµα αυτό ανακύπτουν δύο πολύ σηµαντικά ζητήµατα. Το πρώτο αφορά τη χρήση της κλιµακωτής στοίχισης. Κάθε γραµµή του κώδικα µπορεί να απέχει από το αριστερό περιθώριο όσο θέλουµε, χωρίς να επηρεάζεται η εκτέλεσή της. Η αναγνωσιµότητα όµως του προγράµµατος βελτιώνεται σηµαντικά, εάν για κάθε κλάδο της εντολής if εφαρµόσουµε κλιµακωτή στοίχιση προς τα δεξιά. Με τον τρόπο αυτό, η προσοχή εστιάζεται αµέσως στα σηµαντικά τµήµατα του κώδικα, ώστε να ελέγχεται εύκολα η ροή του προγράµµατος. Η σύνταξη των προγραµµάτων θα πρέπει να διέπεται από την καθαρότητα και τη σαφήνεια µε την οποία οφείλει να γράφει κανείς και σε µια φυσική γλώσσα, όπως είναι η ελληνική ή η αγγλική.εάν αγνοηθούναυτές οι υποδείξεις στη σύνταξη ενός προγράµµατος, το τελικό αποτέλεσµα θα είναι εξίσου ενοχλητικό µε την παράλειψη των επικεφαλίδων ή της αλλαγής τω ν παραγράφων στις ενότητες κάποιου άρθρου. Το δεύτερο ζήτηµα, ανάλογης σπουδαιότητας µε το πρώτο, έχει να κάνει µε τη θέση των χαρακτήρων «;». Στο βιβλίο αυτό ακολουθούνται οι εξής κανόνες όσον αφορά τα σηµεία τοποθέτησής τους: (1) στο τέλος της επικεφαλίδας και της δήλωσης, (2) στο τέλος κάθε εντολής που βρίσκεται µέσα σε σύνθετη εντολή. Οκανόνας αυτός εφαρµόζεται εύκολα στα προγράµµατα των προηγούµενων ενοτήτων, καθώς αυτά περιλαµβάνουν µόνο µία σύνθετη εντολή, εν προκειµένω την κύρια ακολουθία εντολών, την οποία ορίζουν οι λέξεις-κλειδιά και στην αρχή και στο τέλος του προγράµµατος. Εάν λάβουµε υπ όψιν ότι οι ίδιες οι λέξεις-κλειδιά και δεν είναι εντολές, η τοποθέτηση των χαρακτήρων «;» είναι απλούστατη: program ReadData; position1: string;

20 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης readln(position1); writeln(position1); Στο πρόγραµµα FirstTree, όµως, απαιτείται ιδιαίτερη προσοχή για την τοποθέτηση των χαρακτήρων «;». Κατ αρχάς, ελέγχουµε εάν η επικεφαλίδα και η δήλωση έχουν «;». Ακολούθως, εφαρµόζουµε τον κανόνα (2) σε κάθε εντολή του κυρίως προγράµ- µατος, χωρίς να ασχοληθούµε µε τις σύνθετες εντολές που περιλαµβάνονται στη δοµή if-then-else (και οι οποίες είναι µετατοπισµένες προς τα δεξιά και περικλείονται από και ). Τέλος, εξετάζουµε κάθε σύνθετη εντολή και φροντίζουµε η κάθε επι- µέρους εντολή της να ακολουθείται από τον χαρακτήρα «;». Ας εξετάσουµε αρχικά το κυρίως πρόγραµµα, το οποίο αρχίζει και τελειώνει στις γραµµές µε την ένδειξη Κ, και τις τέσσερεις εντολές που φέρουν τις ενδείξεις Κ1 έως Κ4: program FirstTree; answer: string; {K} {K1} writeln('είστε εξοικειωµένος µε συστήµατα τυπικού συµβολισµού;'); {K2} readln(answer); {K3} if answer = 'ναι' then writeln('στον προγραµµατισµό, θα έχετε την ευκαιρία'); writeln('να τα εφαρµόσετε στην πράξη!'); else writeln('η µελέτη της Pascal θα σας επιτρέψει να'); writeln('εξοικειωθείτε επαρκώς µε ένα τέτοιο σύστηµα.'); ; {K4} {K} Και οι τέσσερεις εντολές αρχίζουν στο ίδιο επίπεδο στοίχισης όπως και οι λέξεις-κλειδιά και που τις περικλείουν. Κάθε εντολή πρέπει να τελειώνει µε έναν χαρακτήρα «;». Πού είναι όµως το τέλος της κάθε εντολής; Στις τρεις από τις τέσσερεις περιπτώσεις, το τέλος βρίσκεται στο δεξιό άκρο της αντίστοιχης γραµµής του προγράµµατος. Ηεντολήif-then-else όµως (Κ3) εκτείνεται σε δέκα γραµµές το τέλος της είναι το που προηγείται του τελικού readln. Συνεπώς,µεβάσητονκανόνα(2),οιθέσειςµετις ενδείξεις Κ1, Κ2, Κ3 και Κ4 απαιτούν χαρακτήρες «;». program FirstTree; answer: string; {K} {K1} writeln('είστε εξοικειωµένος µε συστήµατα τυπικού συµβολισµού;'); {*K1} {K2} readln(answer); {*K2} {K3} if answer = 'ναι' then writeln('στον προγραµµατισµό, θα έχετε την ευκαιρία'); writeln('να τα εφαρµόσετε στην πράξη!');

1.5. Προγραµµατισµός δένδρων απόφασης 21 else writeln('η µελέτη της Pascal θα σας επιτρέψει να'); writeln('εξοικειωθείτε επαρκώς µε ένα τέτοιο σύστηµα.'); ; {*K3} {K4} {*K4} {K} Οκανόνας (2) απαιτεί επίσης κάθε επιµέρους εντολή µέσα σε σύνθετη εντολή να τελειώνει µε «;». Για παράδειγµα, η σύνθετη εντολή που ορίζεται από τις λέξεις-κλειδιά και µε την ένδειξη Ν, περιλαµβάνει δύο εντολές, τις Ν1 και Ν2. Στο τέλος των εντολών αυτών πρέπει να υπάρχει ο χαρακτήρας «;»: program FirstTree; answer: string; {K} {K1} writeln('είστε εξοικειωµένος µε συστήµατα τυπικού συµβολισµού;'); {*K1} {K2} readln(answer); {*K2} {K3} if answer = 'ναι' then {N} {N1} writeln('στον προγραµµατισµό, θα έχετε την ευκαιρία'); {*N1} {N2} writeln('να τα εφαρµόσετε στην πράξη!'); {*N2} {N} else writeln('η µελέτη της Pascal θα σας επιτρέψει να'); writeln('εξοικειωθείτε επαρκώς µε ένα τέτοιο σύστηµα.'); ; {*K3} {K4} {*K4} {K} Τέλος, θα πρέπει να εξετάσουµε την τελευταία σύνθετη εντολή για να βεβαιωθούµε ότι οι δύο εντολές που περιέχει τελειώνουν µε τον χαρακτήρα «;». Εάν φροντίζετε να εφαρ- µόζετε αυστηρά αυτούς τους δύο κανόνες, δεν θα έχετε κανένα πρόβληµα µε τη χρήση των χαρακτήρων «;». Εάν όµως κάνετε λάθος στην εφαρµογή τους, το πρόγραµµά σας είτε δεν θα εκτελεστεί είτε θα δώσει λάθος αποτελέσµατα. Ένας χρήσιµος πρόσθετοςέλεγχοςγιατηνορθότητατηςθέσηςτων χαρακτήρων «;» είναι ο εξής: Εξετάστε κάθε else στο πρόγραµµά σας και βεβαιωθείτε ότι δεν υπάρχει χαρακτήρας «;» πριν από αυτό στην ίδια ήτηνπροηγούµενη γραµµή. Εάν ακολουθείτε τους κανόνες (1) και (2), δεν θα βάλετε ποτέ «;» πριν από κάποιο else. (Τα τυπικά εγχειρίδια της Pascal δίνουν µια ελαφρά διαφορετική εικόνα για τους χαρακτήρες «;» από αυτήν που παρουσιάστηκε εδώ. Εκεί οι χαρακτήρες «;» αντιµετωπίζονται ως διαχωριστές εντολών µέσα σε µια σύνθετη εντολή.ωςσύνθετηεντολή θεωρείται µια ακολουθία εντολών µεταξύ και, ενώ οι χαρακτήρες «;» µπαίνουν µεταξύ δύο εντολών ως εξής (το κάθε s αντιστοιχεί σε µία εντολή): s ; s ; s ; s Όταν η παραπάνωακολουθία εντολών γραφεί στη συνηθισµένη µορφή, δείχνει ως εξής: s; s; s; s

22 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης Η τελευταία εντολή s δεν συνοδεύεται από «;». Επειδή αυτό µερικές φορές προκαλεί σύγχυση στους σπουδαστές, σε αυτό το βιβλίο ακολουθούµε τον πιο οµοιόµορφο κανόνα ότι κάθε εντολή µεταξύ των και θα ακολουθείται από «;»: s; s; s; s; Και στις δύο παραπάνωπεριπτώσεις, τα προγράµµατα λειτουργούν µε τον ίδιο ακριβώς τρόπο.) Επιστρέφοντας στα δένδρα απόφασης, καταλήγουµε στο συµπέρασµα ότι όλες οι δοµές αυτού του τύπου προγραµµατίζονται µε ανάλογο τρόπο, µε τη µόνη διαφορά ότι ενδέχεταινα έχουν περισσότερες διακλαδώσεις. Ας δηµιουργήσουµεπαραδείγµατος χάριν ένα πρόγραµµα για το δένδρο τηςυπόδειξηςβιβλίου, το οποίο εξετάσαµεστηναρχή αυτού του κεφαλαίου. Το συγκεκριµένο πρόγραµµα αρχίζει όπως και το αµέσως προηγούµενο: program BookAdvice; answer1: string; writeln('επιθυµείτε µια µαθηµατική προσέγγιση;'); readln(answer1); if answer1 = 'ναι' then Κώδικας για την περίπτωση της επιλογής «ναι» ; else Κώδικας για την περίπτωση της επιλογής «όχι» ; Ας δούµε στη συνέχεια τον κώδικα για τον χειρισµό της επιλογής «ναι»: writeln('σας ενδιαφέρει ο προγραµµατισµός'); writeln('ή τα θεωρητικά θέµατα;'); readln(answer2); if answer2 = 'προγραµµατισµός' then writeln('σας συνιστώ το "Oh! Pascal!" των'); writeln('d. Cooper και M. Clancy.'); else writeln('μια καλή επισκόπηση δίδεται'); writeln('στο βιβλίο Algorithmics '); writeln('του D. Harel.'); ; Μπορούµε τώρα να παρεµβάλουµε τον κώδικα τηςεπιλογής «ναι» στην κατάλληλη θέση του κυρίως προγράµµατος:

1.5. Προγραµµατισµός δένδρων απόφασης 23 program BookAdvice; answer1, answer2: string; writeln('επιθυµείτε µια µαθηµατική προσέγγιση;'); readln(answer1); if answer1 = 'ναι' then writeln('σας ενδιαφέρει ο προγραµµατισµός'); writeln('ή τα θεωρητικά θέµατα;'); readln(answer2); if answer2 = 'προγραµµατισµός' then writeln('σας συνιστώ το "Oh! Pascal!" των'); writeln('d. Cooper και M. Clancy.'); else writeln('μια καλή επισκόπηση δίδεται'); writeln('στο βιβλίο Algorithmics '); writeln('του D. Harel.'); ; else Κώδικας για την περίπτωση της επιλογής «όχι». ; Με ανάλογο τρόπο, µπορούµε να γράψουµε τον κώδικα για την επιλογή «όχι»και να τον παρεµβάλουµε στο κυρίως πρόγραµµα ώστε να ολοκληρωθεί το δένδρο απόφασης: program BookAdvice; answer1, answer2, answer3: string; writeln('επιθυµείτε µια µαθηµατική προσέγγιση;'); readln(answer1); if answer1 = 'ναι' then writeln('σας ενδιαφέρει ο προγραµµατισµός'); writeln('ή τα θεωρητικά θέµατα;'); readln(answer2); if answer2 = 'προγραµµατισµός' then writeln('σας συνιστώ το "Oh! Pascal!" των'); writeln('d. Cooper και M. Clancy.'); else writeln('μια καλή επισκόπηση δίδεται'); writeln('στο βιβλίο "Algorithmics"'); writeln('του D. Harel.'); ;

24 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης else writeln('θα προτιµούσατε ένα βιβλίο'); writeln('µε έµφαση στον προγραµµατισµό'); writeln('ή επιθυµείτε µια γενική επισκόπηση'); writeln('της επιστήµης των υπολογιστών;'); readln(answer3); if answer3 = 'προγραµµατισµός' then writeln('ένα καλό βιβλίο για αρχή είναι το'); writeln(' Karel the Robot του R. Pattis.'); else writeln('πιθανόν να σας ενδιέφερε το'); writeln(' Σπουδαίες ιδέες στην επιστήµη των υπολογιστών '); writeln('του A. Biermann'); ; ; Για την αποθήκευση των απαντήσεων στις διάφορες ερωτήσεις χρησιµοποιήσαµε διαφορετικέςθέσειςµνήµης, τιςanswer1, answer2, answer3. Ηκαταχώρισητων απαντήσεων σε ξεχωριστές θέσεις µνήµης επιβάλλεται για να αποφευχθεί το ενδεχόµενο σύγχυσης στη σύνταξη πιο πολύπλοκων προγραµµάτων. Μην ξεχνάτε να δηλώνετε όλες αυτές τις θέσεις µνήµης. Υπάρχειεπίσηςµια παραλλαγήτηςεντολήςif που είναι ιδιαίτερα χρήσιµη στον προγραµµατισµό δένδρων απόφασης µε περισσότερους από δύο κλάδους σε ορισµένους κόµβους: if συνθήκη then σύνθετη εντολή Εάν ικανοποιείται η συνθήκη, θα εκτελεστεί η αντίστοιχη σύνθετη εντολή. Σε αντίθετη περίπτωση, η εντολή δεν θα εκτελεστεί και το πρόγραµµα θα προχωρήσει αγνοώντας την. Το δένδρο απόφασης για την ταξινόµηση γλάρων προσφέρει ένα καλό παράδειγµα για αυτό το είδος προγραµµατισµού. Μια πρώτη µορφή του προγράµµατος µπορεί να έχει ως εξής: program SeagullClass; answer: string; writeln('τι χρώµα έχουν τα πόδια του;'); readln(answer1); if answer1 = 'κόκκινο' then Κώδικας για την περίπτωση ποδιών κόκκινου χρώµατος ; if answer1 = 'µαύρο' then Κώδικας για την περίπτωση ποδιών µαύρου χρώµατος ; if answer1 = 'καφέ' then Κώδικας για την περίπτωση ποδιών καφέ χρώµατος ;

1.5. Προγραµµατισµός δένδρων απόφασης 25 if answer1 = 'πράσινο' then Κώδικας για την περίπτωση ποδιών πράσινου χρώµατος ; Στη συνέχεια µπορούµε να συµπληρώσουµε τον κώδικα για τις επιµέρους περιπτώσεις ως εξής: program SeagullClass; answer1, answer2: string; writeln('τι χρώµα έχουν τα πόδια του;'); readln(answer1); if answer1 = 'κόκκινο' then writeln('τι χρώµα έχει το ράµφος του;'); readln(answer2); if answer2 = 'µαύρο' then writeln('τι χρώµα έχουν οι άκρες των φτερών του;'); readln(answer3); Συνέχεια του κώδικα. ; if answer2 = 'κίτρινο' then writeln('ανήκει στο είδος Kittiwake.'); ; ; if answer1 = 'µαύρο' then Κώδικας για την περίπτωση ποδιών µαύρου χρώµατος ; if answer1 = 'καφέ' then Κώδικας για την περίπτωση ποδιών καφέ χρώµατος ; if answer1 = 'πράσινο' then Κώδικας για την περίπτωση ποδιών πράσινου χρώµατος ; Όλα τα δένδρα απόφασης, όχι µόνο αυτά που αναφέραµε εδώ αλλά και οποιοδήποτε άλλο, µπορούν να προγραµµατιστούν µε ανάλογο τρόπο. Τα µόνα δοµικά στοιχεία που απαιτούνται είναι οι εντολές writeln, readln, if-then-else, if-then,ηεπικεφαλίδα του προγράµµατος και οι δηλώσεις. Ακόµη και έτσι, αυτά τα προγράµµατα είναι πιο πολύπλοκα από όσο θα έπρεπε, όπως θα διαπιστώσουµε στο Κεφάλαιο 4, όπου θα εισαγάγουµε την έννοια του υποπρογράµµατος. Στο σηµείο αυτό, θα ήταν χρήσιµο αφ ενός να εκτελέσετεορισµένα από αυτά τα προγράµµατα σε κάποιον υπολογιστή και αφ ετέρου να προσπαθήσετε να γράψετε µερικά νέα. Πριν από την εκτέλεση ενός προγράµµατος, όµως, θα πρέπει να το ελέγξετε προσεκτικά. Υπάρχουν δύο είδη ελέγχου που πρέπει να γίνουν: Αρχικά, βεβαιωθείτε ότι το συντακτικό µέρος ακολουθεί πιστά τους κανόνες της γλώσσας. Στη συνέχεια, εκτελέστε τον κώδικα µε το χέρι για να διαπιστώσετε εάν οι εντολές εκτελούν όντως τις εργασίες για τις οποίες γράφτηκαν. Ας εκτελέσουµε αυτούς τους δυο ελέγχους στο πρόγραµµα BookAdvice, ξεκινώντας µε το συντακτικό µέρος. Έχουν γραφεί όλες οι εντολές σύµφωνα µε τους συντακτικούς κανόνες της γλώσσας; Είναι οι χαρακτήρες «;» στις σωστές θέσεις; Αν δεν είναι όλες οι λεπτοµέρειες σωστές στην εντέλεια, το πρόγραµµα δεν θα εκτελεστεί. Θα πρέπει επίσης να ελέγξουµε τα κενά διαστήµατα και τη στοίχιση των γραµµών για να βεβαιωθούµε

26 1. Εισαγωγή στον προγραµµατισµό: Κωδικοποίηση δένδρων απόφασης ότι το πρόγραµµα είναι σαφές και ευανάγνωστο, και ότι η στοίχιση αναδεικνύει όσο γίνεται καλύτεραταβασικάτµήµατάτου.ανκαιτακενάδιαστήµαταδενθαεπηρεάσουν την εκτέλεση του προγράµµατος, θα πρέπει να φροντίζουµε η εµφάνιση του κώδικα να διευκολύνει την κατανόησή του. Εν συνεχεία, εκτελούµε τον κώδικα µε το χέρι προκειµένου να βεβαιωθούµε ότι κάνει αυτό που θέλουµε. Η δήλωση στην αρχή ορίζει ποιες θέσεις µνήµης θα πρέπει να δεσµευθούν, και εποµένως ο «χειρωνακτικός»έλεγχος αρχίζει µε την καταγραφή αυτών των θέσεων. answer1: answer2: answer3: Κατόπιν, ξεκινώντας από τη λέξη-κλειδί, διαβάζουµε κάθε γραµµή του κώδικα, και ελέγχουµε εάν όντως περιγράφειτην ενέργεια που επιθυµούµε να εκτελεστεί: writeln('επιθυµείτε µια µαθηµατική προσέγγιση;'); Αφού βεβαιωθούµε ότι αυτή είναι όντως η σωστή ενέργεια, προχωρούµε στη δεύτερη εντολή: readln(answer1); Είναι σωστή η εντολή αυτή; Αποθηκεύεται η απάντηση εκεί που θέλουµε; Ας υποθέσουµε ότι ο χρήστης πληκτρολογεί «όχι». Αµέσως καταγράφουµε µε το χέρι το αποτέλεσµα που προκύπτει: answer1: όχι answer2: answer3: Συνεχίζοντας στην επόµενη εντολή, βλέπουµε ότι γίνεται ο έλεγχος answer1 =«ναι», οπότε πρέπει να ανατρέξουµε επιµελώς στη θέση µνήµης answer1 για να δούµε κατά πόσον ο έλεγχος είναι επιτυχής. Στη συγκεκριµένη περίπτωση δεν είναι, οπότε ο έλεγχος µεταβιβάζεται στην εντολή που έπεται του else. Θα πρέπει τώρα να πιστοποιήσουµε ότι αυτή είναι η ενέργεια που θέλαµε. Η εκτέλεση µε το χέρι συνεχίζεται µε ενδελεχή εξέταση κάθε ενέργειας του προγράµµατος. Ένα πρόγραµµα δεν θα πρέπει να δίνεται για µεταγλώττιση και εκτέλεση εάν δεν έχει προηγηθεί εκτενής και εξονυχιστικός έλεγχος, αναθεώρηση και επανειληµµένη επαλήθευση. Οι έµπειροι προγραµµατιστές γνωρίζουν καλά ότι λάθη στο πρόγραµµα συνεπάγονται συνήθως τεράστια απώλεια χρόνου και άλλων πόρων, και για τον λόγο αυτό επενδύουν το µεγαλύτερο µέρος του χρόνου τους, και πολύ σωστάκάνουν, στη σχεδίαση του προγράµµατος και στην επαλήθευση µε το χέρι. Ασκήσεις 1. Προγραµµατίστε το δένδρο απόφασης για τη συµπλήρωση της φορολογικής δήλωσης που δόθηκε σε προηγούµενη ενότητα. 2. Σχεδιάστε ένα δένδρο απόφασης σχετικά µε κάποιο θέµα προσωπικού σας ενδιαφέροντος. Γράψτε ένα πρόγραµµα για αυτό το δένδρο. 3. Γράψτε ένα πρόγραµµα για το παιγνίδι Nim µε τα επτά τετράγωνα το οποίο περιγράψαµε στα προηγούµενα.