Introduction to Pascal Greek

134
Σημειώσεις για το Μάθημα Γλώσσα Προγραμματισμού Pascal 1

Transcript of Introduction to Pascal Greek

Page 1: Introduction to Pascal Greek

Σημειώσεις για το Μάθημα

Γλώσσα Προγραμματισμού Pascal

1

Page 2: Introduction to Pascal Greek

Τι είναι ένα πρόγραμμα Η/Υ:

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

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

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

ΕισαγωγήΗ γλώσσα PASCAL σχεδιάστηκε από τον Nicklaus Wirth, διάσημο Ελβετό επιστήμονα της Πληροφορικής, το 1968 και αναθεωρήθηκε το 1972.0 Wirth σχεδίασε την PASCAL προκειμένου να ξεπεραστούν τα μειονεκτήματα των γλωσσών προγραμματισμού της δεκαετίας του 1960. Πήρε το όνομα της προς τιμή του μαθηματικού και φιλοσόφου Blaise Pascal.Η PASCAL σχεδιάστηκε με στόχο να χρησιμοποιηθεί ως διδακτικό εργαλείο των

2

Page 3: Introduction to Pascal Greek

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

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

Η PASCAL είναι γλώσσα γενικής χρήσης και υποστηρίζει τις αρχές του δομημένου και του τμηματικού προγραμματισμού. Μερικά από τα ιδιαίτερα χαρακτηριστικά της είναι τα εξής:• Η δυνατότητα που δίνεται στον προγραμματιστή να δημιουργεί δικούς του τύπους δεδομένων.• Η χρήση μεταβλητών τύπου δείκτη (pointer) και η δυνατότητα της δυναμικής διαχείρισης της κεντρικής μνήμης.• Η σύνθετη εντολή (compound statement), δηλαδή η χρήση μιας σειράς εντολών ως μία εντολή.

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

Παράδειγμα:

Pascal C

Program ena; Var I: integer; C:char;BeginC:=’a’;I:=C; δεν επιτρέπεται λόγω ασυμβατότητας τύπωνEnd.

#include <stdio.h> int I;char C;main( ) { C=’a’; I=C; επιτρέπεται, θα καταχωρίσει στο I τον ASCII αριθμό του γράμματος α }

3

Page 4: Introduction to Pascal Greek

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

Παράδειγμα: Η σύνταξη της εντολής for σεPascal και σε C.

for I:= 1 to 10 do for( I=1; I<=10; I++ )

Το αλφάβητο της γλώσσας Pascal, αποτελείται από βασικά σύμβολα, όπως γράμματα του Ελληνολατινικοΰ αλφαβήτου, τα αριθμητικά ψηφία (0 - 9) και τα ειδικά σύμβολα, όπως +, -, *, /, \,., ; κλπ.Η Pascal μας επιτρέπει να δίνουμε ταυτότητες ή ονόματα (identifiers) τα οποία αναφέρονται σε σταθερές, μεταβλητές, τύπους δεδομένων, διαδικασίες, συναρτήσεις κλπ. Ένα όνομα αποτελείται από μια σειρά χαρακτήρων (γράμματα του λατινικού αλφαβήτου., αριθμοί ή _ ), πρέπει να αρχίζει πάντοτε με γράμμα και δεν πρέπει να περιέχει κενά.Προκειμένου να εξασφαλίσουμε ένα ευανάγνωστο πρόγραμμα, δίνουμε ονόματα ενδεικτικά του περιεχομένου τους (meaningful) και αντί κενού βάζουμε τον χαρακτήρα "_". Ο χαρακτήρας αυτός δεν μπορεί να είναι ο τελευταίος του ονόματος. Πχ. basikos_mistos, kratiseis, pl_poso, είναι σωστά ονόματα.

Ονόματα στην Pascal:1. Δεσμευμένες λέξεις ( and, array, begin, case, const, div, do, downto, else, end,

file, for, function, goto, if, in, label, mod, nil, not, of, or, packed, procedure, program, record, repeat, set, then, to, type, until, var, while, with.)

2. Τυποποιημένα ονόματα (integer, boolean, real, char, read, readln, write, writeln, input, output)

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

Στις περιπτώσεις 1,2 και 3 τα ονόματα αναγνωρίζονται από τον Compiler είτε τα γράφουμε με μικρά είτε με κεφαλαία ( ή και με συνδυασμό) π.χ τα παρακάτω ονόματα είναι ίδια (BEGIN, begin, bEgIN, BeGIn)Στην περίπτωση 3 τα ονόματα. αρχίζουν πάντα με χαρακτήρα και ακολουθούν χαρακτήρες ή αριθμοί. Έχουν μέγιστο μέγεθος 80 χαρακτήρες από τους οποίους ο Compiler επεξεργάζεται τους πρώτους 8. Δεν μπορούμε να δώσουμε σαν όνομα δεσμευμένη λέξη και καλό θα είναι να μην δίνουμε ούτε τυποποιημένη λέξη.

Μορφή Προγράμματος Ένα πρόγραμμα χωρίζεται σε τρία μέρη:

Επικεφαλίδα τμήμα δηλώσεων – ορισμών των στοιχείων τμήμα εκτελέσιμων ενεργειών

Επικεφαλίδα: program askisi(file1,…, filen);askisi: το όνομα του προγράμματοςfile1,…, filen: ονόματα εξωτερικών αρχείων που χρησιμοποιούμε για να εισάγουμε – εξάγουμε δεδομένα. Η εξ’ ορισμού δήλωση είναι η:

4

Page 5: Introduction to Pascal Greek

program askisi(INPUT,OUTPUT); ή program askisi; όπου η δήλωση INPUT αναφέρεται στο πληκτρολόγιο ( η εισαγωγή των στοιχείων γίνεται από το πληκτρολόγιο) και η OUTPUT στην οθόνη ( η εξαγωγή στοιχείων γίνεται στην οθόνη)Η πρώτη επικεφαλίδα απαιτείται στις δηλώσεις της Standard Pascal. Το όνομα του προγράμματος, το οποίο μπορεί να είναι όποιο όνομα μας αρέσει, αρκεί βέβαια να πληρεί τους όρους τους όποιους πρέπει να πληρεί ένα αναγνωριστικό (indentifier). Δεν πρέπει να περιέχει κενούς χαρακτήρες, διαφορετικά θα ελαμβάνετο ως δυο λέξεις και θα μπέρδευε τον compiler. Η πρώτη λέξη Program είναι δεσμευμένη λέξη και είναι η ένδειξη προς τον compiler της Pascal ότι το επόμενο όνομα είναι το όνομα του προγράμματος. Επισημαίνουμε ότι το όνομα τελειώνει με ένα ερωτηματικό. (Η Pascal χρησιμοποιεί το σύμβολο αυτό ως διαχωριστή εκφράσεων (statements) και παρότι όλες οι εκφράσεις δεν καταλήγουν με ερωτηματικό, οι περισσότερες το κάνουν.  Η Turbo Pascal δεν απαιτεί την έκφραση program, αλλά για να διατηρηθεί συμβατή με την Standard Pascal, απλά θα αγνοήσει την όλη έκφραση. Προτείνεται να συμπεριλάβετε την έκφραση αυτή, για να διατηρείτε τη συμβατότητα με τη Standard Pascal, και για να δείξετε μέσω του ονόματος του προγράμματος το σκοπό του προγράμματος.

Τμήμα δηλώσεων – ορισμών των στοιχείων: παραδείγματα:USES όνομα1,…, όνομαn

όνομα1,…, όνομαn : είναι ονόματα μονάδων που περιέχουν διαδικασίες - συναρτήσεις

USES crt;

LABEL δηλώσεις ετικετών LABEL 50;

goto 50;50: εντολή

CONST δηλώσεις ονομάτων σταθερών CONST PI=3.14;

TYPE δηλώσεις οριζομένων τύπων TYPE parea=(kostas,nikos); metr=1..10; A: array[metr] of integer;

VAR δηλώσεις ονομάτων μεταβλητών VAR I:integer; a:real; c:char;

PROCEDURE δηλώσεις και περιγραφή υπορουτινών

FUNCTION δηλώσεις και περιγραφή συναρτήσέων

τμήμα εκτελέσιμων ενεργειών:

begin.

5

Page 6: Introduction to Pascal Greek

.

.end.

Η τελεία που ακολουθεί το end. είναι σημάδι προς τον compiler ότι τελείωσε το πρόγραμμα του εκτελέσιμου μέρους και επίσης ότι τελείωσε η μεταγλώττιση. Κάθε πρόγραμμα Pascal έχει μια και μόνη τελεία η οποία θα βρίσκεται στο τέλος του προγράμματος

Πολλές φορές για λόγους τεκμηρίωσης χρειάζεται να γράφουμε σχόλια στο πρόγραμμα. Τα σχόλια μπορεί να καταλαμβάνουν όσες γραμμές θέλουμε ή να εμφανίζονται μεταξύ των στοιχείων μιας εντολής. Τα σχόλια περιέχονται μεταξύ δύο παρενθέσεων της μορφής {...} η (*...*). Κάθε σχόλιο θεωρείται ως ένα κενό. Παράδειγμα: (* αυτό είναι ένα σχόλιο *) { και αυτό είναι σχόλιο }Θα πρέπει να παρατηρήσουμε το εξής. Αν και κάποιοι compilers επιτρέπουν να υπάρχει κάποιο σχόλιο με τη μορφή (* } ή κάποιοι άλλοι με τη μορφή { *), είναι πολύ κακό προγραμματιστικά και πρέπει να αποφεύγεται. Το πρωτόκολλο ANSI Pascal επιτρέπει τέτοια χρήση αλλά η Turbo Pascal δεν επιτρέπει αυτή την αστεία χρήση των σχολίων. Η Turbo Pascal δεν σας επιτρέπει να ενσωματώσετε σχόλια χρησιμοποιώντας τους ίδιους διαχωριστές, αλλά επιτρέπει να ενσωματώνετε τον έναν τύπο μέσα στον άλλο. Αυτό μπορεί να χρησιμοποιηθεί ως βοήθεια αποσφαλμάτωσης. Αν γενικά χρησιμοποιείτε τα σύμβολα (* και *) για σχόλια, μάλλον θα πρέπει να χρησιμοποιείτε τα { και } στην Turbo Pascal για να μετατρέψετε σε σχόλιο ένα ολόκληρο κομμάτι κώδικα κατά τη διάρκεια της αποσφαλμάτωσης, ακόμα και αν περιέχει και άλλα σχόλια μέσα του. Αυτό είναι ένα τέχνασμα που πρέπει να θυμάστε όταν φθάσετε στο σημείο να γράψετε προγράμματα σημαντικού μεγέθους.

Σημεία στίξης:, (κόμμα) : χρησιμοποιείται για διαχωρισμό ομοίων πραγμάτων (π.χ Var I,j,h:real;). (τελεία) : χρησιμοποιείται στο τελικό end ( end.); (ελληνικό ερωτηματικό) : χρησιμοποιείται για διαχωρισμό προτάσεων Γενικός κανόνας: Μην βάζετε ; πριν από τις λέξεις end και else και μετά από τις λέξεις begin, repeat και case.( Αν βάλω ; μετά από τη λέξη begin ή πριν από τη λέξη end θα έχω εισαγάγει απλώς μια κενή εντολή)

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

6

Page 7: Introduction to Pascal Greek

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

Ακέραιοι:Οι ακέραιοι τύποι είναι οι γνωστοί μας ακέραιοι που μπορεί να είναι θετικοί ή αρνητικοί, πχ. 10 100 -10009 +51 -52 κλπ. Αν δεν υπάρχει πρόσημο, ο αριθμός θεωρείται θετικός, θεωρητικά ένας ακέραιος μπορεί να έχει οποιοδήποτε πλήθος ψηφίων. Πρακτικά όμως το πλήθος των ψηφίων περιορίζεται ανάλογα με τον τύπο του υπολογιστή. Η μεταβλητή Maxint (μέγιστος ακέραιος) προσδιορίζει το εύρος του διαστήματος των ακεραίων, από -Maxlnt-1 έως Maxint Στην Turbo Pascal Maxint =32767 δηλαδή, το εύρος του διαστήματος των ακεραίων είναι από -32768 έως 32767.Έτσι οι ακέραιοι (integer) της Pascal, όπως και στις περισσότερες γλώσσες προγραμματισμού, είναι ένα υποσύνολο των ακεραίων, που γνωρίζουμε από τα Μαθηματικά. Στις περισσότερες εκδόσεις της Pascal παίρνουν τιμές στο διάστημα [-32767, 32768]. Με τους ακεραίους γίνονται όλες οι γνωστές από τα Μαθηματικά πράξεις αλλά τα αποτελέσματα πρέπει να βρίσκονται στο σύνολο τιμών του ακέραιου τύπου.Μερικές εκδόσεις της Pascal, όπως η Turbo Pascal, υποστηρίζουν διάφορους τύπους ακεραίων. Κάθε τέτοιος τύπος καθορίζεται από το πεδίο τιμών του, την ύπαρξη ή μη πρόσημου και το πλήθος των bytes (8bits/byte) που καταλαμβάνει στην κεντρική μνήμη.Ακέραιοι τύποι:Δήλωση τύπου Διάστημα τιμών πρόσημο πλήθος bytes

shortint -128.. 127 ΝΑΙ 1

integer -32768 ..32767 ΝΑΙ 2

longint -2148483648.. 2147483647 ΝΑΙ 4

byte 0..255 ΟΧΙ 1

word 0..65535 ΟΧΙ 2

Οι επιτρεπτές πράξεις ακεραίων είναι:+ πρόσθεση- αφαίρεση* πολλαπλασιασμός div ακέραια διαίρεση (πηλίκο)

7

Page 8: Introduction to Pascal Greek

mod υπόλοιπο διαίρεσης

Παραδείγματα27 div 6=4, 16 div 17 =0, 36 div 6 =6, 27 mod 6=3, 16 mod 17 = 16, 36 mod 6=0

Πραγματικοί:Ο πραγματικός (real) τύπος χρησιμοποιείται εκεί που οι αριθμητικές τιμές δεν είναι ακέραιοι αριθμοί ή οι αναμενόμενες τιμές τους είναι εκτός ορίων του ακέραιου τύπου. Επειδή οι αριθμοί αυτοί αποθηκεύονται με διαφορετικό τρόπο από τους ακέραιους, δίνουν μεγαλύτερο εύρος τιμών και μπορεί να χρησιμοποιηθούν για πολύ μεγάλους ή πολύ μικρούς αριθμούς (ακέραιους ή δεκαδικούς).Οι πραγματικοί αριθμοί της Pascal ορίζονται ως ένα υποσύνολο των πραγματικών αριθμών, που ξέρουμε από τα Μαθηματικά. Περιέχονται στο διάστημα από 10-38

μέχρι 1038 περίπου και έχουν από 6 μέχρι και 20 σημαντικά ψηφία, ανάλογα με την έκδοση της Pascal και την επιμέρους επιλογή του πραγματικού τύπου. Τα σημαντικά ψηφία εκφράζονται με τη μορφή κινητής υποδιαστολής που διαθέτει ο υπολογιστής. Τα αποτελέσματα αριθμητικών πράξεων προσεγγίζονται με το πλήθος των σημαντικών ψηφίων που διαθέτει η έκδοση της Pascal.Π.χ. ο αριθμός 4.934456Ε+04 αντιστοιχεί στο δεκαδικό αριθμό 49344,56 (4.934456 x 10+4).Μερικές εκδόσεις Pascal όπως η Turbo Pascal υποστηρίζει διάφορους τύπους πραγματικών. Κάθε τέτοιος τύπος καθορίζεται από το πεδίο τιμών του, το πλήθος των σημαντικών ψηφίων του και το πλήθος των bytes που καταλαμβάνει στην κεντρική μνήμη.Τύποι πραγματικών αριθμών:Δήλωση τύπου Διάστημα τιμών πρόσημο πλήθος bytes

real -2.9 χ 10-39. .1.7 χ ΙΟ38 11-12 6

single -1.5 χ 10-45.. 3.4 χ ΙΟ38 7-8 4

double -5.0x10-324.. 1.7x10308 15-16 8

extended -3.4x10-4932.. 1.1x104932 19-20 10

comp -263+1.. 263-ί 19-20 8

Οι επιτρεπτές πράξεις πραγματικών είναι:+ πρόσθεση- αφαίρεση* πολλαπλασιασμός / διαίρεση

8

Page 9: Introduction to Pascal Greek

Τελεστές πράξεων:πράξη σύμβολοπρόσθεση +αφαίρεση -πολ/σμός *διαίρεση /

με τις πράξεις +,-, * έχω: int πράξη int δίνει intint πράξη real δίνει real

Η διαίρεση δίνει: int / int δίνει real, int / real δίνει real, real / int δίνει real

Εκτός των άνω υπάρχουν και οι:DIV (ακέραια διαίρεση, γίνεται μόνο μεταξύ ακεραίων και δίνει αποτέλεσμα ακέραιο) π.χ: 19 DIV 3 δίνει αποτέλεσμα 6MOD (Υπόλοιπο ακέραιας διαίρεσης) 19 MOD 3 δίνει αποτέλεσμα 1Ύψωση αριθμού σε δύναμη ( xy) Αν δεν υπάρχει η συνάρτηση POWER(x,y) τότε xy=EXP(y*LN(x)) όπου x>0.

Μεταβλητές Boolean:Μια μεταβλητή με τύπο boolean, μπορεί να λάβει μόνο τιμές TRUE ή FALSE. Αυτή η μεταβλητή χρησιμοποιείται σε loop, EndOFFile αναγνωριστικά ή σε οποιεσδήποτε άλλες συνθήκες TRUE ή FALSE μέσα στο πρόγραμμα. Οι μεταβλητές μπορούν να συγκριθούν μεταξύ τους και να καθορίσουν μια boolean μεταβλητή. Μια πλήρης λίστα με τους σχεσιακούς τελεστές (που χρησιμοποιούνται για τις συγκρίσεις) είναι η επόμενη:

= ίσον

<> διάφορο

> μεγαλύτερο

< μικρότερο

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

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

Αυτοί οι τελεστές μπορούν να χρησιμοποιηθούν για να συγκρίνουμε οποιουσδήποτε από τους απλούς τύπους δεδομένων όπως integer, char, byte, boolean και real ή σταθερές.

Οι πράξεις που μπορούν να γίνουν με μεταβλητές ή εκφράσεις boolean, είναι η σύζευξη, η διάζευξη, η αποκλειστική διάζευξη και η άρνηση και γίνονται με χρήση των λογικών τελεστών and, or, xor και not αντίστοιχα.

9

Page 10: Introduction to Pascal Greek

Τα αποτελέσματα των πράξεων φαίνονται στον κάτω πίνακα:

P Q P and Q P or Q P xor Q NOT pTrue True True True False FalseTrue False False True True FalseFalse True False True True TrueFalse False False False False True

Ιεράρχηση: (από τη μεγαλύτερη προς τη μικρότερη)1. παρενθέσεις2. NOT3. *, /, DIV, MOD, AND4. +, -, OR, XOR5. <, >, <=, >=, <>

Μεταβλητές Char:Ένας τύπος μεταβλητής char είναι μια πολύ χρήσιμη μεταβλητή, αλλά σχεδόν ποτέ δεν χρησιμοποιείται μόνη. Είναι πολύ ισχυρή όταν χρησιμοποιείται σε έναν πίνακα ή σε μια άλλη δηλωμένη από το χρήστη δομή. Η τιμή μιας τέτοιας μεταβλητής γράφεται σε απλά εισαγωγικά: ‘Α’, ‘ν’, ‘n’ κ.λ.πΣυνοψίζοντας, η μεταβλητή char έχει μέγεθος 1 byte και παίρνει τιμές από τον ASCII code.

10

Page 11: Introduction to Pascal Greek

Εντολές Εισόδου / ΕξόδουΤα δεδομένα των προγραμμάτων λαμβάνονται από μια μονάδα εισόδου, όπως για παράδειγμα το πληκτρολόγιο. Για την εισαγωγή των δεδομένων η Pascal χρησιμοποιεί τις διαδικασίες (procedures) read ή readln. Για την Εμφάνιση των περιεχομένων μεταβλητών ή σταθερών στην οθόνη, στον Εκτυπωτή ή σ' ένα αρχείο χρησιμοποιούνται οι διαδικασίες write ή writeln.Οι εντολές read, readln, write, writeln χρησιμοποιούνται και για ανάγνωση/εγγραφή από αρχεία τα οποία είναι καταχωρημένα στο δίσκο.

Οι εντολές read, readln:

Μορφή: read (parameter,parameter,...,)Ενέργεια: Η διαδικασία read ακολουθείται από μία ή περισσότερες παραμέτρους. Οι παράμετροι αυτές είναι τα ονόματα των διευθύνσεων της μνήμης όπου θα αποθηκευτούν τα δεδομένα, δηλαδή ονόματα μεταβλητών που χωρίζονται με ‘,’ (κόμμα) και περιέχονται σε μία παρένθεση. 'Όταν εκτελείται η διαδικασία, τα δεδομένα διαβάζονται και αποδίδονται, κατά τη σειρά που είναι γραμμένα, στις μεταβλητές όπως αυτές εμφανίζονται στη διαδικασία read. Όταν γίνεται εισαγωγή δεδομένων, και εφόσον αυτά είναι αριθμητικά και εμφανίζονται περισσότερα από ένα ανά γραμμή, πρέπει να χωρίζονται με ένα τουλάχιστον κενό. Τα δεδομένα τύπου char δεν πρέπει να χωρίζονται με κενά, γιατί το κενό είναι κι αυτό ένας χαρακτήρας ο οποίος θα διαβαστεί.Αν για παράδειγμα οι παράμετροι της εντολής read είναι ακέραιοι για κάθε παράμετρο, αρχίζοντας από την πρώτη, εκτελούνται τα παρακάτω:1. Διαβάζεται ένας αριθμός από το πληκτρολόγιο. 2. Αποθηκεύεται ο αριθμός στη μεταβλητή (αντίστοιχη διεύθυνση της μνήμης) 3. Επαναλαμβάνονται τα βήματα 1 και 2 για την επόμενη μεταβλητή.Όταν αποθηκευτεί τιμή και στην τελευταία μεταβλητή της λίστας των παραμέτρων, τελειώνει και η εκτέλεση της εντολής read.Θα πρέπει να είμαστε προσεκτικοί κατά την εισαγωγή των δεδομένων. Η εισαγωγή πραγματικού αριθμού σε ακέραια μεταβλητή δεν είναι επιτρεπτή. Μπορούμε όμως να διαβάσουμε μια ακέραια τιμή σε πραγματική μεταβλητή.Παραδείγματα:

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση

1 read(x) 22 x=22

2 read(a, b, c) 33 44 55 a=33 b=44 c=55

3 read(d, e) 6677

d=66 e=77

4 read(f, g) 11.99 21 31 41 51 f=11.99 g=21

5 read(x, a, d) x=31 a=41 d=51

11

Page 12: Introduction to Pascal Greek

Παρατηρήσεις:• Τα δεδομένα της γραμμής 3 δεν είναι αρκετά για όλες της παραμέτρους κι έτσι η εισαγωγή δεδομένων συνεχίζεται στην επόμενη γραμμή.• Οι μεταβλητές της εντολής read στη γραμμή 4 είναι λιγότερες από τα δεδομένα. Για το λόγο αυτό, τα επιπλέον δεδομένα είναι διαθέσιμα για την επόμενη εντολή read στη γραμμή 5.Στα προηγούμενα παραδείγματα όλες οι μεταβλητές είναι ακέραιες (integer) εκτός από την f η οποία είναι πραγματική (real).Οι εντολές read(a), read(b) και read(a, b) είναι ισοδύναμες. Η λίστα των μεταβλητών διευκολύνει τον προγραμματιστή στην κωδικοποίηση.

Μορφή: readln (parameter, parameter,...,)Ενέργεια: Η διαδικασία readln, μπορεί να ακολουθείται από μία ή περισσότερες παραμέτρους (μεταβλητές) που χωρίζονται με ‘,’ (κόμμα) και περιέχονται σε μια παρένθεση, που είναι ισοδύναμη των read και readln. Κατ’ αυτό τον τρόπο τα ζητούμενα διαβάζονται από την τρέχουσα γραμμή (read) και στη συνέχεια ο έλεγχος περνάει στην επόμενη γραμμή (readln). Η διαδικασία readln, όταν εμφανίζεται χωρίς παραμέτρους, έχει ως αποτέλεσμα να περνάει ο έλεγχος στην επόμενη γραμμή.Ας υποθέσουμε ότι έχουμε δύο ακέραιες τιμές σε κάθε γραμμή δεδομένων. Ο πίνακας που ακολουθεί δείχνει τα περιεχόμενα των μεταβλητών μετά την εκτέλεση της εντολής readln.Παραδείγματα:

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση

1 readln(a) readln(b) readln(c)

10 20 30 4050 60

a=10b=30c=50

2 readln(a,b,c) readln(d,e)

10 2030 4050 60

a=10 b=20 c=30d=50 e=60

3 readin (a, b) readln(c,d) readln(e)

10 2030 4050 60

a=10 b=20c=30 d=40 e=50

4 readln(a) readln(b) readln(c,d,e)

10 2030 4050 60

a=10 b=30 c=50 d=60 e=?

5 readln(a,b) readin readln(c)

10 2030 4050 60

a=10 b=20c=50

Παρατηρήσεις:• Δεν υπάρχουν δεδομένα για τη μεταβλητή e η εκτέλεση σταματάει μέχρι να γίνει εισαγωγή από το πληκτρολόγιο.

12

Page 13: Introduction to Pascal Greek

• Μια εντολή readln χωρίς παραμέτρους έχει ως αποτέλεσμα να παραλειφθεί μία γραμμή δεδομένων.

write, writeln

Μορφή: write (parameter,parameter,...,)Ενέργεια: Οι παράμετροι μπορεί να είναι σταθερές, μεταβλητές ή εκφράσεις, σε αντίθεση με την εντολή read η οποία δέχεται ως παραμέτρους μόνο μεταβλητές. Η τιμή καθεμιάς παραμέτρου κατά σειρά, τυπώνεται στη γραμμή από αριστερά προς τα δεξιά Στην απλούστερη περίπτωση οι παράμετροι μπορεί να είναι αριθμοί, χαρακτήρες ή αλφαριθμητικά στοιχεία (συμβολοσειρές) (strings). Εάν πρόκειται να γραφούν συμβολοσειρές σταθερών, αυτές θα πρέπει να περιέχονται μεταξύ απλών εισαγωγικών.Παράδειγμα:write ('αυτή είναι μία συμβολοσειρά')

Μορφή: writeln (parameter, parameter,...,)Ενέργεια: Η διαδικασία writeln, αν ακολουθείται από παραμέτρους, είναι ισοδύναμη των write και writeln. Η τιμή κάθε μιας παραμέτρου κατά σειρά, τυπώνεται στην γραμμή από αριστερά προς τα δεξιά και στη συνέχεια η επόμενη εντολή εισόδου / εξόδου εκτελείται στην αρχή της επόμενης γραμμής. Η διαδικασία writeln, όταν εμφανίζεται χωρίς παραμέτρους, έχει ως αποτέλεσμα να περνάει ο έλεγχος στην αρχή της επόμενης γραμμής.Ο πίνακας που ακολουθεί δείχνει τα αποτελέσματα μετά την εκτέλεση εντολής writeln.Παραδείγματα:Περιεχόμενα παραμέτρων Εντολή Αποτελέσματα

i=2 writeln (i) 2

writeln('i=', i) i=2

writeln('Error= ',i) Error =2

writeln('Error Message') Error Message

la ='Pascal' writeln(ty,' ',la) TURBO Pascal

ty = TURBO' writeln(ty, la) TURBOPascal

writeln('Language=', la) Language = Pascal

Η εισαγωγή των δεδομένων γίνεται με την εντολή read. Η εισαγωγή απλοποιείται, όταν με τη διαδικασία write το ίδιο το πρόγραμμα δίνει ένα προτρεπτικό μήνυμα, δηλαδή εμφανίζει στην οθόνη ποια είναι τα ζητούμενα δεδομένα.

13

Page 14: Introduction to Pascal Greek

Παράδειγμα: write ('Δώσε βασικό μισθό : ');readln(mistos);

Μορφοποιημένη εκτύπωσηΟι δυο βασικές τεχνικές για τη μορφοποίηση της εκτύπωσης είναι οι κενές γραμμές και η εισαγωγή κενών στις γραμμές εκτύπωσης. Για να έχουμε κενές γραμμές αρκεί να δώσουμε την εντολή wrileln χωρίς παραμέτρους τόσες φορές όσες είναι οι κενές γραμμές που θέλουμε. Για την εισαγωγή κενών στη γραμμή μεταξύ των παραμέτρων περιλαμβάνουμε και όσα κενά θέλουμε μεταξύ εισαγωγικών.Ο έλεγχος της μορφής των αποτελεσμάτων στη γραμμή εκτύπωσης γίνεται με πληροφορία που ακολουθεί την παράμετρο στη διαδικασία write ή writeln. Η πληροφορία αυτή δίνει το επιθυμητό εύρος του πεδίου δηλαδή τις θέσεις που θα καταλάβει η παράμετρος κατά την εκτύπωση της.Για σταθερές/μεταβλητές Ακέραιου ή Αλφαριθμητικού τύπου, η μορφή εκτύπωσης είναι write (x:m). Όπου:

x η μεταβλητή που θα τυπωθείm το συνολικό πλήθος των θέσεων εκτύπωσης

Η διαδικασία write(x:m), όπου x είναι ακέραια έκφραση, τυπώνει την τιμή της μεταβλητής x αρχίζοντας από τα δεξιά ενός πεδίου εύρους m. Αν το εύρος είναι μεγαλύτερο από το μήκος του πεδίου που πρόκειται να τυπωθεί, εμφανίζονται κενά στην αριστερή πλευρά της τιμής. Αν το εύρος είναι μικρότερο από το μήκος του πεδίου που πρόκειται να τυπωθεί, αγνοείται η οδηγία μορφοποίησης και χρησιμοποιείται το ελάχιστο απαιτούμενο εύρος.Η μορφοποιημένη εκτύπωση μπορεί να χρησιμοποιηθεί και για σταθερές ή μεταβλητές αλφαριθμητικού τύπου (string). Η χρήση γίνεται όπως και στους ακεραίους, δηλαδή δίνεται το πλήθος των θέσεων εκτύπωσης της μεταβλητής ή της σταθεράς. Η στοίχιση γίνεται από δεξιά.Π.χ. Η εντολή writeln (‘Αριθμός μητρώου.’ :20); θα έχει ως αποτέλεσμα να αφήσει 4 κενές θέσεις εκτύπωσης από την αρχή της γραμμής ή από την τελευταία θέση εκτύπωσης και μετά να γράψει το περιεχόμενο της σταθεράς δηλαδή: Αριθμός μητρώου.

Για σταθερές/μεταβλητές Πραγματικού τύπου η μορφή εκτύπωσης είναι write(x:m:n). Όπου:

x η μεταβλητή πραγματικού τύπου που θα τυπωθεί, m το συνολικό πλήθος των θέσεων εκτύπωσης, συμπεριλαμβανομένης της

υποδιαστολής n το πλήθος των δεκαδικών ψηφίων.

Με τον τρόπο αυτό γίνεται η στρογγυλοποίηση και ο αριθμός εμφανίζεται με τη γνωστή από τα Μαθηματικά, μορφή σταθερής υποδιαστολής. Π.χ. write (3 .14159265 :10 : 4) θα δώσει ως αποτέλεσμα 3.1416. Γίνεται δηλαδή στρογγυλοποίηση στο τέταρτο δεκαδικό ψηφίο και εμφανίζονται και 4 κενά πριν από τον αριθμό, για να συμπληρωθεί το πλήθος των 10 θέσεων.

14

Page 15: Introduction to Pascal Greek

Εντολή εκχώρησης ή αντικατάστασης

Μορφή: μεταβλητή : = έκφρασηΕνέργεια: Το περιεχόμενο της μνήμης που ορίζεται με το όνομα της μεταβλητής που βρίσκεται αριστερά του := αντικαθίσταται από την τιμή που ορίζεται από την έκφραση η οποία βρίσκεται δεξιά του := (συμβόλου αντικατάστασης). Ο συμβολισμός := θα πρέπει να θεωρείται ως ένα μόνο σύμβολο και για το λόγο αυτό δεν επιτρέπονται κενά. Η έκφραση του δεξιού μέρους μπορεί να είναι και μία σταθερά ή άλλη μεταβλητή και τότε η τιμή τους αντικαθιστά την τιμή της μεταβλητής που βρίσκεται αριστερά.Παραδείγματα:χ:=1; {η μεταβλητή χ λαμβάνει την τιμή 1} χ:=χ+1; {το περιεχόμενο της μεταβλητής x αυξάνει κατά 1 και το αποτέλεσμα καταχωρείται στη μεταβλητή x} y:=(3*x+5)/(x+3); {το περιεχόμενο της μεταβλητής y αντικαθίσταται από την τιμή της αλγεβρικής παράστασης (3x+5)/(x+3) onoma:='APHΣ'; {Η μεταβλητή onoma, η οποία πρέπει να έχει ορισθεί ως string, λαμβάνει την τιμή ΑΡΗΣ} star := '*'; {Η μεταβλητή star, η οποία πρέπει να έχει ορισθεί ως string ή char λαμβάνει την τιμή *}

15

Page 16: Introduction to Pascal Greek

Ασκήσεις1. Να γράψετε πρόγραμμα που να τυπώνει: στη γραμμή 1: ΙΕΚ ΑΡΤΑΣ στη γραμμή 2: το όνομα σας στη γραμμή 3: ημερομηνία

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

3. Να γράψετε πρόγραμμα το οποίο να διαβάζει έναν αριθμό και να τυπώνει το διπλάσιο και το τριπλάσιο του. Να γίνει η ίδια διαδικασία για τους 2 επόμενους απ' αυτόν αριθμούς. Η μορφή της εκτύπωσης να είναι σύμφωνα με το παρακάτω υπόδειγμα:8 16 249 18 2710 20 30

4. Να γράψετε πρόγραμμα στο οποίο να γίνεται εισαγωγή των ψήφων δυο ατόμων για το καθένα χωριστά. Να βρεθεί ο μέσος όρος των ψήφων και να τυπωθεί η διαφορά των ψήφων καθενός από το μέσο όρο. Οι αριθμοί κατά την εκτύπωση να συνοδεύονται από τις κατάλληλες επεξηγήσεις σύμφωνα με το υπόδειγμα.Η μορφή της εκτύπωσης θα είναι:Ο Γιώργος πήρε ........ ψήφουςΟ Χάρης πήρε ........ ψήφους----------------------------------------------------ο μέσος όρος των ψήφων είναι ........ ψήφοι----------------------------------------------------Η διαφορά από το μέσο όρο είναι:για το Γιώργο ........ ψήφοιγια το Χάρη ........ ψήφοι

5. Να γράψετε πρόγραμμα που να διαβάζει το μήκος της ακτίνας ενός κύκλου και να τυπώνει τη διάμετρο, το μήκος και το εμβαδόν αυτού του κύκλου ως εξής:για κύκλο ακτίνας **** εκ. η διάμετρος είναι ***** εκ.το μήκος της περιφερείας είναι **** εκ. το εμβαδόν του κύκλου είναι ******τετρ.εκ.

6. Να γράψετε πρόγραμμα που να διαβάζει ένα τριψήφιο ακέραιο αριθμό και να τον τυπώνει ανάστροφα. Π.χ. ο αριθμός είναι 123, ο ανάστροφος είναι 321

7. Να γράψετε το ίδιο πρόγραμμα για έναν τετραψήφιο αριθμό.

8. Να γράψετε πρόγραμμα που να διαβάζει έναν πραγματικό αριθμό και να τυπώνει τις 5 πρώτες δυνάμεις του και το άθροισμα των 3 πρώτων δυνάμεων του.

16

Page 17: Introduction to Pascal Greek

9. Να γράψετε πρόγραμμα που να διαβάζει θερμοκρασία σε βαθμούς Fahrenheit και

να τη μετατρέπει σε βαθμούς Κελσίου. Ο τύπος μετατροπής είναι:

10. Να γράψετε πρόγραμμα που να διαβάζει τους συντελεστές α, β, της πρω-τοβάθμιας εξίσωσης αχ+β=0 και να υπολογίζει τη ρίζα της. (Υποτίθεται ότι α, β διάφορα του μηδενός).

17

Page 18: Introduction to Pascal Greek

Λύσεις των ασκήσεων

1. Program askisi1; Begin Writeln(' ΙΕΚ ΑΡΤΑΣ'); Writeln(' Λάμπρος'); Writeln('20-10-2003'); Writeln('πατησε <Enter>για τέλος'); Readln; End.

2. Program askisi2;Var mikos, platos, upsos, E, V:Real;

Begin Write (' δώσε το μήκος '); Readln(mikos); Write (' δώσε το πλάτος'); Readln(platos); Write (' δώσε το ύψος'); Readln(upsos); E := platos * mikos; V := E * upsos; Writeln(' το εμβαδόν της βάσης είναι ', E, ' τετρ.εκ. '); Writeln(' ο όγκος του παραλληλεπιπέδου είναι ',V,' κυβ. εκ.'); Writeln('πατησε <Enter>για τέλος'); Readln; End.

3. Program askisi3;Var aritmos, diplasio, triplasio:Integer;

Begin Write (' δώσε αριθμό '); Readln(aritmos); diplasio := 2 * aritmos; triplasio := 3 * aritmos; Writeln(aritmos,' ',diplasio,' ',triplasio); aritmos :=aritmos+1; {ο επόμενος είναι ο αριθμός +1} diplasio := 2 * aritmos; triplasio := 3 * aritmos; Writeln(aritmos,' ',diplasio,' ',triplasio); aritmos :=aritmos+1; diplasio := 2 * aritmos; triplasio := 3 * aritmos; Writeln(aritmos,' ',diplasio,' ',triplasio); Writeln('πατησε <Enter>για τέλος'); Readln; End.

18

Page 19: Introduction to Pascal Greek

4. Program askisi4;Var vote1, vote2,diaf1,diaf2:Integer; mo:real;

Begin Write (' δώσε αριθμό ψήφων πρώτου ατόμου '); Readln(vote1); Write (' δώσε αριθμό ψήφων δεύτερου ατόμου '); Readln(vote2); mo :=(vote1 + vote2) / 2; {Η συνάρτηση Round(x) επιστρέφει τον πλησιέστερο ακέραιο στον αριθμό x} diaf1 :=ROUND(vote1 - mo); diaf2 :=ROUND(vote2 - mo); Writeln(' Ο Γιώργος πήρε ',vote1, ' ψήφους'); Writeln(' Ο Χάρης πήρε ',vote2,' ψήφους'); Writeln('---------------------------------------'); Writeln(' ο μέσος όρος των ψήφων είναι ',mo:8:3,' ψήφοι '); Writeln('---------------------------------------'); Writeln(' Η διαφορά από το μέσο όρο είναι:'); Writeln(' για το Γιώργο ', diaf1,' ψήφοι'); Writeln(' για το Χάρη ',diaf2,' ψήφοι'); Writeln('πατησε <Enter>για τέλος'); Readln; End.

5. Program askisi5; Const PI=3.14;

Var R, Diametros, E, Mikos:Real; Begin Write (' δώσε ακτίνα κύκλου '); Readln(R); Diametros := 2 * R; Mikos := 2* PI* R; E := PI * R * R; Writeln('για κύκλο ακτίνας ', R ,' εκ. η διάμετρος είναι ', Diametros ,' εκ.'); Writeln(' το μήκος της περιφερείας είναι ', Mikos ,' εκ.'); Writeln(' το εμβαδόν του κύκλου είναι ', E , ' τετρ.εκ.'); Writeln('πατησε <Enter>για τέλος'); Readln; End.

6. Program askisi6; Var aritmos, ekatontades,dekades,monades, ypoloipo:Integer;

Begin Write (' δώσε αριθμό '); Readln(aritmos); ekatontades := aritmos DIV 100; ypoloipo := aritmos MOD 100; dekades := ypoloipo DIV 10;

19

Page 20: Introduction to Pascal Greek

monades := ypoloipo MOD 10; Writeln(monades:1,dekades:1,ekatontades:1); Writeln('πατησε <Enter>για τέλος'); Readln; End.

7. Program askisi7; Var aritmos, xiliades, ekatontades, dekades,monades, ypoloipo:Integer;

Begin Write (' δώσε αριθμό '); Readln(aritmos); xiliades := aritmos DIV 1000; ypoloipo := aritmos MOD 1000; ekatontades := ypoloipo DIV 100; ypoloipo := ypoloipo MOD 100; dekades := ypoloipo DIV 10; monades := ypoloipo MOD 10; Writeln(monades:1,dekades:1,ekatontades:1,xiliades:1); Writeln('πατησε <Enter>για τέλος'); Readln; End.

8. Program askisi8; Var dun1, dun2, dun3, dun4, dun5, athrisma:real;

Begin Write (' δώσε αριθμό '); Readln(dun1); dun2 :=dun1 * dun1; dun3 :=dun2 * dun1; dun4 :=dun3 * dun1; dun5 :=dun4 * dun1; athrisma := dun1 + dun2 + dun3; Writeln(' Δύναμη 1=', dun1); Writeln(' Δύναμη 2=', dun2); Writeln(' Δύναμη 3=', dun3); Writeln(' Δύναμη 4=', dun4); Writeln(' Δύναμη 5=', dun5); Writeln(' άθροισμα τριών πρώτων δυνάμεων ', athrisma); Writeln('πατησε <Enter>για τέλος'); Readln; End.

9. Program askisi9; Var C, F:real;

Begin Write (' δώσε θερμοκρασία σε βαθμούς Fahrenheit = '); Readln(F);

20

Page 21: Introduction to Pascal Greek

C := 5 * (F-32) / 9; Writeln(' Η θερμοκρασία σε βαθμούς Κελσίου είναι ', C); Writeln('πατησε <Enter>για τέλος'); Readln; End.

10. Program askisi10; Var A, B, X:real;

Begin Write (' δώσε αριθμό A'); Readln(A); Write (' δώσε αριθμό B'); Readln(B); X:= -B / A; Writeln(' Η ρίζα της εξίσωσης ',A:8:3, '* X +' ,B:8:3, '=0 είναι η Χ=',X:8:3); Writeln('πατησε <Enter>για τέλος'); Readln; End.

21

Page 22: Introduction to Pascal Greek

Εντολές επιλογής και αποφάσεων

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

IF

Μορφή: if Λογική έκφραση then εντολή-1Ενέργεια: Αν ή τιμή της λογικής έκφρασης είναι true (σωστό - αληθής), τότε εκτελείται ή εντολή που ακολουθεί το then.

Μορφή: if Λογική έκφραση then εντολή-1 else εντολή-2Ενέργεια: Αν ή τιμή της λογικής έκφρασης είναι true (σωστό - αληθής), τότε εκτελείται ή εντολή-1 που ακολουθεί το then, αλλιώς εκτελείται η Εντολή-2 που ακολουθεί το else.Παραδείγματα:α) if wres <= 40 then plir:=wr_apoz * wres else plir:=wr_apoz ( 40+ (wres-40)*1.5) ;

Δηλαδή αν οι ώρες εργασίας δεν είναι περισσότερες από 40 πολλαπλασιάζουμε την ωριαία αποζημίωση επί τις ώρες και βρίσκουμε το πληρωτέο ποσό. Οι επί πλέον των 40 ωρών θεωρούνται υπερωριακές και πολλαπλασιάζονται με το συντελεστή 1.5. Μερικές φορές η εντολή if χρησιμοποιείται και για έλεγχο των δεδομένων. Για παράδειγμα, πριν γίνει διαίρεση πρέπει να γίνει έλεγχος μήπως ο διαιρέτης έχει τιμή μηδέν οπότε δεν είναι δυνατή η διαίρεση και τυπώνεται έτσι το κατάλληλο μήνυμα, όπως φαίνεται στο παράδειγμα που ακολουθεί.β) if diaireths <>0 then piliko:=diaireteos div diaireths else writeln ('ΛΑΘΟΣ διαίρεση με μηδέν δε γίνεται');

Αν μετά το then ή το else ακολουθούν περισσότερες από μία εντολές, θεωρούμε ότι αποτελούν μία ακολουθία από εντολές. Τις εντολές αυτές βάζουμε μεταξύ των begin - end και το μεταφραστικό πρόγραμμα τις θεωρεί ως μία εντολή, σύνθετη εντολή compound statement. To προηγούμενο παράδειγμα θα μπορούσε να έχει την εξής μορφή:if diaireths <>0 then begin piliko:=diaireteos div diaireths;

22

Page 23: Introduction to Pascal Greek

writeln ('διαίρεση δυνατή'); end else begin writeln ('ΛΑΘΟΣ διαίρεση με μηδέν δε γίνεται'); piliko:=maxint; end;

Η εντολή η οποία ακολουθεί το then ή το else μπορεί να είναι μια άλλη εντολή επιλογής (ένα άλλο if). Τότε λέμε ότι έχουμε φωλιά (nest) επιλογών ή φωλιά από (nested) if.

Παραδείγματα:α) if a1 then a2 else if a3 then a4 else a5

β) if a=b then write ('a=b' ) else if a>b then writeln('a>b') else writeln('a<b') ;

γ) Program exisosi_a_batmoy; var a,b,x:real; begin write('δώσε το a: '); readln(a) ; write('δώσε το b: '); readln(b) ; if a<>0 then begin x:= a/b; writeln('x =', x:8:2); end else if b<>0 then writeln('Αδύνατη εξίσωση') else writeln('αόριστη εξίσωση'); end.

Σύνθετα Παραδείγματα:

23

Page 24: Introduction to Pascal Greek

Απλή Εναλλακτική Δυνατότητα (Δίπλευρη Επιλογή)Μια εταιρία ταχυδρομικών πωλήσεων προσφέρει έκπτωση 5% για παραγγελίες κάτω των 500 €. Για παραγγελίες μεγαλύτερες από 500 € προσφέρει έκπτωση 10%.1. Κατασκευάστε το δομικό διάγραμμα.2. Γράψτε ένα πρόγραμμα με οδηγίες για το χρήστη.Λύση: Δομικό διάγραμμα:

ΕΙΣΑΓΩΓΗ τιμής είδους (timi-eidous)

αληθές

timi-eidous < 500 ?

ψευδέςpliroteo := timi-eidous *(1-0.05) pliroteo := timi-eidous* (1-0.1)

ΕΞΟΔΟΣ πληρωτέου ποσού (pliroteo)

PROGRAM if_aplo;VAR timi_eidous, pliroteo : real;BEGIN write ('Δώστε την τιμή είδους: '); readln (timi_eidous) ; IF timi_eidous < 500 THEN pliroteo := timi_eidous * (1 - 0. 05) ELSE pliroteo := timi_eidous * (1 - 0.1 );writeln ('Η πληρωτέα τιμή σε ECU είναι ', pliroteo:10:2);writeln ('Συνέχεια με <Enter>' ) ;readln;End.

Φωλιασμένο IFΜια εταιρία ταχυδρομικών πωλήσεων προσφέρει έκπτωση 10% σε παραγγελίες αξίας μεγαλύτερης των 500 €. Όσοι είναι πελάτες για περισσότερο από 5 χρόνια θα έχουν έκπτωση 4% της αξίας της παραγγελίας. Γράψτε ένα πρόγραμμα, που θα υπολογίζει το πληρωτέο ποσό με δεδομένα την αξία της παραγγελίας και τη χρονική διάρκεια.

Λύση:

ΕΙΣΑΓΩΓΗ ύψους παραγγελίας (paraggelia)ΕΙΣΑΓΩΓΗ διάρκεια συνεργασίας (diarkeia)

αληθές

paraggelia < 500 ?

ψευδές

αληθές

diarkeia < 5 ?

ψευδές αληθές

diarkeia < 5 ?

ψευδές

pliroteo := paraggelia

pliroteo := paraggelia •(1-0.04)

pliroteo := paraggelia •(1-0.1)

pliroteo:= paraggelia •(1-0.1-0.04)

ΕΞΟΔΟΣ πληρωτέου ποσού (pliroteo)

24

Page 25: Introduction to Pascal Greek

PROGRAM ypolog5;VAR paraggelia, pliroteo : real; diarkeia : integer;BEGIN write(' Παραγγελία σε Eυρώ '); readln( paraggelia); write(' Συνεργασία επί πόσα χρόνια '); readln( diarkeia) ; IF paraggelia < 500 THEN BEGIN IF diarkeia < 5 THEN pliroteo := paraggelia ELSE pliroteo := paraggelia * (1-0.04); END ELSE BEGIN IF diarkeia < 5 THEN pliroteo := paraggelia * (1-0.1) ELSE pliroteo := paraggelia * (1-0.1-0.04); END; writeln('To πληρωτέο ποσό σε Eυρώ είναι ', pliroteo:5:2) ; writeln (' Συνέχεια με <Enter>') ; readln;END.

To BEGIN πριν από την πρόταση "IF diarkeia < 5" και το αντίστοιχο END μπορούσαν και να λείπουν. Η εκτέλεση του προγράμματος δε θα άλλαζε καθόλου. Η πρόταση IF-THEN-ELSE είναι ενιαία και δε χρειάζεται να περιληφθεί σε BEGIN και END.

CASE

Μορφή: case έκφραση of case label, case label...: εντολή-1; case label, case label...: εντολή-2;

.

. else εντολή-λ end;

Ενέργεια: Η εντολή case προσφέρει δυνατότητα πολλαπλής επιλογής.Επιλέγεται για εκτέλεση η εντολή-κ, όταν η έκφραση έχει ως τιμή μια ετικέτα (label) από τα στοιχεία της λίστας ετικετών της εντολής-κ.

Η ετικέτα (case label) μπορεί να είναι:μια καθορισμένη τιμή (literal)μια σταθερά με όνομα

25

Page 26: Introduction to Pascal Greek

οποιοσδήποτε διατεταγμένος τύπος (ακέραιος, χαρακτήρας κλπ) Η έκφραση είναι ο επιλογέας (selector) της case. Η λίστα ετικετών της case είναι μια λίστα διατεταγμένων τιμών του ίδιου

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

Μια πρόταση case μπορεί να είναι της μορφής:α) case Boolean έκφραση of true: εντολή1 false: εντολή2 end {case}Εδώ επιλογέας είναι μια λογική έκφραση. Οι τιμές της μπορεί να είναι true ή false. Εκτελείται η εντολή που έχει ως ετικέτα την τιμή της λογικής έκφρασης, δηλαδή η εντολή 1, αν η τιμή της λογικής έκφρασης είναι true ή η εντολή2, αν η τιμή της λογικής έκφρασης είναι false.Μια τέτοια μορφή που ελέγχεται από μια λογική έκφραση μπορεί βέβαια να έχει το πολύ δύο δυνατές επιλογές. Η μορφή αυτή είναι ισοδύναμη της εντολής if.

Παραδείγματα:α) case letter of 'x' : εντολή-1 'l', 'm' : εντολή-2 's' : εντολή-3 end; {case} εντολή- 4 Εδώ επιλογέας είναι ο διατεταγμένος τύπος γράμμα (letter). Οι ετικέτες είναι literal του ιδίου τύπου με τον επιλογέα της case. Υπάρχει μόνο μία λίστα με ετικέτες που αντιστοιχούν στην εντολή-2. Αν ο επιλογέας έχει ως τιμή μια από τις ετικέτες της λίστας, δηλαδή l ή m, τότε εκτελείται η εντολή-2.

β) case vathmologia of Ά', 'Β' : writeln ('πολύ καλά'); {εντολή-1} 'C', 'D' : writeln ('καλά'); {εντολή-2} Έ', 'F', 'G' : begin {εντολή-3} writeln ('καλά); new_test:=new-test+l; end; else writeln(' βαθμολογία εκτός ορίων')end; {case} εντολή-4Εδώ επιλογέας είναι vathmologia τύπου Char (χαρακτήρα), δηλαδή διατεταγμένου τύπου. Οι ετικέτες είναι literal του ιδίου τύπου με τον επιλογέα της case. Υπάρχουν τρεις λίστες με ετικέτες που αντιστοιχούν σε κάθε μία από τις τρεις εντολές. Η τρίτη εντολή είναι σύνθετη. Αν ο επιλογέας έχει ως τιμή μια από τις ετικέτες της λίστας, τότε εκτελείται η αντίστοιχη εντολή, αλλιώς τυπώνεται βαθμολογία εκτός ορίων.

γ) var

26

Page 27: Introduction to Pascal Greek

arxika epilogis:char; ……… case arxika_epilogis of 'Έ' : writeln ( 'ΕΙΣΑΓΩΓΗ ') ; 'Μ' : writeln ('ΜΕΤΑΒΟΛΗ') ; 'Δ' : writeln ('ΔΙΑΓΡΑΦΗ') ; 'Τ' : writeln ('ΤΕΛΟΣ ΕΡΓΑΣΙΑΣ - ΕΞΟΔΟΣ'); else writeln('Λάθος αρχικό επιλογής');end{case}

δ) var i:integer; case i of 1: a:=a+1; 2: b:=b+1; 3: c:=c+1; end {case}Η εντολή case επιτρέπει την απαρίθμηση διαφόρων εναλλακτικών λύσεων και την επιλογή μίας εξ αυτών για εκτέλεση.

27

Page 28: Introduction to Pascal Greek

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

if arithm mod 2=0 then writeln(' o αριθμός είναι άρτιος ');

2. Να εξηγήσετε την παρακάτω εντολή και να δώσετε παραδείγματα και τα αποτελέ-σματα της εκτέλεσης της εντολής. if diairetis < >0 then pililko:=diaireteos div diairetis else writeln('διαίρεση με μηδέν δεν είναι επιτρεπτή');

3. Να χρησιμοποιήσετε την εντολή if για τον έλεγχο της ηλικίας ενός ψηφοφόρου και να δώσετε το κατάλληλο μήνυμα ανάλογα με την περίπτωση, για ηλικία > 65 , για ηλικία <18 και για 18<ηλικία<65

4. Να χρησιμοποιήσετε την εντολή case για τον έλεγχο της ηλικίας ενός ψηφοφόρου και να δώσετε το κατάλληλο μήνυμα ανάλογα με την περίπτωση, για ηλικία > 65, για ηλικία <18 και για 18<ηλικία<65

5. Να συγκρίνετε την εντολή case με την if και να δώσετε δυο παραδείγματα χρήσης της εντολής case.

6. Να γράψετε την επόμενη κωδικοποίηση χρησιμοποιώντας την εντολή case αντί της if if n=5 then tm5:=tm5+1 else if n=15 then tm15:=tm15+1 else if n=25 then tm25:=tm25+1;

7. Να γράψετε μία εντολή case η οποία ανάλογα με το χαρακτηρισμό της βαθμολογίας τυπώνει το αντίστοιχο μήνυμα. Αν ο χαρακτηρισμός =1 τύπωσε άριστα, 2 λίαν καλώς, 3 καλώς, 4 σχεδόν καλώς, 5 απορρίπτεται, αλλιώς λάθος χαρακτηρισμός. Να επαναλάβετε τα προηγούμενα με την εντολή if.8. Να συμπληρώσετε με Σωστό - Λάθος τις παρακάτω προτάσεις

i. Η έκφραση της εντολής case μπορεί να δώσει τιμές τύπου ακέραιου, πραγματικού ή λογικού.

ii. Οι τιμές που παίρνουν οι ετικέτες στην εντολή case μπορεί να έχουν οποιαδήποτε σειρά, αλλά οι ετικέτες δεν επαναλαμβάνονται.

iii. Όλες οι δυνατές τιμές της έκφρασης σε μια εντολή case πρέπει να περιλαμβάνονται στις λίστες τιμών των ετικετών.

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

28

Page 29: Introduction to Pascal Greek

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

10. Να γράψετε πρόγραμμα που να διαβάζει 4 βαθμούς, να βρίσκει το μέσο όρο τους και, αν αυτός είναι μεγαλύτερος από 15, τυπώνει ΕΠΙΤΥΧΩΝ.

11. Η ωριαία αμοιβή εργαζομένου είναι 5,00 €. Αν οι ώρες εργασίας είναι περισσότερες από 18, παίρνει επιπλέον υπερωριακή αποζημίωση 2,50 € για κάθε υπερωριακή ώρα. Να γράψετε πρόγραμμα που να διαβάζει τις ώρες εργασίας και να υπολογίζει τις αποδοχές του εργαζομένου. Τα αποτελέσματα να ακολουθήσουν το υπόδειγμα:

κανονική αμοιβή ............. αμοιβή υπερωριών ............. συνολικές αποδοχές

12. Να μετατρέψετε τα προηγούμενα προγράμματα if then else κάνοντας χρήση της εντολής case.

13. Να γράψετε πρόγραμμα που να διαβάζει το αρχικό ενός ονόματος και να τυπώνει το αντίστοιχο όνομα (ονόματα: Πέτρος, Χριστίνα, Νίκος, Άννα, Γιώργος).

14. Να γράψετε πρόγραμμα που να εμφανίζει menu με τις 4 πράξεις: 1 πρόσθεση 2 αφαίρεση 3 πολλαπλασιασμός 4 διαίρεση,να διαβάζει τον κωδικό της πράξης και τους δύο αριθμούς και να εμφανίζει το αποτέλεσμα. (Διαίρεση με μηδέν δε γίνεται).

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

Δεδομένα :9 6 Αποτελέσματα: Ο Νίκος είναι 9 ετών Ο Γιώργος είναι 6 ετών Ο Νίκος είναι 3 έτη μεγαλύτερος απ' το ΓιώργοΝα γίνουν άλλες δύο εκτελέσεις με δεδομένα 6, 9 και 9, 9.

16. Δίνονται δυο ακέραιοι αριθμοί Α, Β. Βρείτε το μέσο τους. ( Μ=(Α+Β)/2 ). Στη συνέχεια δίνεται τρίτος ακέραιος αριθμός Γ. Να εξετάζετε αν το Γ είναι μεγαλύτερο, μικρότερο ή ίσο από το μέσο Μ και να εκτυπώνεται το ανάλογο μήνυμα.

17. Δίνονται δυο ακέραιοι αριθμοί Α, Β. Να γραφεί πρόγραμμα που να τους ανταλλάσσει μόνο στην περίπτωση που το Α>Β και στη συνέχεια να τους τυπώνει.

29

Page 30: Introduction to Pascal Greek

Εντολές επανάληψης

Βασικοί στόχοι:Να κατανοήσουμε τη χρησιμότητα της δομής επανάληψης, που παρέχει ο προγραμματισμός.

Ειδικοί στόχοι: Να κατανοήσουμε τη λειτουργία της εντολής while η οποία είναι μία από τις

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

φοροποιείται σε σχέση με την while. Να κατανοήσουμε τη λειτουργία της εντολής for και πώς αυτή διαφο-

ροποιείται από τις δύο προηγούμενες δομές επανάληψης.

Η έννοια της επανάληψης

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

Οι προκαθορισμένοι, όπου το πλήθος των επαναλήψεων είναι δεδομένο πριν αρχίσουν οι επαναλήψεις.

Οι μη προκαθορισμένοι ή απροσδιόριστοι, όπου το πλήθος των επαναλήψεων καθορίζεται κατά τη διάρκεια της εκτέλεσης των εντολών του σώματος επανάληψης.

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

Μορφή: while boolean expression do statement εφόσον λογική έκφραση εκτέλεσε εντολή

Ενέργεια: Κάθε φορά, ακόμη και την πρώτη, πριν εκτελεστεί η εντολή που αποτελεί το σώμα της επανάληψης (το statement μετά το do), εξετάζεται η λογική έκφραση η οποία ακολουθεί τη λέξη while και, μόνο σε περίπτωση που δίνει τιμή true, εκτελείται η προς επανάληψη εντολή. Αν δώσει τιμή false, η εντολή που αποτελεί το σώμα της επανάληψης δεν εκτελείται και ο έλεγχος από το while περνάει στην επόμενη εντολή. Το σώμα της επανάληψης είναι μια εντολή. Σε περίπτωση που θέλουμε να εκτελέσουμε περισσότερες από μια εντολές τότε αυτές θα πρέπει να αποτελέσουν μία συνθέτη εντολή με τη χρήση των begin - end.Υπάρχουν δύο τύποι επαναλήψεων:

Ο ένας τύπος χρησιμοποιεί κάποιο μετρητή επαναλήψεων (count-controlled loop).

Ο άλλος τύπος χρησιμοποιεί κάποιο γεγονός και η επανάληψη συνεχίζεται μέχρι να συμβεί το γεγονός στη διάρκεια της επανάληψης (event-controlled loop).

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

30

Page 31: Introduction to Pascal Greek

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

Παράδειγμα με μετρητήΓια τον έλεγχο των επαναλήψεων (count-controlled hop).

metritis:=1; {αρχική τιμή στη μεταβλητή ελέγχου} while count <= 100 do {έλεγχος της επανάληψης} begin ** {εντολές επανάληψης} ** {εντολές επανάληψης} metritis:=metritis+1; {αύξηση του μετρητή} end

Παράδειγμα με μεταβλητή Για τον έλεγχο των επαναλήψεων (event-controlled loop).

Για κάποια επεξεργασία χρειαζόμαστε ημερομηνίες μήνα και ημέρα. Διαβάζουμε την πρώτη ημερομηνία και για τον έλεγχο χρησιμοποιούμε την ίδια μεταβλητή. Η επανά-ληψη θα σταματήσει όταν η μεταβλητή πάρει τιμή μη παραδεκτή πχ. 31 Φεβρουαρίου. Όταν συμβεί το γεγονός αυτό η επανάληψη θα σταματήσει.

read(mina,imera); {αρχική ημερομηνία} while not ( (month=2) and (day=31)) do {έλεγχοςεπανάληψης} begin * * {επεξεργασία} read(mina,imera); {επόμενη ημερομηνία} end

To παράδειγμα που ακολουθεί είναι ένα πλήρες πρόγραμμα όπου εφαρμόζονται όσα αναφέραμε παραπάνω. Η επανάληψη των εντολών σταματάει όταν συμβεί το γεγονός " το άθροισμα να γίνει μεγαλύτερο από το δεδομένο όριο".Παράδειγμα:program sum1;{Ανάγνωση αριθμών μέχρις ότου το άθροισμα τους γίνει μεγαλύτερο από ένα δεδομένο αριθμό} var orio,ar,sum :real;begin read(orio); sum:=0; while sum <= orio do begin readln(ar) ; sum:=sum+ar; end; writeln(sum:10:4) ;

31

Page 32: Introduction to Pascal Greek

end.

REPEAT - UNTILΗ εντολή repeat χρησιμοποιείται για μη προκαθορισμένο αριθμό επαναλήψεων. Ο έλεγχος για την επανάληψη γίνεται στο τέλος του κύκλου (loop) των εντολών που επαναλαμβάνονται. Όπως φαίνεται και από τη μορφή της εντολής που ακολουθεί

Μορφή: repeatεντολή [;εντολή;...............]until (boolean expression);

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

Υπάρχει πάντοτε μία τουλάχιστον εντολή επανάληψης. Δεν απαιτούνται begin, end γιατί αντί αυτών υπάρχουν οι λέξεις repeat, until

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

Ενέργεια: Αφού εκτελεστούν για πρώτη φορά οι εντολές που αποτελούν το σώμα της επανάληψης (μεταξύ των repeat και until), εξετάζεται η λογική έκφραση η οποία ακολουθεί την λέξη until, και μόνο σε περίπτωση που δίνει τιμή false εκτελούνται και πάλι οι εντολές επανάληψης. Αν δώσει τιμή true, ο έλεγχος από το repeat, περνάει στην επόμενη του repeat-until εντολή. Όπωςφαίνεται από τον ορισμό της repeat οι εντολές εκτελούνται απαραίτητα τουλάχιστον μια φορά ακόμη και όταν η λογική τιμή είναι αληθής σε αντίθεση με την while, που δεν εκτελούνται ποτέ, αν η λογική έκφραση έχει τιμή false.

Ακολουθεί μια σύγκριση των εντολών repeat until και while do πρώτα για επαναλήψεις ελεγχόμενες από μετρητή και στη συνέχεια για επαναλήψεις ελεγχόμενες από κάποιο γεγονός.

Παράδειγμα με μετρητή Για τον έλεγχο των επαναλήψεων (count-controlled loop).metritis:=1;while metritis <= 100 do begin εντολή1; εντολή2; …. metritis:=metritis+1 ; end;

metritis:=1;repeat εντολή1; εντολή2; ... metritis:=metritis+1 until metritis > 100

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

32

Page 33: Introduction to Pascal Greek

Παραδείγματα:Program sum2;{Ανάγνωση αριθμών μέχρις ότου το άθροισμα τους γίνει μεγαλύτερο από ένα δεδομένο αριθμό}var orio,ar,sum :real;begin read(orio) ; sum:=0; while sum <= orio do begin readin(ar); sum:=sum+ar; end; writeln(sum:10:4);end.

program sum2;{Ανάγνωση αριθμών μέχρις ότου τοάθροισμα τους γίνει μεγαλύτεροαπό ένα δεδομένο αριθμό}var orio,ar,sum :real;begin read(orio) ; sum:=0; repeat readln(ar) ; sum:=sum+ar; until sum > orio wrilteln(sum:10:4);end.

Στο προηγούμενο παράδειγμα και στο repeat και στο while η επανάληψη σταματάει, όταν το άθροισμα (sum) γίνει μεγαλύτερο από το όριο (orio) Οι λογικές εκφράσεις είναι συμπληρώματα η μια της άλλης (αντίθετες) (sum > orio και sum < = orio).Εδώ πρέπει να τονιστεί ότι το while χρησιμοποιεί τη λογική έκφραση για να συνεχίσει την επανάληψη, ενώ το repeat/until για να τη σταματήσει.Επιλέγουμε το repeat/until όταν οι εντολές επανάληψης εκτελούνται οπωσδήποτε τουλάχιστον μια φορά αλλιώς επιλέγουμε το while.Αν έχουμε τη δυνατότητα να χρησιμοποιήσουμε και τα δυο πρέπει να επιλέξουμε εκείνο που αντιπροσωπεύει σημασιολογικά το πρόβλημα. Αν το πρόβλημα αναφέρεται στη συνέχεια της επανάληψης καλύτερα είναι να χρησιμοποιήσουμε το while. Αν το πρόβλημα αναφέρεται στη διακοπή της επανάληψης καλύτερα είναι να χρησιμοποιήσουμε το repeat/until. Αν υπάρχει αμφιβολία καλύτερα να χρησιμοποιούμε το While.

Τέλος πρέπει να προσέχουμε η <λογική έκφραση> που χρησιμοποιούμε στην While να γίνεται κάποια στιγμή False (αντίστοιχα η <λογική έκφραση> που χρησιμοποιούμε στην Repeat γίνεται κάποια στιγμή True), αλλιώς δημιουργείται ατέρμονος βρόγχος.

FOR

Η εντολή for σχεδιάστηκε για την απλοποίηση του ελέγχου των επαναλήψεων με μετρητή (count-controlled loop).

Η εντολή for metritis := 1 to n do statement; σημαίνει:

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

επανάληψης αλλιώς εκτελείται ο κύκλος των εντολών επανάληψης και ο

33

Page 34: Introduction to Pascal Greek

μετρητής αυξάνεται κατά 1. ο κύκλος επαναλαμβάνεται μέχρι ο μετρητής να γίνει μεγαλύτερος από n

Η προηγούμενη εντολή for εμφανίζεται μαζί με την ισοδύναμη της while στον πίνακα που ακολουθεί.for metritis := 1 to n do statement;

metritis:=1;while metritis <= n do begin statement; i:=i+1; end;

Υπάρχουν δύο μορφές της εντολής αυτής στην Pascal, μία που η μεταβλητή αυξάνεται (με τη χρήση του to) και μία που η μεταβλητή ελαττώνεται (με τη χρήση του downto).

Μορφή:for variable identifier: = expression to expression do statement;

για μεταβλητή ελέγχου από αρχική τιμή μέχρι τελική τιμή εκτέλεσε εντολή

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

Αν η μεταβλητή ελέγχου αρχίζει από τη μεγαλύτερη τιμή μέχρι τη μικρότερη, τότε η μορφή της εντολής είναι η παρακάτω:for variable identifier: = expression downto expression do statement;για μεταβλητή ελέγχου από αρχική τιμή μέχρι τελική τιμή εκτέλεσε εντολή

Ενέργεια: Η εντολή που ακολουθεί το do εκτελείται, μέχρις ότου η μεταβλητή ελέγχου αποκτήσει τιμή μικρότερη από την τελική τιμή. Η ελάττωση της μεταβλητής ελέγχου γίνεται με βήμα 1. Αν η αρχική τιμή είναι μικρότερη από την τελική τιμή, τότε οι εντολές που ακολουθούν το do δεν εκτελούνται.Στον πίνακα που ακολουθεί ο αριθμός των επαναλήψεων είναι ίδιος και για τις δύο μορφές της εντολής for:for metritis := katwtero_orio to anwtero_orio do statement;

for metritis := anwtero_orio downto katwtero _orio do statement;

Η αρχική και η τελική τιμή του κύκλου for μπορεί να είναι μια έκφραση οποιουδήποτε διατεταγμένου τύπου. Έτσι, εκτός από ακέραιες τιμές μπορούμε να χρησιμοποιήσουμε μεταβλητές με τιμές τύπου χαρακτήρα char ή λογικού τύπου (boolean).

Με το παράδειγμα που ακολουθεί τυπώνουμε το Αγγλικό αλφάβητο for letter: = 'A' to 'Z' do write(letter);

34

Page 35: Introduction to Pascal Greek

Η εντολή for όπως και άλλες μορφές επανάληψης μπορεί να είναι και σε φωλιά -nested (η μία μέσα στην άλλη). Στον πίνακα που ακολουθεί υπάρχει ένα παράδειγμα φωλιάς for και τα αποτελέσματα του.Παράδειγμα:for teleytaio_gramma: = Ά' to 'G' do begin for typwse_gramma:= Ά ' to teleytaio_gramma ' do write(letter) ; end;

AABABCABCDABCDEABCDEFABCDEFG

Η εντολή for είναι πολύ εύχρηστη. Πρέπει να θυμόμαστε ότι έχει σχεδιαστεί για επαναλήψεις ελεγχόμενες με μετρητή, για τον οποίο γνωρίζουμε την αρχική και την τελική τιμή.Για αποτελεσματική χρήση της εντολής:

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

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

Μετά το τέλος της επανάληψης η μεταβλητή ελέγχου έχει απροσδιόριστη τιμή. Αν τη χρησιμοποιήσουμε ή θα πάρουμε μήνυμα λάθους ή λάθος αποτελέσματα ανάλογα με το μεταφραστικό πρόγραμμα (compiler) που χρησιμοποιούμε.

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

Παράδειγμα:Γράψτε πρόγραμμα που να εμφανίζει στην οθόνη 5 φορές τις λέξεις Borland Pascal και να τις υπογραμμίζει κάθε φορά με το σύμβολο "="PROGRAM borland;VARi : integer;BEGIN FOR i : = 1 TO 5 DO BEGIN writeln('Borland Pascal '); writeln('============== '); END; writeln ('Συνέχεια με <Enter>'); readln;END.To ένθετο ζευγάρι BEGIN και END είναι απαραίτητο. Χωρίς αυτό θα

35

Page 36: Introduction to Pascal Greek

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

Παράδειγμα : program sum 3;uses crt;{Ανάγνωση αριθμών και υπολογισμός του αθροίσματος τους μέχρις ότου το πλήθος τους γίνει μεγαλύτερο από ένα δεδομένο αριθμό}varar,sum :real;orio:integer; begin clrscr; read(orio) ; sum:=0; for k:=1 to orio do begin readln(ar) ; sum:=sum+ar; end; writeln(sum:10:4) ;end.

Παράδειγμα φωλιασμένου FOR: (Πίνακας Προπαίδειας)Γράψτε ένα πρόγραμμα που θα τυπώνει έναν πίνακα προπαίδεια ο στην παρακάτω μορφή:1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100

Στην περίπτωση αυτήν έχουμε ένα βρόγχο μέσα σ' έναν άλλο. Λύση:για grammi := 1 μέχρι 10

για stili := 1 μέχρι 10 ΕΞΟΔΟΣ grammi * stili

36

Page 37: Introduction to Pascal Greek

Αλλαγή γραμμής

PROGRAM propaideia;VARgrammi, stili : integer;BEGIN FOR grammi := 1 TO 10 DO BEGIN FOR stili := 1 TO 10 DO write( grammi * stili : 4) ; writeln; END; writeln ('Συνέχεια με <Enter>'); readln;END.

Με την παράμετρο :4 μορφοποιείτε την έξοδο, προβλέποντας για κάθε αριθμό 4 θέσεις. Σ' αυτό το πρόγραμμα έχει ιδιαίτερη σημασία η χρήση των BEGIN και END. Ανάλογα με το πού θα τοποθετηθούν, προκύπτει και διαφορετική εκτύπωση της εξό-δου.

ΑνακεφαλαίωσηΔιακρίναμε τρεις διαφορετικές εντολές επανάληψης: Οι εντολές while και repeat χρησιμοποιούνται για μη προκαθορισμένο αριθμό επαναλήψεων και στις δυο ο έλεγχος για την επανάληψη γίνεται μέσα από μια συνθήκη. Στη περίπτωση της while οι εντολές επανάληψης εκτελούνται εφόσον το αποτέλεσμα της συνθήκης είναι αληθές ενώ στη repeat οι εντολές επανάληψης εκτελούνται όσο το αποτέλεσμα της συνθήκης είναι ψευδές. Σημειώνεται ότι στη repeat οι εντολές θα εκτελεστούν τουλάχιστον μία φορά διότι ο έλεγχος της συνθήκης γίνεται μετά το σώμα των εντολών επανάληψης. Η εντολής for χρησιμοποιείται για προκαθορισμένο αριθμό επαναλήψεων.

Σύνθετο παράδειγμα με χρήση FOR και IF THEN ELSE:Να γραφεί πρόγραμμα PASCAL που να διαβάζει Ν ακεραίους αριθμούς και να τυπώνει το μέσο όρο και το γινόμενο όσων είναι ζυγοί:program xx;uses crt;const n=30;var p,1,x,n,sum:integer; mo:real;begin clrscr;

37

Page 38: Introduction to Pascal Greek

p:=1;sum:=0;for l:= 1 to 30 do begin wrιte('πληκτρολόγησε αριθμό'); readln(x); if ((x mod 2)=0) then begin sum:=sum+x; p:=p * x; end; end; if (n = 0) then writeln('δεν υπήρχε ούτε ένας ζυγός '); else begin mo:=sum/n; writeln('to γινόμενο των ζυγών ακεραίων είναι ',ρ); writeln('o μέσος όρος των ζυγών ακεραίων είναι', μο); end;end.

38

Page 39: Introduction to Pascal Greek

Ασκήσεις1. Να δώσετε τη μορφή της εντολής επανάληψης while, να εξηγήσετε τη λειτουργία της και να δώσετε δύο δικά σας παραδείγματα.

2. Να δώσετε τη μορφή της εντολής επανάληψης repeat - until, να εξηγήσετε τη λειτουργία της και να δώσετε δύο δικά σας παραδείγματα.

3. Να δώσετε τη μορφή της εντολής επανάληψης for, να εξηγήσετε τη λειτουργία της και να δώσετε δύο δικά σας παραδείγματα.

4. Να συγκρίνετε τις εντολές επανάληψης και να αναφέρετε ποιες είναι οι ομοιότητες και ποιες οι διαφορές τους.

5. Να δώσετε τα αποτελέσματα από την εκτέλεση των παρακάτω εντολών arithmos :=1; while arithmos < 11 do begin arithmos:=arithmos+1; write(arithmos:5); end;

6. Να αλλάξετε τη σειρά των εντολών της προηγούμενης άσκησης ώστε το αποτέλεσμα να είναι η εκτύπωση των αριθμών 1 έως και 10.

7. Να χρησιμοποιήσετε τις εντολές επανάληψης repeat - until και for ώστε να έχετε τα ίδια αποτελέσματα με την άσκηση 6.

8. Πόσες επαναλήψεις θα έχουμε από την εκτέλεση των παρακάτω εντολών; telos := false; while not telos do begin arithmos:=arithmos+2; if arithmos > 100 then telos :=true; end;

9. Να χρησιμοποιήσετε τις εντολές επανάληψης repeat - until και for, ώστε να έχετε τον ίδιο αριθμό επαναλήψεων με την άσκηση 8.

10. Να δώσετε τα αποτελέσματα από την εκτέλεση των παρακάτω εντολών και να εξηγήσετε τη διαφορά που υπάρχει στη χρήση των μεταβλητών athroisma και metritis athroisma:=0; metritis :=0; while metritis < 10 do begin athroisma:=athroisma + metritis; writeln(metritis:10,athroisma:10); metritis:= metritis + 1;

39

Page 40: Introduction to Pascal Greek

end;Να τροποποιήσετε τον προηγούμενο κώδικα ώστε, να δίνει τα ίδια αποτελέσματα με τη χρήση των εντολών repeat - until και for

11. Να γράψετε ένα πρόγραμμα που να υπολογίζει τη μικρότερη δύναμη του 2 που είναι μεγαλύτερη από ένα δεδομένο αριθμό και να τυπώνει ποια είναι η δύναμη αυτή.Τα αποτελέσματα να δοθούν με τη μορφή:Η μικρότερη δύναμη του 2μεγαλύτερη από τον αριθμό ..... είναι ......δηλ. είναι το 2 στην ..... δύναμη Υπόδειξη: Η άσκηση να λυθεί με δύο τρόπους (με χρήση WHILE και REPEAT-UNTIL).

12. Να γράψετε πρόγραμμα που να υπολογίζει το μέσο όρο Ν πραγματικών αριθμών που δίνονται από το πληκτρολόγιο. Στο μέσο όρο να μην λαμβάνονται υπόψη τυχόν αρνητικοί αριθμοί που δίνονται από το χρήστη.

13. Να γράψετε πρόγραμμα που να διαβάζει:a. το πλήθος των εργατών μίας εταιρείαςb. πόσες είναι οι υποχρεωτικές ώρες εργασίας (κάθε επιπλέον ώρα είναι

υπερωρία)c. την ωριαία αμοιβήd. την επιπλέον αμοιβή για κάθε υπερωριακή ώραe. τις ώρες εργασίας κάθε εργάτη

και να υπολογίζει την αποζημίωση κάθε εργάτη.Υποδείξεις: Να χρησιμοποιηθεί η εντολή while. Τα αποτελέσματα να δοθούν με τη μορφή:πλήθος εργατών: υποχρεωτικές ώρες εργασίας:ωριαία αποζημίωση :πρόσθετη υπερωριακή αποζημ: αποδοχές εργατών:Η εκτύπωση να γίνει με τη μορφή:α/α ώρες εργ. αποζημ. ώρες υπέρ. υπέρ. αποζ. σύνολο 1 2 ... ... ...... ... ...... ......

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

14. Να τροποποιηθεί η προηγούμενη άσκηση, ώστε το πρόγραμμα να λειτουργεί και με την εντολή repeat.15. Να γράψετε πρόγραμμα που να διαβάζει το πλήθος των μαθητών και το βαθμό του καθενός και να τυπώνει ένα χαρακτηρισμό ανάλογα με το βαθμό του.( 9 < βαθμός < = 12 μέτρια12 < βαθμός < = 15 καλά15 < βαθμός < = 18 πολύ καλά18 < βαθμός < = 20 άριστα )

40

Page 41: Introduction to Pascal Greek

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

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

17. Δίνονται τρεις ακέραιοι αριθμοί Α, Β, Γ (από το πληκτρολόγιο). Να γραφεί πρόγράμμα που να βρίσκει την ημιπερίμετρο Τ=(Α+Β+Γ)/2 και το εμβαδόν Ε=SQRT( Τ*(Τ-Α)*(Τ-Β)*(Τ-Γ)) . Στη συνέχεια να τροποποιήσετε το πρόγραμμα έτσι ώστε να βρίσκετε τα Τ, Ε στην περίπτωση που τα Α, Β, Γ είναι πλευρές τριγώνου αλλιώς να εκτυπώνεται το μήνυμα : Τα Α, Β, Γ δεν είναι πλευρές τριγώνου. ( Εάν Α<Β+Γ και Β<Α+Γ και Γ<Α+Β τότε τα Α, Β, Γ είναι πλευρές τριγώνου ). Το πρόγραμμα μετά την εύρεση των ζητούμενων να επιστρέφει στη αρχή (Looping) και να τερματίζει μόνο στην περίπτωση όπου Α=0, Β=0, Γ=0.

18. Δίνεται ακέραιος αριθμός Ν. Να γραφεί πρόγραμμα που να βρίσκει και να εκτυπώνει το άθροισμα 1+2+…+Ν. Στη συνέχεια να βρίσκει και να εκτυπώνει το γινόμενο 1*2*3*…*Ν.

19. Με το κάτω πρόγραμμα βρίσκετε τη ρίζα , ενός ακέραιου αριθμού Ν Program Riza; Var N: Integer; R: Real; Begin Write(‘ Give N=’); Readln(N); R:=SQRT(N); Writeln(‘Riza=’,R); End. Το πρόβλημα είναι ότι αν δώσω Ν<0 θα προκύψει λάθος στην εκτέλεση του προγράμματος. Χρησιμοποιείστε την εντολή REPEAT … UNTIL έτσι ώστε το πρόγραμμα να μην προχωρεί στη εκτέλεση της εντολής R:=SQRT(N); μέχρι να δώσετε επιτρεπτή τιμή στο Ν.

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

21. Γράψτε πρόγραμμα που να ζητάει την εισαγωγή χαρακτήρων επαναληπτικά, και να σταματάει όταν έχουν πληκτρολογηθεί (όχι απαραίτητα το ένα μετά το άλλο) τα γράμματα που σχηματίζουν τη λέξη PASCAL (π.χ ACHPXSACSLLJCIOAL)

22. Να γραφεί πρόγραμμα που να υπολογίζει τους δέκα πρώτους όρους της ακολουθίας Fibonacci και να τους τυπώνει ανά γραμμή ως εξής:The 1st FIBONACCI is… The 2nd FIBONACCI is… …

41

Page 42: Introduction to Pascal Greek

The 10th FIBONACCI is…Η ακολουθία Fibonacci ορίζεται ως εξής: αν=α ν-1 + α ν-2, α0=α1=1

42

Page 43: Introduction to Pascal Greek

Λύσεις των ασκήσεων - εντολών επιλογής

1. Αν ένας αριθμός διαιρείται ακριβώς με το 2 (δηλαδή το υπόλοιπο της ακέραιας διαίρεσης του αριθμού με το 2 είναι 0) σημαίνει ότι ο αριθμός είναι πολλαπλάσιο του 2 και επομένως είναι άρτιος. Η τροποποίηση για τον περιττό θα είναι η:if arithm mod 2<>0 {ή αλλιώς, if arithm mod 2=1} then writeln(' o αριθμός είναι περιττός ');

2. Αν ο διαιρέτης είναι μηδέν, τότε έχουμε διαίρεση με το μηδέν (division by zero) που στην Pascal δεν είναι επιτρεπτή. Τότε θα τυπωθεί το μήνυμα "διαίρεση με μηδέν δεν είναι επιτρεπτή" αλλιώς (αν δηλαδή ο διαιρέτης<>0 θα γίνει η πράξη pililko:=diaireteos div diairetis

3. If (ilikia<18) then write(' δεν μπορείς να ψηφίσεις, είσαι ανήλικος') else if (ilikia >65) then write(' μπορείς αν θέλεις να ψηφίσεις') else write(' υποχρεούσαι να ψηφίσεις')

4. Program askisi4; var ilikia:integer; Begin write('Δωσε ηλικία'); readln(ilikia);

case ilikia of 1..17: writeln(' δεν μπορείς να ψηφίσεις, είσαι ανήλικος '); 18..65: writeln(' υποχρεούσαι να ψηφίσεις '); 65..120: writeln(' μπορείς αν θέλεις να ψηφίσεις '); else writeln('έδωσες ηλικία μικρότερη του 1 ή μεγαλύτερη του 120'); end; {case} readln; end.

6. var tm5, tm15, tm25, n :integer;

case n of 5: tm5 := tm5 + 1; 15: tm5 := tm5 + 1; 25: tm5 := tm5 + 1; end {case}

7. case vathmos of 1 : writeln (' άριστα '); 2 : writeln (' λίαν καλώς '); 3 : writeln (' καλώς '); 4 : writeln (' σχεδόν καλώς '); 5 : writeln (' απορρίπτεται ' ); else writeln(' λάθος χαρακτηρισμός ')end; {case}

if (vathmos=1) then writeln ('άριστα') else if (vathmos=2) then writeln ('λίαν καλώς') else if (vathmos=3) then writeln ('καλώς') else if (vathmos=4) then writeln ('σχεδόν καλώς') else if (vathmos=5) then writeln ('απορρίπτεται' ) else writeln(' λάθος χαρακτηρισμός ');

43

Page 44: Introduction to Pascal Greek

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

9. Program askisi9;Var Katathesi, Analipsi, Ypoloipo :Real;

Begin Write (' δώσε ποσό κατάθεσης '); Readln(Katathesi); Write (' δώσε ποσό ανάληψης '); Readln(Analipsi); if (Analipsi > Katathesi) then Write (' απαγορευτικό ποσό ανάληψης') else begin Ypoloipo := Katathesi – Analipsi; Writeln (' ποσό ανάληψης ', Analipsi:8:2); Writeln (' υπόλοιπο των καταθέσεων ', Ypoloipo:8:2) end; Readln; End.

10. Program askisi10;Var b1, b2, b3, b4: Integer; mo: Real;

Begin Write (' δώσε βαθμό 1: '); Readln(b1); Write (' δώσε βαθμό 2: '); Readln(b2); Write (' δώσε βαθμό 3: '); Readln(b3); Write (' δώσε βαθμό 4: '); Readln(b4); mo :=(b1 + b2 + b3 + b4) / 4; if (mo > 15) then Writeln('ΕΠΙΤΥΧΩΝ'); Readln; End.

11. Program askisi11; Const OriaiaAmoibi = 5.0;

44

Page 45: Introduction to Pascal Greek

ExtraAmoibi = 2.5; Var ores, ypoloipo:Integer; Amoibi, Yperories, Synolo : Real;

Begin Yperories:=0.0; Write ('Γράψε ώρες εργασίας : '); Readln(ores); Amoibi := ores * OriaiaAmoibi; if (ores > 18) then Begin ypoloipo := ores – 18; Yperories := ypoloipo * ExtraAmoibi ; end; Synolo := Amoibi + Yperories; Writeln(' κανονική αμοιβή ', Amoibi); Writeln(' αμοιβή υπερωριών ', Yperories); Writeln(' συνολικές αποδοχές ', Synolo); Readln; End.

13. Program askisi13; var Arxiko:char; Begin write('Δωσε αρχικο γράμμα ονόματος'); readln(Arxiko);

case Arxiko of 'a', 'A': writeln(' Anna '); 'p', 'P': writeln(' Petros '); 'g', 'G': writeln(' Giorgos '); 'x', 'X': writeln(' Xristina '); 'n', 'N': writeln(' Nikos '); end; {case} readln; end.

14. Program askisi14; Var praksi:char; number1, number2 : Integer; apotelesma : real; Begin Write('Give first number ='); Readln(number1); Write('Give second number ='); Readln(number2); Writeln('Give *, /, + or – '); Write(' Praksi='); Readln(praksi);

case praksi of

45

Page 46: Introduction to Pascal Greek

'+': apotelesma := number1 + number2; '-': apotelesma := number1 - number2; '*': apotelesma := number1 * number2; '/': if (number2<>0) then apotelesma := number1 / number2 else Writeln(' Division by zero'); else Writeln('wrong symbol'); end; {case} if Not( (number2=0) And (praksi='/') ) then Writeln('Apotelesma :', apotelesma:8:3); Readln; end.

15. Program askisi15; Var ilikia1, ilikia2, diafora : Integer; Begin Write('Δώσε ηλικία Νίκου :'); Readln(ilikia1); Write('Δώσε ηλικία Γιώργου :'); Readln(ilikia2); diafora := ilikia1 – ilikia2; Writeln(' Ο Νίκος είναι ', ilikia1:3, ' ετών'); Writeln(' Ο Γιώργος είναι ', ilikia2:3, ' ετών');

if (diafora=0) then Writeln(' Ο Νίκος και ο Γιώργος είναι συνομήλικοι ')

else if (diafora > 0) then Writeln(' Ο Νίκος είναι ', diafora:3, ' έτη μεγαλύτερος απ' το Γιώργο ') else if (diafora < 0) then Writeln(' Ο Νίκος είναι ', Abs(diafora):3, ' έτη μικρότερος απ' το Γιώργο ');

Readln; End.

16. Program askisi16; Var A, B, C : Integer; mesos: Real; Begin Write(' give first number :'); Readln(A); Write(' give second number :'); Readln(B); mesos := ( A + B ) / 2; Write(' give third number :'); Readln(C);

if ( C = mesos ) then Writeln(' Ο Γ και ο μέσος είναι ίσοι ')

else if (C > mesos) then Writeln(' Ο Γ μεγαλύτερος από τον μέσο ')

46

Page 47: Introduction to Pascal Greek

else Writeln(' Ο Γ μικρότερος από τον μέσο ');

Readln; End.

17. Program askisi17; Var A, B, Temp : Integer;Begin Write(' give first number :'); Readln(A); Write(' give second number :'); Readln(B);

if ( A > B ) then begin Writeln(' Swap '); Temp := A; A := B; B := Temp end; Writeln(' A= ',A); Writeln(' B= ',B); Readln; End.

Λύσεις των ασκήσεων - εντολών επανάληψης

4. Οι εντολές while και repeat χρησιμοποιούνται για μη προκαθορισμένο αριθμό επαναλήψεων και στις δυο ο έλεγχος για την επανάληψη γίνεται μέσα από μια συνθήκη. Στη περίπτωση της while οι εντολές επανάληψης εκτελούνται εφόσον το αποτέλεσμα της συνθήκης είναι αληθές ενώ στη repeat οι εντολές επανάληψης εκτελούνται όσο το αποτέλεσμα της συνθήκης είναι ψευδές. Σημειώνεται ότι στη repeat οι εντολές θα εκτελεστούν τουλάχιστον μία φορά διότι ο έλεγχος της συνθήκης γίνεται μετά το σώμα των εντολών επανάληψης. Η εντολής for χρησιμοποιείται για προκαθορισμένο αριθμό επαναλήψεων.

5. Τα αποτελέσματα από την εκτέλεση των εντολών είναι: 2 3 4 5 6 7 8 9 10 11

6. arithmos :=1; while arithmos < 11 do begin write(arithmos:5); arithmos:=arithmos+1; end; 7. arithmos :=1; for arithmos:=1 to 10 do

47

Page 48: Introduction to Pascal Greek

Repeat write(arithmos:5); arithmos:=arithmos+1; until( arithmos >= 11);

write(arithmos:5);

8. Αν τροποποιήσουμε το πρόγραμμα ως εξής και το εκτελέσουμε θα δούμε ότι έχουμε 51 επαναλήψεις:program ask8; var telos:boolean; arithmos, metritis:integer; Begin metritis := 0; telos := false; while not telos do begin metritis := metritis + 1; arithmos := arithmos + 2; if arithmos > 10 then telos :=true; end; writeln(metritis); readln; End.

Η τιμή που αρχικά δίνεται στη μεταβλητή arithmos είναι το 0. Δεν δίνουν όμως όλες οι γλώσσες προγραμματισμού αρχικές τιμές στις μεταβλητές, γι' αυτό καλό είναι να αναθέτουμε εμείς αρχικές τιμές στις μεταβλητές στην αρχή του κυρίου προγράμματος. 9. program ask9;

var telos:boolean; arithmos, metritis:integer; Begin telos := false; repeat metritis:=metritis + 1; arithmos:=arithmos + 2; if arithmos > 10 then telos :=true; until telos; writeln(metritis); readln; End.

program ask9; var arithmos, metritis,i:integer; Begin for i:=1 to 2000 do begin metritis:=metritis + 1; arithmos:=arithmos + 2; if arithmos > 100 then break; end; writeln(metritis); readln; End.

Η εντολή break τερματίζει το loop των εντολών επανάληψης (for, repeat ή while)

10. metritis: 0 1 2 3 4 5 6 7 8 9athroisma: 0 1 3 6 10 15 21 28 36 45

O metritis αυξάνει κατά 1, ενώ το athroisma είναι η πρόσθεση των 0+1+…+ metritis

48

Page 49: Introduction to Pascal Greek

program ask10; var athroisma, metritis:integer;

Begin athroisma:=0; metritis :=0; repeat athroisma:=athroisma + metritis; writeln(metritis:10,athroisma:10); metritis:= metritis + 1; until metritis>=10; readln; End.

program ask10; var athroisma, metritis:integer; Begin athroisma:=0; for metritis :=0 to 9 do begin athroisma:=athroisma + metritis; writeln(metritis:10,athroisma:10); end; readln; End.

11. program ask11; Var number, dynami,metritis:integer; Begin dynami :=1; metritis:=0; write('give number'); readln(number); while(dynami<=number) do begin dynami := dynami * 2; metritis :=metritis +1; end; writeln('Το 2 στην ', metritis:10,' είναι: ',dynami:10); readln; End.

12. program ask12; var N, i, metritis :Integer; number,mo:Real; Begin mo:=0; metritis:=0; write('give N='); readln(N); for i:=1 to N do begin write('give Number'); readln(number); if (number>0) then begin metritis :=metritis +1; mo :=mo + number; end; end;

49

Page 50: Introduction to Pascal Greek

mo := mo / metritis; writeln('MO=',mo:10:2); readln; End.

13. Η εκτύπωση είναι διαφορετική, γιατί έπρεπε να χρησιμοποιηθούν πίνακεςprogram ask13; var N,i,YO, OE :Integer; OA, EA :real;

Begin repeat write('Dose arithmo ergaton, N='); readln(N); until (N>0);

repeat write('Dose arithmo Ypoxreotikon Oron, YO='); readln(YO); until ((YO>0) and (YO<25));

repeat write('Dose Oriaia Amoibi, OA='); readln(OA); until (OA>0);

repeat write('Dose Epipleon Amoibi, EA='); readln(EA); until (EA>0);

{ αλλάξτε την εντολή for με την εντολή while } for i:=1 to N do begin repeat write('Dose ores ergasias ergati ',i:3,' OE='); readln(OE); If(OE<0) then break; until((OE<25) and (OE>=YO));

If(OE<0) then break; Writeln('aa Ores_Ergasias Apozimiosi Ores_Yperorias Yper_Apoz Synolo '); Write(i:5, YO:5, YO*OA:8:2,(OE-YO):5, (OE-YO)*EA:8:2); Writeln(YO*OA+(OE-YO)*EA:8:2); end; readln; End.

50

Page 51: Introduction to Pascal Greek

15. Αλλάξτε το κάτω πρόγραμμα χρησιμοποιώντας την εντολή repeat και δυαδικούς τελεστές (and...). program ask15; var N, i, bathmos, k1 , k2, k3, k4, k5 :Integer; Begin k1:=0; k2:=0; k3:=0; k4:=0; k5:=0; repeat write('give Nuber of students='); readln(N); until (N>0); for i:=1 to N do begin repeat write('give bathmo of student',i:3,' bathmos='); readln(bathmos); until((bathmos<=20) and (bathmos>=0)); case bathmos of 0..9: begin Writeln('aporiptetai'); k1 := k1+ 1; end; 10..12:begin Writeln('Metria'); k2 := k2+ 1; end; 13..15: begin Writeln('Kala'); k3 := k3+ 1; end; 16..18: begin Writeln('Polu Kala'); k4 := k4+ 1; end; 19..20:begin Writeln('Arista'); k5 := k5 + 1; end; end; {case} end; Writeln(' Total students=',N:3); Writeln('aporiptontai mathites ',k1:3); Writeln('Metria mathites ',k2:3); Writeln('Kala mathites ',k3:3); Writeln('Polu Kala mathites ',k4:3); Writeln('Arista mathites ',k5:3); readln; End.

16. program ask16; var A, B, C, D, Gonia :Real; T, E :Real;

51

Page 52: Introduction to Pascal Greek

Begin repeat write('Δώσε πλευρά Α='); readln(A); until (A>0); repeat write('Δώσε πλευρά B='); readln(B); until (B>0); repeat write('Δώσε πλευρά C='); readln(C); until (C>0); repeat write('Δώσε πλευρά D='); readln(D); until (D>0); repeat write('Δώσε Γωνια Gonia='); readln(Gonia); until ((Gonia>0) and (Gonia<180)); If ((A=B) and (B=C) and (C=D) and (Gonia=90)) then Writeln(' Tetragono') else If ((A=B) and (B=C) and (C=D) ) then Writeln(' Romvos') else If ((A=C) and (B=D) and (Gonia=90) ) then Writeln(' Orthogonio') else If ((A=C) and (B=D)) then Writeln(' parallilogramo') else Writeln('tyxaio'); readln; End.

17. program ask17; var A, B, C :Integer; T, E :Real; Begin Repeat repeat write('Δώσε πλευρά Α='); readln(A); until (A>=0); repeat write('Δώσε πλευρά B='); readln(B); until (B>=0); repeat write('Δώσε πλευρά C='); readln(C); until (C>=0);

52

Page 53: Introduction to Pascal Greek

if ((A<B+C) and (B<A+C) and (C<A+B)) then begin T:=(A+B+C)/2; E:=SQRT(T*(T-A)*(T-B)*(T-C)); writeln('E=',E:8:2,' T=',T:8:2);

end; Until ( (A=0) and (B=0) an (C=0)); readln; End.

18. program ask18; var N, I :Integer; S, P :LongInt; Begin S:=0; { το ουδέτερο στοιχείο της πρόσθεσης } P:=1; { το ουδέτερο στοιχείο του πολλαπλασιασμού } repeat write('Δώσε N='); readln(N); until (N>0); For I:=1 to N do S:=S+I; Writeln('S=',S:10); For I:=1 to N do P:=P*I; Writeln('P=',P:10); Readln; End.

19. Program Riza; Var N: Integer; R: Real; Begin Repeat Write(‘ Give N=’); Readln(N); Until(N>=0); R:=SQRT(N); Writeln(‘Riza=’,R); End.

20. program ask20; var I, N, pil1, pil2, yp1, yp2, sum:Integer; Begin for I:=100 to 999 do begin N:=I; pil1 := N div 100; yp1 :=N mod 100;

53

Page 54: Introduction to Pascal Greek

N := yp1; pil2 := N div 10; yp2 :=N mod 10; sum:= pil1 + pil2 + yp2; N:=I; if (sum>=10) then Write(N:4); end; readln; End.

21. Program ask21; Var xar: Char; p, a1 ,c ,s, a2, l: Byte; Begin p:=0; a1:=0; c:=0; s:=0; a2:=0; l:=0; Repeat Write(‘ dose xaraktira=’); Readln(xar); If ((xar='P') and (p=0) and (a1=0) and (s=0) and (c=0) and (a2=0) and (l=0)) then p:=1; If ((xar='A') and (p=1) and (a1=0) and (s=0) and (c=0) and (a2=0) and (l=0)) then a1:=1; If ((xar='S') and (p=1) and (a1=1) and (s=0) and (c=0) and (a2=0) and (l=0)) then s:=1; If ((xar='C') and (p=1) and (a1=1) and (s=1) and (c=0) and (a2=0) and (l=0)) then c:=1; If ((xar='A') and (p=1) and (a1=1) and (s=1) and (c=1) and (a2=0) and (l=0)) then a2:=1; If ((xar='L') and (p=1) and (a1=1) and (s=1) and (c=1) and (a2=1) and (l=0)) then l:=1;Until((p=1) and (a1=1) and (s=1) and (c=1) and (a2=1) and(l=1));readln;End;

22. Program ask22; Var I, a0, a1 ,a2 : Integer; Begin a0:=1; a1:=1; Writeln( a1); For I:=2 to 10 do begin a2 := a1 + a0; Writeln( a2); a0:=a1; a1:=a2; end; readln; End.

54

Page 55: Introduction to Pascal Greek

Δομημένοι Τύποι Δεδομένων

Εκτός από τους απλούς τύπους δεδομένων (integer, real, byte,boolean, char, Word, LongInt, byte, ShortInt), στην Turbo Pascal υπάρχουν και δομημένοι τύποι δεδομένων. Η διαφορά τους είναι ότι οι δομημένοι τύποι δεδομένων αποτελούνται κατά κανόνα από μια σειρά απλών τύπων.

Ο Τύπος String

Ο τύπος string (αλφαριθμητικό) δεν είναι τίποτε άλλο από μια σειρά συμβόλων, γι' αυτό ονομάζεται και συμβολοσειρά. Το όνομα "ΜΑΘΗΤΗΣ" αποτελεί ένα παράδειγμα αλφαριθμητικού. Μετά το χαρακτηρισμό τύπου string, μπορείτε να ορίσετε μέσα σε αγκύλες το μέγιστο επιτρεπόμενο μήκος του αλφαριθμητικού.

Παράδειγμα:

VAR

text : string[45] ;

Αυτή η δήλωση σημαίνει ότι η μεταβλητή string θα αποτελείται από μια σειρά χαρακτήρων που δε θα ξεπερνούν τους 45. Έτσι, με τη δομημένη μεταβλητή string έχουμε επανάληψη 45 φορές του απλού τύπου character. Αν κατά την απόδοση τιμών προσπαθήσετε να δώσετε στη μεταβλητή string μια τιμή 60 χαρακτήρων, θα ληφθούν υπόψη μόνο οι πρώτοι 45, επειδή με τον καθορισμό του μήκους του τύπου string, κρατήθηκε στη μνήμη εργασίας χώρος μόνο για 45 χαρακτήρες. Επιτρέπεται όμως να δώσετε λιγότερους, π.χ. μόνο 15, χαρακτήρες. Το μέγιστο επιτρεπόμενο μήκος μιας μεταβλητής τύπου string είναι 255 χαρακτήρες.

Ο Τύπος ArrayΟ δομημένος τύπος δεδομένων array (πίνακας) μοιάζει αρκετά με τον τύπο δεδομένων string. Σε μεταβλητή τύπου string, το αλφαριθμητικό μπορεί να έχει οποιοδήποτε μήκος, αρκεί να είναι μικρότερο από το μέγιστο που καθόρισε ο προγραμματιστής. Αντίθετα, ένας πίνακας αποτελείται από έναν καθορισμένο αριθμό στοιχείων. Τα στοιχεία αυτά πρέπει να είναι όλα του ίδιου τύπου. Με τη Βοήθεια ενός δείκτη μπορείτε να προσπελάσετε οποιοδήποτε στοιχείο του πίνακα.Στον ορισμό ενός πίνακα, μετά τη λέξη array καθορίζεται μέσα σε αγκύλες ο αριθμός των στοιχείων του. Θα πρέπει μάλιστα να οριστεί με ακρίβεια το πρώτο και το τελευταίο στοιχείο του. Η γλωσσική έκφραση από ... μέχρι διατυπώνεται με δύο τελείες, που τοποθετούνται ανάμεσα στο πρώτο και το τελευταίο στοιχείο. Μετά τις αγκύλες ακολουθεί η λέξη of και ο τύπος των στοιχείων.Σε τι μας χρησιμεύουν οι πίνακεςΓια να διαβάσουμε 1000 βαθμούς μαθητών και να τους τυπώσουμε κατά αντίστροφη σειρά θα γράφαμε ένα πρόγραμμα με την εξής μορφή:

Program antistrofi_seira;var vath1,vath2,vath3vath999,vath1000 : integer; begin readln (vath1) ;

program ant_sei;uses crt;vardeikti: 1..1000;vath:array [1..1000] of integer;

55

Page 56: Introduction to Pascal Greek

readln (vath2) ;…readln (vath1000) ;writeln (vath1000) ;writeln (vath999) ;...writeln (vath1);readlnend.

begin for deikti:=1 to 1000 do readln(vath[deikti] ) ;for deikti:=1000 downto 1 do writeln(vath[deikti] ) ;readln;end.

Για το πρόγραμμα αυτό, όπως εμφανίζεται στην πρώτη στήλη του παραπάνω πίνακα, θα χρειαζόμαστε πάνω από 3000 γραμμές Το βασικό πρόβλημα Είναι ότι χρειαζόμαστε 1000 διαφορετικές μεταβλητές παρόλο που είναι ίδιου τύπου κι έχουν το ίδιο όνομα, με μία μόνο διαφορετική κατάληξη για να ξεχωρίζουν, θα ήταν πολύ πιο εύκολο αν μπορούσαμε να χρησιμοποιήσουμε μία μεταβλητή ως δείκτη για τη διαφορετική κατάληξη κάθε μεταβλητής. Στη δεύτερη στήλη του προηγούμενου πίνακα γράφουμε το αντίστοιχο τμήμα του κυρίου προγράμματος.Το προηγούμενο τμήμα είναι σωστό πρόγραμμα αν ορίσουμε τη μεταβλητή vath ως ένα μονοδιάστατο πίνακα. Αυτό γίνεται με τη δήλωση vath: array [1..1000] of integer. Προσθέτουμε στη δεύτερη στήλη και τις απαραίτητες δηλώσεις για τον πίνακα των βαθμών.Ένας μονοδιάστατος πίνακας είναι τύπος με δόμηση και αποτελείται από έναν προκαθορισμένο αριθμό στοιχείων τα οποία είναι -ανεξαιρέτως όλα δεδομένα του ιδίου τύπου. Ο τύπος αυτός ονομάζεται βασικός τύπος του πίνακα. Οι επεξεργασίες σε πίνακα μπορεί να είναι αντικαταστάσεις για ολόκληρο τον πίνακα ή προσπέλαση σε μεμονωμένα στοιχεία του. Τα δεδομένα είναι καταχωρημένα στον πίνακα έτσι ώστε να ορίζεται μία διάταξη. Σύμφωνα με τη διάταξη αυτή, η προσπέλαση σε κάθε στοιχείο του πίνακα είναι άμεση. Η τιμή του δείκτη προσδιορίζει τη θέση του στοιχείου μέσα στον πίνακα. Ο δείκτης είναι ένας τακτικός τύπος (ordinal type).Με τη δήλωση ορισμού του πίνακα στην περιοχή δηλώσεων των μεταβλητών, καθορίζονται και τα δύο παραπάνω, δηλαδή και ο τύπος των στοιχείων του και ο τύπος του δείκτη. Ο μονοδιάστατος πίνακας είναι ο απλούστερος πίνακας, αυτός δηλαδή που έχει μία διάσταση (μια γραμμή ή μία στήλη). Ο τύπος του δείκτη προσδιορίζει για κάθε διάσταση τον αριθμό των στοιχείων του πίνακα. Οι απλοί τύποι είναι όλοι, εκτός από τον πραγματικό τύπο, τακτικοί τύποι. Στην περίπτωση του ακέραιου τύπου χρησιμοποιείται μία υποπεριοχή ακεραίων, γιατί ειδάλλως ο πίνακας θα ήταν πολύ μεγάλος για να χωρέσει στη μνήμη.

Δήλωση μονοδιάστατου πίνακαΟ τρόπος δήλωσης ενός πίνακα με όνομα Α είναι:varA: array [τύπος-δείκτη ] of τύπος-στοιχείων-πίνακα

Παραδείγματα:α) Ο πίνακας που ακολουθεί είναι πίνακας μιας διάστασης (1 γραμμής και 8 στηλών) στον οποίο έχουν καταχωρηθεί 8 ακέραιοι αριθμοί.περιεχόμενα

15 12 4 3 18 20 10 121ο 2ο 3ο 4ο 5ο 6ο 7ο 8ο

56

Page 57: Introduction to Pascal Greek

τάξη

Η αντίστοιχη δήλωση θα είναι:varpin: array[1..8] of integer;

όνομα πίνακα: pin τύπος-δείκτη: η υποπεριοχή 1..8(το σύνολο των τιμών του δείκτη είναι οι ακέραιοι 1 έως 8)

τύπος των στοιχείων του πίνακα: integer

β)constmax=640;var bathmoi: array[1..20] of integer;onoma: array[1..30] of char;memory: array[0..max] of integer;

γ) Ο αλφαριθμητικός τύπος (string) μπορεί να θεωρηθεί ως μονοδιάστατοςπίνακας χαρακτήρων του οποίου το πρώτο στοιχείο έχει τάξη 1.varmet:string[26];x:char;met: ='abcdefghijklmnopqrstuvwxyz';x:=met[5]; {η μεταβλητή x έχει ως περιεχόμενο το 5° στοιχείο της αλφαριθμητικής μεταβλητής που είναι ο χαρακτήρας e.

Παραδείγματα αναφοράς σε στοιχεία πινάκων:α) pin[k]:=a+2Το στοιχείο k τάξης του πίνακα αντικαθίσταται από το άθροισμα a+2 όπου , a είναι μια μεταβλητήβ) X[1,2]:=k+rΤο στοιχείο της πρώτης γραμμής και δεύτερης στήλης ενός πίνακα με το όνομα Χ αντικαθίσταται από το άθροισμα των μεταβλητών k και r. Το στοιχείο ενός πίνακα μπορεί να είναι ένας άλλος πίνακας και τότε ο πίνακας λέγεται δύο διαστάσεων ή δισδιάστατος. Υπάρχουν επομένως πίνακες με περισσότερους από ένα δείκτες που ονομάζονται πίνακες δύο, τριών ή και περισσότερων διαστάσεων, ανάλογα με τον αριθμό των δεικτών. Η προσπέλαση των στοιχείων των πινάκων αυτών γίνεται με τον ανάλογο αριθμό δεικτών.

57

Page 58: Introduction to Pascal Greek

Δήλωση πολυδιάστατου πίνακαΟ τρόπος δήλωσης ενός πίνακα με όνομα Α με περισσότερους από ένα δείκτες είναι:varA: array [τύπος 1ου δείκτη, τύπος 2ου δείκτη,...] of τύπος-στοιχείων-πίνακα

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

1 2 31 10 12 23

γραμμές 2 15 4 23 1 77 834 23 45 67

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

var pinakas: array[1..4,1..3] of integer;

Η εκτύπωση του στοιχείου της 3ης γραμμής και 2ης στήλης γίνεται με την εντολή writeln(pinakas[3,2]);

β) varpin: array[0..n,0..m] of real;count: array[0..sxol, 0..diam, 0..nomos] of integer;Στις παραπάνω δηλώσεις οι δείκτες είναι υποπεριοχές ακεραίου και πρέπει να έχουν προσδιοριστεί προηγουμένως οι n, m, sxol, diam, nomos να έχουν ορισθεί ως σταθερές.

γ)typepinakas =array [1..100] of real;vartable :array [1..10] of pinakas

δ) Ο ορισμός του παραδείγματος γ είναι ισοδύναμος με τον παρακάτω:vartable: array [1..10,1..100] of real;

Παραδείγματα χρήσης πινάκων:

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

58

στήλες

Page 59: Introduction to Pascal Greek

program pinakas1;uses crt;const n=100;var x:array[1..n] of integer;m,min,max:integer ;pos_min,pos_max:integer;

procedure eisagogi;var k: integer;beginfor k:=1 to n do begin write('δωσε το στοιχείο Χ [ ', k, ' ] =') ; readln(x[k]) ; end;end;

procedure min_max;begin min: =x [1] ; max: =x [1] ; pos_min:=1; pos_max:=1; for m:=2 to n do begin if (x[m]<min) then begin min:=x[m] ; pos_min:=m; end; if (x [m] >max )then begin max:=x[m] ; pos_max:=m; end; end;end;

procedure apotelesmata;begin writeln ( 'Max=', max: 5,' στη θέση ',pos_max: 3); writeln ( 'Min=', min: 5,' στη θέση ',pos_min: 3);end;

{κύριο πρόγραμμα} begin eisagogi; min_max; apotelesmata;end.

59

Page 60: Introduction to Pascal Greek

2) Να γραφεί πρόγραμμα που να δημιουργεί συμμετρικό πίνακα 6 x 6, όπου τα στοιχεία της κύριας διαγωνίου είναι 1, τα στοιχεία πάνω από τη διαγώνιο 2 και τα στοιχεία κάτω από τη διαγώνιο 0. Στη συνέχεια να τυπώνει τον πίνακα κατά γραμμές.

program pinakas2;uses crt;ConstN= 6; TYPE Pinakas= array[1..N, 1..N] of integer;varI, J: integer; A: Pinakas;

begin {εισαγωγή δεδομένων } clrscr; for I:=1 to N do begin for J:=1 to N do begin If ( I < J ) then A[I , J]:=0 else If ( I > J ) then A[I , J]:=2 else If ( I = J ) then A[I , J]:=1; end; end;

{εκτύπωση πίνακα } for I:=1 to N do begin for J:=1 to N do begin write (A[I , J]); end; writeln; { αλλαγή γραμμής} end; readln;end.

60

Page 61: Introduction to Pascal Greek

Πρόβλημα 1: Γράψτε υποπρόγραμμα που να ταξινομεί σε αύξουσα σειρά Ν ακεραίους με τη μέθοδο της φυσαλίδας.

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

Τέλος

1ης φάσης

Τέλος

2ης φάσης

Τέλος

3ης φάσης

4η φάση

Μ[1] 60 42 42 42 42 25 25

Μ[2] 42 60 60 60 25 42 42

Μ[3] 83 83 25 25 60 60 60

Μ[4] 25 25 83 75 75 75 75

Μ[5] 75 75 75 83 83 83 83

Σχήμα 1

Υποπρόγραμμα διαδικασίαProcedure FYSALLIDA (Var M:PINAKAS; N: Integer);(* ΧΡΗΣΙΜΟΠΟΙΕΙ ΤΗ ΜΕΘΟΔΟ ΤΗΣ ΦΥΣΑΛΛΙΔΑΣ *) VarJ, I, PROS: Integer;Begin For I:=N downto 2 do For J:=l to Ι-1 do If ( M[J] > M[J+1] ) then begin PROS:=M[J]; M[J]:=M[J+1]; M[J+1]:=PROS end; End;

61

Page 62: Introduction to Pascal Greek

Επίσης μια άλλη μορφή είναι η παρακάτω:

Procedure TAXI (Var Μ: PINAKAS; ARITHMOS: Integer); VarTAXMSH: Boolean;I, PROS: Integer;Begin(* διατρέχει τον πίνακα Μ μέχρις ότου ταξινομηθεί *) Repeat TAXMSH:=TRUE; For I:=1 to ARITHMOS-1 do If ( M[I] >M[I+1] ) Then Begin PROS:=M[I]; M[I]:=M[I+1]; M[I+1]:=PROS; TAXMSH:=FALSE End; (*IF*) (* το μεγαλύτερο στοιχείο πήγε στη θέση του *) ARITHMOS:=ARITHMOS-1 Until (TAXMSH) End; (*SORT*)

Πρόβλημα 2:Γράψτε μία διαδικασία που να ταξινομεί, σε φθίνουσα σειρά Ν ακεραίους αριθμούς με τη μέθοδο της επιλογής (selection sort).

Ανάλυση:Η μέθοδος της επιλογής ψάχνει και βρίσκει εκείνο το στοιχείο του πίνακα με τη μεγαλύτερη τιμή και την ανταλλάσσει με την τιμή του πρώτου στοιχείου. Μετά βρίσκει το στοιχείο εκείνο με την αμέσως μεγαλύτερη τιμή και την ανταλλάσσει με την τιμή του δεύτερου στοιχείου κ.ο.κ. (βλ. Σχήμα 2).

1η 2η 3η 4η

Μ[1] 60 83 83 83 83

Μ[2] 42 42 75 75 75

Μ[3] 83 60 60 60 60

Μ[4] 25 25 25 25 42

Μ[5] 75 75 42 42 25

Σχήμα 2

Παρατηρούμε ότι, αν N είναι η διάσταση του πίνακα τότε χρειάζονται N-1 φάσεις για την ταξινόμηση των στοιχείων του.

62

Page 63: Introduction to Pascal Greek

Υποπρόγραμμα διαδικασίαProcedure EPILOGH (Var Μ: PINAKAS; Ν:Integer);(* χρησιμοποιεί τη μέθοδο της επιλογής *) VarI, J, MEG, PROS: Integer;BeginFor I:=1 to N-l do Begin MEG:=I: FOR J:=I to Ν do If ( M[J] >M[MEG] ) then MEG:=J; PROS:=M[I]; M[I]:=M[MEG]; M[MEG]:=PROS end End;

Tο κύριο πρόγραμμα θα είναι κάπως έτσι:

PROGRAM Kyrio;

CONST M=5;

TYPE PINAKAS = array[1..M] of Integer;

VAR A : PINAKAS;…Begin…EPILOGH(A, M);…End.

63

Page 64: Introduction to Pascal Greek

Ασκήσεις1. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω: α) Να εισάγετε τα στοιχεία ενός πίνακα 4 x 3 από το πληκτρολόγιο β) Να προσθέτει τα στοιχεία κάθε γραμμής και να τα τοποθετεί σε μονοδιάστατο πίνακα κατάλληλης διάστασης.

2. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω: α) Την εισαγωγή 10 αριθμητικών στοιχείων του πίνακα. β) Την εκτύπωση του πίνακα. γ) Την ταξινόμηση κατ' αύξουσα σειρά των στοιχείων του πίνακα. δ) Την εκτύπωση του ταξινομημένου πίνακα.

3. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω: α) Την εισαγωγή 10 αριθμητικών στοιχείων πίνακα. β) Την εκτύπωση του πίνακα. γ) Την ταξινόμηση κατά φθίνουσα σειρά των στοιχείων του πίνακα. δ) Την εκτύπωση του ταξινομημένου πίνακα.Υπόδειξη: Να τροποποιήσετε κατάλληλα την άσκηση 2

4. Να γραφεί πρόγραμμα το οποίο, αφού διαβάσει τη διάσταση Ν, δύο μο-νοδιάστατων πινάκων Α, Β με 20 το πολύ στοιχεία εκτελεί τις παρακάτω διαδικασίες. α) Με τη χρήση της συνάρτησης RANDOM(N) παράγει και αποθηκεύει Ν στοιχεία για κάθε πίνακα. β) Συγκρίνει τα αντίστοιχα στοιχεία (με τον ίδιο δείκτη) των δύο πινάκων και ανάλογα με το αποτέλεσμα της σύγκρισης δημιουργεί έναν τρίτο πίνακα C με στοιχεία <, > και = αντίστοιχα. γ) Εκτυπώνει τα περιεχόμενα των τριών πινάκων σύμφωνα με το υπόδειγμα:

Α C B15 > 1020 = 2040 < 120

δ) Τυπώνει τον αριθμό των <, >, = που προκύπτουν από την παραπάνω σύγκριση.

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

64

Page 65: Introduction to Pascal Greek

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

Εγγραφη1 Ονομα Επώνυμο Μισθός

Εγγραφή2 Ονομα Επώνυμο Μισθός..

.

...

.

.ΕγγραφήΝ Ονομα Επώνυμο Μισθός

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

Το παραπάνω αρχείο θα μπορούσε λοιπόν να δηλωθεί ως εξής:

Arxeio : RECORD

Onoma : string[10];

Eponumo : string[15];

Mistos : real;

END;

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

65

Page 66: Introduction to Pascal Greek

Δυναμικές Μεταβλητές:

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

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

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

PROGRAM deiktis1;

USES crt;

VAR a, b, c : ^integer;

Begin

Clrscr;

new(a);

new(b);

new(c);

a^:=1;

b^:=2;

c^:=3;

writeln(‘ Αριθμοί στο σωρό ‘,a^:4, b^:4, c^:4);

END.

Οι μεταβλητές a, b, c είναι δείκτες και γι’ αυτό δηλώνονται ως a, b, c : ^integer;Μέσα στο πρόγραμμα οι μεταβλητές παίρνουν συγκεκριμένες τιμές

Π.χ a^:=1;

Με την πρόταση new(a); δημιουργείται η δυναμική μεταβλητή a και ένας δείκτης που δείχνει σε αυτήν. Για να δούμε αν η δυναμική μεταβλητή αποθηκεύτηκε στη μνήμη σωρού την εμφανίζουμε στην οθόνη με την εντολή writeln.

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

66

Page 67: Introduction to Pascal Greek

PROGRAM deiktis2;

USES crt;

VARdeiktis : ^string;

BEGIN clrscr;REPEAT new ( deiktis) ; writeln ('Η διαθέσιμη μνήμη σωρού είναι ',MemAvail,' Byte');

(* dispose (deiktis); *)

writeln ('Η διαθέσιμη μνήμη σωρού είναι ', MemAvaii,' Byte');UNTIL keypressed;writeln ('Συνέχεια με <Enter>');readln;

END.

Τη φορά αυτήν ο δείκτης είναι τύπου string. Με την πρόταση dispose (deiktis) απελευθερώνεται η δεσμευμένη μνήμη στο σωρόΗ συνάρτηση MemAvail επιστρέφει τη συνολική διαθέσιμη μνήμη του σωρού σε byte.Εκτελέστε μια φορά το πρόγραμμα χωρίς τη διαδικασία dispose. θα δείτε τότε πόση μνήμη είναι ελεύθερη. Με το πάτημα ενός πλήκτρου μπορείτε να σταματήσετε το πρόγραμμα. Ενεργοποιήστε τώρα τη διαδικασία dispose στο πρόγραμμα σας, κι εκτελέστε το ξανά. θα δείτε ότι η χρησιμοποιούμενη μνήμη του σωρού απελευθερώνεται ξανά.

Τύποι Δεδομένων που ορίζονται από το Χρήστη

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

PROGRAM Deigma;

TYPE

mera_evdomadas = (de, tr, te, pe, pa ,sa, ky);

VAR

mera : mera_evdomadas;

BEGIN

(* Κυρίως πρόγραμμα *)

END.

67

Page 68: Introduction to Pascal Greek

Η μεταβλητή mera είναι τύπου mera_evdomadas. Επειδή ο τύπος mera_evdomadas δε σημαίνει τίποτα για την Turbo Pascal, όπως σημαίνει π.χ. ο τύπος real ή string, θα πρέπει να ενημερώσουμε ανάλογα τον υπολογιστή. Αυτό γίνεται μετά τη λέξη-κλειδί ΤΥΡΕ Μετά το όνομα του τύπου, που θέλουμε να ορίσουμε (στο παράδειγμα, mera_evdomadas), ακολουθεί το σύμβολο της ισότητας (=). Μετά απαριθμούνται οι δυνατές τιμές που μπορεί να πάρει αυτός ο τύπος. Τα στοιχεία αυτά xωρiζoνται με κόμματα και περικλείονται σε παρενθέσεις.

Ένα δεύτερο παράδειγμα:

PROGRAM askopo;

TYPE

onoma = string[14];

VAR

Eponumo : onoma;

BEGIN

END.

Είναι πραγματικά άσκοπο το πρόγραμμα askopo του παραδείγματος; Με μια πρώτη ματιά φαίνεται ότι θα ήταν απλούστερο να γράψετε το πρόγραμμα ως εξής:

PROGRAM skopimo;

VAR

Eponumo : string[14];END.

To πρόγραμμα askopo όμως δεν γράφτηκε τυχαία μ' αυτόν τον τρόπο. Μια τέτοια μορφή χρησιμοποιείται στα προγράμματα διαχείρισης αρχείων. Σ' αυτήν την περί-πτωση, η συντόμευση που προσφέρει το πρόγραμμα skopimo δε θα μας είναι καθό-λου χρήσιμη.

68

Page 69: Introduction to Pascal Greek

Λύσεις ασκήσεων – Πίνακες

1) Program askisi1; CONST N1=4; N2=3;

TYPE Table = array[1..N1,1..N2] of integer; Table2= array[1..N1] of integer; VAR A: Table; B: Table2; min, max, posmin, posmax: Integer;

Procedure Create(Var Temp: Table; M1,M2: Integer); Var i, j, number: integer; Begin for i:=1 to M1 do begin for j:=1 to M2 do begin Write(' dose A[',i:2,j:2,']='); readln(Temp[i , j] ); end end end;

Procedure prostesi; Var i, j, number: integer; Begin for i:=1 to N1 do begin number :=0; for j:=1 to N2 do begin number := number + A[i, j]; end; B[ i ] :=number; end; writeln; for i:=1 to N1 do writeln(B[ i ]:3); end;

Begin Create(A, N1, N2); prostesi; readln; End.

69

Page 70: Introduction to Pascal Greek

2) Program tajinomisi; USES crt; CONST N=5;

TYPE Table = array[1..N] of integer; VAR A,B:Table;

Procedure Create(Var Temp:Table); Var i:integer; Begin Randomize; for i:=1 to N do Temp[i]:=Random(51); (* Numbers between 0 and 50 *) end;

Procedure Anathesi(Temp:Table;Var Temp1:Table); Var i:integer; Begin for i:=1 to N do Temp1[i]:=Temp[i]; end;

Procedure Ektuposi(Temp:Table); Var i:integer; Begin for i:=1 to N do write(Temp[i],' '); writeln; end;

Procedure Bubble(Var Temp:Table; M:integer); Var i,j,x:integer; Begin for i:=2 to M do Begin for j:=M downto i do if Temp[j-1]>Temp[j] Then Begin x:=Temp[j-1]; Temp[j-1]:=Temp[j]; Temp[j]:=x; end; write('I= ',i,' Table: '); Ektuposi(Temp); end end;

70

Page 71: Introduction to Pascal Greek

Begin clrscr; Create(A); Anathesi(A,B); writeln(' O pinakas '); Ektuposi(B); writeln; Bubble(B,N); writeln('Tajinomimenos '); Ektuposi(B); readln; end.

4) Program askisi4;

CONST N=20;

TYPE Table = array[1..N] of integer; Table2 = array[1..N] of char; VAR A,B:Table; C:Table2; min, max, eq, J: Integer;

Procedure Create(Var Temp1,Temp2:Table; M:Integer); Var i:integer; Begin Randomize; for i:=1 to M do begin Temp1[i]:=Random(300); (* Numbers between 0 and 299 *) Temp2[i]:=Random(300); end end;

Procedure Sugkrisi(Temp1, Temp2:Table;Var Temp3:Table2;M:integer); Var i:integer; Begin for i:=1 to M do begin if( Temp1[i] > Temp2[i] ) then Temp3[i]:='>' else if( Temp1[i] < Temp2[i] ) then Temp3[i]:='<' else if( Temp1[i] = Temp2[i] ) then Temp3[i]:='=';

71

Page 72: Introduction to Pascal Greek

end end; Procedure Ektuposi(Temp1,Temp2:Table; Temp3:Table2; M:integer); Var i:integer; Begin for i:=1 to M do begin write(Temp1[i]:5,' '); write(Temp3[i],' '); writeln(Temp2[i]:5,' '); end end;

Begin Create(A,B,N); Sugkrisi(A,B,C,N); Ektuposi(A,B,C,N); max:=0; min:=0; eq:=0; For j:=1 to N do begin if (C[j]='>') then max:=max+1; if (C[j]='<') then min:=min+1; if (C[j]='=') then eq:=eq+1 end; writeln('Number of > is ', max:3); writeln('Number of < is ', min:3); writeln('Number of = is ', eq:3); readln; end.

5) Program askisi5; USES crt; CONST N=5;

TYPE eggrafi = RECORD onoma : string[12] ; bathmos :integer; END;

Table = array[1..N] of eggrafi; VAR A:Table;

Procedure Create(Var Temp:Table); Var i:integer; Begin for i:=1 to N do begin WRITE (' Επώνυμο (',i:2,' ): ' ) ;

72

Page 73: Introduction to Pascal Greek

readln (Temp[i].onoma) ; Repeat WRITE (' Βαθμος (',i:2,'): ' ) ; readln (Temp[i].bathmos) ; Until( (Temp[i].bathmos<=20) and (Temp[i].bathmos>=0) ); end; end;

Procedure Ektuposi(Temp:Table); Var i:integer; Begin for i:=1 to N do writeln(Temp[i].onoma:12,' ',Temp[i].bathmos:2); end;

Begin Create(A); Ektuposi(A); Readln;End.

73

Page 74: Introduction to Pascal Greek

Υποπρογράμματα ( Διαδικασίες – Συναρτήσεις )

Διαδικασίες με Διαβίβαση Παραμέτρων

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

Παράδειγμα:

PROGRAM procedure1;

VAR

a,b : integer; (* καθολικές μεταβλητές *)

procedure enallagi (VAR x, y : integer);

VAR

endiamesos : integer; (* τοπική μεταβλητή *)

BEGIN

endiamesos : = x;

x:=y;

y:= endiamesos;

END;

BEGIN

WRITE ('Αριθμός 1: '); readln(a);

WRITE ('Αριθμός 2: '); readln( b);

enallagi (a, b); (* κλήση διαδικασίας *)

writeln ('Ο αριθμός 1 είναι τώρα ο: ', a: 4);

writeln (' O αριθμός 2 είναι τώρα ο: ' , b: 4);

writeln ('Συνέχεια με <Enter>');

readln;

END.

Ας δούμε τι κάνουμε με το κύριο πρόγραμμα: Ορίζουμε δύο μεταβλητές a και b, και τις δύο τύπου integer. Μετά δίνουμε τιμές στις μεταβλητές. Στη συνέχεια καλούμε τη διαδικασία, όπου οι μεταβλητές a και b του κύριου προγράμματος διαβιβάζovται μέσα σε παρενθέσεις σαν πραγματικές παράμετροι στη διαδικασία enallagi. Μετά την εκτέλεση της διαδικασίας εκτυπώνονται οι τιμές των μεταβλητών του κύριου προγράμματος, και διαπιστώνουμε ότι έχουν εναλλαγεί οι τιμές τους. Η διαδικασία επέστρεψε λοιπόν τις επεξεργασμένες τιμές στο κύριο πρόγραμμα.

74

Page 75: Introduction to Pascal Greek

Κατά τον ορισμό της διαδικασίας enallagi, δίνονται μετά το όνομα της διαδικασίας οι τυπικές παράμετροι μέσα σε παρενθέσεις. Αν θέλουμε η διαδικασία να ανταλλάξει τις τιμές του κύριου προγράμματος, οι παράμετροι θα πρέπει να οριστούν σαν παράμετροι μεταβλητών (VAR). Πρέπει δηλαδή, πριν τις παραμέτρους, να γραφεί η λέξη VAR.Στη συνέχεια δηλώνονται οι τυπικές παράμετροι, χωρισμένες με κόμματα. Ακολουθεί μια άνω και κάτω τελεία και ο καθορισμός του τύπου. Για να εναλλάξουν δύο μεταβλητές τις τιμές τους, χρειάζεται και μια τρίτη βοηθητική μεταβλητή, που θα χρησιμεύει για την ενδιάμεση αποθήκευση της τιμής της μιας μεταβλητής. Επειδή αυτή η τρίτη μεταβλητή χρειάζεται μόνο μέσα στην διαδικασία, αρκεί να οριστεί σαν τοπική μεταβλητή (local variable). Η τοπική μεταβλητή υφίσταται μόνο μέσα στη διαδικασία, και είναι άγνωστη έξω απ' αυτήν.Μετά το τμήμα δηλώσεων ακολουθεί το τμήμα των προτάσεων, που ξεκινά με BEGIN και καταλήγει σε END με ελληνικό ερωτηματικό.

Καθολικές μεταβλητές: Στο πρόγραμμα υπάρχουν εκτός από τοπικές, και καθολικές μεταβλητές. Οι καθολικές μεταβλητές ορίζονται πριν τις διαδικασίες και τις συναρ-τήσεις και πριν το πρώτο BEGIN. Ισχύουν για ολόκληρο το πρόγραμμα.

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

PROGRAM procedure2;

VAR

a,b : integer;

procedure enallagi ( x, y : integer);

VAR

endiamesos : integer;

BEGIN

endiamesos : = x;

x:=y;

y := endiamesos;

writeln ('0 αριθμός 1 της διαδικασίας είναι τώρα ο: ', x:4);

writeln ('Ο αριθμός 2 της διαδικασίας είναι τώρα ο: ',y:4);

END;

BEGIN

WRITE ('Αριθμός 1: ' ); readln(a);

WRITE (' Αριθμός 2: '); readln( b) ;

enallagi (a, b); (* κλήση διαδικασίας *)

writeln ('Ο αριθμός 1 στο κύριο πρόγραμμα παραμένει ο:',a:4);

writeln ('0 αριθμός 2 στο κύριο πρόγραμμα παραμένει ο:' , b: 4);

writeln ('Συνέχεια με <Enter>') ;

readln;

END.

75

Page 76: Introduction to Pascal Greek

Παράμετροι τιμών: Οι παράμετροι a και b του κύριου προγράμματος δεν πρόκειται αλλάξουν τιμή μετά την κλήση της διαδικασίας γι’ αυτό, στην αρχή της διαδικασίας, οι τυπικές παράμετροι ορίζονται σαν παράμετροι τιμών. Πριν τις παραμέτρους δεν υπάρχει τώρα κανένα χαρακτηριστικό (VAR).Η εκτέλεση του προγράμματος γίνεται ως εξής: Στο κύριο πρόγραμμα γίνεται η εισαγωγή των μεγεθών a και b. Οι τιμές αυτές διαβιβάζονται στη διαδικασία enallagi, που πραγματοποιεί μιαν εναλλαγή των δύο τιμών.Για καλύτερο έλεγχο του προγράμματος, τυπώστε τις τιμές μέσα από τη διαδικασία. Θα διαπιστώσετε ότι τα αλλαγμένα μεγέθη δεν επιστρέφονται στο κύριο πρόγραμμα. (τυπώστε τις κύριες μεταβλητές a και b μετά την εκτέλεση της διαδικασίας.)

Γενικά, η αρχή της διαδικασίας μπορεί να παρασταθεί ως εξής:

Procedure όνομα διαδικασίας ( VAR ονόματα παραμέτρων χωριζόμενα με κόμμα : τύπος παραμέτρων) ; ( * VAR Το μπορεί και να μην υπάρχει *)

Παραδείγματα διαδικασιών:

ΔΙΑΔΙΚΑΣΙΑ χωρίς παραμέτρους

Procedure athroisma;var num, sum, i, m :integer;begin sum:=0; write(Αριθμός προσθετέων=') ; readln(m) ; for i:=1 to m do begin write('αριθμός='); readln(num) ; sum:=sum+num; end; writeln('ΆΘΡΟΙΣΜΑ',sum) ;end.

ΠΡΟΓΡΑΜΜΑ ίδιο με τη διαδικασία

Program athroisma;Var num, sum,i,m :integer;Begin sum:=0; write('αριθμός προσθετέων=') ; readln(m); for i : = 1 to m do begin write('αριθμός='); readln(num); sum:=sum+num; end; writeln('AΘΡΟΙΣΜΑ=',sum) ;end.

ΚΛΗΣΗ διαδικασίας χωρίς παραμέτρους

Program test__subroutines1;Uses crt;

procedure athroisma;var num, sum,i,m :integer; begin sum:=0; write('αριθμός προσθετέων='); readln(m) ; for i:=1 to m do begin write('αριθμός=') ; readln(num); sum:= sum+num;

ΚΛΗΣΗ διαδικασίας με παραμέτρους

Program test_subroutines2;Uses crt;Var n :integer; athr :real;

Procedure athroisma(m:integer; var sum :real) ;{υπολογίζει το άθροισμα m αριθμών. To αποτέλεσμα στη μεταβλητή sum } var num, i :integer; begin sum: = 0; for i:=1 to m do begin write ( 'αριθμός=' ) ;

76

Page 77: Introduction to Pascal Greek

end; writeln('AΘΡΟΙΣΜΑ=',sum) ;end;

begin {*κλήση διαδικασίας *} athroisma;end.

readln(num) ; sum:=sum+num; end end;

begin write('αριθμός προσθετέων='); readln(n) ; athroisma(n, athr); {*διαδικασιας με παραμέτρους*} writeln(' άθροισμα= ', athr:10:2) ;end.

Program test_subroutines3;uses crt;var n :integer;athr : real;

procedure athroisma(m:integer; var sum :real);{Η υπορουτίνα υπολογίζει το άθροισμα m αριθμών.Το αποτέλεσμα στη μεταβλητή sum } var num, i : integer; begin sum:=0; writeln (m) ; m:=m+2; writeln(m) ;

for i:=1 to m do begin

write (i, ' ');write ('αριθμός=');readln(num) ;sum:=sum+num;

end ; writeln(m);end;

beginwrite(' αριθμός προσθετέων= ');readln(n) ;writeln(' n=', n) ;writeln('AΘΡΟΙΣΜΑ= ', athr:10:2);athroisma(n, athr);writeln('AΘΡΟΙΣΜΑ= ', athr:10:2) ;writeln ( 'n=', n) ;

end.

ΕΚΤΕΛΕΣΗαριθμός προσθετέων=3 n=3

ΑΘΡΟΙΣΜΑ=0.003 5

1 αριθμός 102 αριθμός 203 αριθμός 304 αριθμός 405 αριθμός 50 5ΑΘΡΟΙΣΜΑ= 150.00n=3

77

Page 78: Introduction to Pascal Greek

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

Οι πιο σημαντικές διαφορές ανάμεσα στις συναρτήσεις και τις διαδικασίες είναι οι εξής:

Οι συναρτήσεις επιστρέφουν πάντα μια τιμή. Οι διαδικασίες μπορούν να επιστρέφουν περισσότερες ή και καμία τιμή.

Οι συναρτήσεις μπορούν να χρησιμοποιηθούν σε μια πρόταση απόδοσης τιμής ή σε μια πρόταση εξόδου. Με τις διαδικασίες κάτι τέτοιο δεν είναι δυνατό.

Παράδειγμα :

PROGRAM function1;

VAR

a, apotelesma : integer;

function diplasio (x : integer) : integer;

BEGIN

diplasio : = x * 2;

END;

BEGIN

write(' Δώστε έναν αριθμό: ');

readln( a) ;

apotelesma := diplasio(a); (* Κλήση συνάρτησης *)

writeln ('Η τιμή της συνάρτησης είναι: ', apotelesma: 6);

writeln ('Συνέχεια με <Enter>') ;

readln;

END.

Κύριο πρόγραμμα : Στο κύριο πρόγραμμα εισάγεται μια τιμή. Η τιμή αυτή διαβιβά-ζεται στη συνάρτηση diplasio. Αποτελεί πραγματική παράμετρο και τοποθετείται σε παρενθέσεις μετά το όνομα της συνάρτησης. Η πραγματική παράμετρος είναι η μετα-βλητή, για την οποία υπολογίζεται η συνάρτηση. Η τιμή που επιστρέφει η συνάρτηση αποδίδεται στη μεταβλητή apotelesma.

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

78

Page 79: Introduction to Pascal Greek

Παραδείγματα συναρτήσεων:

program test_functionl;uses crt;var i : integer;ba, ek :integer;

function power(basi, kth: integer): real;var apotel : real;begin apotel:=1; for 1:=1 to ekth do apotel:=apotel* basi; power:=apotel;end;

begin clrscr; writeln('δώσε βάση, εκθέτη(0 για τέλος )') ; readln(ba, ek); writeln('βάση ':11, 'εκθέτης ':10, δύναμη':30 ); while ( ba > 0) do begin writeln(ba :10, ek :10,power(ba,ek) :30 :1 ) readln(ba, ek) ; end;end.

Το πρόγραμμα καλεί τη συνάρτηση power για τον υπολογισμό δυνάμεων και οι πραγματικές παράμετροι ba, ek αντικαθιστούν τις τυπικές παραμέτρους, basi, ekth, για τον υπολογισμό των δυνάμεων αυτών.Η συνάρτηση power υπολογίζει τη δύναμη ενός αριθμού με δεδομένα τη βάση και τον εκ-θέτη.basi, ekth είναι οι τυπικές παράμετροι.Με διάβασμα δίνονται τιμές στις πραγματικές παραμέτρους και καλείται η συνάρτηση.Στον πίνακα που ακολουθεί εμφανίζονται τα δεδομένα (βάση, εκθέτης) και τα αποτελέ-σματα (δύναμη) που υπολογίζονται με κλήση της συνάρτησης. δώσε βάση, εκθέτη( 0 για τέ-λος)

βάση εκθέτης δύναμη 5 2 25.0 5 3 125.0 5 4 625.0 2 8 256.0 2 16 65536.0 2 32 4294967296.0 2 64 18446744074000000000.0

program test_functon2;uses crt;var pl :integer;

function tetragwno (plevra:integer):integer;var i :integer;begin tetragwnο:=plevra * plevra;end;

Begin Write('πλευρά τετραγώνου='); Readln(pl) ; While (pl > 0) do Begin Writeln('Έμβαδόν=', tetragwno(pl) ); Write('πλευρά τετραγώνου=') ; Readln(pl); end;End.

To πρόγραμμα καλεί τη συνάρτηση tetragwno για τον υπολογισμό του εμβαδού με πραγμα-τική παράμετρο pl που αντικαθιστά την τυπική παράμετρο plevra, για τον υπολογισμό του εμ-βαδού

Η συνάρτηση υπολογίζει το εμβαδόν ενός τετραγώνουplevra είναι η τυπική παράμετρος

Με διάβασμα δίνονται τιμές στην πραγματική παράμετρο (pl) και καλείται η συνάρτηση tetragwno Στον πίνακα που ακολουθεί εμφα-νίζονται τα δεδομένα (πλευρά) και τα αποτελέ-σματα (εμβαδόν) που υπολογίζονται με κλήση της συνάρτησης tetragwno.

πλευρά =10 Εμβαδόν =100πλευρά =100 Εμβαδόν =10000 πλευρά =25 Εμβαδόν =625

79

Page 80: Introduction to Pascal Greek

πλευρά =19 Εμβαδόν =361 πλευρά =22 Εμβαδόν =484 πλευρά = 0

program test_functon4;uses crt;vararl,ar2,ar3,z :integer;

Function max (a, b, c :Integer):integer;Begin if ( a > b ) then if ( c > a ) then max: =c else max:=a else if (c > b) then max:=c else max:=b;end; Begin Writeln('δώσε 3 αριθμούς( 0 για τέλος) ') ; readln (ar1, ar2, ar3); writeln(ar1, ar2, ar3) ; while (ar1 > 0) do begin z :=max(ar1, ar2, ar3 ); writeln ( 'μέγιστος', z ); writeln('δώσε 3 αριθμούς( 0 τέλος )' ); readln (ar1, ar2, ar3) ; end;end.

To πρόγραμμα καλεί τη συνάρτηση max με πραγματικές παραμέτρους ar1,ar2,ar3 που αντικαθιστούν τις τυπικές παραμέτρους a, b, c για την εύρεση του μεγίστου τριών αριθμών.Η συνάρτηση υπολογίζει το μέγιστο τριών δεδομένων αριθμών.

a, b, c είναι οι τυπικές παράμετροι.

Με διάβασμα δίνονται τιμές στις πραγματικές παραμέτρους(ar1,ar2,ar3) και καλείται η συνάρτηση max. Στον πίνακα που ακολουθεί εμφανίζονται τα δεδομένα (3 αριθμοί) και τα αποτελέσματα (ο μέγιστος) που υπολογίζεται με κλήση της συνάρτησης max.

100 49 80 μέγιστος ο 100 100 300 124 μέγιστος ο 300 100 200 500 μέγιστος ο 500 0

Πότε χρησιμοποιούμε συναρτήσειςΠαρακάτω αναφέρονται ορισμένες προτάσεις για τη χρήση συναρτήσεων:

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

Αν το τμήμα προγράμματος εκτελεί είσοδο δεδομένων ή έξοδο αποτελεσμά-των τότε δε χρησιμοποιούμε συνάρτηση

Αν το τμήμα προγράμματος επιστρέφει μια τιμή και η τιμή αυτή είναι λογική (boolean) τότε χρησιμοποιούμε τη συνάρτηση

Αν το τμήμα προγράμματος επιστρέφει μια τιμή και η τιμή αυτή χρησι-μοποιείται άμεσα σε μια παράσταση τότε χρησιμοποιούμε τη συνάρτηση

Αν υπάρχει αμφιβολία είναι προτιμότερο να χρησιμοποιήσουμε μία διαδικασία. Στη διαδικασία το ρόλο του ονόματος της συνάρτησης παίζει η μία παράμετρος μεταβλητής.

80

Page 81: Introduction to Pascal Greek

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

Οι συναρτήσεις περιλαμβάνονται στη γλώσσα Pascal για προσομοίωση Μα-θηματικών συναρτήσεων. Η Pascal διαθέτει ενσωματωμένες Μαθηματικές συναρτήσεις όπως Abs(x) Απόλυτη τιμή, Sin(x) Ημίτονο χ, Sqr(x) Τετράγωνο του χ, Sqrt(x) Τετραγωνική ρίζα, Ln(x) Λογάριθμος του x κλπ.

81

Page 82: Introduction to Pascal Greek

Αναδρομή

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

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

1. Ο αριθμός 1 είναι ένας φυσικός αριθμός2. Ο επόμενος ενός φυσικού αριθμού είναι ένας φυσικός αριθμός

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

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

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

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

Πρόβλημα 1Γράψτε μία αναδρομική συνάρτηση που να υπολογίζει το παραγοντικό ενός μη αρνητικού ακεραίου αριθμού.

Ανάλυση:Καταρχήν περιγράφεται η κατάσταση διακοπής: 1. Αν N=0 τότε FACTORIAL:=1. Το αναδρομικό βήμα είναι: 2. Για N>=1, τότε FACTORIAL: =N*FACTORIAL(N-1).Όπως φαίνεται από το αναδρομικό βήμα, το πρόβλημα τώρα είναι να βρεθεί το παραγοντικό του επόμενου μικρότερου ακέραιου αριθμού. Είναι φανερό ότι το Ν-1 είναι πλησιέστερο προς το 0 από ότι είναι το Ν. Με άλλα λόγια, διαδοχικές ε-φαρμογές του αναδρομικού βήματος θα οδηγήσουν τελικά στην κατάσταση διακοπής.

82

Page 83: Introduction to Pascal Greek

Πρόγραμμα:function factorial (n: integer): integer;(* αναδρομικός υπολογισμός του N *) begin if (n=0) then factorial := 1 else factorial := n * factorial(n-1) end; (*FACTORIAL*)Αλλά ας προσέξουμε τι συμβαίνει με μία κλήση του υποπρογράμματος μας. Κάθε νέα κλήση της FACTORIAL αυξάνει το αναδρομικό επίπεδο. "Ο μεταγλωττιστής αποθη-κεύει τις τιμές της παραμέτρου Ν της συνάρτησης όπως επίσης και οποιασδήποτε τοπικής μεταβλητής πριν από κάθε νέα κλήση". Κατά τη διάρκεια της κλήσης, υπολογίζεται η έκφραση Ν-1 και καταχωρείται σαν τη νέα τιμή της παραμέτρου Ν. Τελικά η παράμετρος Ν θα γίνει μηδέν και θα δοθεί η τιμή της μονάδας στο όνομα της FACTORIAL με την τελευταία κλήση της (προς τα πίσω διαδικασία). Στη συνέχεια, ο μεταγλωττιστής επιστρέφει από κάθε αναδρομικό επίπεδο και υπολογίζει την τρέχουσα τιμή της FACTORIAL πολλαπλασιάζοντας την παράμετρο που έχει αποθηκεύσει σε αυτό το επίπεδο με την τιμή της FACTORIAL του προηγούμενου επιπέδου. Κατ' αυτό τον τρόπο επιστρέφουμε στο αρχικό επίπεδο (προς τα εμπρός διαδικασία). Τέλος, όταν ολοκληρωθεί η διαδικασία εκτέλεσης μιας κλήσης, ο έλεγχος επιστρέφει στην αμέσως επόμενη εντολή μετά την κλήση. Για παράδειγμα, μια κλήση FACTORIAL(3) περιέχει, κατά τη διάρκεια της εκτέλεσης, μια κλήση FACTORIAL(2). Για τον υπολογισμό της FACTORIAL(2) χρειάζεται ο υπολογισμός της FACTORIAL(1), η οποία με τη σειρά της χρειάζεται την τιμή της FACTORIAL (0) που είναι 1. Έτσι από τη στιγμή αυτή μπορεί, να αρχίσει η προς τα εμπρός διαδικασία, με τον υπολογισμό της FACTORIAL (1) που τώρα μπορεί να υπολογισθεί, (1x1). Στη συνέχεια η FACTORIAL(2) υπολογίζεται σαν 2 x 1 και τέ-λος η FACTORIAL(3):=3x2. Στο σχήμα παρουσιάζεται η εκτέλεση της FACTORIAL(3). Υπάρχουν 4 αναδρομικά επίπεδα (0-3) και τρεις αναδρομικές κλήσεις της FACTORIAL συν την αρχική κλήση. Τα βέλη που έχουν φορά προς τα κάτω δείχνουν την έκφραση που προκύπτει μετά από την εφαρμογή κάθε αναδρομικού βήματος. Μετά την τελευταία αναδρομική κλήση (FACTORIAL(0)), η συνάρτηση πρέπει να επιστρέφει από κάθε κλήση με μια τιμή. Η τιμή που επιστρέφεται είναι εκείνη που υπολογίζεται από τον πολλαπλασιασμό του αποτελέσματος του προηγουμένου επιπέδου με την τιμή της παραμέτρου Ν στο τρέχον επίπεδο. Οι τιμές αυτές δηλώνονται δίπλα από τα βέλη που έχουν φορά προς τα επάνω.

83

Σχήμα: Παρουσίαση της εκτέλεσης της FACTORIAL(3).

Page 84: Introduction to Pascal Greek

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

Ανάλυση:Έστω για παράδειγμα ο ακέραιος 7321. Το ακέραιο μέρος του υπολοίπου της διαίρεσης του αριθμού αυτού με το δέκα μας δίνει το τελευταίο ψηφίο του, ενώ το ακέραιο μέρος του πηλίκου μας δίνει τον αριθμό 732. Συνεχίζοντας τις διαιρέσεις δια του 10 θα λάβουμε στην τελευταία διαίρεση ότι το ακέραιο μέρος του πηλίκου είναι το μηδέν ενώ το ακέραιο μέρος του υπολοίπου θα είναι το 7.

Έτσι έχουμε το παρακάτω πρόγραμμα:

PROGRAM ΑΝΤΙTHETOS (INPUT, OUTPUT);(* αντιστρέφει τα ψηφία ενός ακεραίου *) VAR arithmos: integer;

procedure antistrofh (akeraios: Integer);begin Repeat write (akeraios mod 10:1); akeraios:=akeraios div 10 Until (akeraios =0) end;

begin readln (arithmos); antistrofh (arithmos); writeln end.

Χρησιμοποιώντας τώρα την τεχνική της αναδρομής έχουμε το παρακάτω πρόγραμμα.PROGRAM ANTITHETOS (INPUT, OUTPUT);(* αντιστρέφει τα ψηφία ενός ακεραίου *) VAR arithmos: integer;

procedure antistrofh (akeraios:integer); begin write (akeraios mod 10:1); (* εκτύπωση του ακραίου δεξιού ψηφίου *) if ( ( akeraios div 10) < > 0 ) then antistrofh (akeraios div 10)(* αν υπάρχουν περισσότερα ψηφία τότε να απομονωθεί το ακραίο δεξιό και να επαναληφθεί η όλη διαδικασία*) end; (*antistrofh*)

begin readln (arithmos);

84

Page 85: Introduction to Pascal Greek

antistrofh (arithmos); writeln end.

Πρόβλημα 3Γράψτε ένα πρόγραμμα που να υπολογίζει τον n-ιοστό Fibonacci αριθμό.

Ανάλυση:Ο n-ιοστός αριθμός του Fibonacci ορίζεται ως εξής:

1. Αν n είναι 1 ή 2, τότε ο η-ιοστός αριθμός του Fibonacci είναι 1,2. Αν n>=3, τότε ο η-ιοστός αριθμός του Fibonacci είναι το άθροισμα των δύο

προηγουμένων.Μεταφέροντας τον παραπάνω αλγόριθμο σε Pascal έχουμε:

PROGRAM FIBONUMBERS (INPUT, OUTPUT);(* υπολογίζει τον n-ιοστο αριθμό FIBONACCI *)varnum1, num2: integer;function fibonacci (number: integer): integer; begin if ( ( number=1 ) or ( number=2 ) ) then fibonacci:=1 else fibonacci: = fibonacci ( number-1 ) + fibonacci ( number-2 ) end; (*of fibonacci*)

begin (*main*) readln ( num1, num2 ) ; writeln (' οι αριθμοι fibonacci ', num1:4, num2:4, ' ειναι'); writeln ( fibonacci( num1 ), fibonacci( num2 ) ) end.

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

85

Page 86: Introduction to Pascal Greek

Ασκήσεις

1. Να γραφεί υποπρόγραμμα συνάρτηση που να υπολογίζει το για x πραγματικό

και n ακέραιο

2. Να γραφεί. ένα πρόγραμμα που να υπολογίζει προσεγγιστική τιμή της f '(α) (της τιμής της παραγώγου της συνάρτησης f(x) στο α). Η παράγωγος της f(x) στο α δίνεται

από τον τύπο όπου γενικά οι τιμές της f '(α) για ,

n = 0(1)14.

3. Να γραφεί ένα πρόγραμμα που να βρίσκει τον Μέγιστο Κοινό Διαιρέτη (ΜΚΔ) δύο θετικών ακεραίων αριθμών. Ο ΜΚΔ των m και η, τον οποίο θα συμβολίζουμε με ΜΚΔ(m,n) ορίζεται από την (αλγόριθμος του Ευκλείδη):

4. Ένας πρώτος αριθμός είναι ένας ακέραιος n > 1 του οποίου οι μόνοι διαιρέτες είναι ο 1 και ο εαυτός του. Να γραφεί, μια συνάρτηση, η οποία προσδιορίζει αν ο n είναι ένας πρώτος αριθμός. Στη συνέχεια, να γραφεί ένα πρόγραμμα που να διαβάζει διάφορους ακέραιους αριθμούς και να τυπώνει για κάθε αριθμό αν είναι πρώτος ή όχι.

5. Να γραφεί ένα πρόγραμμα που να υπολογίζει τους δυωνυμικούς συντελεστές ,

για μη αρνητικούς ακέραιους n και k, που δίνονται από τον τύπο:

όπου γενικά

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

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

8. Να γραφεί διαδικασία που να λύνει μια δευτεροβάθμια εξίσωση ( ).

86

Page 87: Introduction to Pascal Greek

Λύσεις των ασκήσεων

1. FUNCTION DYNAMH (x: real; n: integer): real;VAR i, ginomeno: integer;beginif ( x = 0 ) then DYNAMH := 0 else begin ginomeno:=1; for i:= 1 to abs( n ) do ginomeno := ginomeno * x; if ( n > =0 ) then DYNAMH := ginomeno else DYNAMH := 1 / ginomeno end end;

2. PROGRAM PARAGOGOS (INPUT, OUTPUT);VAR A, H, H1 : REAL; N : INTEGER;FUNCTION F (X:REAL): REAL;VAR . .Begin . . Ρ := ορισμός της f(x) End;

FUNCTION PARAGSYN (FUNCTION F: REAL; H, A: REAL): REAL;VAR FAH, FA: REAL;Begin FAH:=F( A+H ); FA :=F(A); PARAGSYN:=( FAH-FA) / H End;

FUNCTION DYNAMH (X: REAL; Ν: INTEGER): REAL;(* Βλ. άσκηση 1 *)…End;

Begin

87

Page 88: Introduction to Pascal Greek

readln(A); For N:=0 to 14 do begin H1:=DYNAMH (2, N); Η :=1 / Η1; writeln (N, H, PARAGSYN ( F, H, A):5:4) endEnd.

3. PROGRAM EYCLIDHS ( INPUT, OUTPUT );VAR m, n: integer;

FUNCTION MKD (m, n: integer): integer;begin if ( (n < =m) and (m mod n=0) ) then MKD : = n else if ( m < n ) then MKD := MKD ( n, m ) else MKD := MKD (n, m mod n) end;

begin readln (m, n); writeln (' MKD( ', m:1, ' , ', n:1,' )= ', MKD( m, n):1) end.

4. Program askisi4;Var I, number: LongInt; Flag: Boolean;

Function Protos(num: Integer): Boolean;Var M: LongInt;Begin M:= ( num Div 2 )+1; Protos:= False; For I:= 2 to M do Begin If ( (num Mod I ) =0 ) then Begin Protos:= True; Break; end; end;end;

88

Page 89: Introduction to Pascal Greek

Begin repeat Write('Give Number='); readln(number); Until( number > 1 ); If ( number = 2 ) then Writeln(' O ',number:12,' einai protos ari8mos') else begin Flag:= Protos( number ); If( Flag=True ) then Writeln(' O ',number:12,' den einai protos ari8mos, diaireitai me to', I:12) else Writeln(' O ',number:12,' einai protos ari8mos'); end; readln;End.

5. PROGRAM DIONYMIKOI ;VAR n, k, dionymsyn: integer;

function paragontiko (m: integer): integer;var k, parag: integer;begin parag := 1; for k:=2 to m do parag := parag * k; paragontiko := parag end;

begin readln (n, k); while (n > =0 ) do begin dionymsyn:= paragontiko (n) div ( paragontiko (k) * paragontiko (n-k ) ); writeln (' ( ', n:1, ':', k:1,' )=', dionymsyn: 1); end end.

6. Program dix;const e=0.00000000001;

var x, a, b, mid, root, fa, fb, fmid, c: real;step: integer;

89

Page 90: Introduction to Pascal Greek

function f(x, c: real): real;begin f:= x * x - c;end;

begin write(' Δώσε το c, c='); read(c); a:=0; b:= c; fa:=f(a, c); fb:=f( b, c); step:=0; while (abs( a-b ) > e) do begin mid :=( a + b ) / 2; step:= step + 1; fmid:=f(mid, c); if ( fmid<>0 ) then begin if ( fmid * fa > 0 ) then begin a:=mid; fa:=fmid; end else begin b:=mid; fb:=fmid; end; end else a:=b; end; root:=mid;writeln('riza= ', root,' se bimata=', step);readln;readln;end.

7. Program anazitisi;

CONST N=5;

TYPE Table = array[1..N] of integer; VAR A, B: Table; el: integer;

Procedure Create(Var Temp:Table; M: Integer); Var

90

Page 91: Introduction to Pascal Greek

i: integer; Begin Randomize; for i:=1 to M do Temp[i]:=Random(201); (* Numbers between 0 and 200 *) end;

Procedure Anathesi(Temp:Table;Var Temp1:Table;M:integer); Var i: integer; Begin for i:=1 to M do Temp1[i]:=Temp[i]; end;

Procedure Ektuposi(Temp:Table; M:integer); Var i:integer; Begin for i:=1 to M do writeln(Temp[i],' '); end;

Procedure Bubble(Var Temp:Table; M:integer); Var i,j,x:integer; Begin for i:=2 to M do Begin for j:=M downto i do if Temp[j-1]>Temp[j] Then Begin x:=Temp[j-1]; Temp[j-1]:=Temp[j]; Temp[j]:=x; end; end; end;

Procedure Seq_Search(Temp:Table; M,x:integer); Var Pos,i: integer; Begin Pos:=0; while (Pos=0) and (i<=M) do begin if(Temp[i]=x) then Pos:=i else i:=i+1; end; if(Pos<>0) then

91

Page 92: Introduction to Pascal Greek

writeln('Element ',x,' found in position ',Pos,' of the table') else writeln('Element ',x,' not found in the table') end;

Procedure Binary_Search(Temp:Table; M,x:integer); Var Pos,Low,High,Mid:integer; Begin Pos:=0; Low:=1; High:=M; while ( ( Pos=0 ) and (Low <= High) ) do begin Mid:=(Low + High) DIV 2; if ( Temp[Mid]=x ) then Pos:=Mid else begin if ( x > Temp[Mid] ) then Low:=Mid+1 else High:=Mid-1 end; end; if ( Pos<>0 ) then writeln('Element ',x,' found in position ',Pos,' of the table') else writeln('Element ',x,' not found in the table') end;

Procedure Anadrom_Binary_Search(Temp:Table; First,Last,x:integer); Var Pos,Mid:integer; Begin (* 1 *) if (First > Last) then begin Pos:=0; writeln('Element ',x,' not found in the table') end else begin Mid:=(First + Last) DIV 2; writeln(Mid); if ( Temp[Mid]=x ) then begin Pos:=Mid; writeln('Element ',x,' found in position ',Pos,' of the table') end else

92

Page 93: Introduction to Pascal Greek

if ( x>Temp[Mid] ) then Anadrom_Binary_Search(Temp,Mid+1,Last,x) else Anadrom_Binary_Search(Temp,First,Mid-1,x) end end; (* 1 *)

Begin Create(A,N); Anathesi(A,B,N);

Ektuposi(A,N); writeln; Bubble(A,N); Ektuposi(A,N); write('Give number for Search Number='); readln(el); Anadrom_Binary_Search(A,1,N,el); readln; End.

8. Program b8mia;Var A, B, C: Real;

Procedure eksisosi( A, B, C: Real);Var D, P, F: real;begin If ( ( A=0) and (B=0) ) then begin If ( C=0 ) then Writeln(' Exei apeires luseis ') else Writeln(' Den exei lusi ') end else if( A=0 ) then Writeln(' Lusi i X=', - c / b) else (* if A<>0) *) if ( C=0 ) then Writeln('luseis to X1=0 kai X2= ',- b / a) else (* if A<>0 and C<>0 *) begin P:= - B / ( 2 * A ); D:= B * B- 4 * A * C; F:= SQRT( ABS ( D ) ) / 2* A;

93

Page 94: Introduction to Pascal Greek

If ( D > 0 ) then Writeln('X1=',P+F,' X2=', P-F) else If ( D = 0 ) then Writeln('Dilpi riza i X1=',P+F) else If ( D < 0 ) then begin Writeln('X1=',P,'+i*',F); Writeln('X2=', P,'-i*',F); end; end;End;

begin Write(' Give A='); readln(A); Write(' Give B='); readln(B); Write(' Give C='); readln(C); eksisosi(A, B, C); Readln;End.

94

Page 95: Introduction to Pascal Greek

Έτοιμες Συναρτήσεις και Διαδικασίες

Αριθμητικές συναρτήσεις

ABS( X )Επιστρέφει την απόλυτη τιμή της παραμέτρου (Χ). Η Χ μπορεί να είναι ή πραγματική ή ακέραια. Το αποτέλεσμα θα είναι πραγματικό ή ακέραιο, αντίστοιχα.

Π.χ. για Κ=55, L=-62, Μ=36.25 και N=0 θα έχουμε. ABS(K) = 55 ABS( L) = 62 ABS(M) = 36.25 ABS(N) = 0

SQR( X ) Επιστρέφει την τιμή του τετραγώνου της Χ (Χ2). Η Χ μπορεί να είναι ή πραγματική ή ακέραια και το αποτέλεσμα είναι πραγματικό ή ακέραιο, αντίστοιχα. Π.χ. για Α=30, Β=10.35 και C= -8.5 θα έχουμε.SQR(A) = 900SQR(B) = 107.1225SQR(C) = 72.25

SQRT( X )Επιστρέφει την τιμή της τετραγωνική ρίζας της παραμέτρου Χ, ( ). Η Χ μπορεί να είναι ή πραγματική ή ακέραια με θετική τιμή ή μηδέν. Το αποτέλεσμα είναι πάντα πραγματικό (Real). Αν η Χ είναι αρνητική, διακόπτεται η εκτέλεση και δίνεται σχετικό μήνυμα. Π.χ. για Α=100 και Β=63.25 θα έχουμε.SQRT(A)= 10.000SQRT(B) = 7.9529

LN( X )Επιστρέφει το φυσικό λογάριθμο της παραμέτρου Χ. Η Χ μπορεί να είναι πραγματική ή ακέραια αλλά θετική. Το αποτέλεσμα είναι πάντοτε πραγματικό.

ΕΧΡ( Χ )Επιστρέφει την τιμή του ex. Η Χ μπορεί να είναι πραγματική ή ακέραια και το αποτέλεσμα είναι πάντοτε πραγματικό.

SIN( X )Επιστρέφει το ημίτονο της Χ. Η Χ μπορεί να είναι πραγματική ή ακέραια εκ-φρασμένη σε ακτίνια. Το αποτέλεσμα είναι πάντοτε πραγματικό.

COS( X )Επιστρέφει το συνημίτονο της Χ. Η Χ μπορεί να είναι πραγματική ή ακέραια εκφρα-σμένη σε ακτίνια. Το αποτέλεσμα είναι πάντοτε πραγματικό.

95

Page 96: Introduction to Pascal Greek

ARCTAN( X )Επιστρέφει το τόξο της εφαπτομένης της παραμέτρου Χ. Η Χ μπορεί να είναι πραγματική ή ακέραια εκφρασμένη σε ακτίνια. Το αποτέλεσμα είναι πάντοτε πραγματικό.

Λογικές (boolean) συναρτήσειςΟι συναρτήσεις αυτές παίρνουν τιμές μόνο True ή False, δηλαδή μόνο λογικές τιμές.

ODD( X )Ελέγχει έναν ακέραιο αριθμό (Χ) αν είναι μονός ή ζυγός και επιστρέφει τη λογική τιμή True, αν ο αριθμός είναι μονός ή τη λογική τιμή False, αν ο αριθμός είναι ζυγός. Π.χ. για Α=357 και Β=264 θα έχουμε:ODD(A) = True. ODD(B) = False.

Συναρτήσεις μετασχηματισμούΟι συναρτήσεις αυτές χρησιμοποιούνται για να μετασχηματίζουν αριθμούς και χαρα-κτήρες από τον έναν τύπο στον άλλο.

CHR( X )Επιστρέφει το χαρακτήρα που αντιστοιχεί στον ακέραιο αριθμό Χ, με βάση κάποιο κώδικα (συνήθως ASCII ή EBCDIC). Σε περίπτωση που δεν υπάρχει αντιστοιχία, δίνεται σχετικό μήνυμα. Π.χ.CHR(74) = J CHR(84) = ΤCHR(51) = 3

ORD( X )Επιστρέφει τον αντίστοιχο ακέραιο του χαρακτήρα Χ, με βάση κάποιο κώδικα (συνήθως ASCII ή EBCDIC). Δηλαδή κάνει αντίστροφη εργασία από αυτή που κάνει η συνάρτηση CHR(X). Π.χ.ORD(K) = 75 ORD(A) = 65ORD(5) = 53

ROUND( X )Επιστρέφει την αξία του ακέραιου μέρους του πραγματικού αριθμού Χ, στρογγυλε-μένη προς τα πάνω ή κάτω. Αν το δεκαδικό μέρος είναι 5-9, η στρογγυλοποίηση γίνε-ται προς τα πάνω για θετικούς αριθμούς, και προς τα κάτω για αρνητικούς αριθμούς.

Π.χROUND(5.62) = 6 ROUND(-5.62) = -6 ROUND(7.55) = 8 ROUND(-7.55) = -8ROUND(2.49) = 2 ROUND(-2.49) = -2

96

Page 97: Introduction to Pascal Greek

TRUNC( X )Επιστρέφει μόνο το ακέραιο μέρος του δεκαδικού αριθμού (Real), δηλαδή κάνει αποκοπή (truncation) του κλασματικού μέρους του Χ. Π.χ.TRUNC(8.52) = 8 TRUNC(-4.57) = -4 TRUNC(6.45) = 6 TRUNC(-7.35) = -7

SUCC( X )Επιστρέφει την επόμενη αξία της τιμής του Χ. Π.χ.SUCC(21) = 22 SUCC(K) = L SUCC(-6) = -5

PRED( X )Επιστρέφει την προηγούμενη αξία της τιμής του Χ. Π.χ.PRED(45) = 44 PRED(-7) = -8 PRED(C) = Β

Με τη χρήση των έτοιμων συναρτήσεων, το πρόγραμμα γράφεται πιο εύκολα και βελτιώνεται η δομή του. Μία συνάρτηση μπορεί να καλέσει τον ίδιο της τον εαυτό, π.χ. SQR ( (SQR(K) ).Χρειάζεται κάποια προσοχή στον τύπο των παραμέτρων και των αποτελεσμάτων των συναρτήσεων. Η παράμετρος και το αποτέλεσμα δεν είναι πάντοτε υποχρεωτικά του ίδιου τύπου. Π.χ. η συνάρτηση TRUNC(X) έχει παράμετρο Real και αποτέλεσμα Integer.

97

Page 98: Introduction to Pascal Greek

Βιβλιογραφία

Τίτλος Συγγραφέας

Μαθήματα Προγραμματισμού Borland Pascal 7.0 Manfred Fussinger

Εισαγωγή στην Pascal και την Turbo Pascal Rodnay Zaks

Pascal Θεωρία - Προγράμματα Βατικιώτης Α.

Pascal Θεοδώρου Γ.

Δομές Δεδομένων Μανωλόπουλος Γ.

Pascal καιTurbo Pascal Μισυρλής Ν.

Γλώσσα Προγραμματισμού Pascal Μοσχοβίνος Μ., Βασιλείου Σ.

Προγραμματισμός Υπολογιστών Τ.Ε.Ε (1ος Κύκλος Β' Τάξη)

Λάμπρος

98