Σημειώσεις για την Pascal



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

Pascal. 15 Νοεμβρίου 2011

Pascal. 1 Γλώσσες προγραμματισμού. 21 Οκτωβρίου 2011

Pascal. 26 Οκτωβρίου 2011

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

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

Εντολές ελέγχου ροής if, for, while, do-while

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

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

2ο σετ σημειώσεων. 1 Εντολές εκτέλεσης υπό συνθήκη. 19 Μαρτίου 2012

ΜΑΗΣ ΕΞΕΤΑΣΤΙΚΟ ΔΟΚΙΜΙΟ

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

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

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

ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PASCAL

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

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

Η ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ Εντολές Επανάληψης REPEAT UNTIL, FOR, WHILE

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

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

Διαδικασιακός Προγραμματισμός

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

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

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση 1 read(x) 122 x= 2 read(a,b,c) a= b= c= 3 read(d,e)

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ. Διδάσκουσα Δρ Β.

Δομή Επανάληψης. Κεφάλαιο 7 Mike Trimos

ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΔΙΕΥΘΥΝΣΗ ΑΝΩΤΕΡΗΣ ΚΑΙ ΑΝΩΤΑΤΗΣ ΕΚΠΑΙΔΕΥΣΗΣ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2006

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Η γλώσσα προγραμματισμού Strange

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

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

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

Κεφάλαιο 1. Τι θα μάθουμε σήμερα: -AND, OR, NOT. -Ενσωματωμένες συναρτήσεις. -Μαθηματικοί τελεστές -ΤΕΛΕΣΤΕΣ DIV ΚΑΙ MOD. -Προτεραιότητα πράξεων

Μεταβλητές τύπου χαρακτήρα

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

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

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

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

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

Προγραμματισμός με FORTRAN Συνοπτικός Οδηγός Α. Σπυρόπουλος Α. Μπουντουβής

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

Πρόβλημα 29 / σελίδα 28

Η γλώσσα προγραμματισμού EEL

Δομημένος Προγραμματισμός (ΤΛ1006)

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ:

Εισαγωγή στην Αριθμητική Ανάλυση

Προγραμματισμός PASCAL

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Γραπτές εξετάσεις στο μάθημα: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (Θ) Εισηγητής: Γεωργίου Χρήστος ΘΕΜΑΤΑ & ΑΠΑΝΤΗΣΕΙΣ. Β. Χαρακτήρας(Αλφαριθμητικά)

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Ρητή μετατροπή αριθμητικής τιμής σε άλλο τύπο. Τι θα τυπωθεί στον παρακάτω κώδικα;

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

Διαδικασιακός Προγραμματισμός

Εισαγωγή στην γλώσσα προγραμματισμού C

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

Αντίρριο, 14/03/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές»

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

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

Βασικές Έννοιες Αλγορίθμων Τι είναι αλγόριθμος

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / Γ ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 27/01/2013

ιαδικαστικός Προγραμματισμός


Εισαγωγή στον Προγραμματισμό

Προγραμματισμός ΗΥ και Υπολογιστική Φυσική. Χρήστος Γκουμόπουλος

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

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

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

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

Εισαγωγή στον Προγραμματισμό

ΜΕΡΟΣ Α - Αποτελείται από δέκα (10) ερωτήσεις. Κάθε ερώτηση βαθμολογείται με έξι μονάδες.

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΠΡΑΞΕΙΣ. Παράδειγμα #1. Πράξεις μεταξύ ακεραίων αριθμών

Σκοπός. Εργαστήριο 5 Εντολές Επιλογής

Pascal Βασικοί τύποι δεδοµένων

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

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

Βασικές έννοιες προγραμματισμού

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

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Διαδικασιακός Προγραμματισμός

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΔΙΕΥΘΥΝΣΗ ΑΝΩΤΕΡΗΣ ΚΑΙ ΑΝΩΤΑΤΗΣ ΕΚΠΑΙΔΕΥΣΗΣ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2007

Εισαγωγή στην PHP. ΕΣΔ 516 Τεχνολογίες Διαδικτύου. Περιεχόμενα. Περιεχόμενα. ΕΣ 516: Τεχνολογίες ιαδικτύου. ΕΣ 516: Τεχνολογίες ιαδικτύου

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

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

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

Λογικός τύπος Τελεστές σύγκρισης Λογικοί τελεστές Εντολές επιλογής Εμβέλεια Μαθηματικές συναρτήσεις Μιγαδικός τύπος ΔΕΥΤΕΡΗ ΔΙΑΛΕΞΗ

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

A2. Να γράψετε για κάθε περίπτωση τον αριθμό της πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Transcript:

Σημειώσεις για την Pascal 10 Νοεμβρίου 2013 1 Γλώσσες προγραμματισμού Οι σύγχρονοι μικροεπεξεργαστές μπορούν μεταξύ άλλων να εκτελούν αριθμητικές και λογικές πράξεις και να διαβάζουν και γράφουν στη μνήμη του υπολογιστή. Για να γίνει αυτό πρέπει να τους δωθούν οι ανάλογες εντολές. Οι εντολές είναι κωδικοποιημένες ως αριθμοί. Για παράδειγμα οι παρακάτω εντολές βάζουν σε μια θέση μνήμης τον αριθμό 5, σε μια άλλη τον αριθμό 7, προσθέτουν τους δύο αριθμούς και αποθηκεύουν το αποτέλεσμα σε μια τρίτη θέση μνήμης (για έναν επεξεργαστή Pentium). 457f 464c 0101 0001 0000 0000 0000 0000 0001 0003 0001 0000 0000 0000 0000 0000 00d0 0000 0000 0000 0034 0000 0000 0028 0009 0006 8955 83e5 10ec 45c7 05fc 0000 c700 f845 0007 0000 458b 8bf8 fc55 048d 8902 f445 00b8 0000 c900 00c3 4700 4343 203a 5528 7562 746e 2f75 694c 616e 6f72 3420 342e 342e 312d 7534 7562 746e 3575 2029 2e34 2e34 0035 2e00 7973 746d 6261 2e00 7473 7472 6261 2e00 6873 7473 7472 6261 2e00 6574 7478 2e00 6164 6174 2e00 7362 0073 632e 6d6f 656d 746e 2e00 6f6e 6574 472e 554e 732d 6174 6b63 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 Είναι προφανώς ακατανόητο. Ο λόγος δεν είναι απλώς ότι οι εντολές είναι κωδικοποιημένες ως αριθμοί αλλά και ότι πρέπει να τοποθετούνται σε μια συγκεκριμένη σειρά σε σχέση με τις παραμέτρους τους, να εκτελούνται κάποιες προπαρασκευαστικές λειτουργίες πριν εκτελεστούν αυτές καθαυτές οι εντολές κτλ. Για να απλουστεύσουν τα πράγματα οι κατασκευαστές μικροεπεξεργαστών αναθέτουν σε κάθε εντολή ένα μνημονικό (mnemonic) και έτσι μπορεί κανείς να καταλάβει ευκολότερα το παρακάτω 1 movl $5, -4(% ebp) 2 movl $7, -8(% ebp) 3 movl -8(%ebp), %eax 4 movl -4(%ebp), %edx 5 leal (%edx,%eax), %eax 1

6 movl %eax, -12(%ebp) σε σχέση με το προηγούμενο. Συνεχίζει όμως να μην είναι ευανάγνωστο και αυτό είναι ένα σημαντικό μειονέκτημα. Άλλο μειονέκτημα είναι ότι το πρόγραμμα αυτό θα ισχύει μόνο για μικροεπεξεργαστές ενός συγκεκριμένου τύπου. Όταν αναπόφευκτα αυτοί αποσυρθούν θα πρέπει και το πρόγραμμα να επικαιροποιηθεί. Προκειμένου να αντιμετωπίσουν τα παραπάνω προβλήματα, οι επιστήμονες πληροφορικής ανέπτυξαν γλώσσες προγραμματισμού δηλαδή γλώσσες με συγκεκριμένη σημασιολογία, ανεξάρτητες από συγκεκριμένο τύπο επεξεργαστή οι οποίες όμως θα μπορούσαν με κάποιο μηχανικό και σαφή τρόπο να μετατραπούν σε εντολές εκτελέσιμες από κάποιο μικροεπεξεργαστή. Έτσι, ένα πρόγραμμα μιας κάποιας γλώσσας προγραμματισμού θα σήμαινε κάποια συγκεκριμένα πράγματα ανεξάρτητα από τον επεξεργαστή στον οποίο τελικά θα εκτελείτο. Για να δουλέψει το παραπάνω σχήμα χρειάζονται κάποια προγράμματα τα οποία θα κάνουν αυτοματοποιημένα κάποιες απαραίτητες μετατροπές. Για παράδειγμα, το παραπάνω πρόγραμμα πρόσθεσης του 5 και του 7, στην Pascal θα γραφόταν ως εξής: 1 a := 5; 2 b := 7; 3 c := a + b; Στην ορολογία των γλωσσών προγραμματισμού, εντολές σαν τις παραπάνω, γραμμένες σε κάποια γλώσσα προγραμματισμού ονομάζονται πηγαίος κώδικας (source code). Οι παραπάνω εντολές είναι προφανώς πιο ευανάγνωστες από τον κώδικα μηχανής ή την assembly. Δεν μπορούν όμως να εκτελεστούν από κάποιον επεξεργαστή. Οπότε πρέπει να υπάρξει ένα πρόγραμμα το οποίο να μετατρέπει τις παραπάνω εντολές σε κώδικα μηχανής. Το πρόγραμμα αυτό ονομάζεται μεταγλωττιστής (compiler). Ένας μεταγλωττιστής προορίζεται για μία συγκεκριμένη γλώσσα προγραμματισμού. Επίσης, αφού ο ίδιος ο μεταγλωττιστής είναι πρόγραμμα αποτελείται από εντολές που εκτελούνται από έναν συγκεκριμένο τύπο επεξεργαστή και όχι από άλλους. Για κάθε συνδυασμό γλώσσας προγραμματισμού και τύπου επεξεργαστή, χρειαζόμαστε διαφορετικό μεταγλωττιστή¹. Ένας μεταγλωττιστής γενικά διαβάζει ένα κομμάτι πηγαίου κώδικα και το μετατρέπει σε αριθμητικές εντολές για ένα συγκεκριμένο τύπο επεξεργαστή. Οι εντολές αυτές ονομάζονται αντικειμενικός κώδικας (objective code). Επιπρόσθετα, εκτός από τη μεταγλώττιση κάποιων εντολών μιας γλώσσας προγραμματισμού, κατά κανόνα χρειάζεται και η συνένωση του αντικειμενικού κώδικα με διάφορα άλλα κομμάτια αντικειμενικού κώδικα, π.χ. βιβλιοθήκες κώδικα. Αυτή τη δουλειά την κάνει ο λεγόμενος linker. Ο linker διαβάζει διάφορα κομμάτια αντικειμενικού κώδικα και τα συνενώνει σε ένα εκτελέσιμο πρόγραμμα (executable program) ή απλώς πρόγραμμα. Τελικά, η διαδικασία έχει ως εξής: Ένας προγραμματιστής γράφει ένα πρόγραμμα σε πηγαίο κώδικα για κάποια γλώσσα προγραμματισμού. Δεν έχει σημασία ο τύπος επεξεργαστή στον οποίο εργάζεται. Με το μεταγλωττιστή και το linker δημιουργεί ένα πρόγραμμα το οποίο μπορεί να δώσει σε οποιονδήποτε χρησιμοποιεί το ίδιο λειτουργικό σύστημα σε ίδιο ή συμβατό τύπο μικροεπεξεργαστή. Ο πηγαίος κώδικας γίνεται κατανοητός με τον ίδιο τρόπο από οποιονδήποτε προγραμματιστή ¹Είναι όμως εφικτό ένας μεταγλωττιστής που προορίζεται να τρέξει σε ένα συγκεκριμένο τύπο μικροεπεξεργαστή να παράξει κώδικα μηχανής για κάποιον άλλο τύπο μικροεπεξεργαστή 2

τον διαβάζει. Αν και από μόνος του δεν είναι εκτελέσιμος, μπορεί να μετατραπεί σε ένα εκτελέσιμο πρόγραμμα από οποιονδήποτε διαθέτει κατάλληλο μεταγλωττιστή. 2 Εισαγωγή στον προγραμματισμό σε Pascal ² Για κάθε γλώσσα προγραμματισμού το πιο διάσημο πρόγραμμα είναι εκείνο που τυπώνει στην οθόνη το μήνυμα Hello, world!. Στην Pascal ένα τέτοιο πρόγραμμα θα ήταν κάπως έτσι: 1 program hello; 2 begin 3 writeln('hello, world!'); 4 end. Αν κανείς μεταγλωττίσει τον πηγαίο κώδικα και τρέξει το εκτελέσιμο θα δει στην οθόνη του το μήνυμα Hello, world!. Το παραπάνω αν και μικρό μας δείχνει μερικά στοιχεία τα οποία θα βρίσκουμε σχεδόν σε κάθε πρόγραμμα Pascal: Η δεσμευμένη λέξη program στην πρώτη γραμμή του προγράμματος. Αν και δεν είναι κανόνας, τα περισσότερα προγράμματα με τα οποία θα ασχοληθούμε ξεκινούν με αυτήν τη δεσμευμένη λέξη, μετά το όνομα του προγράμματος (το οποίο δεν είναι κατ' ανάγκη ίδιο με το όνομα του αρχείου στο οποίο θα σώσουμε το πρόγραμμα) και στο τέλος το ελληνικό ερωτηματικό. Στις γραμμές 2 και 4 υπάρχουν οι δεσμευμένες λέξεις begin και end. Στην Pascal κάθε εκτελέσιμο πρόγραμμα πρέπει να έχει ένα μπλοκ (block) εντολών το οποίο να ξεκινάει με ένα begin και να τελειώνει με ένα end. Η εκτέλεση του προγράμματος ξεκινάει από την πρώτη εντολή αυτού του μπλοκ και συνεχίζεται με τις επόμενες μέχρις να φτάσει στην τελευταία εντολή πριν το αντίστοιχο end όπου ολοκληρώνεται η εκτέλεση του προγράμματος. Ενώ οι εντολές της Pascal συνήθως ακολουθούνται από το ελληνικό ερωτηματικό, μετά το end που ορίζει το τέλος του προγράμματος ακολουθεί η τελεία, όπως στη γραμμή 4 παραπάνω. Ένας καλός πρακτικός κανόνας είναι ότι μετά από κάθε εντολή της Pascal ακολουθεί το ελληνικό ερωτηματικό όπως στις γραμμές 1 και 3 παραπάνω. Αυτό δεν είναι απόλυτα αληθές γιατί στην πραγματικότητα το ελληνικό ερωτηματικό είναι ο χαρακτήρας διαχωρισμού και όχι τερματισμού εντολών. Στην πραγματικότητα δηλαδή το ελληνικό ερωτηματικό πρέπει να μπαίνει ανάμεσα από οποιεσδήποτε δύο εντολές της Pascal και όχι μετά από κάθε μία. Μερικές παρατηρήσεις σχετικά με αυτό το σημείο είναι χρήσιμο να γίνουν: Η λέξη begin στη γραμμή 2 δεν είναι εντολή. Απλώς σηματοδοτεί την αρχή μιας ομάδας εντολών που ξεκινάει από το begin και τελειώνει με το αντίστοιχο end. Η Pascal θεωρεί όλο αυτόν τον κώδικά ως μία σύνθετη εντολή. Οπότε δεν τίθεται θέμα να μπει ερωτηματικό μετά το begin γιατί η σύνθετη εντολή που ξεκινάει με αυτό δεν τελειώνει εκεί αλλά τελειώνει στο end. Μια άλλη παρατήρηση είναι ότι το ερωτηματικό στο τέλος της γραμμής 3 θα μπορούσε να παραληφθεί. Αναφέραμε ότι το ερωτηματικό είναι ο χαρακτήρας διαχωρισμού εντολών, δηλαδή χωρίζει μία εντολή από την επόμενή της. Στη συγκεκριμένη περίπτωση δεν υπάρχει άλλη εντολή από την writeln ²Οι παρούσες σημειώσεις δεν έχουν σκοπό να αποτελέσουν ένα πλήρη και εξαντλητικό εγχειρίδιο της Pascal αλλά να λειτουργήσουν ως βοήθημα στο εργαστηριακό μάθημα 3

της γραμμής 3 μέσα στο μπλοκ που ορίζεται από τα begin-end οπότε το ερωτηματικό δεν είναι απαραίτητο. 3 Μεταβλητές Είναι απαραίτητο στον προγραμματισμό να μπορούμε να αναφερθούμε σε θέσεις μνήμης του υπολογιστή στις οποίες να μπορούμε να αποθηκεύσουμε αποτελέσματα ή να διαβάσουμε τα περιεχόμενά τους. Οι θέσεις μνήμης σε κάθε υπολογιστή είναι διατεταγμένες (οπότε και αριθμημένες). Είναι πρακτικά δύσκολο για έναν προγραμματιστή να αναφέρεται σε θέσεις μνήμης βάσει του αύξοντα αριθμού τους. Οι άνθρωποι θυμούνται ονόματα ευκολότερα από ότι αριθμούς. Επίσης είναι πιο εύκολο να γράψει κανείς λανθασμένα έναν αριθμό από ότι ένα όνομα. Για αυτούς τους λόγους κάθε γλώσσα προγραμματισμού δίνει τη δυνατότητα ορισμού μεταβλητών (variables). Ο προγραμματιστής χρησιμοποιεί μεταβλητές απλώς αναφέροντας το όνομά τους. Ο μεταγλωττιστής αναλαμβάνει να αντιστοιχίσει τις μεταβλητές σε θέσεις μνήμης. Έτσι όποτε ο προγραμματιστής γράφει το όνομα μιας μεταβλητής ο μεταγλωττιστής δημιουργεί κώδικα μηχανής που αναφέρεται στη θέση μνήμης που αντιστοίχισε στη μεταβλητή χωρίς ο προγραμματιστής να ασχολείται με τις τεχνικές λεπτομέρειες. Στην Pascal πρέπει πριν χρησιμοποιήσουμε μια μεταβλητή να τη δηλώσουμε (declare). Αυτό γίνεται όπως στο παρακάτω πρόγραμμα στη γραμμή 3. Μία δήλωση μεταβλητής έχει τη μορφή onoma_metavlitis: typos_metavlitis;. Ως όνομα μπορούμε να χρησιμοποιήσουμε οποιοδήποτε νόμιμο όνομα (identifier) δηλαδή μια ακολουθία γραμμάτων ή/και αριθμών η οποία δεν ξεκινάει με αριθμό. Μετά ακολουθεί μία άνω-κάτω τελεία και τέλος ο τύπος της μεταβλητής που στην Pascal μπορεί να είναι integer, real, boolean ή char ³. Στο τέλος μπαίνει το ελληνικό ερωτηματικό. Όλες οι δηλώσεις πρέπει να είναι γραμμένες πριν από το begin με το οποίο ξεκινάει το πρόγραμμα. Πριν από τις δηλώσεις πρέπει να υπάρχει η δεσμευμένη λέξη var. Μπορεί κανείς να δηλώσει τις μεταβλητές που θα χρησιμοποιηθούν σε κάποιο πρόγραμμα είτε μία-μία είτε περισσότερες χωρισμένες με κόμματα αρκεί να είναι ίδιου τύπου: i, j, k: integer. Στο παράδειγμά μας στη γραμμή 7 βλέπουμε επίσης πώς μπορούμε να τυπώσουμε την τιμή μιας μεταβλητής χρησιμοποιώντας την `εντολή' writeln⁴. Η writeln ακολουθείται από ένα ζευγάρι παρενθέσεων μέσα στο οποίο βάζουμε ότι θέλουμε να τυπωθεί στην οθόνη. Μπορούμε να βάλουμε ονόματα μεταβλητών είτε μηνύματα μέσα σε μονά εισαγωγικά. Επίσης μπορούμε να βάλουμε περισσότερα από ένα ορίσματα στις παρενθέσεις αρκεί να τα χωρίζουμε με κόμματα. Στη γραμμή 6 του παραδείγματός μας βλέπουμε πώς μπορούμε να δώσουμε σε μία μεταβλητή την τιμή που θα δώσει ο χρήστης του προγράμματος στο πληκτρολόγιο. Η εντολή readln συντάσσεται όπως και η writeln δηλαδή ακολουθείται από ένα ζευγάρι παρενθέσεων μέσα στο οποίο αναφέρονται τα ορίσματά της δηλαδή οι μεταβλητές που θα πάρουν τιμή από το πληκτρολόγιο. Και σε αυτήν την περίπτωση μπορούμε να χρησιμοποιήσουμε περισσότερα από ένα ορίσματα χωρισμένα με κόμματα αλλά προς το παρόν στα παραδείγματά μας θα χρησιμοποιούμε ένα και μόνο όνομα μεταβλητής. Τέλος, στη γραμμή 8 φαίνεται πώς μπορούμε να δώσουμε μία τιμή σε κάποια μεταβλητή. Ο τελεστής απόδοσης τιμής := συντάσσεται ως εξής: Στα αριστερά του μπαίνει το όνομα της μεταβλητής στην οποία θα δοθεί τιμή. Στα δεξιά του μπαίνει οποιαδήποτε παράσταση δίνει απότέλεσμα ίδιου τύπου ³Θα δούμε στη συνέχεια ότι υπάρχουν και άλλες δυνατότητες πέρα από αυτούς τους βασικούς τύπους ⁴Στην πραγματικότητα η writeln δεν είναι εντολή αλλά διαδικασία. Θα δούμε λεπτομέρειες στη συνέχεια. 4

με τη μεταβλητή. Στο παράδειγμά μας όπου η μεταβλητή i είναι ακέραια, πρέπει και η έκφραση δεξιά από το := να είναι ακέραια. Η λειτουργία της είναι η εξής: Πρώτα υπολογίζεται η τιμή της παράστασης δεξιά από το :=. Η παράσταση μπορεί να περιέχει και την ίδια τη μεταβλητή. Όταν τελειώσουν οι υπολογισμοί, το αποτέλεσμα που προκύπτει αποθηκεύεται στη μεταβλητή αριστερά από το :=. 1 program var1; 2 var 3 i: integer; 4 begin 5 write(' Dose tin timi tis i: '); 6 readln(i); 7 writeln('h timi poy edoses einai ', i); 8 i := i + 5; 9 writeln('an tou pros8eseis to 5 givetai ', i); 10 end. 4 Εντολές της Pascal 4.1 Εντολή if Μία άλλη συνηθισμένη δομή στον προγραμματισμό είναι η εκτέλεση εντολών υπο συνθήκη. Δηλαδή κάποιες εντολές εκτελούνται αν ισχύει κάποια συγκεκριμένη προϋπόθεση. Στην Pascal η απλή μορφή αυτής της εντολής είναι η παρακάτω 1 if synthiki then 2 entoli; 3... που Ο τρόπος λειτουργίας είναι ο εξής: Αρχικά υπολογίζεται η τιμή της συνθήκης της γραμμής 1. Αν είναι αληθής τότε εκτελείται η εντολή⁵ της γραμμής 2 και η εκτέλεση του προγράμματος συνεχίζεται στη γραμμή 3. Αν η συνθήκη δεν είναι αληθής, τότε η εντολή της γραμμής 2 παρακάμπτεται και η εκτέλεση του προγράμματος συνεχίζεται με τη γραμμή 3. Ως λογική συνθήκη μπορεί να χρησιμοποιηθεί οποιαδήποτε έκφραση μπορεί να αποτιμηθεί ως αληθής ή ψευδής, π.χ. 7 > 5, i <= 10, i > j ⁶. Στη δεύτερή της μορφή η εντολή if δίνει τη δυνατότητα εκτέλεσης μιας εναλλακτικής εντολής στην περίπτωση που η συνθήκη δεν ισχύει. 1 if synthiki then 2 entoli 3 else 4 entoli2; ⁵Η εντολή μπορεί να είναι μία απλή εντολή ή μια ομάδα εντολών μέσα σε ένα begin-end μπλοκ. Η ίδια παρατήρηση ισχύει για το σύνολο των σημειώσεων. ⁶Θα δούμε στη συνέχεια αναλυτικά όλα τα είδη τελεστών που μπορούν να χρησιμοποιηθούν σε τέτοιου είδους εκφράσεις. 5

5... Σε αυτήν τη μορφή αν η συνθήκη ισχύει τότε εκτελείται η εντολή της γραμμής 2 και η εντολή μετά το else παρακάμπτεται οπότε η εκτέλεση του προγράμματος προχωράει με τη γραμμή 5. Αν όμως η συνθήκη δεν ισχύει τότε παρακάμπτεται η εντολή της γραμμής 2 και εκτελείται εκείνη της γραμμής 4. Και σε αυτήν την περίπτωση η εκτέλεση συνεχίζεται από τη γραμμή 5. Είναι σημαντικό να παρατηρήσετε ότι στην δεύτερη περίπτωση δεν μπαίνει ερωτηματικό μετά την εντολή της γραμμής 2. Επίσης πρέπει να πούμε ότι συντακτικά η Pascal θεωρεί ολόκληρο το σχήμα των γραμμών 1 και 2 στο πρώτο παράδειγμα ή το σχήμα των γραμμών 1 έως 4 στο δεύτερο ως μία (σύνθετη) εντολή. Οπότε μία if μπορεί να χρησιμοποιηθεί όπου θα έμπαινε μια απλή εντολή μέσα σε μια άλλη if. Δείτε το παρακάτω παράδειγμα υπολογισμού φόρου στο οποίο υπολογίζεται η φορολογία κάποιου σύμφωνα με τους εξής κανόνες: Αν έχει εισόδημα κάτω από 5 χιλιάδες ευρώ δεν πληρώνει τίποτα, αν έχει από 5 έως 12 πληρώνει το 10 τοις εκατό του ποσού πάνω από 5000 και αν έχει περισσότερα πληρώνει επιπλέον 20 τοις εκατό για το ποσό πάνω από 12 χιλιάδες. 1 program foros1; 2 var 3 eisodima, foros: real; 4 5 begin 6 write(' Dose to etisio eisodima sou: '); 7 readln( eisodima); 8 9 if ( eisodima <= 5000) then 10 foros := 0 11 else 12 if ( eisodima <= 12000) then 13 foros := ( eisodima - 5000) * 0.1 14 else 15 foros := 7000 * 0.1 + ( eisodima - 12000) * 0.2; 16 writeln('tha pliroseis foro ', foros :0:2); 17 end. Στο προηγούμενο χρησιμοποιήσαμε μεταβλητές τύπου real προκειμένου να μπορέσουμε να πραγματοποιήσουμε πράξεις κινητής υποδιαστολής (με δεκαδικά ψηφία). Παρατηρήστε ότι μετά το else της γραμμής 11, δεν ακολουθεί μια απλή εντολή όπως στη γραμμή 10 αλλά μία δεύτερη if. Επίσης παρατηρήστε ότι τόσο στη γραμμή 10 όσο και στη γραμμή 13 οι εντολές δεν ακολουθούνται από ερωτηματικό γιατί βρίσκονται ακριβώς πριν από ένα else. 4.2 Εντολή for Μια άλλη απαραίτητη δομή στον προγραμματισμό είναι και αυτή της επανάληψης. Παρουσιάζεται η ανάγκη να επαναληφθούν κάποιες εντολές. Ο αριθμός των επαναλήψεων μπορεί να είναι εκ των προτέρων γνωστός μπορεί ομως και όχι. Στην Pascal δίνονται τρεις διαφορετικές εναλλακτικές για αυτό το σκοπό. Η απλούστερη είναι η for που μας δίνει τη δυνατότητα να εκτελέσουμε ένα αριθμό επαναλήψεων, εκ των προτέρων γνωστό. Συντάσσεται όπως εδώ: 6

1 for variable := start to end do 2 entoli; Σε κάθε εντολή for χρειάζεται μια μεταβλητή ελέγχου (control variable) η οποία θα διατρέξει ένα σύνολο τιμών όπως η variable παραπάνω. Αυτή διατρέχει τις τιμές από start μέχρι end διαδοχικά δηλαδή πραγματοποιούνται end-start+1 επαναλήψεις. Σε κάθε επανάληψη εκτελείται η entoli. Στο παραπάνω παράδειγμα δηλαδή αρχικά η μεταβλητή ελέγχου variable παίρνει την τιμή start και εκτελείται η entoli. Μετά η μεταβλητή παίρνει την τιμή start+1 και εκτελείται η entoli, και ούτω καθεξής μέχρι η μεταβλητή να πάρει την τιμή end (συμπεριλαμβανομένης). Αν η τιμή start είναι μεγαλύτερη από την end δεν εκτελείται καμία επανάληψη. Σε αυτήν την περίπτωση μπορούμε αντί για τη λέξη to στη γραμμή 1 να χρησιμοποιήσουμε τη λέξη downto ώστε η μεταβλητή ελέγχου να προχωράει με βήμα -1 αντί για βήμα +1. Μια εντολή επανάληψης όπως η for παραπάνω στον προγραμματισμό ονομάζεται βρόχος (loop). Η εντολή που επαναλαμβάνεται ονομάζεται σώμα (body) του βρόχου. Το παρακάτω πρόγραμμα εκτελεί μια τέτοια επανάληψη για τις τιμές από 1 μέχρι και n όπου το n δίνεται από το χρήστη, προκειμένου να υπολογίσει το άθροισμα των n όρων μιας αριθμητικής προόδου με πρώτο όρο το 1 και βήμα 1. 1 program progression; 2 var 3 total, i, n: integer; 4 5 begin 6 write('dose to n: '); 7 readln(n); 8 9 total := 0; 10 for i := 1 to n do 11 total := total + i; 12 13 writeln('to a8roisma tvn orwv eivai: ', total); 14 end. 4.3 Εντολή while-do Μια άλλη εντολή με την οποία πραγματοποιούνται επαναλήψεις είναι η while-do. Συντάσσεται όπως εδώ: 1 while synthiki do 2 entoli; 3... Η συνθήκη είναι όπως και στην εντολή if. Η λειτουργία της while είναι η εξής: Αρχικά εκτιμάται η συνθήκη. Αν είναι αληθής τότε εκτελείται η εντολή μία φορά και η ροή του προγράμματος επανέρχεται στη while, ξαναεκτιμάται η συνθήκη και ούτω καθεξής. Η διαδικασία σταματάει όταν κάποια στιγμή η συνθήκη πάψει να ισχύει οπότε η while τερματίζεται και η εκτέλεση του προγράμματος 7

συνεχίζει από την επόμενη εντολή (στη γραμμή 3 στο παραπάνω). Η εντολή που εκτελείται σε κάθε επανάληψη ονομάζεται και αυτή σώμα του βρόχου while όπως και στην περίπτωση της for παραπάνω. Παρατηρήστε ότι υπάρχει περίπτωση το σώμα της while να μην εκτελεστεί ούτε μία φορά αν στην πρώτη φορά που υπολογιστεί η συνθήκη είναι ψευδής. Η while χρησιμοποιείται σε περιπτώσεις που ο αριθμός των επαναλήψεων που θα πραγματοποιηθούν δεν είναι εκ των προτέρων γνωστός αλλά είναι γνωστή μία συνθήκη τερματισμού. Δείτε και το παρακάτω παράδειγμα υπολογισμού όρων της ακολουθίας Fibonacci. Προσέξτε ότι επειδή στην περίπτωση αυτή χρειάζεται να επαναλαμβάνονται περισσότερες από μία εντολές τις περικλείνουμε σε ένα μπλοκ (block) begin-end. Μέσα στο μπλοκ μπορούμε να έχουμε οσεσδήποτε εντολές. Συντακτικά όμως η Pascal θεωρεί όλο το μπλοκ ως μία εντολή. 1 program fib; 2 var 3 a, b, c: integer; 4 limit: integer; 5 6 begin 7 write(' Dose to ano fragma twv orwv poy 8a ypologistouv: '); 8 readln(limit); 9 10 a := 1; 11 b := 1; 12 write(a, ' '); 13 14 while b < limit do 15 begin 16 write(b, ' '); 17 c := a + b; 18 a := b; 19 b := c; 20 end; 21 end. 4.4 Εντολή repeat-until Ακόμα μια εντολή επανάληψης στην Pascal είναι η repeat-until. Η σύνταξή της είναι όπως παρακάτω: 1 repeat 2 entoli1; 3 entoli2; 4... 5 until synthiki; Η λειτουργία είναι η ακόλουθη: Οι εντολές που βρίσκονται από το repeat μέχρι το until εκτελούνται διαδοχικά. Στη συνέχεια υπολογίζεται η τιμής της συνθήκης. Αν η συνθήκη δεν είναι αληθής 8

τότε η ροή εκτέλεσης του προγράμματος μεταφέρεται πάλι στην αρχή του βρόχου, οι εντολές επαναλαμβάνονται διαδοχικά και ούτω καθεξής. Με άλλα λόγια ο βρόχος επαναλαμβάνεται μέχρι να ισχύσει η συνθήκη οπότε και τερματίζεται. Μια παρατήρηση σχετικά με αυτήν τη μορφή επανάληψης σε σχέση με το βρόχο while-do είναι ότι σε αυτήν την περίπτωση οι εντολές του βρόχου θα εκτελεστούν τουλάχιστον μία φορά. Μία δεύτερη παρατήρηση είναι ότι δεν χρειάζεται οι εντολές του βρόχου να κλειστούν μέσα σε ένα begin-end. Δείτε το πρόγραμμα υπολογισμού όρων της ακολουθίας Fibonacci με χρήση της repeat-until. 1 program fib; 2 var 3 a: integer; 4 b, c: integer; 5 limit: integer; 6 7 begin 8 a := 1; 9 b := 1; 10 write(' Dose to orio'); 11 readln( limit); 12 13 repeat 14 c := a + b; 15 a := b; 16 b := c; 17 write(c, ' '); 18 until a + b > limit; 19 20 writeln; 21 end. 4.5 Εντολή case Έχουμε δει ότι μπορούμε να σχηματίσουμε `αλυσίδες' από if και else εντολές προκειμένου να καλύψουμε πολλές διαφορετικές εναλλακτικές ενός ενδεχόμενου. Υποθέστε ότι πρέπει να γράψουμε ένα πρόγραμμα που εμφανίζει στην οθόνη το επίδομα παιδιών που παίρνει ένας υπάλληλος. Υποθέστε ότι η νομοθεσία λέει ότι ένας υπάλληλος με ένα παιδί παίρνει 50 ευρώ, με δύο 75, με τρία 100 και από κει και πέρα 50 ευρώ επιπλέον για κάθε παιδί. Αν χρησιμοποιούσαμε if θα έπρεπε να γράψουμε 1 if paidia = 0 then writeln ('0 euro') 2 else if paidia = 1 then writeln('50 euro') 3 else if paidia = 2 then writeln('75 euro') 4 else if paidia = 3 then writeln('100 euro') 5 else writeln (100 + (paidia -3) * 50, ' euro); Το παραπάνω είναι επιρρεπές σε λάθη. Για τέτοιες περιπτώσεις μπορούμε να χρησιμοποιήσουμε την εντολή case. Η συνταξή της είναι η ακόλουθη: 9

1 case expression of 2 value1: commands1; 3 value2: commands2; 4... 5 valuen: commandsn; 6 else commands; 7 end; Εκτελείται ως εξής: Εξετάζεται η τιμή της έκφρασης expression (μπορεί να είναι απλώς μία μεταβλητή ή και μία συνθετότερη έκφραση). Η έκφραση πρέπει να είναι βαθμωτού τύπου, δηλαδή integer, boolean ή char. Αν η τιμή της έκφρασης είναι ίση με value1 τότε εκτελούνται οι εντολές της γραμμής 2, αν είναι ίση με value2 εντολές της γραμμής 3, κτλ. Αν δεν ισχύει τίποτα από αυτά, τότε εκτελούνται οι εντολες της γραμμής 6, μετά το else. Το κομάτι του else δεν είναι υποχρεωτικό να υπάρχει. Αν σε κάποια περίπτωση υπάρχουν περισσότερες από μία εντολές που θέλουμε να εκτελεστούν θα πρέπει να τις περικλείσουμε σε ένα begin-end μπλοκ. Τελικά, το παράδειγμα με τα επιδόματα θα μπορούσε να γραφεί με μία case όπως παρακάτω: 1 case paidia of 2 1: writeln('50 euro'); 3 2: writeln('75 euro'); 4 3: writeln('100 euro'); 5 else writeln (100 + ( paidia - 3) * 50, ' euro'); 6 end; 5 Βασικοί τύποι στην Pascal Στην standard Pascal ορίζονται τέσσερις βασικοί τύποι μεταβλητών: integer: Παριστάνει ακέραιους αριθμούς από το -32768 μέχρι και το 32767, real: παριστάνει αριθμούς κινητής υποδιαστολής από το 3.4 10 38 μέχρι το 3.4 10 38 τόσο θετικούς όσο και αρνητικούς, boolean: παριστάνει τις δύο τιμές της άλγεβρας Boole δηλαδή true και false, και char: παριστάνει χαρακτήρες π.χ. 'a', 'b', 'F' κτλ. Επίσης υπάρχουν και οι παρακάτω αριθμητικοί τελεστές: + Πρόσθεση, - αφαίρεση, / διαίρεση, * πολλαπλασιασμός, div ακέραια διαίρεση, 10

mod ακέραιο υπόλοιπο. οι οποίοι όταν εφαρμόζονται κατάλληλα παράγουν αριθμητικές εκφράσεις. Οι αριθμητικές εκφράσεις μπορούν να συγκριθούν με τους συσχετιστικούς τελεστές: < μικρότερο, > μεγαλύτερο, <= μικρότερο ή ίσο, >= μεγαλύτερο ή ίσο, = ίσο, <> διάφορο. Το απότελεσμα που προκύπτει είναι μια λογική τιμή true ή false, δηλαδή οι συσχετιστικοί τελεστές παράγουν τις λογικές τιμές ναι ή όχι. Οι λογικές τιμές true και false ή εκφράσεις που μπορούν να αποτιμηθούν ως true ή false μπορούν να συνδυαστούν με λογικούς τελεστές για να παράξουν πιο σύνθετες λογικές εκφράσεις. Αυτοί είναι: and Λογική σύζευξη, or λογική διάξευξη, not λογική άρνηση, xor λογική αποκλειστική διάζευξη. Παρακάτω θα δούμε αναλυτικά τα χαρακτηριστικά κάθε τύπου καθώς και το πώς μπορούν να χρησιμοποιηθούν μαζί με τελεστές για να προκύψουν εκφράσεις. 5.1 Ο τύπος integer Ο τύπος integer παριστάνει ακέραιους αριθμούς από το -32768 μέχρι και το 32767. Η ανάθεση άλλου τύπου τιμών σε ακέραιες μεταβλητές δεν επιτρέπεται. Δεν μπορεί κανείς δηλαδή να δηλώσει μία μεταβλητή a: integer και να της δώσει την τιμή 1.2, true ή 'c'. Ο μεταγλωττιστής μπορεί να εντοπίσει τέτοιου είδους λάθη και έτσι μπορούν να διορθωθούν πριν την εκτέλεση του προγράμματος. Είναι ευθύνη του προγραμματιστή όμως να ελέγχει ότι οι τιμές που αποθηκεύονται σε μία integer μεταβλητή είναι εντός ορίων, δηλαδή ανάμεσα στα -32768 και 32767. π.χ. οι εντολές του listing 1 1 a := 256 * 64; writeln(a); 2 a := a * 2; writeln(a); τυπώνουν στην οθόνη το εξής: Listing 1: Υπολογισμός εκτός ορίων 11

16384-32768 Ο λόγος είναι ότι το 256 * 64 κάνει όντως 16384 αλλά το 16384 επί 2 κάνει 32768, τιμή που είναι εκτός ορίων. Με τις ακέραιες μεταβλητές δεν μπορούμε να χρησιμοποιήσουμε τον τελεστή διαίρεσης / ο οποίος στην Pascal δίνει πάντα αποτέλεσμα σε δεκαδική μορφή⁷. Μεταξύ ακεραίων επιτρέπεται η χρήση του τελεστή ακέραιας διαίρεσης div ο οποίος επιστρέφει το ακέραιο πηλίκο μιας διαίρεσης. Αντίστοιχα ο τελεστής υπολοίπου mod επιστρέφει το υπόλοιπο της ακέραιας διαίρεσης. Υπενθυμίζουμε ότι για δύο ακέραιους αριθμούς a και b το πηλίκο c και το υπόλοιπο d της ακέραιας διαίρεσης του a με το b είναι τέτοια ώστε να ισχύει a = c b + d με το d τέτοιο ώστε 0 d < b. 5.2 Ο τύπος real Οποτεδήποτε θέλουμε να πραγματοποιήσουμε υπολογισμούς με ποσότητες οι οποίες δεν είναι κατ' ανάγκη ακέραιες (π.χ. τιμές σε ευρώ, βάρη ανθρώπων σε κιλά κτλ.) ή είναι τέτοιες που οι υπολογισμοί με αυτές θα μπορούσαν να υπερβαίνουν τα όρια των integer πρέπει να χρησιμοποιήσουμε real. Με τις real μεταβλητές μπορούμε να χρησιμοποιήσουμε όλους τους αριθμητικούς τελεστές εκτός από τους mod και div. Η εσωτερική αναπαράσταση μίας μεταβλητής real είναι κινητής υποδιαστολής και έτσι τυπώνεται στην οθόνη ή και αλλού όταν ζητηθεί. Π.χ. το listing 2 τυπώνει 4.20000000000000E+001 4.20000000000000E+002 1 a := 42; writeln(a); 2 a := 420; writeln(a); Listing 2: Εκτύπωση real Αν θέλουμε να αλλάξουμε αυτήν τη μορφή μπορούμε να γράψουμε ως όρισμα της writeln αντί για το όνομα της μεταβλητής, το όνομα της μεταβλητής ακολουθούμενο από έναν προσδιοριστή της μορφής :x ή :x:y. Στη δεύτερη περίπτωση, η σημασιολογία είναι ότι θέλουμε να εκτυπωθεί η μεταβλητή με y δεκαδικά ψηφία και τουλάχιστον x ψηφία στο σύνολο. Για παράδειγμα το listing 3 τυπώνει 42.00 420.00 420.00 0.42 0.04 Listing 3: Εκτύπωση real 1 a := 42; writeln(a:2:2); 2 a := 420; writeln(a:2:2); 3 a := 0.42; writeln(a:2:2); 4 a := 0.042; writeln(a:2:2); ⁷ακόμα και σε εκφράσεις που έχουν ακέραιο αποτέλεσμα όπως π.χ. 4/2. 12

Σημειώστε ότι μπορούμε να δηλώσουμε αριθμητικές σταθερές κινητής υποδιαστολής και να τις αναθέσουμε σε real μεταβλητές είτε με το γνωστό τρόπο `ακέραιες μονάδες-υποδιαστολή-δεκαδικά ψηφία' π.χ. 42.25, 0.007 είτε σε μορφή `βάση-e-εκθέτης' π.χ. 12e47 που σημαίνει 12 10 47, 0.1e-12 που σημαίνει 0.1 10 12 κτλ. 5.3 Αριθμητικοί και συσχετιστικοί τελεστές σε integer και real Για να συνοψίσουμε σχετικά με τους αριθμητικούς τελεστές: Οι τελεστές +, - και * εφαρμόζονται τόσο σε integer όσο και real. Το αποτέλεσμα που δίνουν είναι integer αν και τα δύο ορίσματα είναι integer αλλιώς είναι real. Οι τελεστές div και mod εφαρμόζονται μόνο σε integer και δίνουν αποτέλεσμα πάντα integer. Ο τελεστής / εφαρμόζεται και σε integer και σε real αλλά το αποτέλεσμά του είναι πάντα real. Οι τελεστές σύγκρισης μπορούν να εφαρμοστούν σε δύο integer ή real αλλά και μεταξύ ενός integer και ενός real. Το αποτέλεσμα που προκύπτει είναι μία λογική τιμή, true ή false. Χρειάζεται ιδιαίτερη προσοχή όταν συγκρίνουμε δύο μεταβλητές τύπου real. Γνωρίζουμε ότι η αναπαράσταση μη-ακέραιων αριθμών στην Pascal αλλά και στους υπολογιστές γενικότερα είναι εκείνη της κινητής υποδιαστολής. Το πλήθος των αριθμών που μπορούν να αναπαρασταθούν είναι πεπερασμένο. Οπότε προφανώς δεν μπορούμε να αναπαραστήσουμε σε έναν υπολογιστή ούτε καν τους ρητούς αριθμούς από το 0 μέχρι το 1 οι οποίοι είναι άπειροι. Οπότε πρακτικά οι αριθμοί στρογγυλεύονται σε κάποιον κοντινό τους με αρκετά μεγάλη ακρίβεια ώστε αυτό να μη δημιουργεί πρόβλημα στις περισσότερες εφαρμογές. Δείτε για παράδειγμα το παρακάτω πρόγραμμα: 1 program compare; 2 var 3 a, b, c: real; 4 begin 5 a := 100; 6 c := 100; 7 b := 1e-24; 8 a := a + b; 9 if a = c then 10 writeln('a equals c'); 11 end. Το πρόγραμμα δίνει στις μεταβλητές a και c την τιμή 100. Μετά προσθέτει στην a την τιμή 1 10 24 και στη συνέχεια ελέγχει αν οι δύο μεταβλητές είναι ίσες. Αν τρέξετε το πρόγραμμα θα δείτε ότι θεωρεί τις δύο μεταβλητές ίσες. Στην πράξη δεν πρέπει να χρησιμοποιούμε τον τελεστή = για να συγκρίνουμε μεταβλητές τύπου real παρόλο που αυτό είναι νόμιμο (και καλά κάνει και είναι) στην Pascal. Θα δούμε παρακάτω έναν πρακτικό τρόπο για να ελέγχουμε αν δύο αριθμοί είναι `ίσοι'. 5.4 Ο τύπος boolean Οι μεταβλητές τύπου boolean μπορούν να αναπαριστούν τις δύο τιμές της άλγεβρας Boole: true και false. Σε μεταβλητές αυτού του τύπου δεν μπορεί να χρησιμοποιηθεί κανένας από τους αριθμητικούς τελεστές. Μπορούν όμως να χρησιμοποιηθούν οι συσχετιστικοί τελεστές όπου θεωρείται 13

ότι false < true. Οι αριθμητικοί τελεστές εφαρμόζονται σε αριθμητικές ποσότητες και δίνουν ως αποτέλεσμα νέες αριθμητικές ποσότητες. Με τον ίδιο τρόπο εφαρμόζονται και στις λογικές τιμές οι λογικοί τελεστές and (και, σύζευξη), or (ή, διάζευξη) και not (όχι, άρνηση). Τα αποτελέσματα είναι και αυτά λογικές τιμές. Οι πράξεις and και or παίρνουν δύο ορίσματα, ενώ η not μόνο ένα. Ορίζονται ως εξής: Το αποτέλεσμα της a and b είναι true αν και μόνο αν είναι true και το a και το b (αν δηλαδή έστω ένα από τα a ή b είναι false τότε και το αποτέλεσμα είναι false). Το αποτέλεσμα της a or b είναι false αν και μόνο αν και τα δύο ορίσματα είναι false (αν έστω και ένα είναι true τότε και το αποτέλεσμα είναι true). Το αποτέλεσμα της not a είναι το αντίθετο της τιμής a. Τα παραπάνω συνοψίζονται στον παρακάτω πίνακα αληθείας: a b a and b a or b not a true true true true false true false false true false false true false true true false false false false true Θυμίζουμε ότι οι λογικές τιμές μπορούν να χρησιμοποιούνται όποτε το συντακτικό της Pascal αναμένει μία συνθήκη, δηλαδή στις εντολές if, repeat-until και while-do. 5.5 Ο τύπος char Οι μεταβλητές τύπου char μπορούν να αποθηκεύουν έναν και μόνο εκτυπώσιμο χαρακτήρα. Με τον ίδιο τρόπο που μπορούμε να δηλώσουμε μία μεταβλητή π.χ. τύπου integer και να της αναθέσουμε τιμή κάπως έτσι 1 var i: integer; 2 begin 3 i := 5; μπορούμε να δηλώσουμε μία μεταβλητή τύπου char και να της αναθέσουμε ως τιμή έναν χαρακτήρα, π.χ. κάπως έτσι: 1 var a: char; 2 begin 3 a := 'j'; Στο συγκεκριμένο παράδειγμα το όνομα της μεταβλητής είναι a και της ανατίθεται η τιμή 'j'. Αν τυπώσουμε τη μεταβλητή a του παραπάνω παραδείγματος με την εντολή writeln(a); στην οθόνη θα εμφανιστεί ο χαρακτήρας j (χωρίς εισαγωγικά). Τα μονά εισαγωγικά που χρησιμοποιήθηκαν στην εντολή ανάθεσης a := 'j' δεν είναι μέρος της τιμής της μεταβλητής αλλά χρησιμοποιούνται για να μπορέσει η Pascal να καταλάβει ότι πρόκειται για έναν χαρακτήρα και όχι για όνομα μεταβλητής. Αν δηλαδή λέγαμε απλώς a := j; τότε η Pascal θα θεωρούσε ότι θέλουμε να αναθέσουμε στη μεταβλητή a την τιμή της μεταβλητής j. Δείτε επίσης και το παράδειγμα που ακολουθεί: 1 program char1; 2 var 3 a,b: char; 4 begin 14

5 a := 'a'; 6 writeln('h metavliti a exei timn ', a); 7 b:= 'c'; 8 writeln('h metavliti v exei timn ', b); 9 end. Στις γραμμές 5 και 6 ανατίθεται η τιμή 'a' στη μεταβλητή a και στη συνέχεια τυπώνεται ένα μήνυμα 'H metavliti a exei timn ' και τέλος η τιμή της μεταβλητής a. Αυτό που πρέπει να γίνει κατανοητό είναι το όνομα της μεταβλητής, η τιμή που αυτή παίρνει και το μήνυμα που τυπώνεται στην οθόνη είναι τρία διαφορετικά πράγματα. Στις γραμμές 6 και 7 έχουμε τη μεταβλητή b η οποία όμως παίρνει την τιμή 'c'. Στη γραμμή 7 κατά λάθος το μήνυμα που εκτυπώνεται είναι 'H metavliti v exei timn ' αντί για 'H metavliti b exei timn ' αλλά αυτό δεν επηρεάζει την εκτέλεση του προγράμματος γιατί πρόκειται απλώς για ένα μήνυμα το οποίο η Pascal δεν ερμηνεύει ούτε ελέγχει. Τελικά η έξοδος του παραπάνω προγράμματος είναι H metavliti a exei timn a H metavliti v exei timn c Όπως είπαμε οι μεταβλητές τύπου char αποθηκεύουν χαρακτήρες, έτσι αν κάποια μεταβλητή a είναι τύπου char μπορούμε να δώσουμε την παρακάτω εντολή a:='e' αλλά όχι a:=101. Αυτό μπορεί να είναι άβολο καθώς γνωρίζουμε ότι οι χαρακτήρες αποθηκεύονται ως αριθμοί στη μνήμη του υπολογιστή σύμφωνα με τον κώδικα ASCII. Δηλαδή, η εντολή a:='e' έχει ως αποτέλεσμα την αποθήκευση της τιμής 101 στη θέση μνήμης που αντιστοιχεί στη μεταβλητή a παρόλο που δεν μπορούμε να αναθέσουμε απευθείας την τιμή 101 στην a με την εντολή a:=101. Η Pascal μας δίνει τη δυνατότητα να 'μετατρέψουμε' έναν χαρακτήρα στον αντίστοιχο αριθμό και το αντίστροφο. Συγκεκριμένα η συνάρτηση ord(x) παίρνει ως παράμετρο έναν χαρακτήρα και επιστρέφει τον κωδικό που αντιστοιχεί σε αυτόν. Αντίστροφα, η συνάρτηση chr(x) παίρνει ως παράμετρο έναν αριθμό και επιστρέφει τον χαρακτήρα που αντιστοιχεί σε αυτόν. Έτσι θα μπορούσαμε να γράψουμε ένα βρόχο που τυπώνει όλα τα κεφαλαία γράμματα του αγγλικού αλφαβήτου κάπως έτσι: 1 program example; 2 var 3 a: char; 4 begin 5 a := 'A'; 6 repeat 7 write(a); 8 a := chr(ord(a) + 1); 9 until a > 'Z'; Η εντολή της γραμμής 8 αναθέτει στη μεταβλητή a τον χαρακτήρα που βρίσκεται αμέσως μετά στον πίνακα ASCII από εκείνον που είχε στην τελευταία επανάληψη. Για παράδειγμα αν η a έχει το χαρακτήρα E (με κωδικό 69), αρχικά εκτελείται η ord(a) που επιστρέφει την τιμή 69. Στη συνέχεια προστίθεται σε αυτήν το 1 και προκύπτει 70. Οπότε εκτελείται η chr(70) που επιστρέφει το χαρακτήρα F. Μπορεί κανείς να παρατηρήσει ότι οι συναρτήσεις chr και ord είναι αντίστροφες δηλαδή για οποιοδήποτε χαρακτήρα σε μια μεταβλητή a η εντολή chr(ord(a)) επιστρέφει τον ίδιο 15

χαρακτήρα και ανάλογα για οποιοδήποτε αριθμό n μέσα στα όρια 0-255 η εντολή ord(chr(n)) επιστρέφει τον ίδιο τον αριθμό. Ένα άλλο ζευγάρι αντίστροφων συναρτήσεων είναι οι succ και pred. Και οι δύο παίρνουν ως παράμετρο ένα χαρακτήρα και επιστρέφουν έναν άλλον. Η succ επιστρέφει τον επόμενο χαρακτήρα ενώ η pred τον προηγούμενο. 5.6 Ενσωματωμένες (built-in) συναρτήσεις της Pascal Η Pascal παρέχει κάποιες έτοιμες συναρτήσεις στους προγραμματιστές ώστε να κάνει τη ζωή τους ευκολότερη. Οι συναρτήσεις αυτές δέχονται μία παράμετρο και επιστρέφουν μία τιμή. Στον πίνακα 1 αναγράφονται μερικές από αυτές (οι λεγόμενες αριθμητικές) και η λειτουργία που εκτελούν. Όλες δέχονται ως παραμέτρους τόσο real όσο και integer. Οι abs και sqr επιστρέφουν είτε real είτε integer ανάλογα με τον τύπο που τους δόθηκε ως παράμετρος. Όλες οι άλλες επιστρέφουν real. abs(x) sqr(x) sin(x) cos(x) exp(x) ln(x) sqrt(x) arctan(x) Πίνακας 1: Αριθμητικές συναρτήσεις Απόλυτη τιμή της ποσότητας x Το x στο τετράγωνο Ημίτονο του x Συνημίτονο του x Ο αριθμός e υψωμένος στη x-οστή δύναμη Φυσικός λογάριθμος του x Τετραγωνική ρίζα του x Τόξο εφαπτομένης του x Επίσης υπάρχουν και οι συναρτήσεις μεταφοράς trunc(x) και round(x). Αυτές δέχονται ορίσματα τύπου real και επιστρέφουν integer. Η πρώτη είναι η λεγόμενη συνάρτηση ακέραιου μέρους, δηλαδή επιστρέφει τον αριθμό που της δίνεται ως όρισμα χωρίς τα δεκαδικά ψηφία. Π.χ. η trunc(3.5) επιστρέφει 3, η trunc(2.9) επιστρέφει 2, η trunc(-3.7) επιστρέφει -3. Η δεύτερη στρογγυλεύει το όρισμά της στον πλησιέστερο ακέραιο. Π.χ. η round(3.7) επιστρέφει 4, η round(3.2) επιστρέφει 3 και η round(-3.7) επιστρέφει -4. Οι τιμές που είναι στη μέση στρογγυλεύονται προς το μεγαλύτερο ακέραιο κατ' απόλυτη τιμή, δηλαδή η round(3.5) επιστρέφει 4 και η round(-3.5) επιστρέφει -4. 6 Σύνθετοι τύποι Οι τύποι που είδαμε μέχρι τώρα ονομάζονται απλοί. Αυτοί παρέχονται από την Pascal και δε γίνεται να αναλυθούν σε απλούστερους. Εκτός από αυτούς υπάρχουν και οι λεγόμενοι σύνθετοι οι οποίοι προκύπτουν με κάποιο συνδυασμό άλλων τύπων. Σύνθετοι τύποι είναι οι πίνακες, οι συμβολοσειρές (strings), τα σύνολα, οι εγγραφές (records)⁸. Θα δούμε λίγο πιο αναλυτικά τους πίνακες και τα strings. ⁸Υπάρχουν και οι δείκτες με τους οποίους δε θα ασχοληθούμε 16

6.1 Πίνακες (arrays) Ένας πίνακας είναι μια γραμμική διάταξη ομοειδών μεταβλητών. Μέχρι στιγμής είδαμε ότι για κάθε μεταβλητή που θέλουμε να χρησιμοποιήσουμε πρέπει να δηλώσουμε το όνομά της και τον τύπο της. Αυτό δεν είναι πρακτικά δυνατό όταν πρέπει να χειριστούμε μεγάλο αριθμό τέτοιων μεταβλητών. Οι πίνακες μας δίνουν τη δυνατότητα να δεσμεύσουμε χώρο μνήμης για όσες μεταβλητές θέλουμε με μία μόνο δήλωση. Σε αυτή τη δήλωση δίνουμε και το όνομα του πίνακα το οποίο χρησιμοποιούμε για να αναφερόμαστε σε αυτόν. Για να προσπελάσουμε ένα συγκεκριμένο από τα πολλά στοιχεία του πίνακα δίνουμε τον αύξοντα αριθμό του μέσα σε αγκύλες. Μία δήλωση πίνακα θα μπορούσε να είναι αυτή: var p: array[1..10] of integer; η οποία δηλώνει έναν πίνακα p με δέκα ακέραιους ή αυτή: var r: array[30..40] of real η οποία δηλώνει έναν πίνακα r ο οποίος περιέχει πραγματικούς αριθμούς με αύξοντες από 30 έως και 40. Στη γενική της μορφή μία δήλωση πίνακα έχει τη μορφή 1 name: array[a.. b] of typename; όπου name είναι το όνομα του πίνακα, a είναι ο αύξοντας αριθμός του πρώτου στοιχείου του πίνακα, b είναι ο αύξοντας του τελευταίου και περιέχει στοιχεία τύπου typename. Το παρακάτω παράδειγμα δηλώνει έναν πίνακα 10 ακεραίων, ζητάει από το χρήστη να δώσει τιμή στον κάθε έναν από αυτούς με ένα βρόχο και στη συνέχεια βρίσκει το μικρότερο από αυτούς. 1 program example; 2 var 3 p: array [1..10] of integer; 4 i: integer; 5 mik: integer; 6 7 begin 8 for i := 1 to 10 do 9 begin 10 write('dose ton #', i, ' ari8mo: '); 11 readln(p[i]); 12 end; 13 14 mik := p[1]; 15 for i := 2 to 10 do 16 begin 17 if p[i] < mik then 18 mik := p[i] 19 end; 20 writeln('o mikroteros eivai o ', mik); 21 readln; 22 end. Στο βρόχο των γραμμών 8 έως 11 η μεταβλητή i παίρνει διαδοχικά τις τιμές από 1 έως και 10 και σε κάθε επανάληψη δίνεται από το χρήστη με τη readln της γραμμής 11 μία τιμή στη μεταβλητή p[1], p[2], κοκ. Δηλαδή χρησιμοποιούμε τα p[i] όπως θα χρησιμοποιούσαμε οποιοδήποτε όνομα ακέραιας μεταβλητής. 17

Στην πράξη, δε χρησιμοποιούμε δηλώσεις πινάκων της μορφής p: array[a..b] of typename αλλά ορίζουμε ένα νέο όνομα τύπου όπως παρακάτω: 1 type 2 myarray = array [1..10] of integer; 3 mybigarray = array [1..1000] of real; Τα ονόματα που βρίσκονται αριστερά από το ίσον είναι νέα ονόματα τύπων. Η περιγραφή τους είναι αυτό που βρίσκεται δεξιά από το ίσον. Δηλαδή στο παραπάνω παράδειγμα λέμε ότι το όνομα myarray είναι ένας πίνακας ακεραιών με δείκτες από 1 έως και 10 και το mybigarray είναι ένας πίνακας αριθμών κινητής υποδιαστολής με δείκτες από 1 έως και 1000. Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε τα νέα ονόματα τύπων σε δηλώσεις μεταβλητών όπως χρησιμοποιούμε και τα ονόματα των ενσωματωμένων τύπων της Pascal (integer, boolean κτλ.). Γράφουμε δηλαδή 1 var 2 p: myarray; 3 q: myarray; 4 r: mybigarray; 5 i, j, k: integer; για να πούμε ότι ο p και ο q είναι πίνακες 10 ακεραιών, ενώ ο r είναι πίνακας 1000 κινητής υποδιαστολής. 6.2 Strings Γνωρίζουμε ότι ένας χαρακτήρας μπορεί να αποθηκευτεί σε ένα byte με κατάλληλη κωδικοποίηση και αυτό ακριβώς κάνει ο τύπος char της Pascal. Συνήθως βέβαια η επεξεργασια κειμένου σε έναν υπολογιστή αφορά πολυπληθή σύνολα χαρακτήρων διατεταγμένων γραμμικά. Προκειμένου να παραστήσουμε κέιμενα θα μπορούσαμε να χρησιμοποιήσουμε πίνακες χαρακτήρων. Επειδή αυτή είναι μια πολύ συνηθισμένη εφαρμογή, στις γλώσσες προγραμματισμού συναντάμε σύνθετους τύπους που βοηθούν στην αποθήκευση σειρών χαρακτήρων, ή αλλιώς συμβολοσειρών. Στην Pascal ο ανάλογος τύπος είναι ο string. Οι μεταβλητές τύπου string μπορούν να πάρουν ως τιμές χαρακτήρες κλεισμένους μέσα σε μονά εισαγωγικά, π.χ. s := 'This is a string'. Μπορούμε να δηλώσουμε μεταβλητές τύπου string όπως τους άλλους τύπους: var s:string;. Στην standard Pascal ο τύπος string είναι συνήθως ένας πίνακας χαρακτήρων και συγκεκριμένα κάτι σαν αυτό: array[0..255] of char αν και γενικά εξαρτάται από την υλοποίηση. Από τους 256 χαρακτήρες που υπάρχουν στην παραπάνω δομή ο πρώτος που βρίσκεται στη θέση 0, παριστάνει το μήκος της συμβολοσειράς και οι υπόλοιποι από τη θέση 1 και έπειτα, παριστάνουν τον αντίστοιχο χαρακτήρα της συμβολοσειράς. Για παράδειγμα το πρόγραμμα 4 θα τύπωνε στην οθόνη το παρακάτω: Mikos: 6 Xaraktiras 1: H Xaraktiras 2: e Το 6 είναι το μήκος της συμβολοσειράς 'Hello.'. Παρατηρήστε ότι είναι αποθηκευμένο στη θέση s[0], την πρώτη θέση του array. Θυμηθείτε από την ενότητα για τους χαρακτήρες ότι δε θα αρκούσε στη γραμμή 5 να τυπώσουμε το s[0] γιατί αυτό είναι τύπου char οπότε η Pascal δε 18

1 program strex1; 2 var s: string; 3 begin 4 s := 'Hello.'; 5 writeln('mikos: ', ord(s[0])); 6 writeln('xaraktiras 1: ', s[1]); 7 writeln('xaraktiras 2: ', s[2]); 8 end. Listing 4: Παράδειγμα string θα τύπωνε τον αριθμό 6 αλλά το χαρακτήρα με ASCII κωδικό 6. Για να πάρουμε το s[0] ως αριθμό θα πρέπει να χρησιμοποιήσουμε τη συνάρτηση ord. Επίσης παρατηρήστε ότι ο πρώτος χαρακτήρας του string είναι ο s[1], ο δεύτερος ο s[2] κοκ. Μπορούμε να επεξεργαστούμε τις συμβολοσειρές πραγματοποιώντας τους χειρισμούς που επιτρέπονται στους επιμέρους χαρακτήρες τους. Για παράδειγμα μπορούμε να μετατρέψουμε τους κεφαλαίους χαρακτήρες μιας συμβολοσειράς σε πεζούς με μία εντολή σαν αυτήν: 1 for i := 1 to length(s) do 2 if (s[i] >= 'A') and (s[i] <= 'Z') then 3 s[i] := chr(ord(s[i]) - ord('a') + ord('a')); Επειδή πολλές τέτοιου τύπου πράξεις είναι συνηθισμένες στον προγραμματισμό, συνήθως οι υλοποιήσεις της Pascal δίνουν βιβλιοθήκες με τέτοιες συναρτήσεις. Ενδεικτικά αναφέρουμε κάποιες που ειναι διαθέσιμες στη FreePascal. length(s) Επιστρέφει το μήκος της συμβολοσειράς s. pos(sub, str) Επιστρέφει τη θέση στην οποία η συμβολοσειρά sub εμφανίζεται μέσα στην str ή 0 αν δεν περιέχεται. Για παράδειγμα η pos('is', 'This looks good'); επιστρέφει 3. copy(s, i, c) Επιστρέφει το κομμάτι της συμβολοσειράς s που ξεκινάει από την i-οστή θέση της και έχει μήκος c χαρακτήρες. Π.χ. η copy('the magic wand', 5, 3) επιστρέφει 'mag'. Κατά κανόνα θα πρέπει να ανατρέξετε στην τεκμηρίωση των βιλιοθηκών της συγκεκριμένης υλοποίησης του μεταγλωττιστή σας για να βρείτε τις συναρτήσεις και διαδικασίες που διατίθενται. Για παράδειγμα η FreePascal δίνει αυτές που φαίνονται στην ιστοσελίδα http://www.freepascal.org/ docs-html/ rtl/ sysutils/ stringfunctions.html (εδώ). 6.3 Records Είδαμε ότι με τους ενσωματωμένους βασικούς τύπους της Pascal μπορούμε να αναπαραστήσουμε διάφορους τύπους δεδομένων. Δεν έχουμε δει όμως μέχρι στιγμής αν υπάρχει η δυνατότητα να συσχετίσουμε κάποιους μεταξύ τους ώστε να αποτελούν μία οντότητα. Ας υποθέσουμε, για παράδειγμα, ότι θέλουμε να χειριστούμε καρτέλες σπουδαστών μίας σχολής. Θα χρειαζόμασταν ένα string για το επώνυμο, ένα για το όνομα, ένα για τη διεύθυνση, ένα πίνακα ακεραίων που να αποθηκεύονται οι 19

βαθμοί του σπουδαστή για κάθε μάθημα κοκ. Αν είχαμε πολλά τέτοια στοιχεία, θα έπρεπε να τα αποθηκεύσουμε σε αντίστοιχους πίνακες. Και αν θέλαμε να τους ταξινομήσουμε με τον αλγόριθμο της φυσαλίδας σε αλφαβητική σειρά θα μπορούσαμε να συγκρίνουμε τα αντίστοιχα επώνυμα. Στην περίπτωση όμως που θα έπρεπε να γίνει ανταλλαγή μεταξύ δύο γειτονικών επωνύμων, θα έπρεπε για να διατηρηθεί η σωστή σειρά και στους υπόλοιπους πίνακες (με το όνομα, τη διεύθυνση κτλ.) να κάνουμε την αντίστοιχη ανταλλαγή σε κάθε έναν από αυτούς. Όσο περισσότερα ήταν αυτά τα στοιχεία τόσο περισσότερες επιπλέον πράξεις θα έπρεπε να κάνουμε. Αυτό θα ήταν και κουραστικό αλλά και επιρρεπές σε λάθη. Θα ήταν ολικό αν μπορούσαμε να ομαδοποιήσουμε όλα τα στοιχεία που είχαν να κάνουν με μία καρτέλα σε έναν τύπο. Αυτή τη δυνατότητα δίνεται με τη χρήση των record στην Pascal. Δείτε το listing 5. 1 program recex; 2 type 3 kartela = record 4 eponymo: string; 5 onoma: string; 6 xronologia: integer; 7 end; Listing 5: Παράδειγμα record 8 9 var 10 a, b: kartela; 11 begin 12 a. eponymo := 'Karamanlis'; 13 a. onoma := 'Konstantinos'; 14 a. xronologia := 1975; 15 writeln(a. eponymo); 16 writeln(a. onoma); 17 writeln(a. xronologia); 18 19 b := a; 20 writeln(b. eponymo); 21 writeln(b. onoma); 22 writeln(b. xronologia); 23 end. Στις γραμμές 3-7, στο τμήμα type του προγράμματος δηλώνουμε έναν νέο σύνθετο τύπο τον οποίο ονομάζουμε kartela. Αυτός ο τύπος είναι ένα record (εγγραφή) η οποία αποτελείται από τρία επιμέρους στοιχεία: δύο strings με ονόματα eponymo και onoma και έναν integer με όνομα χρονολογία. Στο εξής μπορούμε να δηλώνουμε μεταβλητές τύπου kartela όπως και κάνουμε στη γραμμή 10 που δηλώνεται η μεταβλητή a. Για να προσπελάσουμε τα επιμέρους στοιχεία μιας μεταβλητής τύπου record γράφουμε το όνομα της μεταβλητής, μία τελεία και μετά το όνομα του επιμέρους στοιχείου που θέλουμε να προσπελάσουμε όπως στις γραμμές 12-14 και 15-17. Το πλεονέκτημα της χρήσης records φαίνεται στη γραμμή 19, όπου με μία εντολή b := a; η μεταβλητή b παίρνει την τιμή της μεταβλητής a με την έννοια ότι όλα τα επιμέρους στοιχεία της b παίρνουν την ίδια τιμή με τα 20