Академический Документы
Профессиональный Документы
Культура Документы
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), δηλαδή η χρήση μιας σειράς
εντολών ως μία εντολή.
3
Πρόκειται για μια γλώσσα υψηλού επιπέδου ( αντίθετα η C είναι χαμηλού
επιπέδου ) που σημαίνει ότι η σύνταξη των εντολών και των δομών της πλησιάζουν
την καθομιλούμενη Αγγλική γλώσσα.
Παράδειγμα: Η σύνταξη της εντολής for σε
Pascal και σε C.
for I:= 1 to 10 do for( I=1; I<=10; I++ )
Στις περιπτώσεις 1,2 και 3 τα ονόματα αναγνωρίζονται από τον Compiler είτε τα
γράφουμε με μικρά είτε με κεφαλαία ( ή και με συνδυασμό) π.χ τα παρακάτω
ονόματα είναι ίδια (BEGIN, begin, bEgIN, BeGIn)
Στην περίπτωση 3 τα ονόματα. αρχίζουν πάντα με χαρακτήρα και ακολουθούν
χαρακτήρες ή αριθμοί. Έχουν μέγιστο μέγεθος 80 χαρακτήρες από τους οποίους ο
Compiler επεξεργάζεται τους πρώτους 8. Δεν μπορούμε να δώσουμε σαν όνομα
δεσμευμένη λέξη και καλό θα είναι να μην δίνουμε ούτε τυποποιημένη λέξη.
Μορφή Προγράμματος
Ένα πρόγραμμα χωρίζεται σε τρία μέρη:
Επικεφαλίδα
τμήμα δηλώσεων – ορισμών των στοιχείων
τμήμα εκτελέσιμων ενεργειών
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, και για να δείξετε μέσω του ονόματος του προγράμματος το σκοπό του
προγράμματος.
goto 50;
50: εντολή
CONST δηλώσεις ονομάτων σταθερών CONST PI=3.14;
begin
.
5
.
.
end.
Η τελεία που ακολουθεί το end. είναι σημάδι προς τον compiler ότι τελείωσε το
πρόγραμμα του εκτελέσιμου μέρους και επίσης ότι τελείωσε η μεταγλώττιση. Κάθε
πρόγραμμα Pascal έχει μια και μόνη τελεία η οποία θα βρίσκεται στο τέλος του
προγράμματος
Σημεία στίξης:
, (κόμμα) : χρησιμοποιείται για διαχωρισμό ομοίων πραγμάτων (π.χ Var I,j,h:real;)
. (τελεία) : χρησιμοποιείται στο τελικό end ( end.)
; (ελληνικό ερωτηματικό) : χρησιμοποιείται για διαχωρισμό προτάσεων
Γενικός κανόνας: Μην βάζετε ; πριν από τις λέξεις end και else και μετά από τις
λέξεις begin, repeat και case.
( Αν βάλω ; μετά από τη λέξη begin ή πριν από τη λέξη end θα έχω εισαγάγει απλώς
μια κενή εντολή)
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
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
8
Τελεστές πράξεων:
πράξη σύμβολο
πρόσθεση +
αφαίρεση -
πολ/σμός *
διαίρεση /
Η διαίρεση δίνει: int / int δίνει real, int / real δίνει real, real / int δίνει real
Μεταβλητές Boolean:
Μια μεταβλητή με τύπο boolean, μπορεί να λάβει μόνο τιμές TRUE ή FALSE. Αυτή
η μεταβλητή χρησιμοποιείται σε loop, EndOFFile αναγνωριστικά ή σε οποιεσδήποτε
άλλες συνθήκες TRUE ή FALSE μέσα στο πρόγραμμα. Οι μεταβλητές μπορούν να
συγκριθούν μεταξύ τους και να καθορίσουν μια boolean μεταβλητή. Μια πλήρης
λίστα με τους σχεσιακούς τελεστές (που χρησιμοποιούνται για τις συγκρίσεις) είναι η
επόμενη:
= ίσον
<> διάφορο
> μεγαλύτερο
< μικρότερο
μεγαλύτερο ή ίσο
>=
από
<= μικρότερο ή ίσο από
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
Μεταβλητές Char:
Ένας τύπος μεταβλητής char είναι μια πολύ χρήσιμη μεταβλητή, αλλά σχεδόν ποτέ
δεν χρησιμοποιείται μόνη. Είναι πολύ ισχυρή όταν χρησιμοποιείται σε έναν πίνακα ή
σε μια άλλη δηλωμένη από το χρήστη δομή. Η τιμή μιας τέτοιας μεταβλητής
γράφεται σε απλά εισαγωγικά: ‘Α’, ‘ν’, ‘n’ κ.λ.π
Συνοψίζοντας, η μεταβλητή char έχει μέγεθος 1 byte και παίρνει τιμές από τον ASCII
code.
10
Εντολές Εισόδου / Εξόδου
Τα δεδομένα των προγραμμάτων λαμβάνονται από μια μονάδα εισόδου, όπως για
παράδειγμα το πληκτρολόγιο. Για την εισαγωγή των δεδομένων η Pascal
χρησιμοποιεί τις διαδικασίες (procedures) read ή readln. Για την Εμφάνιση των
περιεχομένων μεταβλητών ή σταθερών στην οθόνη, στον Εκτυπωτή ή σ' ένα αρχείο
χρησιμοποιούνται οι διαδικασίες write ή writeln.
Οι εντολές read, readln, write, writeln χρησιμοποιούνται και για ανάγνωση/εγγραφή
από αρχεία τα οποία είναι καταχωρημένα στο δίσκο.
1 read(x) 22 x=22
11
Παρατηρήσεις:
• Τα δεδομένα της γραμμής 3 δεν είναι αρκετά για όλες της παραμέτρους κι έτσι η
εισαγωγή δεδομένων συνεχίζεται στην επόμενη γραμμή.
• Οι μεταβλητές της εντολής read στη γραμμή 4 είναι λιγότερες από τα δεδομένα. Για
το λόγο αυτό, τα επιπλέον δεδομένα είναι διαθέσιμα για την επόμενη εντολή read στη
γραμμή 5.
Στα προηγούμενα παραδείγματα όλες οι μεταβλητές είναι ακέραιες (integer) εκτός
από την f η οποία είναι πραγματική (real).
Οι εντολές read(a), read(b) και read(a, b) είναι ισοδύναμες. Η λίστα των μεταβλητών
διευκολύνει τον προγραμματιστή στην κωδικοποίηση.
1 readln(a) 10 20 a=10
readln(b) 30 40 b=30
readln(c) 50 60 c=50
4 readln(a) 10 20 a=10
readln(b) 30 40 b=30
readln(c,d,e) 50 60 c=50 d=60 e=?
Παρατηρήσεις:
• Δεν υπάρχουν δεδομένα για τη μεταβλητή e η εκτέλεση σταματάει μέχρι να γίνει
εισαγωγή από το πληκτρολόγιο.
12
• Μια εντολή readln χωρίς παραμέτρους έχει ως αποτέλεσμα να παραλειφθεί μία
γραμμή δεδομένων.
write, writeln
writeln('i=', i) i=2
13
Παράδειγμα: write ('Δώσε βασικό μισθό : ');
readln(mistos);
Μορφοποιημένη εκτύπωση
Οι δυο βασικές τεχνικές για τη μορφοποίηση της εκτύπωσης είναι οι κενές γραμμές
και η εισαγωγή κενών στις γραμμές εκτύπωσης. Για να έχουμε κενές γραμμές αρκεί
να δώσουμε την εντολή wrileln χωρίς παραμέτρους τόσες φορές όσες είναι οι κενές
γραμμές που θέλουμε. Για την εισαγωγή κενών στη γραμμή μεταξύ των παραμέτρων
περιλαμβάνουμε και όσα κενά θέλουμε μεταξύ εισαγωγικών.
Ο έλεγχος της μορφής των αποτελεσμάτων στη γραμμή εκτύπωσης γίνεται με
πληροφορία που ακολουθεί την παράμετρο στη διαδικασία write ή writeln. Η
πληροφορία αυτή δίνει το επιθυμητό εύρος του πεδίου δηλαδή τις θέσεις που θα
καταλάβει η παράμετρος κατά την εκτύπωση της.
Για σταθερές/μεταβλητές Ακέραιου ή Αλφαριθμητικού τύπου, η μορφή εκτύπωσης
είναι write (x:m).
Όπου:
x η μεταβλητή που θα τυπωθεί
m το συνολικό πλήθος των θέσεων εκτύπωσης
Η διαδικασία write(x:m), όπου x είναι ακέραια έκφραση, τυπώνει την τιμή της
μεταβλητής x αρχίζοντας από τα δεξιά ενός πεδίου εύρους m. Αν το εύρος είναι
μεγαλύτερο από το μήκος του πεδίου που πρόκειται να τυπωθεί, εμφανίζονται κενά
στην αριστερή πλευρά της τιμής. Αν το εύρος είναι μικρότερο από το μήκος του
πεδίου που πρόκειται να τυπωθεί, αγνοείται η οδηγία μορφοποίησης και
χρησιμοποιείται το ελάχιστο απαιτούμενο εύρος.
Η μορφοποιημένη εκτύπωση μπορεί να χρησιμοποιηθεί και για σταθερές ή
μεταβλητές αλφαριθμητικού τύπου (string). Η χρήση γίνεται όπως και στους
ακεραίους, δηλαδή δίνεται το πλήθος των θέσεων εκτύπωσης της μεταβλητής ή της
σταθεράς. Η στοίχιση γίνεται από δεξιά.
Π.χ. Η εντολή writeln (‘Αριθμός μητρώου.’ :20); θα έχει ως αποτέλεσμα να αφήσει 4
κενές θέσεις εκτύπωσης από την αρχή της γραμμής ή από την τελευταία θέση
εκτύπωσης και μετά να γράψει το περιεχόμενο της σταθεράς δηλαδή: Αριθμός
μητρώου.
14
Εντολή εκχώρησης ή αντικατάστασης
15
Ασκήσεις
1. Να γράψετε πρόγραμμα που να τυπώνει:
στη γραμμή 1: ΙΕΚ ΑΡΤΑΣ
στη γραμμή 2: το όνομα σας
στη γραμμή 3: ημερομηνία
4. Να γράψετε πρόγραμμα στο οποίο να γίνεται εισαγωγή των ψήφων δυο ατόμων για
το καθένα χωριστά. Να βρεθεί ο μέσος όρος των ψήφων και να τυπωθεί η διαφορά
των ψήφων καθενός από το μέσο όρο. Οι αριθμοί κατά την εκτύπωση να
συνοδεύονται από τις κατάλληλες επεξηγήσεις σύμφωνα με το υπόδειγμα.
Η μορφή της εκτύπωσης θα είναι:
Ο Γιώργος πήρε ........ ψήφους
Ο Χάρης πήρε ........ ψήφους
----------------------------------------------------
ο μέσος όρος των ψήφων είναι ........ ψήφοι
----------------------------------------------------
Η διαφορά από το μέσο όρο είναι:
για το Γιώργο ........ ψήφοι
για το Χάρη ........ ψήφοι
5. Να γράψετε πρόγραμμα που να διαβάζει το μήκος της ακτίνας ενός κύκλου και να
τυπώνει τη διάμετρο, το μήκος και το εμβαδόν αυτού του κύκλου ως εξής:
για κύκλο ακτίνας **** εκ. η διάμετρος είναι ***** εκ.
το μήκος της περιφερείας είναι **** εκ. το εμβαδόν του κύκλου είναι ******τετρ.εκ.
6. Να γράψετε πρόγραμμα που να διαβάζει ένα τριψήφιο ακέραιο αριθμό και να τον
τυπώνει ανάστροφα. Π.χ. ο αριθμός είναι 123, ο ανάστροφος είναι 321
16
9. Να γράψετε πρόγραμμα που να διαβάζει θερμοκρασία σε βαθμούς Fahrenheit και
( f − 32) = c
να τη μετατρέπει σε βαθμούς Κελσίου. Ο τύπος μετατροπής είναι:
9 5
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.
21
Εντολές επιλογής και αποφάσεων
IF
Αν μετά το 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. Γράψτε ένα πρόγραμμα με οδηγίες για το χρήστη.
Λύση:
Δομικό διάγραμμα:
αληθές ψευδές
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% της αξίας της παραγγελίας. Γράψτε ένα πρόγραμμα, που θα υπολογίζει
το πληρωτέο ποσό με δεδομένα την αξία της παραγγελίας και τη χρονική διάρκεια.
Λύση:
αληθές ψευδές
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
25
οποιοσδήποτε διατεταγμένος τύπος (ακέραιος, χαρακτήρας κλπ)
• Η έκφραση είναι ο επιλογέας (selector) της case.
• Η λίστα ετικετών της case είναι μια λίστα διατεταγμένων τιμών του ίδιου
τύπου με τον επιλογέα της case.
Αν η έκφραση δεν πάρει καμιά από τις αναφερόμενες τιμές, τότε εκτελείται η εντολή-
λ, εφόσον έχει δηλωθεί μέσω της else. Αν σε μία επιλογή πρέπει να εκτελεστούν
περισσότερες εντολές, τότε χρησιμοποιούμε τη σύνθετη εντολή μέσω των begin-end.
Ακολουθούν χαρακτηριστικά παραδείγματα για την κατανόηση της case.
Παραδείγματα:
α) 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 αριθμός είναι άρτιος ');
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;
28
απαγορευτικό μήνυμα, αλλιώς τυπώνει το ποσό ανάληψης και το υπόλοιπο των
καταθέσεων.
10. Να γράψετε πρόγραμμα που να διαβάζει 4 βαθμούς, να βρίσκει το μέσο όρο τους
και, αν αυτός είναι μεγαλύτερος από 15, τυπώνει ΕΠΙΤΥΧΩΝ.
13. Να γράψετε πρόγραμμα που να διαβάζει το αρχικό ενός ονόματος και να τυπώνει
το αντίστοιχο όνομα (ονόματα: Πέτρος, Χριστίνα, Νίκος, Άννα, Γιώργος).
15. Να γράψετε πρόγραμμα που να διαβάζει δύο ηλικίες και να δίνει τη διαφορά τους.
Η εισαγωγή στοιχείων και τα αποτελέσματα να είναι σύμφωνα με το υπόδειγμα:
Δεδομένα :9 6
Αποτελέσματα:
Ο Νίκος είναι 9 ετών
Ο Γιώργος είναι 6 ετών
Ο Νίκος είναι 3 έτη μεγαλύτερος απ' το Γιώργο
Να γίνουν άλλες δύο εκτελέσεις με δεδομένα 6, 9 και 9, 9.
16. Δίνονται δυο ακέραιοι αριθμοί Α, Β. Βρείτε το μέσο τους. ( Μ=(Α+Β)/2 ). Στη
συνέχεια δίνεται τρίτος ακέραιος αριθμός Γ. Να εξετάζετε αν το Γ είναι μεγαλύτερο,
μικρότερο ή ίσο από το μέσο Μ και να εκτυπώνεται το ανάλογο μήνυμα.
29
Εντολές επανάληψης
Βασικοί στόχοι:
Να κατανοήσουμε τη χρησιμότητα της δομής επανάληψης, που παρέχει ο
προγραμματισμός.
Ειδικοί στόχοι:
• Να κατανοήσουμε τη λειτουργία της εντολής while η οποία είναι μία από τις
τρεις βασικές δομές του δομημένου προγραμματισμού.
• Να κατανοήσουμε τη λειτουργία της εντολής repeat και πώς αυτή δια-
φοροποιείται σε σχέση με την while.
• Να κατανοήσουμε τη λειτουργία της εντολής for και πώς αυτή διαφο-
ροποιείται από τις δύο προηγούμενες δομές επανάληψης.
WHILE
Η εντολή while χρησιμοποιείται για μη προκαθορισμένο αριθμό επαναλήψεων, όπου
υπάρχει περίπτωση να μην εκτελεστούν οι επαναλήψεις και όπου ο έλεγχος γίνεται
πριν από την εκτέλεση των εντολών επανάληψης.
Ενέργεια: Κάθε φορά, ακόμη και την πρώτη, πριν εκτελεστεί η εντολή που αποτελεί
το σώμα της επανάληψης (το statement μετά το do), εξετάζεται η λογική έκφραση η
οποία ακολουθεί τη λέξη while και, μόνο σε περίπτωση που δίνει τιμή true, εκτελείται
η προς επανάληψη εντολή. Αν δώσει τιμή false, η εντολή που αποτελεί το σώμα της
επανάληψης δεν εκτελείται και ο έλεγχος από το while περνάει στην επόμενη εντολή.
Το σώμα της επανάληψης είναι μια εντολή. Σε περίπτωση που θέλουμε να
εκτελέσουμε περισσότερες από μια εντολές τότε αυτές θα πρέπει να αποτελέσουν μία
συνθέτη εντολή με τη χρήση των begin - end.
Υπάρχουν δύο τύποι επαναλήψεων:
• Ο ένας τύπος χρησιμοποιεί κάποιο μετρητή επαναλήψεων (count-controlled
loop).
• Ο άλλος τύπος χρησιμοποιεί κάποιο γεγονός και η επανάληψη συνεχίζεται
μέχρι να συμβεί το γεγονός στη διάρκεια της επανάληψης (event-controlled
loop).
•
30
Στο παράδειγμα που ακολουθεί χρησιμοποιείται ένας μετρητής για τον έλεγχο των
επαναλήψεων. Ο μετρητής παίρνει αρχική τιμή έξω από τον κύκλο των
επαναλήψεων, και αυξάνει κατά 1 στην τελευταία εντολή μέσα στον κύκλο των
επαναλήψεων έτσι ώστε να μπορεί να γίνει ο έλεγχος και να σταματήσουν οι
επαναλήψεις, όταν η λογική έκφραση πάρει τιμή false δηλαδή, όταν ο μετρητής γίνει
ίσος με 101.
Παράδειγμα με μετρητή
Για τον έλεγχο των επαναλήψεων (count-controlled hop).
Παράδειγμα με μεταβλητή
Για τον έλεγχο των επαναλήψεων (event-controlled loop).
Για κάποια επεξεργασία χρειαζόμαστε ημερομηνίες μήνα και ημέρα. Διαβάζουμε την
πρώτη ημερομηνία και για τον έλεγχο χρησιμοποιούμε την ίδια μεταβλητή. Η επανά-
ληψη θα σταματήσει όταν η μεταβλητή πάρει τιμή μη παραδεκτή πχ. 31
Φεβρουαρίου. Όταν συμβεί το γεγονός αυτό η επανάληψη θα σταματήσει.
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);
Ενέργεια: Αφού εκτελεστούν για πρώτη φορά οι εντολές που αποτελούν το σώμα της
επανάληψης (μεταξύ των 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.
FOR
Η εντολή for σχεδιάστηκε για την απλοποίηση του ελέγχου των επαναλήψεων με
μετρητή (count-controlled loop).
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 μπορεί να είναι μια έκφραση
οποιουδήποτε διατεταγμένου τύπου. Έτσι, εκτός από ακέραιες τιμές μπορούμε να
χρησιμοποιήσουμε μεταβλητές με τιμές τύπου χαρακτήρα char ή λογικού τύπου
(boolean).
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.
Στην περίπτωση αυτήν έχουμε ένα βρόγχο μέσα σ' έναν άλλο.
Λύση:
για 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.
Ανακεφαλαίωση
Διακρίναμε τρεις διαφορετικές εντολές επανάληψης:
Οι εντολές while και repeat χρησιμοποιούνται για μη προκαθορισμένο αριθμό
επαναλήψεων και στις δυο ο έλεγχος για την επανάληψη γίνεται μέσα από μια
συνθήκη. Στη περίπτωση της while οι εντολές επανάληψης εκτελούνται εφόσον το
αποτέλεσμα της συνθήκης είναι αληθές ενώ στη repeat οι εντολές επανάληψης
εκτελούνται όσο το αποτέλεσμα της συνθήκης είναι ψευδές. Σημειώνεται ότι στη
repeat οι εντολές θα εκτελεστούν τουλάχιστον μία φορά διότι ο έλεγχος της συνθήκης
γίνεται μετά το σώμα των εντολών επανάληψης.
Η εντολής for χρησιμοποιείται για προκαθορισμένο αριθμό επαναλήψεων.
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, να εξηγήσετε τη λειτουργία
της και να δώσετε δύο δικά σας παραδείγματα.
7. Να χρησιμοποιήσετε τις εντολές επανάληψης repeat - until και for ώστε να έχετε τα
ίδια αποτελέσματα με την άσκηση 6.
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).
40
Να χρησιμοποιήσετε την εντολή repeat και δυαδικούς τελεστές (and...). Στο τέλος να
τυπωθεί το πλήθος κάθε κατηγορίας, δηλ. άριστα, πολύ καλά κλπ. καθώς και το
σύνολο όλων των μαθητών.
16. Να γράψετε πρόγραμμα που να διαβάζει τις 4 πλευρές και μία γωνία ενός
τετραπλεύρου και να υπολογίζει το είδος του (τετράγωνο, ρόμβο, ορθογώνιο,
παραλληλόγραμμο, τυχαίο). Να χρησιμοποιήσετε την εντολή repeat και δυαδικούς
τελεστές.
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
Λύσεις των ασκήσεων - εντολών επιλογής
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.
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.
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.
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.
46
else
Writeln(' Ο Γ μικρότερος από τον μέσο ');
Readln;
End.
6. arithmos :=1;
while arithmos < 11 do
begin
write(arithmos:5);
arithmos:=arithmos+1;
end;
47
Repeat write(arithmos:5);
write(arithmos:5);
arithmos:=arithmos+1;
until( arithmos >= 11);
Η τιμή που αρχικά δίνεται στη μεταβλητή arithmos είναι το 0. Δεν δίνουν όμως όλες
οι γλώσσες προγραμματισμού αρχικές τιμές στις μεταβλητές, γι' αυτό καλό είναι να
αναθέτουμε εμείς αρχικές τιμές στις μεταβλητές στην αρχή του κυρίου
προγράμματος.
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.
49
mo := mo / metritis;
writeln('MO=',mo:10:2);
readln;
End.
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);
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.
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.
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.
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;
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 βαθμούς μαθητών και να τους τυπώσουμε κατά αντίστροφη
σειρά θα γράφαμε ένα πρόγραμμα με την εξής μορφή:
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).
Με τη δήλωση ορισμού του πίνακα στην περιοχή δηλώσεων των μεταβλητών,
καθορίζονται και τα δύο παραπάνω, δηλαδή και ο τύπος των στοιχείων του και ο
τύπος του δείκτη. Ο μονοδιάστατος πίνακας είναι ο απλούστερος πίνακας, αυτός
δηλαδή που έχει μία διάσταση (μια γραμμή ή μία στήλη). Ο τύπος του δείκτη
προσδιορίζει για κάθε διάσταση τον αριθμό των στοιχείων του πίνακα. Οι απλοί τύποι
είναι όλοι, εκτός από τον πραγματικό τύπο, τακτικοί τύποι. Στην περίπτωση του
ακέραιου τύπου χρησιμοποιείται μία υποπεριοχή ακεραίων, γιατί ειδάλλως ο πίνακας
θα ήταν πολύ μεγάλος για να χωρέσει στη μνήμη.
Παραδείγματα:
α) Ο πίνακας που ακολουθεί είναι πίνακας μιας διάστασης (1 γραμμής και 8 στηλών)
στον οποίο έχουν καταχωρηθεί 8 ακέραιοι αριθμοί.
περιεχόμενα
15 12 4 3 18 20 10 12
1ο 2ο 3ο 4ο 5ο 6ο 7ο 8ο
56
τάξη
β)
const
max=640;
var
bathmoi: array[1..20] of integer;
onoma: array[1..30] of char;
memory: array[0..max] of integer;
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 στήλες ανά γραμμή, όπου
αποθηκεύονται ακέραιοι αριθμοί, και δηλώνεται ως εξής:
Η εκτύπωση του στοιχείου της 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
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;
{εκτύπωση πίνακα }
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
Επίσης μια άλλη μορφή είναι η παρακάτω:
Πρόβλημα 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;
63
Ασκήσεις
1. Να γράψετε πρόγραμμα που να εκτελεί τα παρακάτω:
α) Να εισάγετε τα στοιχεία ενός πίνακα 4 x 3 από το πληκτρολόγιο
β) Να προσθέτει τα στοιχεία κάθε γραμμής και να τα τοποθετεί σε μονοδιάστατο
πίνακα κατάλληλης διάστασης.
δ) Τυπώνει τον αριθμό των <, >, = που προκύπτουν από την παραπάνω σύγκριση.
64
Ο Τύπος Record
Η λέξη record σημαίνει εγγραφή. Ας μάθουμε λοιπόν τι είναι εγγραφή, για να αντι-
ληφθείτε τι είναι ο τύπος record. Γενικά, ένα αρχείο μπορεί να θεωρηθεί σαν ένα σύ-
νολο δεδομένων, που είναι τακτοποιημένα (δομημένα) με κάποιον τρόπο. Ας φαντα-
στούμε το αρχείο προσωπικού μιας επιχείρησης. Σ' αυτό έχουν αποθηκευτεί δεδομένα
για τον κάθε εργαζόμενο και, μάλιστα, η αποθήκευση έχει γίνει με ένα ορισμένο Βα-
σικό σχήμα. Έτσι, για κάθε εργαζόμενο υπάρχουν αποθηκευμένα τουλάχιστον: το
όνομα του, το επώνυμο του και ο μισθός του. Όλα τα στοιχεία για έναν εργαζόμενο
είναι αποθηκευμένα σε μια συγκεκριμένη εγγραφή, που αποτελείται από διαφορετικά
πεδία (π.χ. όνομα, επώνυμο, μισθός). Το αρχείο μπορεί, λοιπόν, ν' απεικονιστεί ως
εξής:
Μια μεταβλητή τύπου record δηλώνεται ως εξής: Μετά το όνομα της μεταβλητής,
ακολουθεί η λέξη RECORD, και στη συνέχεια τα πεδία (στοιχεία) της εγγραφής, το
καθένα με τον τύπο του. Τα πεδία διαχωρίζονται με ερωτηματικά.
Προσοχή: η δήλωση μιας μεταβλητής τύπου record τελειώνει πάντα με τη λέξη END.
Το παραπάνω αρχείο θα μπορούσε λοιπόν να δηλωθεί ως εξής:
Arxeio : RECORD
Onoma : string[10];
Eponumo : string[15];
Mistos : real;
END;
Ο Τύπος Pointer
Όλες οι δομές δεδομένων που αναφέραμε μέχρι τώρα, παραμένουν ίδιες στη μορφή
και το μέγεθος σε όλη τη διάρκεια της επεξεργασίας τους. Είναι στατικές, κάτι που
σημαίνει ότι η απαραίτητη μνήμη στο τμήμα δεδομένων της μνήμης εργασίας κα-
θορίζεται γι' αυτές κατά τη μεταγλώττιση του προγράμματος, και παραμένει σταθερή.
Σκεφτείτε, π.χ., την περίπτωση του αριθμού των στοιχείων ενός πίνακα. Σε πολλές
εφαρμογές, ο αριθμός των στοιχείων δεν μπορεί να καθοριστεί από πριν. Αυτό
σημαίνει, είτε ότι θα δεσμευτεί υπερβολικά μεγάλη μνήμη, είτε ότι η μνήμη που θα
κρατηθεί δε θα είναι αρκετή. Φανταστείτε εδώ π.χ. τον αριθμό των εγγραφών ενός
αρχείου. Σ' αυτήν την περίπτωση βοηθά πολύ η χρήση δυναμικών μεταβλητών.
65
Δυναμικές Μεταβλητές:
Οι δυναμικές μεταβλητές δεν περιέχουν τις ίδιες τις τιμές, αλλά μόνο τη διεύθυνση
της τιμής δείχνουν σε μια περιοχή της μνήμης- γι' αυτό και οι μεταβλητές αυτές
ονομάζονται δείκτες.
Δυναμικές μεταβλητές σημαίνει ότι σ' αυτές διατίθεται μνήμη μόνο κατά τη διάρκεια
της εκτέλεσης του προγράμματος. Στις δυναμικές μεταβλητές διατίθεται η συνολική
μνήμη σωρού (heap). Η μνήμη σωρού είναι μια περιοχή στη μνήμη εργασίας, που δεν
καταλαμβάνεται ούτε από το λειτουργικό σύστημα, ούτε από τα προγράμματα και τα
τμήματα στοίβας και δεδομένων τους
66
PROGRAM deiktis2;
USES crt;
VAR
deiktis : ^string;
BEGIN clrscr;
REPEAT
new ( deiktis) ;
writeln ('Η διαθέσιμη μνήμη σωρού είναι ',MemAvail,' Byte');
(* dispose (deiktis); *)
END.
Τη φορά αυτήν ο δείκτης είναι τύπου string. Με την πρόταση dispose (deiktis)
απελευθερώνεται η δεσμευμένη μνήμη στο σωρό
Η συνάρτηση MemAvail επιστρέφει τη συνολική διαθέσιμη μνήμη του σωρού σε
byte.
Εκτελέστε μια φορά το πρόγραμμα χωρίς τη διαδικασία dispose. θα δείτε τότε πόση
μνήμη είναι ελεύθερη. Με το πάτημα ενός πλήκτρου μπορείτε να σταματήσετε το
πρόγραμμα. Ενεργοποιήστε τώρα τη διαδικασία dispose στο πρόγραμμα σας, κι
εκτελέστε το ξανά. θα δείτε ότι η χρησιμοποιούμενη μνήμη του σωρού
απελευθερώνεται ξανά.
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.
To πρόγραμμα askopo όμως δεν γράφτηκε τυχαία μ' αυτόν τον τρόπο. Μια τέτοια
μορφή χρησιμοποιείται στα προγράμματα διαχείρισης αρχείων. Σ' αυτήν την περί-
πτωση, η συντόμευση που προσφέρει το πρόγραμμα skopimo δε θα μας είναι καθό-
λου χρήσιμη.
68
Λύσεις ασκήσεων – Πίνακες
1) Program askisi1;
CONST
N1=4;
N2=3;
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 Ektuposi(Temp:Table);
Var i:integer;
Begin
for i:=1 to N do
write(Temp[i],' ');
writeln;
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;
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;
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
Υποπρογράμματα ( Διαδικασίες – Συναρτήσεις )
Παράδειγμα:
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 Το μπορεί και να μην υπάρχει *)
Παραδείγματα διαδικασιών:
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.
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;
BEGIN
write(' Δώστε έναν αριθμό: ');
readln( a) ;
apotelesma := diplasio(a); (* Κλήση συνάρτησης *)
writeln ('Η τιμή της συνάρτησης είναι: ', apotelesma: 6);
writeln ('Συνέχεια με <Enter>') ;
readln;
END.
Κύριο πρόγραμμα : Στο κύριο πρόγραμμα εισάγεται μια τιμή. Η τιμή αυτή διαβιβά-
ζεται στη συνάρτηση diplasio. Αποτελεί πραγματική παράμετρο και τοποθετείται σε
παρενθέσεις μετά το όνομα της συνάρτησης. Η πραγματική παράμετρος είναι η μετα-
βλητή, για την οποία υπολογίζεται η συνάρτηση. Η τιμή που επιστρέφει η συνάρτηση
αποδίδεται στη μεταβλητή apotelesma.
Δομή της συνάρτησης: Η ίδια η συνάρτηση είναι ένα υποπρόγραμμα, όπως και η
διαδικασία. Στην αρχή όμως μιας συνάρτησης θα πρέπει να ορίζεται ο τύπος δεδομέ-
νων του αποτελέσματος της. Αυτό γίνεται προσθέτοντας μια άνω και κάτω τελεία και
τον τύπο δεδομένων μετά τη λίστα των τυπικών παραμέτρων (που βρίσκονται μέσα
σε παρενθέσεις). Στη συνέχεια ακολουθεί το τμήμα δηλώσεων, αν υπάρχει. Αν ορι-
στούν εδώ μεταβλητές, θα ισχύουν μόνο μέσα στη συνάρτηση (τοπικές μεταβλητές).
Ακολουθεί το τμήμα προτάσεων, που ξεκινά με BEGIN και τελειώνει σε END με
(ελληνικό) ερωτηματικό. Το τμήμα προτάσεων θα πρέπει οπωσδήποτε να περιέχει
μια πρόταση απόδοσης τιμής για το όνομα της συνάρτησης.
78
Παραδείγματα συναρτήσεων:
79
πλευρά =19 Εμβαδόν =361
πλευρά =22 Εμβαδόν =484
πλευρά = 0
80
• Αν είναι δυνατόν να χρησιμοποιήσουμε και τις δύο δηλαδή διαδικασία ή
συνάρτηση χρησιμοποιούμε αυτή με την οποία αισθανόμαστε πιο άνετα στην
υλοποίηση.
81
Αναδρομή
Πρέπει επίσης να σημειώσουμε ότι μια συνάρτηση μπορεί να καλεί άλλες
συναρτήσεις, ακόμη και τον ίδιον τον εαυτό της. Μια συνάρτηση που καλεί τον εαυτό
της, ονομάζεται αναδρομική συνάρτηση. Η διαβίβαση παραμέτρων γίνεται με τον
ίδιον τρόπο, όπως στις διαδικασίες.
Πρόβλημα 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)), η
συνάρτηση πρέπει να επιστρέφει από κάθε κλήση με μια τιμή. Η τιμή που
επιστρέφεται είναι εκείνη που υπολογίζεται από τον πολλαπλασιασμό του
αποτελέσματος του προηγουμένου επιπέδου με την τιμή της παραμέτρου Ν στο
τρέχον επίπεδο. Οι τιμές αυτές δηλώνονται δίπλα από τα βέλη που έχουν φορά προς
τα επάνω.
83
Πρόβλημα 2
Γράψτε ένα πρόγραμμα που να διαβάζει ένα ακέραιο αριθμό και στη συνέχεια να τον
τυπώνει με την αντίστροφη φορά (πρώτο ψηφίο να είναι το τελευταίο του αριθμού
που διαβάστηκε, δεύτερο ψηφίο να είναι το προτελευταίο, κ.ο.κ.).
Ανάλυση:
Έστω για παράδειγμα ο ακέραιος 7321. Το ακέραιο μέρος του υπολοίπου της
διαίρεσης του αριθμού αυτού με το δέκα μας δίνει το τελευταίο ψηφίο του, ενώ το
ακέραιο μέρος του πηλίκου μας δίνει τον αριθμό 732. Συνεχίζοντας τις διαιρέσεις δια
του 10 θα λάβουμε στην τελευταία διαίρεση ότι το ακέραιο μέρος του πηλίκου είναι
το μηδέν ενώ το ακέραιο μέρος του υπολοίπου θα είναι το 7.
Έτσι έχουμε το παρακάτω πρόγραμμα:
PROGRAM ΑΝΤΙTHETOS (INPUT, OUTPUT);
(* αντιστρέφει τα ψηφία ενός ακεραίου *)
VAR arithmos: integer;
begin
readln (arithmos);
antistrofh (arithmos);
writeln
end.
begin
readln (arithmos);
84
antistrofh (arithmos);
writeln
end.
Πρόβλημα 3
Γράψτε ένα πρόγραμμα που να υπολογίζει τον n-ιοστό Fibonacci αριθμό.
Ανάλυση:
Ο n-ιοστός αριθμός του Fibonacci ορίζεται ως εξής:
1. Αν n είναι 1 ή 2, τότε ο η-ιοστός αριθμός του Fibonacci είναι 1,
2. Αν n>=3, τότε ο η-ιοστός αριθμός του Fibonacci είναι το άθροισμα των δύο
προηγουμένων.
Μεταφέροντας τον παραπάνω αλγόριθμο σε Pascal έχουμε:
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
86
87
Λύσεις των ασκήσεων
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.
begin
readln (m, n);
writeln (' MKD( ', m:1, ' , ', n:1,' )= ', MKD( m, n):1)
end.
4. Program askisi4;
Var
I, number: LongInt;
Flag: Boolean;
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;
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;
91
i: integer;
Begin
Randomize;
for i:=1 to M do
Temp[i]:=Random(201); (* Numbers between 0 and 200 *)
end;
92
writeln('Element ',x,' found in position ',Pos,' of the table')
else
writeln('Element ',x,' not found in the table')
end;
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;
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 )
Επιστρέφει το τόξο της εφαπτομένης της παραμέτρου Χ. Η Χ μπορεί να είναι
πραγματική ή ακέραια εκφρασμένη σε ακτίνια. Το αποτέλεσμα είναι πάντοτε
πραγματικό.
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) = Β
98
Βιβλιογραφία
Τίτλος Συγγραφέας
Μαθήματα Προγραμματισμού Borland Pascal 7.0 Manfred Fussinger
Εισαγωγή στην Pascal και την Turbo Pascal Rodnay Zaks
Pascal Θεωρία - Προγράμματα Βατικιώτης Α.
Pascal Θεοδώρου Γ.
Δομές Δεδομένων Μανωλόπουλος Γ.
Pascal καιTurbo Pascal Μισυρλής Ν.
Γλώσσα Προγραμματισμού Pascal Μοσχοβίνος Μ., Βασιλείου Σ.
Προγραμματισμός Υπολογιστών Τ.Ε.Ε (1ος Κύκλος Β' Τάξη)
Λάμπρος
99