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

Σχετικά έγγραφα
Pascal. 26 Οκτωβρίου 2011

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

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

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

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

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

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

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

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

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

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

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

Κεφάλαιο 7: Υπορουτίνες

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

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

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

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

Δομημένος Προγραμματισμός

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

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

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

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

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

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

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

Συναρτήσεις. Υποπρόγραμμα

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

Προγραμματισμός ΙI (Θ)

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

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

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

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

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

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

ΚΕΦΑΛΑΙΟ 10 ΕΝΤΟΛΕΣ ΕΠΙΛΟΓΗΣ (ή εντολές Ελέγχου και Επιλογής ή εντολές Επιλογής και Απόφασης)

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Λογισµικό (Software SW) Γλώσσες

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Εισαγωγή στο Προγραμματισμό για Μηχανολόγους Οδηγός Προετοιμασίας για τη Τελική Εξέταση

ΑΠΑΝΤΗΣΕΙΣ ΘΕΜΑ Α A1. 2-Λάθος 3-Λάθος 4-Σωστό 5-Λάθος A2. integer. real. Boolean. char. string A3.

Προγραμματισμός Ι (ΗΥ120)

3 ο Εργαστήριο Μεταβλητές, Τελεστές

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

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

Δομημένος Προγραμματισμός

5ο σετ σημειώσεων - Δείκτες

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

Υπο-προγράμματα στη Fortran

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

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

8 FORTRAN 77/90/95/2003

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

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

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

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

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

Αρχές Γλωσσών Προγραμματισμου Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2015 Χρήστος Νομικός ( Τμήμα Μηχανικών Αρχές

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ

ΕΠΑ.Λ ΧΡΥΣΟΥΠΟΛΗΣ Γ Πληροφορική Προγραµµατισµός Υπολογιστών Κεφάλαιο 9 Σηµειώσεις 03. Εντολή Εκχώρησης - Αντικατάστασης

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

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

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

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

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

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

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

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

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

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

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

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

Εργαστήριο 10 Πίνακες. Πίνακες. Η έννοια της δόμησης δεδομένων στη PASCAL. Σκοπός

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

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

Τι είναι κλάση Κλάση

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

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

Ενότητα 3: «Εισαγωγή στην Αλγοριθμική και στον Προγραμματισμό: loops, subroutines, tables»

2. β. Συνθήκη ή επιλογή. 4. δ. Υποπρόγραμμα. 5. ε. ιαδικασία εισόδου ή εξόδου

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

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

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

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

Transcript:

Pascal 15 Νοεμβρίου 011 1 Procedures σε Pascal Στην Pascal μπορούμε να ορίσουμε διαδικασίες (procedures). Αυτές είναι ομάδες εντολών οι οποίες έχουν ένα όνομα. Γράφοντας το όνομα μιας διαδικασίας μπορούμε να την καλέσουμε (call). Όταν καλούμε μια διαδικασία εκτελούνται οι εντολές που αυτή περιέχει. Δείτε παράδειγμα 1: 1 program proc1; Listing 1: Ορισμός και κλήση procedure 3 procedure myproc; 4 begin 5 write('h kota ekave to augo,'); 6 write(' h to augo tnv kota; '); 7 writeln('to be or not to be?'); 8 end; 9 10 begin 11 myproc; 1 myproc; 13 14 readln; 15 end. Σε αυτό ορίζεται μία procedure με όνομα myproc στις γραμμές 3 έως 8. Το σώμα της procedure δηλαδή οι εντολές που εκτελούνται όποτε την καλεί κανείς περιλαμβάνονται σε ένα begin-end μπλοκ. Όποτε δηλαδή κανείς καλεί την procedure εκτελούνται οι εντολές που περιέχονται εκεί. Παρατηρήστε ότι η γραμμή 3 τελειώνει με ένα ερωτηματικό όπως και το end της γραμμής 8 που κλείνει το σώμα της διαδικασίας όπως και κάθε εντολή που περιέχεται εκεί. Για να καλέσει κανείς τη συνάρτηση, αρκεί να αναφέρει το όνομά της, όπως στις γραμμές 11 και 1. Σημειώστε ότι οι εντολές της διαδικασίας δεν εκτελούνται αν δεν υπάρχει κάπου μία κλήση. Δηλαδή το γεγονός ότι υπάρχουν οι γραμμές 3 έως 8 δε σημαίνει απαραίτητα ότι θα εκτελεστούν κιόλας. Ο κανόνας είναι ότι η εκτέλεση του προγράμματος ξεκινάει με την πρώτη εντολή του κύριου begin-end μπλοκ του προγράμματος, το οποίο ξεκινάει στη γραμμή 10. Κάθε φορά που η εκτέλεση του προγράμματος συναντά μια κλήση συνάρτησης τότε η ροή του προγράμματος μεταφέρεται στο 1

begin-end μπλοκ της αντίστοιχης διαδικασίας και στη συνέχεια επιστρέφει στο σημείο αμέσως μετά την κλήση. Στο παραπάνω δηλαδή η ροή εκτέλεσης του προγράμματος ξεκινάει στη γραμμή 10 όπου βρίσκεται το begin του κύριου μπλοκ του προγράμματος. Όταν η ροή εκτέλεσης φτάσει στη γραμμή 11 (κλήση συνάρτησης) τότε μεταφέρεται στο μπλοκ των γραμμών 4 έως 8 όπου εκτελεί τις εκεί εντολές διαδοχικά. Μετά επιστρέφει στην αμέσως επόμενη εντολή του κύριου μπλοκ από την οποία πραγματοποιήθηκε η τελευταία κλήση δηλαδή τη γραμμή 1. Αυτή είναι επίσης κλήση συνάρτησης οπότε ξαναεκτελούνται οι εντολές των γραμμών 4 έως 8. Οι διαδικασίες μπορούν να παίρνουν κάποια ορίσματα (arguments) δηλαδή παραμέτρους. Για παράδειγμα το παρακάτω πρόγραμμα περιέχει μια συνάρτηση η οποία τυπώνει μερικά αστεράκια. Το πόσα αστεράκια θα τυπώσει καθορίζεται από την τιμή της παραμέτρου x. Το σώμα της διαδικασίας είναι ένα απλό for το οποίο τυπώνει τόσα αστέρια όσα ζητούνται μέσω της x και μετά αλλάζει γραμμή. 1 program proc; Listing : Ορισμός procedure με μία παράμετρο 3 procedure print_stars(x: integer); 4 var 5 i: integer; 6 begin 7 for i := 1 to x do 8 write('*'); 9 writeln; 10 end; 11 1 begin 13 print_stars (3); 14 print_stars (); 15 print_stars (5); 16 17 readln; 18 end. Αν τρέξετε το παραπάνω πρόγραμμα θα δείτε στην οθόνη κάτι σαν αυτό: *** ** ***** Σε σχέση με το προηγούμενο παράδειγμα παρατηρούμε τα εξής: Η διαδικασία print_stars παίρνει μία παράμετρο x η οποία δηλώνεται μέσα σε παρενθέσεις ακριβώς όπως δηλώνονται και οι άλλες μεταβλητές σε ένα πρόγραμμα, δηλαδή αναφέρεται το όνομά της, μία άνω-κάτω τελεία και μετά ο τύπος της. Μέσα στο σώμα της διαδικασίας η παράμετρος x μπορεί να χρησιμοποιείται όπως και οι άλλες μεταβλητές, π.χ. στη γραμμή 7. Επίσης παρατηρούμε ότι προκειμένου να χρησιμοποιήσουμε τη μεταβλητή i στο βρόχο της γραμμής 7 πρέπει να τη δηλώσουμε σε ένα var μπλοκ στις γραμμες

4 και 5. Τέλος, για να καλέσουμε τη διαδικασία γράφουμε το όνομά της όπως στις γραμμές 13 έως 15 και μέσα σε παρενθέσεις δίνουμε την τιμή της παραμέτρου. Όταν εκτελούνται οι κλήσεις των γραμμών 13-15 η ροή μεταφέρεται στις γραμμές 6-10 όπως και στο προηγούμενο παράδειγμα με τη διαφορά ότι αυτή τη φορά κατά τη διάρκεια εκτέλεσης των 6-10 υφίσταται και η μεταβλητή-παράμετρος x η οποία έχει την τιμή 3, ή 5 αντίστοιχα σε κάθε κλήση των γραμμών 13-15. Μια διαδικασία μπορεί να παίρνει περισσότερες από μία παραμέτρους διάφορων τύπων. Αν για παράδειγμα θέλουμε να επεκτείνουμε τη συνάρτησή μας ώστε να παίρνει ως παράμετρο όχι μόνο το πόσους αλλά και ποιους χαρακτήρες θα τυπώνει μπορουμε να γράψουμε το εξής: 1 program proc3; Listing 3: Ορισμός procedure με δύο παραμέτρους 3 procedure print_chars(c: char; x: integer); 4 var 5 i: integer; 6 begin 7 for i := 1 to x do 8 write(c); 9 end; 10 11 begin 1 print_chars('*', 3); 13 print_chars('.', 1); 14 print_chars('*', 3); 15 16 readln; 17 end. Στο παράδειγμα 3 προσθέτουμε μία επιπλέον παράμετρο με όνομα c και τύπο char. Διατηρούμε και την x όπως και προηγουμένως. Μεταξύ τους τις χωρίζουμε με το ερωτηματικό. Στις γραμμές 1-14 υπάρχουν οι αντίστοιχες κλήσεις. Μέσα σε παρενθέσεις τοποθετούμε τόσες παραμέτρους όσες δέχεται η συνάρτηση. Οι τιμές που δίνουμε σε κάθε κλήση αντιστοιχίζονται μία προς μία στις αντίστοιχες παραμέτρους. Δηλαδή η κλήση της γραμμής 1 έχει σαν αποτέλεσμα να δοθεί στην παράμετρο c η τιμή '*' και στην x η τιμή 3, ενώ η κλήση της γραμμής 13 δίνει αντίστοιχα στην c την τιμή '.' και στην x την τιμή 1. Συνοψίζοντας ο ορισμός μιας διαδικασίας αποτελείται από τα εξής: Την επικεφαλίδα της διαδικασίας η οποία με τη σειρά της αποτελείται από τη δεσμευμένη λέξη procedure, το όνομα της διαδικασίας, τη λίστα των τυπικών παραμέτρων της διαδικασίας (αν υπάρχουν) μέσα σε παρενθέσεις και στο τέλος το ελληνικό ερωτηματικό. Η λίστα των τυπικών παραμέτρων είναι μια λίστα δηλώσεων χωρισμένων με ελληνικά ερωτηματικά. Κάθε δήλωση είναι της μορφής onoma: typos ή on1, on,..., onx: typos όπως δηλαδή και στις δηλώσεις μεταβλητών. 3

Ένα begin-end μπλοκ το οποίο περιέχει τις εντολές της διαδικασίας. Του μπλοκ μπορεί να προηγείται ένα μπλοκ var το οποίο περιέχει δηλώσεις μεταβλητών. Ένα παράδειγμα Ας δούμε με ένα παράδειγμα τη χρήση μιας απλής διαδικασίας όπως η παραπάνω. Ας υποθέσουμε ότι θέλουμε να γράψουμε ένα πρόγραμμα το οποίο να τυπώνει στην οθόνη ένα τρίγωνο με αστεράκια και τελείες. Το μέγεθος του τριγώνου θα το δίνει ο χρήστης. Θα μπορούσε να είναι όπως το παράδειγμα 4. 1 program triangle; var 3 n, i, j: integer; Listing 4: Κάποιο τρίγωνο 4 5 begin 6 write('dose to n:'); 7 readln(n); 8 9 for j := n div downto 0 do 10 begin 11 for i := 1 to j do 1 write('*'); 13 for i := 1 to n - * j do 14 write('.'); 15 for i := 1 to j do 16 write('*'); 17 writeln; 18 end; 19 end. Το ίδιο πράγμα θα μπορούσαμε να το γράψουμε όπως στο παράδειγμα 5. 1 program triangle3; Listing 5: Το ίδιο τρίγωνο 3 procedure print_chars(c: char; x: integer); 4 var 5 k: integer; 6 begin 7 for k := 1 to x do 8 write(c); 9 end; 10 11 var 1 n, j: integer; 4

13 begin 14 write('dose to n:'); 15 readln(n); 16 17 for j := n div downto 0 do 18 begin 19 print_chars('*', j); 0 print_chars('.', n - * j); 1 print_chars('*', j); writeln; 3 end; 4 end. 3 Functions (συναρτήσεις) Πολλές φορές χρειάζεται να πραγματοποιούνται υπολογισμοί οι οποίοι απαιτούν την εκτέλεση περισσότερων από μία εντολών και να επιστρέφουν τελικά ένα αποτέλεσμα. Η ομαδοποίησή τους σε διαδικασίες δεν αρκεί καθώς οι διαδικασίες δεν επιστρέφουν κάποιο αποτέλεσμα. Για αυτόν το σκοπό μπορούν να χρησιμοποιηθούν στην Pascal οι λεγόμενες συναρτήσεις οι οποίες λειτουργούν όπως και οι διαδικασίες αλλά επιπρόσθετα μπορούν να επιστρέφουν και μία τιμή. Ένα παράδειγμα τέτοιας διαδικασίας είναι ο υπολογισμός της απόλυτης τιμής ενός αριθμού. Θυμίζουμε ότι η απόλυτη τιμή ενός αριθμού είναι ο ίδιος ο αριθμός αν είναι θετικός ή ο αντίθετός του στην περίπτωση που είναι αρνητικός. Οι εντολές που κάνουν τον υπολογισμό θα μπορούσαν να είναι οι παρακάτω, υποθέτωντας ότι η μεταβλητή x κρατάει τον αριθμό και θέλουμε η απόλυτη τιμή του να αποθηκευτεί στη μεταβλητή apolyti: 1 if x < 0 then apolyti := -x; 3 else 4 apolyti := x; Ας δούμε πώς θα μπορούσαμε να ορίσουμε μια συνάρτηση η οποία κάνει αυτόν τον υπολογισμό στο πρόγραμμα 6 εξετάζοντας τις διαφορές που απαιτούνται σε σχέση με τον ορισμό μιας procedure. Listing 6: Συνάρτηση υπολογισμού απόλυτης τιμής 1 function myabs(x: integer) : integer; begin 3 if x < 0 then 4 myabs := -x 5 else 6 myabs := x; 7 end; Στη γραμμή 1 ξεκινάμε την επικεφαλίδα της διαδικασίας χρησιμοποιώντας τη δεσμευμένη λέξη function αντί για την procedure. Στη συνέχεια δηλώνουμε το όνομα της συνάρτησης και τα ορίσματά της μέσα σε παρενθέσεις όπως ακριβώς και στις procedures. Αμέσως μετά την παρένθεση 5

όμως και πριν το ερωτηματικό που τερματίζει την επικεφαλίδα δηλώνουμε τον τύπο της τιμής που επιστρέφει η συνάρτηση. Ενώ στις procedures αμέσως μετά την παρένθεση που κλείνει θα βάζαμε το ερωτηματικό, στις functions βάζουμε άνω-κάτω τελεία και το όνομα ενός τύπου, στο παράδειγμά μας integer. Αμέσως μετά συνεχίζουμε όπως και στις procedures, δηλώνοντας με τη var όσες μεταβλητές θα θέλαμε να χρησιμοποιεί η συνάρτησή μας και τις εντολές της μέσα σε ένα μπλοκ begin-end. Η μόνη διαφορά είναι ότι μέσα στο μπλοκ begin-end μπορούμε να χρησιμοποιήσουμε το όνομα της συνάρτησης (στο παράδειγμά μας myabs) ως όνομα μεταβλητής στην οποία αποθηκεύουμε την τιμή που θέλουμε να επιστραφεί από τη συνάρτηση. Ο μηχανισμός εκτέλεσης της Pascal λέει ότι η τιμή που επιστρέφεται είναι η τιμή της μεταβλητής αυτής (εκείνης που έχει το όνομα της συνάρτησης) τη στιγμή που τερματίζεται η εκτέλεσή της, δηλαδή τη στιγμή που η εκτέλεση φτάνει στο end; που κλείνει το μπλοκ begin-end της συνάρτησης. Στο παράδειγμα 3 φαίνεται πώς μπορούμε να καλέσουμε μία συνάρτηση. 1 var arithmos: integer; 3 apotelesma: integer; 4 begin 5 write(' Dose evav ari8mo: '); 6 readln( arithmos); 7 apotelesma := myabs( arithmos); 8 writeln('h apolytn timn toy ', arithmos, ' eivai ', apotelesma); Για να καλέσουμε μία συνάρτηση γράφουμε το όνομά της ακολουθούμενο από τις παραμεέτρους μέσα σε παρενθέσεις (όπως και στις procedures). Η κλήση της συνάρτησης πραγματοποιείται στη γραμμή 7. Η συνάρτηση καλείται με παράμετρο την τιμή της μεταβλητής arithmos. Η τιμή που επιστρέφει αποθηκεύεται στη μεταβλητή apotelesma. Η εντολή ανάθεσης τιμής της γραμμής 7 λειτουργεί ως ένα βαθμό όπως και οποιαδήποτε άλλη εντολή ανάθεσης π.χ. apotelesma := 4 * x δηλαδή πρώτα υπολογίζεται η τιμή της παράστασης δεξιά από το := και στη συνέχεια το αποτέλεσμα αποθηκεύεται στη μεταβλητή που είναι αριστερά. Στη συγκεκριμένη περίπτωση η έκφραση δεξία από το := είναι η κλήση συνάρτησης myabs(arithmos). Από άποψη συντακτική η Pascal επιτρέπει την κλήση μιας συνάρτησης οπουδήποτε επιτρέπεται η εμφάνιση μιας παράστασης με τύπο ίδιο με εκείνον που επιστρέφει η συνάρτηση. Στο συγκεκριμένο παράδειγμα, αφού η συνάρτηση myabs επιστρέφει integer μπορούμε να την καλέσουμε οπουδήποτε επιτρέπεται μία integer έκφραση, π.χ. σε παραστάσεις με τους τελεστές +, -, *, mod, div κτλ. Αν η συνάρτησή μας επέστρεφε real δε θα μπορούσαμε να την χρησιμοποιήσουμε με τον mod ή τον div. Από άποψη λειτουργική, όταν σε μία έκφραση συναντάται μία κλήση συνάρτησης τότε καλείται η συνάρτηση αυτή και η τιμή που επιστρέφει αντικαθιστά την κλήση της συνάρτησης στην έκφραση αυτή. Για παράδειγμα αν σε ένα πρόγραμμα Pascal υπήρχε η παράσταση 5 * 7 + 1 τότε η Pascal (ακολουθώντας τον κανόνα ότι ο πολλαπλασιασμός έχει υψηλότερη προτεραιότητα από την πρόσθεση) θα εκτελούσε την πράξη 5 * 7 και θα αντικαθιστούσε το αποτέλεσμα 35 στην προηγούμενη έκφραση οπότε θα προέκυπτε 35 + 1 το οποίο θα υπολόγιζε και θα προέκυπτε το τελικό αποτέλεσμα 47. Με ανάλογο τρόπο αν πρέπει να υπολογιστεί η έκφραση 5 * myabs(-7) + 1 η Pascal θα προσπαθήσει να υπολογίσει το 5 * myabs*(-7). Επειδή εκεί εμπλέκεται η κλήση της συνάρτησης, θα διέκοπτε προσωρινά την εκτέλεση των πράξεων και θα καλούσε τη συνάρτηση myabs με παράμετρο -7. Η κλήση αυτή θα επέστρεφε την τιμή 7. Η Pascal θα αντικαθιστούσε την 6

κλήση myabs(-7) με το αποτέλεσμά της οπότε θα προέκυπτε 5 * 7 + 1 και θα συνέχιζε όπως και στο προηγούμενο παράδειγμα. 4 Εμβέλεια, τοπικές και καθολικές μεταβλητές Δείτε το πρόγραμμα 4. 1 program scopes1; var 3 a: integer; 4 5 procedure p; 6 var 7 b: integer; 8 begin 9 b := 5; 10 writeln('to a eivai ', a); 11 writeln('to b eivai ', b); 1 end; 13 14 begin 15 a := 3; 16 p; 17 end. Εκεί δηλώνεται μία procedure p στις γραμμές 5-1. Η procedure χρησιμοποιεί μία μεταβλητή b η οποία δηλώνεται σε ένα var-block στις γραμμές 6-7. Το κύριο μπλοκ του προγράμματος (γραμμές 14-17) έχει και αυτό ένα var-block στις γραμμές -3. Αν εκτελεστεί το πρόγραμμα τυπώνεται στην οθόνη το εξής: To a eivai 3 To b eivai 5 Οι εντολές που τυπώνουν τα παραπάνω μηνύματα βρίσκονται μέσα στην procedure p. Βλέπουμε ότι οι μεταβλητές a και b είναι προσβάσιμες από εκείνο το σημείο του προγράμματος. Αν όμως προσπαθήσουμε να μεταφέρουμε τη γραμμή 11 έξω από την procedure p και να την τοποθετήσουμε μετά τη γραμμή 16 ο μεταγλωττιστής θα μας δώσει σφάλμα παραπονούμενος ότι η μεταβλητή b δεν έχει δηλωθεί. Το ίδιο θα συμβεί αν μεταφέρουμε τις γραμμές -3 ώστε να βρεθούν αμέσως μετά τη γραμμή 1. Ο μεταγλωττιστής θα δώσει ανάλογο σφάλμα λέγοντας ότι η μεταβλητη a που αναφέρεται στη γραμμή 10 δεν έχει δηλωθεί. Βλέπουμε ότι τα ονόματα των μεταβλητών δεν είναι `ορατά' σε οποιοδήποτε σημείο του προγράμματος. Μπορούμε να τα χρησιμοποιούμε μόνο σε συγκεκριμένα σημεία. Για παράδειγμα τη μεταβλητή b του παραπάνω παραδείγματος μπορούμε να τη χρησιμοποιούμε μόνο μέσα στο σώμα της procedure p, δηλαδή από τη γραμμή 8 μέχρι τη 1. Το ίδιο ισχύει και για τις παραμέτρους των procedures και των functions, αν για παράδειγμα είχαμε μία procedure όπως στο παράδειγμα 4 τότε τις μεταβλητές x και y θα μπορούσαμε να τις χρησιμοποιούμε μόνο μέσα στο begin-end μπλοκ της procedure. 7

1 procedure proc(x: real; y: integer) var 3 a: real; 4 begin 5 a := x + y; 6 end; Αυτού του είδους οι μεταβλητές ονομάζονται τοπικές επειδή μπορούν να χρησιμοποιηθούν μόνο σε ένα μέρος του προγράμματος. Έχουμε πει ότι η δήλωση μιας μεταβλητής ισοδυναμεί με τη δέσμευση μνήμης κατάλληλης για να αποθηκεύσει την τιμή της μεταβλητής. Δείτε και το παράδειγμα 4. 1 procedure p1; var 3 a: integer; 4 begin 5 end; 6 7 procedure p; 8 var 9 a: integer; 10 begin 11 end; Εκεί βλέπουμε δύο procedures σε κάθε μία από τις οποίες δηλώνεται μία μεταβλητή a. Μία εύλογη απορία είναι η εξής: Ποια είναι η σχέση της θέσης μνήμης που δεσμεύεται για τη μεταβλητή a της procedure p1 με εκείνην της συνώνυμης μεταβλητής της procedure p; Η απάντηση είναι ότι δεν έχουν καμία σχέση. Το γεγονός ότι έχουν το ίδιο όνομα δεν έχει καμία σημασία για την Pascal. Ο κανόνας είναι ότι για κάθε όνομα μεταβλητής που εμφανίζεται σε ένα var μπλοκ ή στη λίστα παραμέτρων μίας procedure ή function, δεσμεύεται μία ανάλογη θέση μνήμης, άσχετα αν το όνομα αυτό δηλώνεται και κάπου αλλού. Η δέσμευση αυτής της μνήμης ισχύει για όσο εκτελείται η συγκεκριμένη procedure ή function και παύει να ισχύει όταν τερματιστεί η εκτέλεση. 5 Call by value, call by reference Ένα τελευταίο θέμα σχετικά με τις κλήσεις συναρτήσεων και διαδικασιών είναι το εξής: Είδαμε ότι οι τιμές των ορισμάτων στην κλήση ενός υποπρογράμματος τίθενται στις αντίστοιχες παραμέτρους όταν αυτό καλείται. Π.χ. στο απόσπασμα 5 1 procedure p(a: integer); begin 3 writeln(a); a:= 6; writeln(a); 4 end; 5... 6 b:= 5; p(b); βλέπουμε μια διαδικασία p η οποία παίρνει μία παράμετρο a. Στη γραμμή 3 βλέπουμε μία κλήση αυτής της διαδικασίας. Ως όρισμα δίνεται η μεταβλητή b η οποία εκείνη τη στιγμή έχει την τιμή 8

5. Υπενθυμίζουμε ότι όταν ξεκινήσει να εκτελείται η p δημιουργείται η μεταβλητή a ως τοπική μεταβλητή η οποία παίρνει αρχικά την τιμή 5 στο συγκεκριμένο παράδειγμα. Μέσα στο σώμα της p η τοπική μεταβλητή αλλάζει τιμή και γίνεται 6. Το ερώτημα είναι εάν η τιμή της μεταβλητής b αλλάζει όταν αλλάζει η τιμή της τοπικής μεταβλητής a στην p. Η απάντηση είναι ότι, όχι, η τιμή της μεταβλητής b δεν αλλάζει. Ο λόγος είναι ότι οι δύο μεταβλητές δε συνδέονται μεταξύ τους με μόνη εξαίρεση τη στιγμή που η τιμή της μίας αποθηκεύεται στην άλλη. Αυτός ο τρόπος περάσματος παραμέτρων σε υποπρογράμματα λέγεται call by value (κλήση κατ' αξία) γιατί αυτό που περνιέται στο υποπρόγραμμα είναι η τιμή μιας ποσότητας και όχι το σημείο στο οποίο είναι αποθηκευμένη ώστε να μπορεί το υποπρόγραμμα να την τροποποιήσει. Οπότε σύμφωνα με τα παραπάνω, δεν υπάρχει τρόπος να μας επιστρέψει ένα υποπρόγραμμα πάνω από μία ποσότητα. Αν για παράδειγμα θέλαμε να γράψουμε ένα υποπρόγραμμα που έπαιρνε δύο παραμέτρους, π.χ. τις συντεταγμένες x και y ενός διανύσματος στο χώρο δύο διαστάσεων και θέλαμε να μας επιστρέψει τις συντεταγμένες ενός διανύσματος κάθετου προς αυτό, δεν θα μπορούσαμε να το κάνουμε σύμφωνα με τα όσα ξέρουμε μέχρι στιγμής καθώς ο μόνος τρόπος που υπάρχει είναι να ορίσουμε μία function η οποία όμως επιστρέφει το πολύ μία τιμή¹. Για το λόγο αυτό, δίνεται από την Pascal η δυνατότητα ορισμού υποπρογραμμάτων τα οποία παίρνουν ένα ή περισσότερα ορίσματά τους όχι κατ' αξία αλλά κατ όρισμα. Αυτός ο τρόπος περάσματος ορισμάτων λέγεται και call by reference γιατί αντί για να περνάει στο υποπρόγραμμα την τιμή μίας ποσότητας περνάει τη θέση μνήμης στην οποία αυτή είναι αποθηκευμένη. Ο προγραμματιστής δεν χρειάζεται να ασχοληθεί με τις τεχνικές λεπτομέρειες του χειρισμού της μνήμης, απλώς δηλώνει τα ορίσματα χρησιμοποιώντας πριν από το όνομά τους τη λέξη var. Δείτε το παράδειγμα 5. Εκεί ορίζεται στις γραμμές 3-8 μία διαδικασία p η οποία παίρνει τρεις παραμέτρους τις οποίες και αλλάζει. Πιο κάτω στο κυρίως πρόγραμμα 10-18, ορίζονται τρεις μεταβλητές οι οποίες παίρνουν τις τιμές 1, και 3. Στη συνέχεια καλείται η διαδικασία με ορίσματα τις τρεις αυτές μεταβλητές και αμέσως μετά τυπώνονται οι τιμές τους στη γραμμή 17. 1 program byref; 3 procedure p(a: integer; b: integer; c: integer); 4 begin 5 a := 11; 6 b := 1; 7 c := 13; 8 end; 9 10 var 11 i,j,k: integer; 1 begin 13 i := 1; 14 j := ; 15 k := 3; 16 p(i,j,k); 17 writeln(i, ' ', j, ' ', k); ¹Θα μπορούσαμε να χρησιμοποιήσουμε records αλλά δεν τα έχουμε μάθει ακόμα 9

18 end. Αν τρέξετε το πρόγραμμα ως έχει θα σας δώσει στην οθόνη 1 3 που σημαίνει ότι οι τιμές των μεταβλητών i, j και k στο κυρίως πρόγραμμα δεν άλλαξαν μετά την κλήση της p. Αυτό είναι φυσικό, αφού είπαμε ότι οι τιμές των παραμέτρων περνιόνται κατ' αξία, δηλαδή οι τιμές τους. Αν όμως αλλάξουμε την επικεφαλίδα της p έτσι ώστε να γίνει procedure p(a: integer; var b: integer; c: integer); δηλαδή προσθέσουμε τη λέξη var πριν από το όνομα της παραμέτρου b και τρέξουμε το πρόγραμμα θα δούμε στην οθόνη 1 1 3 δηλαδή η μεταβολή της μεταβλητής b μέσα στο υποπρόγραμμα `πέρασε' και στο κύριως πρόγραμμα, δηλαδή και στην τιμή της μεταβλητής j που βρίσκεται έξω από το υποπρόγραμμα. 10