Вы находитесь на странице: 1из 99

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

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

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

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

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

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

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

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

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

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

Οι τύποι δεδομένων και τα όρια τους στην Pascal καθορίζονται αυστηρά.


Μερικές γλώσσες προγραμματισμού επιτρέπουν στον προγραμματιστή να καθορίσει
τις σταθερές και τις μεταβλητές με έναν τυχαίο τρόπο έκφρασης και μετά να
συνδυάζουν δεδομένα με έναν ακόμα πιο τυχαίο τρόπο. Για παράδειγμα, αν
αναμειγνύατε τον αριθμό των αυγών, στην παραπάνω συνταγή, με τον αριθμό των
φλιτζανιών από αλεύρι, θα το κάνατε με μια έγκυρη μαθηματική πρόσθεση, αλλά θα
είχατε ένα τελείως άχρηστο αποτέλεσμα. Μερικές γλώσσες προγραμματισμού σας
επιτρέπουν να επιτελέσετε μια τέτοια πράξη και να εμφανίσετε το άχρηστο
παραγόμενο αποτέλεσμα. Επειδή όμως η Pascal απαιτεί από σας να καθορίσετε τις
σταθερές και τις μεταβλητές σας με έναν ακριβή τρόπο, η πιθανότητα μια τέτοιας
ανώφελης πράξης ελαχιστοποιείται. Ένα καλογραμμένο πρόγραμμα σε Pascal έχει
πολλά σημεία ελέγχου ώστε να αποφεύγεται το ενδεχόμενο μιας απολύτως
μπερδεμένης και χωρίς ουσία εκτύπωσης.
Παράδειγμα:
Pascal C
Program ena; #include <stdio.h>
Var I: integer; int I;
C:char; char C;
Begin main( )
C:=’a’; {
I:=C; δεν επιτρέπεται λόγω C=’a’;
ασυμβατότητας τύπων I=C; επιτρέπεται, θα καταχωρίσει στο I τον
End. ASCII αριθμό του γράμματος α
}

3
Πρόκειται για μια γλώσσα υψηλού επιπέδου ( αντίθετα η 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
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 USES crt;
όνομα1,…, όνομαn : είναι ονόματα
μονάδων που περιέχουν διαδικασίες -
συναρτήσεις
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
.
.
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
συγκεκριμένου τύπου. Εάν προσπαθήσουμε να δώσουμε τιμή εκτός των ορίων του
τύπου της τότε τα αποτελέσματα είναι απρόβλεπτα. Υπάρχουν απλοί ή στοιχειώδεις
και σύνθετοι τύποι δεδομένων.
Οι προσδιορισμένοι από την 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
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
Τελεστές πράξεων:
πράξη σύμβολο
πρόσθεση +
αφαίρεση -
πολ/σμός *
διαίρεση /

με τις πράξεις +,-, * έχω:


int πράξη int δίνει int
int πράξη real δίνει real

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

Εκτός των άνω υπάρχουν και οι:


DIV (ακέραια διαίρεση, γίνεται μόνο μεταξύ ακεραίων και δίνει αποτέλεσμα
ακέραιο) π.χ: 19 DIV 3 δίνει αποτέλεσμα 6
MOD (Υπόλοιπο ακέραιας διαίρεσης) 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
P Q P and Q P or Q P xor Q NOT p
True True True True False False
True False False True True False
False True False True True True
False False False False False True

Ιεράρχηση: (από τη μεγαλύτερη προς τη μικρότερη)


1. παρενθέσεις
2. NOT
3. *, /, DIV, MOD, AND
4. +, -, OR, XOR
5. <, >, <=, >=, <>

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

10
Εντολές Εισόδου / Εξόδου
Τα δεδομένα των προγραμμάτων λαμβάνονται από μια μονάδα εισόδου, όπως για
παράδειγμα το πληκτρολόγιο. Για την εισαγωγή των δεδομένων η 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) 66 d=66 e=77


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
Παρατηρήσεις:
• Τα δεδομένα της γραμμής 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) 10 20 a=10
readln(b) 30 40 b=30
readln(c) 50 60 c=50

2 readln(a,b,c) 10 20 a=10 b=20 c=30


readln(d,e) 30 40 d=50 e=60
50 60
3 readin (a, b) 10 20 a=10 b=20
readln(c,d) 30 40 c=30 d=40 e=50
readln(e) 50 60

4 readln(a) 10 20 a=10
readln(b) 30 40 b=30
readln(c,d,e) 50 60 c=50 d=60 e=?

5 readln(a,b) 10 20 a=10 b=20


readin 30 40 c=50
readln(c) 50 60

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

12
• Μια εντολή 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
Παράδειγμα: 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
Εντολή εκχώρησης ή αντικατάστασης

Μορφή: μεταβλητή : = έκφραση


Ενέργεια: Το περιεχόμενο της μνήμης που ορίζεται με το όνομα της μεταβλητής που
βρίσκεται αριστερά του := αντικαθίσταται από την τιμή που ορίζεται από την
έκφραση η οποία βρίσκεται δεξιά του := (συμβόλου αντικατάστασης). Ο
συμβολισμός := θα πρέπει να θεωρείται ως ένα μόνο σύμβολο και για το λόγο αυτό
δεν επιτρέπονται κενά. Η έκφραση του δεξιού μέρους μπορεί να είναι και μία
σταθερά ή άλλη μεταβλητή και τότε η τιμή τους αντικαθιστά την τιμή της μεταβλητής
που βρίσκεται αριστερά.
Παραδείγματα:
χ:=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
Ασκήσεις
1. Να γράψετε πρόγραμμα που να τυπώνει:
στη γραμμή 1: ΙΕΚ ΑΡΤΑΣ
στη γραμμή 2: το όνομα σας
στη γραμμή 3: ημερομηνία

2. Να γράψετε πρόγραμμα στο οποίο να γίνεται εισαγωγή των δεδομένων μήκος,


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

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


διπλάσιο και το τριπλάσιο του. Να γίνει η ίδια διαδικασία για τους 2 επόμενους απ'
αυτόν αριθμούς. Η μορφή της εκτύπωσης να είναι σύμφωνα με το παρακάτω
υπόδειγμα:
8 16 24
9 18 27
10 20 30

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

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

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

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

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


τις 5 πρώτες δυνάμεις του και το άθροισμα των 3 πρώτων δυνάμεων του.

16
9. Να γράψετε πρόγραμμα που να διαβάζει θερμοκρασία σε βαθμούς Fahrenheit και
( f − 32) = c
να τη μετατρέπει σε βαθμούς Κελσίου. Ο τύπος μετατροπής είναι:
9 5

10. Να γράψετε πρόγραμμα που να διαβάζει τους συντελεστές α, β, της πρω-


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

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

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
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
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
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
Εντολές επιλογής και αποφάσεων

Αλλαγή σειράς εκτέλεσης των εντολών


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

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
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
Απλή Εναλλακτική Δυνατότητα (Δίπλευρη Επιλογή)
Μια εταιρία ταχυδρομικών πωλήσεων προσφέρει έκπτωση 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 := pliroteo := paraggelia pliroteo := pliroteo:= paraggelia •(1-
paraggelia •(1-0.04) paraggelia •(1-0.1) 0.1-0.04)
ΕΞΟΔΟΣ πληρωτέου ποσού (pliroteo)

24
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
οποιοσδήποτε διατεταγμένος τύπος (ακέραιος, χαρακτήρας κλπ)
• Η έκφραση είναι ο επιλογέας (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
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
Ασκήσεις
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
απαγορευτικό μήνυμα, αλλιώς τυπώνει το ποσό ανάληψης και το υπόλοιπο των
καταθέσεων.

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
Εντολές επανάληψης

Βασικοί στόχοι:
Να κατανοήσουμε τη χρησιμότητα της δομής επανάληψης, που παρέχει ο
προγραμματισμός.
Ειδικοί στόχοι:
• Να κατανοήσουμε τη λειτουργία της εντολής 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
Στο παράδειγμα που ακολουθεί χρησιμοποιείται ένας μετρητής για τον έλεγχο των
επαναλήψεων. Ο μετρητής παίρνει αρχική τιμή έξω από τον κύκλο των
επαναλήψεων, και αυξάνει κατά 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;

31
writeln(sum:10:4) ;
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; metritis:=1;
while metritis <= 100 do repeat
begin εντολή1;
εντολή1; εντολή2;
εντολή2; ...
…. metritis:=metritis+1
metritis:=metritis+1 ; until metritis > 100
end;

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

32
τιμή true.

Παραδείγματα:
Program sum2; program sum2;
{Ανάγνωση αριθμών μέχρις ότου το {Ανάγνωση αριθμών μέχρις ότου το
άθροισμα τους γίνει μεγαλύτερο από ένα άθροισμα τους γίνει μεγαλύτερο
δεδομένο αριθμό} από ένα δεδομένο αριθμό}
var var
orio,ar,sum :real; orio,ar,sum :real;
begin begin
read(orio) ; read(orio) ;
sum:=0; sum:=0;
while sum <= orio do repeat
begin readln(ar) ;
readin(ar); sum:=sum+ar;
sum:=sum+ar; until sum > orio
end; wrilteln(sum:10:4);
writeln(sum:10:4); end.
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
επανάληψης αλλιώς εκτελείται ο κύκλος των εντολών επανάληψης και ο
μετρητής αυξάνεται κατά 1.
• ο κύκλος επαναλαμβάνεται μέχρι ο μετρητής να γίνει μεγαλύτερος από n

Η προηγούμενη εντολή for εμφανίζεται μαζί με την ισοδύναμη της while στον πίνακα
που ακολουθεί.
for metritis := 1 to n do metritis:=1;
statement; 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 for metritis := anwtero_orio downto katwtero _orio do
statement; statement;

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

Με το παράδειγμα που ακολουθεί τυπώνουμε το Αγγλικό αλφάβητο


for letter: = 'A' to 'Z' do
write(letter);

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

Η εντολή for είναι πολύ εύχρηστη. Πρέπει να θυμόμαστε ότι έχει σχεδιαστεί για
επαναλήψεις ελεγχόμενες με μετρητή, για τον οποίο γνωρίζουμε την αρχική και την
τελική τιμή.
Για αποτελεσματική χρήση της εντολής:
• Η μεταβλητή ελέγχου δεν πρέπει να αλλάζει τιμές μέσα στον κύκλο της
επανάληψης. Μπορεί να εμφανίζεται σε μία έκφραση, αλλά όχι στο αριστερό
μέλος της εντολής αντικατάστασης, οπότε αλλάζει η τιμή της
• Η μεταβλητή ελέγχου μεταβάλλεται κατά βήματα παίρνοντας την επόμενη ή
την προηγούμενη τιμή από το πεδίο τιμών της. Αν η μεταβλητή είναι
ακέραιος, τότε το βήμα είναι 1. Αν χρειαζόμαστε άλλο βήμα, επιλέγουμε την
εντολή while.
• Μετά το τέλος της επανάληψης η μεταβλητή ελέγχου έχει απροσδιόριστη
τιμή. Αν τη χρησιμοποιήσουμε ή θα πάρουμε μήνυμα λάθους ή λάθος
αποτελέσματα ανάλογα με το μεταφραστικό πρόγραμμα (compiler) που
χρησιμοποιούμε.
• Ο κύκλος επανάληψης εκτελείται με τη μεταβλητή ελέγχου να παίρνει τιμές
την αρχική, την τελική και τα ενδιάμεσα βήματα. Αν η αρχική τιμή είναι ίση
με την τελική, ο κύκλος εκτελείται μια μόνο φορά. Στην περίπτωση to αν η
αρχική τιμή είναι μεγαλύτερη από την τελική, ο κύκλος δεν εκτελείται. Στην
περίπτωση downto αν η αρχική τιμή είναι μικρότερη από την τελική τιμή, ο
κύκλος δεν εκτελείται.

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

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

Παράδειγμα:
program sum 3;
uses crt;
{Ανάγνωση αριθμών και υπολογισμός του αθροίσματος τους μέχρις ότου το πλήθος
τους γίνει μεγαλύτερο από ένα δεδομένο αριθμό}
var
ar,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

36
ΕΞΟΔΟΣ grammi * stili
Αλλαγή γραμμής

PROGRAM propaideia;
VAR
grammi, 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

37
clrscr;
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
Ασκήσεις
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
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
Να χρησιμοποιήσετε την εντολή 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
The 10th FIBONACCI is…
Η ακολουθία Fibonacci ορίζεται ως εξής: αν=α ν-1 + α ν-2, α0=α1=1

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

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 if (vathmos=1) then writeln ('άριστα')
1 : writeln (' άριστα '); else if (vathmos=2) then writeln ('λίαν καλώς')
2 : writeln (' λίαν καλώς '); else if (vathmos=3) then writeln ('καλώς')
3 : writeln (' καλώς '); else if (vathmos=4) then writeln ('σχεδόν καλώς')
4 : writeln (' σχεδόν καλώς '); else if (vathmos=5) then writeln ('απορρίπτεται' )
5 : writeln (' απορρίπτεται ' ); else writeln(' λάθος χαρακτηρισμός ');
else writeln(' λάθος χαρακτηρισμός ')
end; {case}

43
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
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
'+': 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
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
Repeat write(arithmos:5);
write(arithmos:5);
arithmos:=arithmos+1;
until( arithmos >= 11);

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; program ask9;


var telos:boolean; var
arithmos, metritis:integer; arithmos, metritis,i:integer;
Begin Begin
telos := false; for i:=1 to 2000 do begin
repeat metritis:=metritis + 1;
metritis:=metritis + 1; arithmos:=arithmos + 2;
arithmos:=arithmos + 2; if arithmos > 100
if arithmos > 10 then break;
then telos :=true; end;
until telos; writeln(metritis);
writeln(metritis); readln;
readln; End.
End.
Η εντολή break τερματίζει το loop των εντολών επανάληψης (for, repeat ή while)

10. metritis: 0123 4 5 6 7 8 9


athroisma: 0 1 3 6 10 15 21 28 36 45
O metritis αυξάνει κατά 1, ενώ το athroisma είναι η πρόσθεση των 0+1+…+ metritis

48
program ask10; program ask10;
var var
athroisma, metritis:integer; athroisma, metritis:integer;
Begin
Begin athroisma:=0;
athroisma:=0; for metritis :=0 to 9 do begin
metritis :=0; athroisma:=athroisma + metritis;
repeat writeln(metritis:10,athroisma:10);
athroisma:=athroisma + metritis; end;
writeln(metritis:10,athroisma:10); readln;
metritis:= metritis + 1; End.
until metritis>=10;
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
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
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
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
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
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
Δομημένοι Τύποι Δεδομένων

Εκτός από τους απλούς τύπους δεδομένων (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; program ant_sei;


var vath1,vath2,vath3 uses crt;
vath999,vath1000 : integer; var
begin deikti: 1..1000;
readln (vath1) ; vath:array [1..1000] of integer;

55
readln (vath2) ; begin
… for deikti:=1 to 1000 do
readln (vath1000) ; readln(vath[deikti] ) ;
writeln (vath1000) ; for deikti:=1000 downto 1 do
writeln (vath999) ; writeln(vath[deikti] ) ;
... readln;
writeln (vath1); end.
readln
end.

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

Δήλωση μονοδιάστατου πίνακα


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

Παραδείγματα:
α) Ο πίνακας που ακολουθεί είναι πίνακας μιας διάστασης (1 γραμμής και 8 στηλών)
στον οποίο έχουν καταχωρηθεί 8 ακέραιοι αριθμοί.
περιεχόμενα
15 12 4 3 18 20 10 12
1ο 2ο 3ο 4ο 5ο 6ο 7ο 8ο

56
τάξη

Η αντίστοιχη δήλωση θα είναι:


var
pin: array[1..8] of integer;

όνομα πίνακα: pin


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

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

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

γ) Ο αλφαριθμητικός τύπος (string) μπορεί να θεωρηθεί ως μονοδιάστατος


πίνακας χαρακτήρων του οποίου το πρώτο στοιχείο έχει τάξη 1.
var
met: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
Δήλωση πολυδιάστατου πίνακα
Ο τρόπος δήλωσης ενός πίνακα με όνομα Α με περισσότερους από ένα δείκτες είναι:
var
A: array [τύπος 1ου δείκτη, τύπος 2ου δείκτη,...] of τύπος-στοιχείων-πίνακα

Παραδείγματα:
α) στήλες

1 2 3
1 10 12 23
γραμμές 2 15 4 2
3 1 77 83
4 23 45 67

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

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

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

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

γ)
type
pinakas =array [1..100] of real;
var
table :array [1..10] of pinakas

δ) Ο ορισμός του παραδείγματος γ είναι ισοδύναμος με τον παρακάτω:


var
table: array [1..10,1..100] of real;

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

1) Να γραφεί πρόγραμμα το οποίο να διαβάζει τα στοιχεία ενός μονοδιάστατου


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

58
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;
begin
for 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
2) Να γραφεί πρόγραμμα που να δημιουργεί συμμετρικό πίνακα 6 x 6, όπου τα
στοιχεία της κύριας διαγωνίου είναι 1, τα στοιχεία πάνω από τη διαγώνιο 2 και τα
στοιχεία κάτω από τη διαγώνιο 0. Στη συνέχεια να τυπώνει τον πίνακα κατά γραμμές.

program pinakas2;
uses crt;
Const
N= 6;
TYPE
Pinakas= array[1..N, 1..N] of integer;
var
I, 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
Πρόβλημα 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);
(* ΧΡΗΣΙΜΟΠΟΙΕΙ ΤΗ ΜΕΘΟΔΟ ΤΗΣ ΦΥΣΑΛΛΙΔΑΣ *)
Var
J, 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
Επίσης μια άλλη μορφή είναι η παρακάτω:

Procedure TAXI (Var Μ: PINAKAS; ARITHMOS: Integer);


Var
TAXMSH: 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
Υποπρόγραμμα διαδικασία
Procedure EPILOGH (Var Μ: PINAKAS; Ν:Integer);
(* χρησιμοποιεί τη μέθοδο της επιλογής *)
Var
I, J, MEG, PROS: Integer;
Begin
For 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
Ασκήσεις
1. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω:
α) Να εισάγετε τα στοιχεία ενός πίνακα 4 x 3 από το πληκτρολόγιο
β) Να προσθέτει τα στοιχεία κάθε γραμμής και να τα τοποθετεί σε μονοδιάστατο
πίνακα κατάλληλης διάστασης.

2. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω:


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

3. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω:


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

4. Να γραφεί πρόγραμμα το οποίο, αφού διαβάσει τη διάσταση Ν, δύο μο-


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

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

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


πίνακα είναι τύπου εγγραφή αποτελούμενη από το όνομα Μαθητή και το βαθμό του
στην Pascal.

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

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

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


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

Μια μεταβλητή τύπου record δηλώνεται ως εξής: Μετά το όνομα της μεταβλητής,
ακολουθεί η λέξη RECORD, και στη συνέχεια τα πεδία (στοιχεία) της εγγραφής, το
καθένα με τον τύπο του. Τα πεδία διαχωρίζονται με ερωτηματικά.
Προσοχή: η δήλωση μιας μεταβλητής τύπου record τελειώνει πάντα με τη λέξη END.
Το παραπάνω αρχείο θα μπορούσε λοιπόν να δηλωθεί ως εξής:
Arxeio : RECORD
Onoma : string[10];
Eponumo : string[15];
Mistos : real;
END;

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

65
Δυναμικές Μεταβλητές:
Οι δυναμικές μεταβλητές δεν περιέχουν τις ίδιες τις τιμές, αλλά μόνο τη διεύθυνση
της τιμής δείχνουν σε μια περιοχή της μνήμης- γι' αυτό και οι μεταβλητές αυτές
ονομάζονται δείκτες.
Δυναμικές μεταβλητές σημαίνει ότι σ' αυτές διατίθεται μνήμη μόνο κατά τη διάρκεια
της εκτέλεσης του προγράμματος. Στις δυναμικές μεταβλητές διατίθεται η συνολική
μνήμη σωρού (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
PROGRAM deiktis2;
USES crt;

VAR
deiktis : ^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
Η μεταβλητή 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
Λύσεις ασκήσεων – Πίνακες

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
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
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
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
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
Υποπρογράμματα ( Διαδικασίες – Συναρτήσεις )

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


Οι διαδικασίες δεν είναι τίποτε άλλο από υποπρογράμματα. Μπορούν να χρησιμο-
ποιηθούν για τη διάσπαση ενός "μεγάλου" προγράμματος σε ενότητες.. Οι διαδικα-
σίες όμως μπορούν να καταφέρουν πολύ περισσότερα από τη διάσπαση ενός προ-
γράμματος. Μπορούν να καλούνται από το κύριο πρόγραμμα με διαφορετικές παρα-
μέτρους κάθε φορά.
Το κύριο πρόγραμμα διαβιβάζει σε κάθε διαδικασία που καλεί και τις κατάλληλες
τιμές. Οι τιμές αυτές ονομάζονται πραγματικές παράμετροι (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
Κατά τον ορισμό της διαδικασίας 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
Παράμετροι τιμών: Οι παράμετροι a και b του κύριου προγράμματος δεν πρόκειται
αλλάξουν τιμή μετά την κλήση της διαδικασίας γι’ αυτό, στην αρχή της διαδικασίας,
οι τυπικές παράμετροι ορίζονται σαν παράμετροι τιμών. Πριν τις παραμέτρους δεν
υπάρχει τώρα κανένα χαρακτηριστικό (VAR).
Η εκτέλεση του προγράμματος γίνεται ως εξής: Στο κύριο πρόγραμμα γίνεται η
εισαγωγή των μεγεθών a και b. Οι τιμές αυτές διαβιβάζονται στη διαδικασία enallagi,
που πραγματοποιεί μιαν εναλλαγή των δύο τιμών.
Για καλύτερο έλεγχο του προγράμματος, τυπώστε τις τιμές μέσα από τη διαδικασία.
Θα διαπιστώσετε ότι τα αλλαγμένα μεγέθη δεν επιστρέφονται στο κύριο πρόγραμμα.
(τυπώστε τις κύριες μεταβλητές a και b μετά την εκτέλεση της διαδικασίας.)
Γενικά, η αρχή της διαδικασίας μπορεί να παρασταθεί ως εξής:
Procedure όνομα διαδικασίας ( VAR ονόματα παραμέτρων χωριζόμενα με κόμμα :
τύπος παραμέτρων) ; ( * VAR Το μπορεί και να μην υπάρχει *)

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

ΔΙΑΔΙΚΑΣΙΑ χωρίς παραμέτρους ΠΡΟΓΡΑΜΜΑ ίδιο με τη διαδικασία

Procedure athroisma; Program athroisma;


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

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

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

76
end; readln(num) ;
writeln('AΘΡΟΙΣΜΑ=',sum) ; sum:=sum+num;
end; end
end;
begin {*κλήση διαδικασίας *}
athroisma; begin
end. write('αριθμός προσθετέων=');
readln(n) ;
athroisma(n, athr);
{*διαδικασιας με παραμέτρους*}
writeln(' άθροισμα= ', athr:10:2) ;
end.

Program test_subroutines3; ΕΚΤΕΛΕΣΗ


uses crt; αριθμός προσθετέων=3
var n=3
n :integer;
athr : real;
ΑΘΡΟΙΣΜΑ=0.00
procedure athroisma(m:integer; var sum :real); 3
{Η υπορουτίνα υπολογίζει το άθροισμα m αριθμών. 5
Το αποτέλεσμα στη μεταβλητή sum }
var num, i : integer; 1 αριθμός 10
begin 2 αριθμός 20
sum:=0; 3 αριθμός 30
writeln (m) ; 4 αριθμός 40
m:=m+2; 5 αριθμός 50
writeln(m) ; 5
for i:=1 to m do ΑΘΡΟΙΣΜΑ= 150.00
begin n=3
write (i, ' ');
write ('αριθμός=');
readln(num) ;
sum:=sum+num;
end ;
writeln(m);
end;

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

77
Συναρτήσεις με Διαβίβαση Παραμέτρων
Και οι συναρτήσεις είναι υποπρογράμματα, όπως οι διαδικασίες.
Οι πιο σημαντικές διαφορές ανάμεσα στις συναρτήσεις και τις διαδικασίες είναι οι
εξής:
• Οι συναρτήσεις επιστρέφουν πάντα μια τιμή. Οι διαδικασίες μπορούν να
επιστρέφουν περισσότερες ή και καμία τιμή.
• Οι συναρτήσεις μπορούν να χρησιμοποιηθούν σε μια πρόταση απόδοσης
τιμής ή σε μια πρόταση εξόδου. Με τις διαδικασίες κάτι τέτοιο δεν είναι
δυνατό.

Παράδειγμα:
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
Παραδείγματα συναρτήσεων:

program test_functionl; Το πρόγραμμα καλεί τη συνάρτηση power για


uses crt; τον υπολογισμό δυνάμεων και οι πραγματικές
var i : integer; παράμετροι ba, ek αντικαθιστούν τις τυπικές
ba, ek :integer; παραμέτρους, basi, ekth, για τον υπολογισμό
των δυνάμεων αυτών.
function power(basi, kth: integer): real; Η συνάρτηση power υπολογίζει τη δύναμη ενός
var apotel : real; αριθμού με δεδομένα τη βάση και τον εκθέτη.
begin basi, ekth είναι οι τυπικές παράμετροι.
apotel:=1; Με διάβασμα δίνονται τιμές στις πραγματικές
for 1:=1 to ekth do παραμέτρους και καλείται η συνάρτηση.
apotel:=apotel* basi; Στον πίνακα που ακολουθεί εμφανίζονται τα
power:=apotel; δεδομένα (βάση, εκθέτης) και τα αποτελέσματα
end; (δύναμη) που υπολογίζονται με κλήση της
συνάρτησης. δώσε βάση, εκθέτη( 0 για τέλος)
begin
clrscr; βάση εκθέτης δύναμη
writeln('δώσε βάση, εκθέτη(0 για τέλος )') ; 5 2 25.0
readln(ba, ek); 5 3 125.0
writeln('βάση ':11, 'εκθέτης ':10, δύναμη':30 ); 5 4 625.0
while ( ba > 0) do 2 8 256.0
begin 2 16 65536.0
writeln(ba :10, ek :10,power(ba,ek) :30 :1 ) 2 32 4294967296.0
readln(ba, ek) ; 2 64 18446744074000000000.0
end;
end.

program test_functon2; To πρόγραμμα καλεί τη συνάρτηση tetragwno


uses crt; για τον υπολογισμό του εμβαδού με πραγμα-
var pl :integer; τική παράμετρο pl που αντικαθιστά την τυπική
παράμετρο plevra, για τον υπολογισμό του εμ-
βαδού
function tetragwno (plevra:integer):integer;
var i :integer; Η συνάρτηση υπολογίζει το εμβαδόν ενός
begin τετραγώνου
tetragwnο:=plevra * plevra; plevra είναι η τυπική παράμετρος
end;

Begin Με διάβασμα δίνονται τιμές στην πραγματική


Write('πλευρά τετραγώνου='); παράμετρο (pl) και καλείται η συνάρτηση
Readln(pl) ; tetragwno Στον πίνακα που ακολουθεί εμφα-
While (pl > 0) do νίζονται τα δεδομένα (πλευρά) και τα αποτελέ-
Begin σματα (εμβαδόν) που υπολογίζονται με κλήση
Writeln('Έμβαδόν=', tetragwno(pl) ); της συνάρτησης tetragwno.
Write('πλευρά τετραγώνου=') ;
Readln(pl); πλευρά =10 Εμβαδόν =100
end; πλευρά =100 Εμβαδόν =10000
End. πλευρά =25 Εμβαδόν =625

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

program test_functon4; To πρόγραμμα καλεί τη συνάρτηση max με


uses crt; πραγματικές παραμέτρους ar1,ar2,ar3 που
var αντικαθιστούν τις τυπικές παραμέτρους a, b, c
arl,ar2,ar3,z :integer; για την εύρεση του μεγίστου τριών αριθμών.
Η συνάρτηση υπολογίζει το μέγιστο τριών
Function max (a, b, c :Integer):integer; δεδομένων αριθμών.
Begin
if ( a > b ) a, b, c είναι οι τυπικές παράμετροι.
then if ( c > a )
then max: =c
else max:=a
else if (c > b)
then max:=c Με διάβασμα δίνονται τιμές στις πραγματικές
else max:=b; παραμέτρους(ar1,ar2,ar3) και καλείται η
end; συνάρτηση max. Στον πίνακα που ακολουθεί
εμφανίζονται τα δεδομένα (3 αριθμοί) και τα
Begin αποτελέσματα (ο μέγιστος) που υπολογίζεται
Writeln('δώσε 3 αριθμούς( 0 για τέλος) ') ; με κλήση της συνάρτησης max.
readln (ar1, ar2, ar3);
writeln(ar1, ar2, ar3) ;
while (ar1 > 0) do 100 49 80
begin μέγιστος ο 100
z :=max(ar1, ar2, ar3 ); 100 300 124
writeln ( 'μέγιστος', z ); μέγιστος ο 300
writeln('δώσε 3 αριθμούς( 0 τέλος )' ); 100 200 500
readln (ar1, ar2, ar3) ; μέγιστος ο 500
end; 0
end.

Πότε χρησιμοποιούμε συναρτήσεις


Παρακάτω αναφέρονται ορισμένες προτάσεις για τη χρήση συναρτήσεων:
• Αν το τμήμα προγράμματος επιστρέφει περισσότερες από μια τιμές ή αλλάζει
τιμές πραγματικών παραμέτρων τότε δεν χρησιμοποιούμε συνάρτηση.
• Αν το τμήμα προγράμματος εκτελεί είσοδο δεδομένων ή έξοδο αποτελεσμά-
των τότε δε χρησιμοποιούμε συνάρτηση
• Αν το τμήμα προγράμματος επιστρέφει μια τιμή και η τιμή αυτή είναι λογική
(boolean) τότε χρησιμοποιούμε τη συνάρτηση
• Αν το τμήμα προγράμματος επιστρέφει μια τιμή και η τιμή αυτή χρησι-
μοποιείται άμεσα σε μια παράσταση τότε χρησιμοποιούμε τη συνάρτηση
• Αν υπάρχει αμφιβολία είναι προτιμότερο να χρησιμοποιήσουμε μία
διαδικασία. Στη διαδικασία το ρόλο του ονόματος της συνάρτησης παίζει η
μία παράμετρος μεταβλητής.

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

Οι συναρτήσεις περιλαμβάνονται στη γλώσσα Pascal για προσομοίωση Μα-


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

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

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
Πρόγραμμα:
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)), η
συνάρτηση πρέπει να επιστρέφει από κάθε κλήση με μια τιμή. Η τιμή που
επιστρέφεται είναι εκείνη που υπολογίζεται από τον πολλαπλασιασμό του
αποτελέσματος του προηγουμένου επιπέδου με την τιμή της παραμέτρου Ν στο
τρέχον επίπεδο. Οι τιμές αυτές δηλώνονται δίπλα από τα βέλη που έχουν φορά προς
τα επάνω.

Σχήμα: Παρουσίαση της εκτέλεσης


της FACTORIAL(3).

83
Πρόβλημα 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
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 *)
var
num1, 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
Ασκήσεις
n
1. Να γραφεί υποπρόγραμμα συνάρτηση που να υπολογίζει το
x για x
πραγματικό και n ακέραιο

2. Να γραφεί. ένα πρόγραμμα που να υπολογίζει προσεγγιστική τιμή της f '(α) (της
τιμής της παραγώγου της συνάρτησης f(x) στο α). Η παράγωγος της f(x) στο α δίνεται
f (a + h) − f (a)
από τον τύπο f '(a) = lim
h→0 h
όπου γενικά οι τιμές της f '(α) για

1
h = n , n = 0(1)14.
2

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

ΜΚ∆ (m, n) = M Κ∆(m, n) , αν m < n
M Κ∆(m, m mod n) , διαφορετικά

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

n
5. Να γραφεί ένα πρόγραμμα που να υπολογίζει τους δυωνυμικούς συντελεστές 
k 

 
 n n!
, για μη αρνητικούς ακέραιους n και k, που δίνονται από τον τύπο: 
k 
 = k!(n − k)!
 
 1 αν m = 0
όπου γενικά m!= 
2⋅ 3 ⋅ ⋅ ⋅ ⋅ m αν m > 0

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


f (x) = x2 − c , με τη μέθοδο της διχοτόμησης

7. Να γραφεί πρόγραμμα που να δημιουργεί μονοδιάστατο πίνακα μεγέθους 5, τυχαία


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

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


a ⋅ x2 + b⋅ x + c = 0).

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

1. FUNCTION DYNAMH (x: real; n: integer): real;


VAR
i, ginomeno: integer;
begin
if ( 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

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

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;

89
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;

90
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

91
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

92
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

93
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;

94
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.

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

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

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) = 900
SQR(B) = 107.1225
SQR(C) = 72.25

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

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

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

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

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

96
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) = 65
ORD(5) = 53

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

97
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.

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

Τίτλος Συγγραφέας
Μαθήματα Προγραμματισμού Borland Pascal 7.0 Manfred Fussinger
Εισαγωγή στην Pascal και την Turbo Pascal Rodnay Zaks
Pascal Θεωρία - Προγράμματα Βατικιώτης Α.
Pascal Θεοδώρου Γ.
Δομές Δεδομένων Μανωλόπουλος Γ.
Pascal καιTurbo Pascal Μισυρλής Ν.
Γλώσσα Προγραμματισμού Pascal Μοσχοβίνος Μ., Βασιλείου Σ.
Προγραμματισμός Υπολογιστών Τ.Ε.Ε (1ος Κύκλος Β' Τάξη)

Λάμπρος

99

Вам также может понравиться