You are on page 1of 79

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

Σχεδίαση Προγράμματος Pascal

Τομέας : Πληροφορικής
Ειδικότητα : Προγραμματιστής Εφαρμογών Πολυμέσων
Εξάμηνο : Β

page 1
ΕΙΣΑΓΩΓΗ
ΓΕΝΙΚΑ

Στη γενική του έννοια, αρχείο είναι μία σειρά από στοιχεία του ίδιου τύπου, που έχει ένα όνομα
και που μπορεί να γράφεται ή να διαβάζεται από ένα πρόγραμμα. Στα απλά προγράμματα της
Pascal, χρησιμοποιoύνται τα τυποποιημένα ονόματα (των αρχείων της Pascal) INPUT και
OUTPUT, για τη λήψη στοιχείων από το πληκτρολόγιο και την εμφάνιση των αποτελεσμάτων
στην οθόνη, Μετά το τέλος της επεξεργασίας, τα στοιχεία των αρχείων χάνονται. Έτσι τα
στοιχεία εισόδου συνήθως είναι λίγα και τα αποτελέσματα τους δεν μπορούσαν να
χρησιμοποιηθούν στο μέλλον σαν στοιχεία εισόδου σε ένα άλλο πρόγραμμα. Δηλαδή τα
στοιχεία εισόδου και εξόδου ήταν στενά συνδεμένα με το συγκεκριμένο πρόγραμμα.
Όταν τα στοιχεία ενός αρχείου είναι γραμμένα σε μία βοηθητική μνήμη (δίσκος, δισκέτα
κλπ.), τότε λέμε ότι το αρχείο είναι εξωτερικό. Τα βασικά πλεονεκτήματα των εξωτερικών
αρχείων είναι τα ακόλουθα:
1. Τα στοιχεία είναι ανεξάρτητα από τα προγράμματα που τα δημιουργούν και που τα
επεξεργάζονται.
2. Επιτρέπουν την αποθήκευση μεγάλου όγκου στοιχείων. Ο όγκος των στοιχείων του αρχείου
μπορεί να υπερβεί τη χωρητικότητα της κύριας μνήμης (RAM) του υπολογιστή.
3. Τα στοιχεία των αρχείων δε χάνονται μετά το τέλος της επεξεργασίας, πράγμα που συμβαίνει
για τα στοιχεία που τοποθετούνται στην κύρια μνήμη. Έτσι για ένα αρχείο που δημιουργείται,
μπορούμε να χρησιμοποιήσουμε τα δεδομένα που περιέχει σαν στοιχεία εισόδου σε ένα άλλο
πρόγραμμα.
Οι περισσότερες εφαρμογές χρειάζονται εξωτερικά αρχεία. Τα στοιχεία που είναι
αποθηκευμένα σε βοηθητική μνήμη, μεταφέρονται τμηματικά στην κύρια μνήμη και υφίστανται
τη σχετική επεξεργασία. Επίσης τα προγράμματα που δημιουργούν εξωτερικά αρχεία,
μεταφέρουν τα στοιχεία διαδοχικά από την κύρια μνήμη και τα γράφουν στη βοηθητική μνήμη.
Το γράψιμο και το διάβασμα εξωτερικών αρχείων είναι βασικές εργασίες στον
προγραμματισμό. Τα εξωτερικά αρχεία είναι από τις πιο ισχυρές και ευέλικτες δομές δεδομέ-
νων. Στο εξής με τον όρο αρχεία θα εννοούμε εξωτερικά αρχεία, εκτός αν αναφέρεται σχετική
επεξήγηση.
Είπαμε λοιπόν ότι αρχείο είναι μία σειρά στοιχείων του ίδιου τύπου, που είναι γραμμένα σε
δίσκο ή δισκέτα κλπ. Ο τύπος του αρχείου εξαρτάται από τον τύπο των απλών δομών, από τις
οποίες αυτό αποτελείται. Το αρχείο είναι και αυτό ένας τύπος δόμησης των στοιχείων. Ένα
αρχείο για παράδειγμα μπορεί να αποτελείται από σειρές ή εγγραφές. Δηλαδή τα στοιχεία ενός
αρχείου της Pascal, μπορεί να είναι οποιουδήποτε τύπου δεδομένων που επιτρέπεται στην
Pascal. Δεν επιτρέπονται όμως αρχεία σε αρχεία.
page 2
Το αρχείο είναι μια δομή δεδομένων, που το μήκος της μπορεί να μεταβάλλεται δυναμικά κατά
τη διάρκεια εκτέλεσης του προγράμματος. Μήκος αρχείου ονομάζεται ο αριθμός των στοιχείων
που έχουν γραφτεί σε αυτό. Αρχείο με μηδενικό μήκος θεωρείται άδειο. Το μήκος του αρχείου
δεν είναι καθορισμένο, δηλαδή δεν προκαθορίζεται με τη δήλωση του. Το αρχείο έχει μία αρχή
και ένα τέλος. Για να είναι δυνατό να εντοπιστεί το τέλος, το αρχείο έχει στο τέλος των
στοιχείων του μία ιδιαίτερη σήμανση EOF (End-Of-File/τέλος αρχείου).

Μία μορφή αρχείου φαίνεται παρακάτω.

ΣΤΟΙΧΕΙ01 ΣΤΟΙΧΕΙ02 ΣΤΟΙΧΕΙ03 ... ΣΤΟΙΧΕΙΟΝ EOF

Ένα αρχείο μπορεί να χρησιμοποιηθεί ή για διάβασμα ή για γράψιμο. Όταν το αρχείο
διαβάζεται (input), το πρόγραμμα παίρνει ένα στοιχείο του αρχείου, το μεταφέρει στην κύρια
μνήμη και το επεξεργάζεται. Όταν το αρχείο γράφεται (output), δημιουργείται το στοιχείο στην
κύρια μνήμη και μετά μεταφέρεται και γράφεται στο αρχείο. Δηλαδή το αρχείο διαβάζεται ή
γράφεται στοιχείο προς στοιχείο. Το διάβασμα και το γράψιμο των αρχείων είναι από τις
βασικές εργασίες των προγραμμάτων.
Υπάρχουν βασικά δύο τρόποι λήψης ή γραψίματος (επεξεργασίας) αρχείων, η σειριακή και η
τυχαία. Στη σειριακή επεξεργασία η πρόσβαση στο αρχείο γίνεται σειριακά, δηλαδή το ένα
στοιχείο μετά το άλλο. Για να εντοπιστεί ένα στοιχείο, πρέπει υποχρεωτικά να διαβαστούν όλα
τα προηγούμενα, άσχετα αν αυτά χρειάζονται στην επεξεργασία ή όχι. Στην τυχαία
επεξεργασία, ένα στοιχείο εντοπίζεται αμέσως, χωρίς να εξεταστούν τα προηγούμενα. Δεν είναι
δυνατό να γίνει πήδημα προς τα εμπρός ή προς τα πίσω, προκειμένου να γίνει εντοπισμός ενός
στοιχείου. ( Η τυποποιημένη Pascal έχει μόνο σειριακή επεξεργασία. )
Στην Pascal τα αρχεία είναι τύπου μεταβλητής, δηλαδή οι πράξεις που μπορούν να γίνουν στα
δεδομένα ενός στοιχείου είναι οι γνωστές. Μόνο τα επιμέρους δεδομένα ενός στοιχείου
μπορούν να χρησιμοποιηθούν σε μία δεδομένη χρονική στιγμή (κάθε φορά) και αυτό, γιατί το
αρχείο διαβάζεται στοιχείο προς στοιχείο. Όπως είπαμε, στην Pascal επιτρέπονται τα κενά
αρχεία. Ένα κενό αρχείο δημιουργείται, μόλις οριστεί αυτό για πρώτη φορά στο πρόγραμμα,
δηλαδή ένα αρχείο που πρόκειται να χρησιμοποιηθεί για έξοδο (output).
Το αρχείο είναι η μόνη μορφή δεδομένων που η επεξεργασία της γίνεται από το λειτουργικό
σύστημα. Όταν δημιουργείται ένα αρχείο από ένα πρόγραμμα Pascal, το λειτουργικό σύστημα
το γράφει στη βοηθητική μνήμη (δίσκο ή δισκέτα) και το καταχωρεί στον κατάλογο (Directory)
με το όνομα του. Μετά μπορεί να το αντιγράψει, να του αλλάξει το όνομα, να το διαγράψει
(σβήσει) και να μεταφέρει στοιχεία από ή και προς το αρχείο, μετά από σχετικές εντολές του
προγράμματος. Ο μόνος τρόπος να αυξηθούν τα στοιχεία ενός αρχείου, είναι να προστεθούν
στοιχεία στο τέλος του.

page 3
Η Pascal έχει δύο τύπους στοιχείων. Τα αρχεία Δεδομένων και τα αρχεία TEXT. Τα αρχεία
δεδομένων περιέχουν στοιχεία απλής ή σύνθετης δομής δεδομένων. Στη βοηθητική μνήμη είναι
καταχωρημένα όχι σε αναγνώσιμη μορφή ASCII, αλλά στην εσωτερική παράσταση και γι' αυτό,
λέγονται και Δυαδικά (binary). Τα TEXT είναι αρχεία κειμένου και καταχωρούνται στη
βοηθητική μνήμη σε αναγνώσιμη μορφή (ASCII).
Τα γνωστά τυποποιημένα αρχεία INPUT και OUTPUT είναι δύο εξωτερικά αρχεία, που παρέχει
αυτόματα η Pascal και είναι ακολουθίες χαρακτήρων, δηλαδή TEXT. Στη συνέχεια
περιγράφονται τα αρχεία δεδομένων και τα αρχεία TEXT.

ΑΡΧΕΙΑ ΔΕΔΟΜΕΝΩΝ
Γενικά

Το αρχείο δεδομένων είναι ένα σύνολο στοιχείων (μεταβλητών) του ίδιου τύπου. Ο τύπος των
στοιχείων μπορεί να είναι ένας από τους τυποποιημένους (standard) τύπους που διαθέτει η
Pascal ή ένας τύπος, που ορίζει ο προγραμματιστής. Δηλαδή τα στοιχεία ενός αρχείου μπορεί να
είναι:

1. Αριθμοί (Integer ή Real).

2. Χαρακτήρες (Char).

3. Πίνακες (Arrays).

4. Σύνολα (Sets).
5. Εγγραφές (Records).
Ο πιο χρήσιμος τύπος είναι των Records. Άσχετα από τον τύπο των στοιχείων του αρχείου, κάθε
επιμέρους στοιχείο του αρχείου έχει επικρατήσει να λέγεται record. Μερικές μορφές αρχείων
δεδομένων φαίνονται στα παρακάτω οχήματα.

125 -750 687 005 ... 480 EOF

Αρχείο τύπου Integer

12.5 13.6 -8.7 - ... 195. EOF


19.3 8
Αρχείο τύπου Real

A Κ Ρ Τ ... Ν EOF

Αρχείο τύπου Char

page 4
TRUE FALSE FALSE TRUE ... TRUE EOF

Αρχείο τύπου Boolean

RECORD1 RECORD2 RECORD3 ... RECORDN EOF

Αρχείο τύπου Record

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

ΑΡΧΕΙΑ ΚΕΙΜΕΝΟΥ (TEXT FILES)


Γενικά

Η Pascal έχει ένα προκαθορισμένο αρχείο κειμένου (TEXT), που αντιπροσωπεύει ένα αρχείο
τύπου Char, δηλαδή κάθε στοιχείο του είναι ένας χαρακτήρας από αυτούς που χρησιμοποιεί ο
υπολογιστής. Το αρχείο αυτό έχει όλες τις ιδιότητες των αρχείων της Pascal. Παρουσιάζει
ενδιαφέρον, γιατί αποτελεί το βασικό μέσο επικοινωνίας μεταξύ χρήστη (ανθρώπου) και
υπολογιστή.
Τα αρχεία TEXT είναι όμοια, αλλά όχι ίδια, με τα αρχεία χαρακτήρων και επιπλέον έχουν μία
βασική ιδιότητα, ότι γκρουπάρονται σε γραμμές, π.χ. όπως τα αρχεία που γίνονται με τη χρήση
του Editor.
Τα αρχεία TEXT αποτελούνται από γραμμές (lines) και κάθε γραμμή τελειώνει με έναν ειδικό
χαρακτήρα, που δηλώνει το τέλος της γραμμής. Έτσι ομαδοποιούνται σειρές χαρακτήρων σε
γραμμές. Κάθε γραμμή μπορεί να έχει διαφορετικό αριθμό χαρακτήρων. Μερικές φορές οι
γραμμές ομαδοποιούνται σε σελίδες, με τη χρήση ειδικών χαρακτήρων. Κάθε σελίδα μπορεί να
αποτελείται από διαφορετικό αριθμό γραμμών. Ένα TEXT αρχείο μπορεί να θεωρηθεί ότι
περιέχει οποιοδήποτε χαρακτήρα, εκτός του χαρακτήρα που χρησιμοποιείται για να δείξει το
τέλος της γραμμής ή της σελίδας. Η γραμμή δεν είναι δομή δεδομένων, δηλαδή δεν μπορεί να
γραφτεί ή να διαβαστεί κλπ. με μία εντολή. Τα αρχεία TEXT είναι σειριακά.

Στο παρακάτω σχήμα φαίνεται η μορφή του TEXT αρχείου.

page 5
ΑΥΤΟ ΕΙΝΑΙ ΕΝΑ ΠΑΡΑΔΕΙΓΜΑ ΑΡΧΕΙΟΥ ΤΕΧΤ[ΤΓ] 1η γραμμή
ΚΑΘΕ ΓΡΑΜΜΗ ΤΕΛΕΙΩΝΕΙ ΜE ΕΙΔΙΚΟ ΧΑΡΑΚΤΗΡΑ[ΤΓ] 2η γραμμή
[ΤΓ] 3η γραμμή
Η ΠΑΡΑΠΑΝΩ ΕΙΝΑΙ ΚΕΝΗ ΓΡΑΜΜΗ[ΤΓ] 4η γραμμή
125 363 547 85.36 120.55 917[ΤΓ] 5η γραμμή
Ο ΓΙΩΡΓΟΣ ΓΕΝΝΗΘΗΚΕ ΣΤΙΣ 29/11/86[ΤΓ] 6η γραμμή
Η ΕΛΕΝΑ ΓΕΝΝΗΘΗΚΕ ΣΤΙΣ 28-2-89[ΤΓ] 7η γραμμή

Μορφή αρχείου TEXT


Όπως είπαμε, κάθε γραμμή είναι οργανωμένη σε χαρακτήρες και η επεξεργασία του αρχείου,
γράψιμο-διάβασμα, γίνεται μόνο ανά χαρακτήρα. Στο παρακάτω σχήμα φαίνεται η μορφή
οργάνωσης της γραμμής.
Γ Ρ Α ΜΜΗ ΤΕ Χ Τ Α Ρ Χ Ε Ι 0 Υ ΤΓ

Μορφή γραμμής αρχείου TEXT

Ο τρόπος με τον οποίο γίνεται η σήμανση του τέλους της γραμμής σε ένα αρχείο TEXT,
εξαρτάται από την έκδοση της Pascal. Στις περισσότερες περιπτώσεις στο τέλος της γραμμής,
για κώδικα ASCII, τοποθετείται ο χαρακτήρας που αντιστοιχεί στο CR ή στο LF (Line Feed).
Έτσι αν το αρχείο εμφανιστεί στην οθόνη, θα παρουσιαστεί κατά γραμμές, η μία κάτω από την
άλλη. Ο χαρακτήρας τέλους γραμμής δεν μπορεί να διαβαστεί και να καταχωρηθεί σε μία
μεταβλητή τύπου Char, αλλά μπορεί να αναγνωριστεί από την υπορουτίνα EOLN (End Of
Line). Το διάβασμα του χαρακτήρα τέλους γραμμής δημιουργεί ένα κενό στην αντίστοιχη
μεταβλητή (buffer του αρχείου).
Τα πιο συνηθισμένα παραδείγματα αρχείων TEXT είναι αυτά, που δημιουργούνται από τον
Editor. Όλα τα αρχεία, αρχεία δεδομένων και προγράμματα Pascal, γράφονται σε αρχεία τύπου
TEXT. Τα προκαθορισμένα αρχεία INPUT και OUTPUT της Pascal είναι τύπου TEXT. Αυτά
χρησιμοποιούνται, όπως είδαμε, για να δημιουργήσουν ένα διάλογο μεταξύ χρήστη
(προγραμματιστή) και προγράμματος Pascal.
Τα στοιχεία των αρχείων τύπου TEXT αποθηκεύονται στο μέσο καταχώρησης (δίσκο ή
δισκέτα), σύμφωνα με τον κώδικα χαρακτήρων που χρησιμοποιεί ο υπολογιστής και είναι
συνήθως σε κώδικα ASCII. To σύστημα (compiler), όταν το αρχείο δημιουργείται, μετατρέπει
τα στοιχεία από την εσωτερική μορφή παρουσίασης στοιχείων σε μορφή ASCII και τα γράφει

page 6
στο δίσκο. Κατά το διάβασμα, μετατρέπει τα στοιχεία από τον κώδικα ASCII στην εσωτερική
μορφή. Έτσι τα στοιχεία ενός αρχείου τύπου TEXT είναι εμφανίσιμα, δηλαδή μπορούν να
εμφανιστούν στην οθόνη από τον Editor ή με την εντολή ΤΥΡΕ του λειτουργικού συστήματος
(DOS), σε αντίθεση με τα στοιχεία των αρχείων δεδομένων (binary), που δεν μπορούν να
εμφανιστούν με αυτά.
Τα αρχεία τύπου TEXT διαβάζονται ή γράφονται ένας ένας χαρακτήρας κάθε φορά. Όπως
είπαμε, η γραμμή δεν είναι δομή δεδομένων, αλλά ένας τρόπος χειρισμού των αρχείων αυτών.

page 7
Σειριακά αρχεία (Sequential files)
Η δομή του σειριακού αρχείου
Το βασικό χαρακτηριστικό ενός σειριακού αρχείου (sequential file) είναι ότι τα records
καταχωρούνται το ένα μετά το άλλο σε μια μονάδα αποθήκευσης. Άλλωστε αυτό είναι και η
λογική αντιμετώπιση για την επεξεργασία ενός τέτοιου αρχείου από ένα πρόγραμμα. Επειδή
μάλιστα η οργάνωση αυτή είναι, απλή, με εύκολη προσαρμογή στο διαχειρισμό μεγάλων
όγκων data και με πολύ καλή εμπειρία από τους προγραμματιστές έχει καταλάβει την πρώτη
θέση χρησιμοποίησης σε πολλά μηχανογραφικά συστήματα.
Όλοι οι τύποι των περιφερειακοί μονάδων υποστηρίζουν τη σειριακή οργάνωση. Βέβαια
υπάρχουν μερικές μονάδες που από κατασκευής προσφέρονται μόνο για την αξιοποίηση
σειριακών αρχείων. Τέτοιες μονάδες είναι οι ταινίες, οι card readers, οι tape cassettes, line
printers κ.α. Υπάρχουν όμως και οι μονάδες των μαγνητικών δίσκων (magnetic disks - fixed or
removable), οι floppy disks που εξυπηρετούν τη σειριακή οργάνωση αλλά που προσφέρονται
επίσης θαυμάσια για την Direct οργάνωση.
Η επεξεργασία που μπορούμε να κάνουμε σ' έναν σειριακό αρχείο είναι μόνο η σειριακή
δηλαδή διαβάζουμε ή γράφουμε το ένα record μετά το άλλο θεωρώντας ότι το αρχείο είναι
μόνο input (δηλ. αρχείο εισόδου). Αυτό σημαίνει είτε ότι «διαβάζουμε» τα records το ένα μετά
το άλλο και επεξεργαζόμαστε τα data από το τρέχον «διάβασμα», είτε ότι «γράφουμε» τα
records το ένα πίσω από το άλλο. Υπάρχουν μερικές εξαιρέσεις σ' αυτό τον κανόνα όπως:
α) υπάρχει ειδικό software που δίνει τη δυνατότητα διαχειρισμού ενός σειριακού αρχείου είτε
σαν input είτε σαν "update". Η επεξεργασία "update" σημαίνει ότι το τρέχον record που
«διαβάστηκε» μπορεί να «ξαναγραφτεί» στο ίδιο αρχείο και στην ίδια θέση (ισχύει μόνο για
σειριακό αρχείο σε δίσκο ή δισκέτα).
β) μερικά λειτουργικά συστήματα δίνουν την δυνατότητα επέκτασης ενός σειριακού αρχείου.
Αυτό γίνεται με το να γράφονται νέα records αμέσως μετά το τελευταίο record του αρχείου.
3.7.4 Πλεονεκτήματα / μειονεκτήματα της σειριακής οργάνωσης
Συμπερασματικά ο πιο κάτω πίνακας μας δείχνει πλεονεκτήματα και μειονεκτήματα από την
χρήση της σειριακής οργάνωσης:

Πλεονεκτήματα

• Απλός σχεδιασμός αρχείου

• Μεγάλος όγκος records επεξεργάζεται με απλούς και γνωστούς τρόπους.


page 8
• Γρήγορη και απλή η διαδοχική προσπέλαση των records.

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

Μειονεκτήματα

• Χρειάζεται ταξινόμηση εφόσον πρόκειται ορισμένα records να ενημερωθούν

• Ολόκληρο το αρχείο πρέπει να επεξεργαστεί

• To transaction file πρέπει να είναι ταξινομημένο

• Το αρχείο δεν έχει ποτέ την ενημέρωση της στιγμής.

• Μετά από κάθε ενημέρωση ξαναδημιουργείται σαν νέο αρχείο σ' άλλο φυσικό χώρο.

• Δεν μπορεί να ανταποκριθεί σε συστήματα γρήγορης απάντησης (online, real-time)

Αρχεία άμεσης προσπέλασης

ΓΕΝΙΚΑ

Είπαμε, ότι στην τυποποιημένη Pascal η προσπέλαση στα αρχεία είναι πάντοτε σειριακή,
δηλαδή για να εντοπιστεί ένα record, πρέπει να διαβαστούν υποχρεωτικά όλα τα προηγούμενα
records, άσχετα αν χρειάζονται στην επεξεργασία ή όχι. Μερικές εκδόσεις Pascal, όπως η MS
η UCSD και η Borland Pascal, επιτρέπουν τη χρήση αρχείων άμεσης προσπέλασης (Direct
access files), στα οποία είναι δυνατός ο εντοπισμός ενός record, χωρίς να διαβαστούν
υποχρεωτικά όλα τα προηγούμενα. Δηλαδή τα records του αρχείου μπορούν να διαβαστούν
επιλεκτικά (τυχαία), γιατί μπορεί να προσδιοριστεί η θέση τους στο αρχείο.
Το αρχείο άμεσης πρσπέλασης αποτελείται από records, που το καθένα γίνεται μοναδικό
(εξατομικεύεται) από τη σχετική του θέση μέσα στο αρχείο, με βάση την αρχή του αρχείου.
Δηλαδή κάθε record είναι αριθμημένο και γίνεται μοναδικό από το σχετικό αριθμό, που δείχνει
τη σχετική θέση της περιοχής του αρχείου, στην οποία είναι αποθηκευμένο αυτό. Η αρίθμηση
των records διαφέρει από Pascal σε Pascal. Σε μερικές εκδόσεις, όπως η MS, τα records
αριθμούνται από το 1 μέχρι τον αριθμό των records του αρχείου και σε άλλες, όπως η UCSD
και η Borland Pascal τα records αριθμούνται από το 0 μέχρι τον αριθμό των records του
αρχείου μείον 1.

page 9
Ο σχετικός αριθμός του record αποτελεί και το κλειδί για τον εντοπισμό του, αλλά αυτό δεν
ανήκει στο record του αρχείου, δηλαδή δεν είναι πεδίο (στοιχείο) του record. Τα records
διαβάζονται ή γράφονται, με βάση το σχετικό αριθμό τους. Στα παρακάτω σχήματα φαίνεται η
μορφή και ο τρόπος επεξεργασίας ενός σειριακού αρχείου και ενός αρχείου άμεσης
προσπέλασης.

A Β C D Ε F G EOF

1 2 3 4 5 6 7
A Β C D Ε F G EOF

ΕΥΡΕΣΗ ΘΕΣΗΣ

( Ζητούμενα records κατά σειρά τα 2, 7, 4 )

Αρχείο άμεσης προσπέλασης

Τα records των αρχείων άμεσης προσπέλασης έχουν σταθερό μήκος. Τα αρχεία αυτά μπορεί
να επεκταθούν με την προσθήκη νέων records στο τέλος τους. Η θέση ενός record στο αρχείο
εντοπίζεται από το σύστημα, αφού φυσικά δοθεί ο αριθμός της θέσης του, με τον υπολογισμό
της διεύθυνσης του από την αρχή του αρχείου. Π. χ. αν το μήκος του record του αρχείου είναι
100 bytes και ζητηθεί το αρχείο με θέση 5, η θέση του είναι από το byte 401-500. Άμεση
page 10
προσπέλαση υπάρχει μόνο σε αρχεία δεδομένων και όχι σε αρχεία τύπου TEXT. Τα αρχεία
άμεσης προσπέλασης στην Pascal είναι γνωστά και σαν αρχεία σχετικής θέσης (relative files).

Η Οργάνωση Άμεσης Προσπέλασης (Direct file Organization)


Η δομή της άμεσης προσπέλασης
Η δομή οργάνωσης ενός direct αρχείου (που από αρκετούς καλείται και dynamic)
στηρίζεται σ' έναν αλγόριθμο μετατροπής ή αντιστοίχησης του κλειδιού κάθε record σε μια
φυσική ή λογική διεύθυνση ενός μέσου αποθήκευσης αρχείων. Ο αλγόριθμος αυτός καλείται
hashing algorithm δηλαδή σε μια ελεύθερη μετάφραση είναι ο αλγόριθμος που τεμαχίζει
(κόβει σε κομματάκια) το κλειδί του record, θα πρέπει να παρατηρήσουμε εδώ ότι ένας
hashing algorithm αποτελείται από δυο μέρη:
α) μια συνάρτηση hashing (hashing function) που ορίζει μια απεικόνιση του συνόλου των
κλειδιών του αρχείου στο σύνολο του χώρου των διευθύνσεων.
β) μια τεχνική διαχωρισμού η οποία επιλύει περιπτώσεις στις οποίες πάνω από ένα κλειδί του
αρχείου απεικονίζεται στην ίδια διεύθυνση. Αυτή η περίπτωση λέγεται συνήθως
«περίπτωση συνώνυμων κλειδιών» ή συνώνυμα records».
Η φυσική δομή των records σε μια direct οργάνωση βασίζεται στην έννοια του τι είναι
"bucket". Bucket είναι ο φυσικός χώρος (σ' ένα δίσκο) που περιέχει ν θέσεις records. Ο
αριθμός των records ανά bucket καλείται χωρητικότητα του bucket (bucket capacity). Για να
έχουμε μια καλλίτερη αίσθηση του τι είναι bucket μπορούμε να πούμε ότι ένας sector (τομέας
ενός track) είναι ένα bucket όταν ο δίσκος είναι οργανωμένος σε sectors (sector - addressable
disk). Ένα bucket ακόμα μπορεί να έχει το χώρο ενός μπλοκ σ' ένα δίσκο που είναι
οργανωμένος σε μπλοκς (block - addressable disk).
Για να απομονώσουμε ένα record σ' ένα bucket θα πρέπει κατ' αρχήν να εντοπισθεί το
bucket που περιέχει το record και κατόπιν να οδηγηθεί σ' ένα buffer στην κύρια μνήμη απ'
όπου θα αντληθούν οι επιθυμητές πληροφορίες.
Στην περίπτωση όπου το σύνολο των κλειδιών απεικονίζεται ένα προς ένα στο σύνολο των
διευθύνσεων, ΤΟΤΕ αυτή η αμφιμονοσήμαντη απεικόνιση καλείται κατευθείαν Εύρεση της
διεύθυνσης (direct addressing). Σε πολλές περιπτώσεις όμως, όπου το σύνολο των κλειδιών
είναι πολύ μικρό σε σχέση με τις διαθέσιμες διευθύνσεις τότε η direct addressing εμφανίζει
μικρή χρησιμοποίηση του διαθέσιμου χώρου. Μ' άλλα λόγια, αυτό σημαίνει, ότι ένα μεγάλο
μέρος του διαθέσιμου χώρου μένει όχι μόνο κενό αλλά και αναξιοποίητο. Για την αποφυγή
αυτής της κατάστασης υπάρχει η έμμεση εύρεση της διεύθυνσης (indirect addressing) όπου

page 11
ο αλγόριθμος μετατροπής των κλειδιών σε διευθύνσεις, στέλνει αρκετά records σε κάθε
bucket. Μάλιστα υπάρχει και η πρόβλεψη για υπερχείλιση (overflow) ενός bucket, γεγονός
που μπορεί να εμφανιστεί όταν σ' ένα bucket σταλούν περισσότερα records απ' όσα μπορεί να
χωρέσει. Μια τεχνική bucket overflow λαμβάνει τότε πρόνοια για την αποθήκευση των
πλεοναζόντων records σε περιοχές υπερχείλισης (overflow areas). Τέτοιες παρόμοιες τεχνικές
συναντήσαμε στα σειριακά αρχεία με δείκτη.
Hashing techniques
Σύμφωνα με τα όσα έχουμε διατρέξει μέχρι στιγμής ένας hashing algorithm αποτελείται
από δυο μέρη εκ των οποίων το ένα είναι η hashing function, θα δούμε τώρα ότι και η hashing
function υποδιαιρείται σε δυο κλάσεις:
1) σε συναρτήσεις ανεξάρτητες από την κατανομή (distribution - independent functions) των
κλειδιών, και 2) σε συναρτήσεις που εξαρτώνται από την κατανομή (distribution -dependent
functions) των κλειδιών.
Στις συναρτήσεις που είναι ανεξάρτητες από την κατανομή η hashing function δεν
χρησιμοποιεί την κατανομή των κλειδιών για τον υπολογισμό της διεύθυνσης ενώ στις
συναρτήσεις που εξαρτώνται από την κατανομή των κλειδιών η hashing function εξετάζει ένα
υποσύνολο κλειδιών που αντιστοιχούν σε γνωστά records.
Ι) Ας εξετάσουμε όμως πιο κάτω μερικές hashing functions που προσπαθούν να κατανέμουν
ομαλά τα κλειδιά στον διαθέσιμο χώρο και οι οποίος Εφαρμόζονται ανεξάρτητα από την
κατανομή των κλειδιών μέσα στο σύνολο τους. Συνήθως οι συναρτήσεις που είναι
ανεξάρτητες από την κατανομή είναι χρήσιμες στις περιπτώσεις όπου το σύνολο των κλειδιών
δέχεται πολλές εισαγωγές και διαγραφές. Τέτοιες λοιπόν hashing functions είναι:
α) η μέθοδος της διαίρεσης (division method) που είναι η παλιότερη και η πιο πολύ
χρησιμοποιημένη. Έστω Κ η αριθμητική τιμή του κλειδιού του record τότε η «διεύθυνση»
= Κ— [K/m]*m+1 όπου οι αγκύλες [] σημαίνουν το ακέραιο μέρος της διαίρεσης K/m. Ο
αριθμός m εκλέγεται ανάλογα. Για παράδειγμα: m = 17 και μια σειρά κλειδιών 1000, 1001,
1002. Τότε αυτά θα αντιστοιχούν στις διευθύνσεις 15, 16, 17 κλπ. Παρατηρήστε όμως τι
μπορεί να συμβεί όταν και μια άλλη ομάδα κλειδιών όπως 1102, 1103, 1104... θελήσει να
αντιστοιχηθεί σε κάποιες διευθύνσεις. Ο πιο πάνω αλγόριθμος θα μας δώσει γι' αυτή την
ομάδα διευθύνσεις 15, 16, 17,... πράγμα που βέβαια μας ενοχλεί. Αυτό συμβαίνει γιατί η
διαφορά των κλειδιών της μιας ομάδας με την άλλη είναι ακέραιο πολλαπλάσιο του 17.
Είναι φανερό λοιπόν ότι ο ακέραιος πι πρέπει να εκλεγεί κατάλληλα και σύμφωνα με τις
αριθμητικές τιμές του συνόλου των κλειδιών μας.

page 12
β) η μέθοδος του πολ/σμού του κλειδιού με τον εαυτό του και ο καθορισμός των μεσαίων
ψηφίων του αριθμού που προκύπτει σα διεύθυνση, (midsquare hashing method). Για
παράδειγμα έστω το κλειδί 1234 τότε το τετράγωνο του είναι 1522756. Μπορούμε να
θεωρήσουμε σαν διεύθυνση το 3ο, 4ο και 5ο ψηφίο δηλαδή το 227. Είναι αρκετά καλή
μέθοδος αν και έχει δεχτεί πολύ κριτική.
γ) η μέθοδος του διπλώματος (folding method) όπου το κλειδί κόβεται σε τόσα κομμάτια ώστε
το κάθε κομμάτι να έχει τον απαιτούμενο αριθμό ψηφίων της διεύθυνσης. Κατόπιν τα
κομματάκια αυτά αθροίζονται αγνοώντας τα επιπλέον ψηφία ώστε το τελικό άθροισμα να
μας δίνει την διεύθυνση. ' Έστω για κλειδί το 1898234, ζητείται τριψήφιος αριθμός
διεύθυνσης: κάνουμε το χωρισμό 001 898 234 και κατόπιν 001 898+ 234 1 133 ΟΠΟΤΕ η
διεύθυνση είναι η 133.
ΙΙ ) Ας δούμε όμως τώρα και μια hashing function που ανήκει στην κλάση των
συναρτήσεων που είναι εξαρτημένες από την κατανομή των κλειδιών. Μια τέτοια λοιπόν
hasing function είναι η ανάλυση των ψηφίων (digit analysis) του κλειδιού του αρχείου και θα
την Εξετάσουμε μ' ένα παράδειγμα: Έστω ότι τα κλειδιά των records ενός αρχείου είναι
5ψήφιοι αριθμοί. Για το κλειδί κάθε record επαναλαμβάνουμε μια διαδικασία οπου
καταχωρούμε σ' ένα πίνακα το πόσες φορές κάθε ψηφίο 0 έως 9 βρέθηκε στην 1 η, 2η, 3η, 4η,
5η θέση του διψήφιου κλειδιού. ' Έτσι βλέπετε στον πίνακα ότι ο αριθμός C βρέθηκε 531
φορές στο πρώτο ψηφίο όλων των κλειδιών του αρχείου 123 φορές στο δεύτερο ψηφίο όλων
των κλειδιών, κ.ο.κ.
Μπορείτε να παρατηρήσετε τώρα στον πίνακα του κάτω σχήματος ότι η πρώτη, τρίτη και
πέμπτη στήλη έχουν την πιο ομοιόμορφη κατανομή των ψηφίων Ο έως 9. Αυτό αντιστοιχεί ότι
στην πρώτη, τρίτη και πέμπτη θέση του 5 ψηφίου κλειδιού οι αριθμοί Ο έως 9 έχουν την
καλλίτερη στατιστική κατανομή. Βάσει αυτού του συμπεράσματος επιλέγουμε την πρώτη,
τρίτη και πέμπτη θέση του κλειδιού για να μας δώσουν ένα τριψήφιο αριθμό που θα μας
χρησιμεύσει σαν τη διεύθυνση του record. Για παράδειγμα από το κλειδί 18763 θα βγάλουμε
σαν διεύθυνση το 173 ή ακόμα την 371 αν τα ψηφία επιλεγούν με την αντίθετη σειρά.

Αριθμοί Θεσεις ψηφίων μέσα στο κλειδί


1ον 2ον 3ον 4ον 5ον

0 531 123 499 0 562


1 582 0 538 17 617
2 571 0 532 1 523
3 547 0 510 475 543
4 521 247 494 5 545
5 502 0 500 9 479
page 13
6 486 25 469 78 430
7 451 0 502 135 427
8 420 0 471 642 456
9 393 0 487 7 448

Πλεονεκτήματα / Μειονεκτήματα της άμεσης προσπέλασης.

Πλεονεκτήματα

• Η κατευθείαν προσπέλαση στα records ενός direct αρχείου είναι πολύ γρήγορη, ειδικά
όταν ενημερώνεται» μικρός αριθμός records και έχουμε λίγες περιοχές υπερχείλισης.

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

• Τα records μπορούν να προσπελαστούν σειριακά κατά την «τυχαία» σειρά που βρίσκονται
στο αρχείο, όχι όμως και ταξινομημένα κάτι που είναι πολύ δύσκολο να γίνει.

• Για την δημιουργία του αρχείου δεν χρειάζεται να γίνει από πριν ταξινόμηση καθώς
επίσης και οι μεταβολές δεν χρειάζεται να Είναι ταξινομημένες.

Μειονεκτήματα
• Για μεγάλο αριθμό μεταβολών που γίνονται μέσα από ένα on line σύστημα έχουμε σαν
αποτέλεσμα αύξηση του χρόνου απόκρισης του συστήματος

• Η εκμετάλλευση του χώρου είναι μικρότερη από αυτήν της σειριακής.

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

Εκτός από τους απλούς τύπους δεδομένων (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 και ο
τύπος των στοιχείων.

page 16
Παράδειγμα:
VAR
bathmoi : array [1..24] of integer;

Μπορούμε να προσπελάσουμε οποιαδήποτε τιμή της μεταβλητής bathmoi, τοποθετώντας τον


κατάλληλο δείκτη σε αγκύλες μετά το όνομα της μεταβλητής, π.χ: bathmoi[8].
Αντί για τον τύπο array θα μπορούσαν ισοδύναμα να οριστούν 24 διαφορετικές μεταβλητές
(bathmoi1, bathmoi2, bathmoi3,... bathmoi24). Κάτι τέτοιο θα ήταν όμως πραγματική
ταλαιπωρία.

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

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

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


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

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

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


Arxeio : RECORD
Onoma : string[10];
Eponumo : string[15];

page 17
Mistos : real;
END;

Ο Τύπος File
Ο δομημένος τύπος δεδομένων file (Αρχείο) είναι ιδιαίτερα σημαντικός κατά την
επεξεργασία δεδομένων. Στον τύπο record εξηγήσαμε ήδη τι είναι ένα αρχείο. Εδώ απλώς θα
συνοψίσουμε ακόμα μια φορά. Ένα αρχείο αποτελείται από έναν ορισμένο αριθμό εγγραφών.
Οι εγγραφές, με τη σειρά τους, αποτελούνται από έναν ορισμένο αριθμό πεδίων. Με τη
βοήθεια των εγγραφών, θα διαχωρίσουμε τους τύπους αρχείων, που χρησιμοποιούνται στην
Borland Pascal.

Αρχεία με τύπο : Όταν η διαμόρφωση της εγγραφής εξαρτάται από μας, αναφερόμαστε σε
αρχείο με τύπο. Κάθε εγγραφή μπορεί να αποτελείται από ένα μόνο πεδίο ή από περισσότερα
πεδία, διαφορετικού μήκους το καθένα.
Τυχαία προσπέλαση: Όλες οι εγγραφές ενός αρχείου έχουν ακριβώς την ίδια διαμόρφωση
επίσης, η Borland Pascal διαθέτει ένα δείκτη για κάθε αρχείο που επεξεργάzεται. Έτσι είναι
δυνατή η προσπέλαση σε οποιαδήποτε εγγραφή ενός αρχείου με τύπο. Αναφερόμαστε τότε σε
δυνατότητα τυχαίας προσπέλασης (random access).
Αρχεία κειμένου: Τα αρχεία τύπου text ή αρχεία text (αρχεία κειμένου), είναι ο δεύτερος
επιτρεπτός τύπος αρχείων στην Borland Pascal. Τα αρχεία κειμένου αποτελούνται επίσης από
εγγραφές, μεταβλητού όμως μήκους.
Σειριακή προσπέλαση: Οι εγγραφές αυτές αποθηκεύονται η μια μετά την άλλη, χωρίς κενά.
Επειδή πρόκειται για εγγραφές που έχουν διαφορετικά μήκη δεν μπορούμε να γνωρίσουμε τη
θέση αποθήκευσης τους. Έτσι δεν είναι δυνατή η τυχαία προσπέλαση τους, αλλά για να βρεθεί
κάποια εγγραφή θα πρέπει να διαβαστούν πρώτα όλες οι προηγούμενες με τη σειρά. Εδώ
έχουμε σειριακή προσπέλαση.

Αρχείο χωρίς τύπο:


Το τελευταίο είδος αρχείων είναι τα αρχεία χωρίς τύπο. Τα αρχεία αυτά ονομάζονται χωρίς
τύπο, επειδή είναι συμβατά με όλους τους άλλους τύπους αρχείων.

Ο Τύπος Set
Ο τύπος set (τύπος-σύνολο) είναι μια συλλογή στοιχείων, που χαρακτηρίζονται από ένα
όνομα, με το οποίο μπορούμε να τα χειριστούμε όλα μαζί.

TYPE
page 18
DIGIT=SET OF 0..9;
VAR
NUM1,NUM2:DIGIT;
BEGIN
NUM1:=[8];
NUM2:=[1,2,6];
Ο Τύπος Pointer
Όλες οι δομές δεδομένων που αναφέραμε μέχρι τώρα, παραμένουν ίδιες στη μορφή και το
μέγεθος σε όλη τη διάρκεια της επεξεργασίας τους. Είναι στατικές, κάτι που σημαίνει ότι η
απαραίτητη μνήμη στο τμήμα δεδομένων της μνήμης εργασίας καθορίζεται γι' αυτές κατά τη
μεταγλώττιση του προγράμματος, και παραμένει σταθερή. Σκεφτείτε, π.χ., την περίπτωση του
αριθμού των στοιχείων ενός πίνακα. Σε πολλές εφαρμογές, ο αριθμός των στοιχείων δεν
μπορεί να καθοριστεί από πριν. Αυτό σημαίνει, είτε ότι θα δεσμευτεί υπερβολικά μεγάλη μνή-
μη, είτε ότι η μνήμη που θα κρατηθεί δε θα είναι αρκετή. Φανταστείτε εδώ π.χ. τον αριθμό των
εγγραφών ενός αρχείου. Σ' αυτήν την περίπτωση βοηθά πολύ η χρήση δυναμικών μεταβλητών.

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

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

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

PROGRAM deiktis1;
USES crt;
VAR a, b, c : ^integer;
Begin

page 19
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 έχει σκοπό να σας ευαισθητοποιήσει


σχετικά με τη διαχείριση της μνήμης στο σωρό. Δεν μπορούμε πάντα, μόνο να
καταλαμβάνουμε μνήμη από τη μνήμη σωρού' θα πρέπει κιόλας να την απελευθερώνουμε.
Ιδιαίτερα όταν εργάζεστε με την Turbo Vision θα πρέπει να προσέχετε να απελευθερώνετε
πάλι τη μνήμη, αλλιώς η μνήμη σωρού θα κορεστεί πολύ γρήγορα.

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;

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

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


PROGRAM askopo;
TYPE
onoma = string[14];
page 21
VAR
Eponumo : onoma;
BEGIN
END.

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

PROGRAM skopimo;
VAR
Eponumo : string[14];
END.

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

page 22
Αρχεία με τύπο
Πρόγραμμα για Αρχεία
Αποθήκευση δεδομένων: Μέχρι τώρα, όταν κλείνατε τον υπολογιστή σας, χάνατε όλη τη δουλειά σας.
Όμως στην Borland Pascal μπορείτε ν’ αποθηκεύετε μόνιμα τα δεδομένα, που επεξεργάζεστε Μ' αυτόν τον τρόπο
θα μπορείτε πάντοτε να ξαναχρησιμοποιείτε παλαιότερα δεδομένα.

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

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

Ας συνοψίσουμε ξανά:

1. Δίνουμε ένα όνομα στο αρχείο.

2. Αποθηκεύουμε το περιεχόμενο της μνήμης εργασίας σ' ένα αρχείο στη δισκέτα.

3. Επαναφέρουμε το αρχείο από τη δισκέτα στη μνήμη εργασίας.

Στη συνέχεια θα γράψουμε ένα πρόγραμμα, που θα μας επιτρέπει να αποθηκεύουμε εγγραφές
καθορισμένης δομής σε ένα αρχείο και, αντίστοιχα, να τις διαβάζουμε. Αρχικά θα πρέπει να
δώσετε ένα όνομα στο αρχείο. Αυτό γίνεται με την πρόταση:
Καθορισμός ονόματος αρχείου :
ASSIGN ( μεταβλητή αρχείου, μεταβλητή ) ;
Αν μετά τη μεταβλητή αρχείου δώσετε σαν σταθερά το όνομα του αρχείου, θα πρέπει να το
περικλείσετε σε αποστρόφους. Αν θέλετε π. χ. να ονομάσετε το αρχείο ONOMA.DAT, θα
πρέπει να γράψετε ‘ONOMA.DAT’. Τα ονόματα των αρχείων δεν πρέπει να υπερβαίνουν τους
οκτώ χαρακτήρες, πριν την τελεία.
Μετά την τελεία επιτρέπεται να υπάρχουν τρεις το πολύ χαρακτήρες. Για λόγους ταξινόμησης
ακολουθείται ένας συγκεκριμένος τρόπος ονοματολογίας. Έτσι, όλα τα αρχεία των προ-
γραμμάτων θα έχουν την προέκταση .PAS. Για αρχεία με τύπο χρησιμοποιείται η
προέκταση .DAT Μ' αυτόν τον τρόπο, αν κάποιος εξετάσει τον κατάλογο περιεχομένων της
δισκέτας θα έχει αμέσως μια συνολική εικόνα του είδους των αρχείων. Η μεταβλητή αρχείου
είναι η μεταβλητή τύπου FILE OF, που βρίσκεται στο τμήμα δηλώσεων του προγράμματος.
Ένα σχετικό παράδειγμα προσφέρει το πρόγραμμα dat1 με τις επεξηγήσεις του. Μετά
δημιουργούμε ένα νέο αρχείο στη δισκέτα. Το όνομα του θα είναι αυτό που αποδόθηκε στη
μεταβλητή αρχείου με την εντολή ASSIGN. Αυτό γίνεται με την ακόλουθη πρόταση:
Δημιουργία αρχείου :
page 23
REWRITE( μεταβλητή αρχείου ) ;
Η πρόταση αυτή θα πρέπει να χρησιμοποιείται με προσοχή, επειδή στην περίπτωση που
υπάρχει ήδη αρχείο με το όνομα αυτό, θα το διαγράψει.
Οι βασικότερες λειτουργίες σ' ένα αρχείο είναι η γραφή και η ανάγνωση δεδομένων, που
υλοποιούνται με τις επόμενες προτάσεις:
Γράψιμο σε αρχείο :
WRITE (μεταβλητή αρχείου, μεταβλητή ) ;
και με τις προτάσεις:
Διάβασμα από αρχείο :
READ (μεταβλητή αρχείου, μεταβλητή ) ;
Αν θέλετε να γράψετε σε αρχείο που υπάρχει ήδη, ή να διαβάσετε μια εγγραφή απ' αυτό, θα
πρέπει πρώτα να το ανοίξετε. Αυτό γίνεται με την πρόταση
Άνοιγμα αρχείου :
RESET ( μεταβλητή αρχείου ) ;
Όταν τελειώσετε την εργασία με το αρχείο το κλείνετε με την πρόταση
Κλείσιμο αρχείου:
CLOSE ( μεταβλητή αρχείου ) ;

θα πρέπει πάντοτε να κλείνετε τα αρχεία με CLOSE, αλλιώς υπάρχει μεγάλος κίνδυνος να


χάσετε δεδομένα.
Έτσι ολοκληρώσαμε τον εφοδιασμό με όλα τα απαραίτητα για το πρώτο πρόγραμμα
διαχείρισης αρχείων. Σ' αυτό θα δημιουργήσουμε ένα αρχείο με όνομα ONOMA.DAT. Κάθε
εγγραφή θα αποτελείται από όνομα και επώνυμο.
Δομικό διάγραμμα του dat1

Ονομασία ενός αρχείου

Δημιουργία αρχείου στη δισκέτα

ΕΙΣΑΓΩΓΗ ονόματος (onoma}

ΕΙΣΑΓΩΓΗ επωνύμου (eponymo)

Καταγραφή στο αρχείο

Κλείσιμο αρχείου

page 24
Άνοιγμα αρχείου

Ανάγνωση από το αρχείο

ΕΞΟΔΟΣ ονόματος (onoma)

ΕΞΟΔΟΣ επωνύμου (eponymo)

Κλείσιμο αρχείου

PROGRAM dat1;
TYPE
eggrafi = RECORD
eponymo : string[12] ;
onoma :string[10];
END;
VAR
arxeio : FILE OF eggrafi;
synolo : eggrafi;
BEGIN
ASSIGN ( arxeio, 'ΟΝΟΜΑ.DAT') ;
REWRITE( arxeio) ;
WRITE ('Επώνυμο : ' ) ;
readln ( synolo.eponymo) ;
WRITE (‘Όνομα : ‘ );
readln (synolo.onoma) ;
WRITE (arxeio, synolo) ;
CLOSE (arxeio) ;
RESET (arxeio);
READ ( arxeio, synolo) ;
writeln ('To επώνυρο που δώσατε είναι: ' , synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι:' , synolo. onoma) ;
CLOSE (arxeio) ;
writeln ('Συνέχεια με <Enter>') ;
page 25
readln;
END.
Ορισμός μεταβλητών : Ας εξετάσουμε το πρόγραμμα, κι ας συγκρίνουμε τις προτάσεις του
προγράμματος με τα συντακτικά διαγράμματα των νέων προτάσεων. Το όνομα του αρχείου
είναι ONOMA.DAT. Η μετα6λητή αρχείου ονομάστηκε arxeio, και η μεταβλητή που αντι-
στοιχεί σε εγγραφή στο αρχείο, synolo. Για να ξεχωρίζουν στο κείμενο του προγράμματος, οι
λέξεις WRITE και READ γράφονται με κεφαλαία, όταν αναφέρονται σε γράψιμο ή διάβασμα
από αρχείο.
Ας παρατηρήσουμε τώρα το τμήμα δηλώσεων του προγράμματος. Υπάρχουν δύο μεταβλητές.
Η μεταβλητή arxeio είναι τύπου FILE OF eggrafi. Όμως. η γραμμή
arxeio: FILE OF eggrafi
στο τμήμα δηλώσεων του προγράμματος, δεν αρκεί. Με το FILE OF ορίζεται βέβαια ένα
αρχείο μ' αυτόν τον τύπο, δεν καθορίζεται όμως η μορφή της eggrafi. Γι' αυτό θα πρέπει, στο
τμήμα δηλώσεων του προγράμματος, να οριστεί ένας τύπος μεταβλητής με το όνομα eggrafι
μετά τη δεσμευμένη λέξη ΤΥΡΕ. Η μεταβλητή αυτή αποτελείται από ένα RECORD με τα
στοιχεία eponymo και onoma. Ο συντομευμένος τρόπος γραφής, δεν μπορεί να χρησιμοποι-
ηθεί. Αν γινόταν, θα έπρεπε να γράψουμε στο τμήμα δηλώσεων των μεταβλητών τα εξής:
arxeio : FILE OF RECORD

eponymo : string[12];
onoma : string[10] ;
END;
Η Borland Pascal θ' αντιδρούσε σ' αυτήν τη δήλωση μ' ένα μήνυμα λάθους, καθώς το
RECORD είναι δεσμευμένη λέξη για τύπους δεδομένων.
(Ενώ η μεταβλητή arxeio αντιστοιχεί σε όλες τις εγγραφές, είναι δηλαδή το ίδιο το αρχείο, η
μεταβλητή synolo αντιστοιχεί μόνο σε μια εγγραφή του αρχείου.)
Όταν το πρόγραμμα αρχίσει να εκτελείται, παρακολουθήστε το φωτάκι του οδηγού δίσκου.

Εκτέλεση του προγράμματος: Εύκολα μπορείτε να καταλάβετε πότε γράφεται ή διαβάζεται


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

page 26
Χωρισμός του Προγράμματος Διαχείρισης Αρχείου σε Διαδικασίες
Βασικές λειτουργίες : Στην παράγραφο αυτή θα διαχωρίσουμε ακόμη περισσότερο τις τρεις
βασικές λειτουργίες κάθε επεξεργασίας αρχείων. Αυτό γίνεται για να κατανοήσετε καλύτερα
τις βασικές λειτουργίες, και να φτάσετε αργότερα στο σημείο να μπορείτε να καλείτε την
καθεμία τους πατώντας απλώς ένα πλήκτρο.
Για να χωριστούν οι βασικές λειτουργίες, θα κλείνετε κάθε φορά το αρχείο και όταν
χρειάζεται, θα το ανοίγετε ξανά. Κάθε φορά θα δίνετε στη μεταβλητή αρχείου το όνομα του
αρχείου της δισκέτας. Αυτό δεν είναι οπωσδήποτε απαραίτητο, αλλά ο τρόπος αυτός
προσφέρεται για εξάσκηση και καλύτερη κατανόηση.
Το πρόγραμμα γίνεται τότε ως εξής:

PROGRAM dat2;

TYPE
eggrafi = RECORD
eponymo :string[12];
onoma : string[10];
END;
VAR
arxeio : FILE OF eggrafi;
synolo : eggrafi;
BEGIN
ASSIGN (arxeio, 'ONOMA.DAT') ;
REWRITE (arxeio);
CLOSE (arxeio) ;
ASSIGN (arxeio, 'ONOMA. DAT') ;
RESET (arxeio) ;
WRITE ('Επώνυμο : ' ) ;
readln ( synolo. eponyμo) ;
WRITE ('Όνομα : ' );
readln (synolo. onoma);
WRITE ( arxeio, synolo) ;

page 27
CLOSE (arxeiο);
ASSIGN (arxeio, 'ONOMA. DAT');
RESET (arxeio) ;
READ ( arxeio, synolo) ;
writeln ('To επώνυμο που δώσατε είναι: ', synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι: ', synolo. onoma);
CLOSE (arxeio) ;
writeln ('Συνέχεια με <Enter>') ;
readln;
END.
Κατά την εκτέλεση του προγράμματος δε θα παρατηρήσετε καμία αλλαγή, καθώς ο
υπολογιστής εκτελεί κάθε άνοιγμα, κλείσιμο, και ονομασία αρχείου με εξαιρετικά υψηλή
ταχύτητα.
θα χωρίσετε τώρα το πρόγραμμα σε τμήματα, δημιουργώντας τα υποπρογράμματα anoigma,
eisagogi και exodos.
Ο διαχωρισμός αυτός γίνεται στην Borland Pascal με τις διαδικασίες. Οι διαδικασίες είναι και
αυτές προγράμματα, με την ίδια δομή όπως και τα προγράμματα. Αρχίζουν όμως με τη λέξη
procedure ακολουθούμενη από το όνομα της διαδικασίας, και τελειώνουν με "END;" αντί με
"END.". Οι μεταβλητές, που θα χρησιμοποιηθούν σε μια διαδικασία, είτε έχουν δηλωθεί στο
τμήμα δηλώσεων του προγράμματος, είτε δηλώνονται στην κάθε διαδικασία πριν από τη λέξη
BEGIN.

Δομικό Διάγραμμα:

Τα τμήματα του προγράμματος

Διαδικασία anoigma
Διαδικασία elsagogi
Διαδικασία exodos

Anoigma
Προσδιορισμός ονόματος αρχείου
Προσπέλαση αρχείου στη δισκέτα
Κλείσιμο αρχείου

eisagogi

page 28
Προσδιορισμός ονόματος αρχείου
Άνοιγμα αρχείου
ΕΙΣΑΓΩΓΗ επωνύμου (eponymo)
ΕΙΣΑΓΩΓΗ ονόματος (onoma)
Εγγραφή στο αρχείο
Κλείσιμο αρχείου

exodos

Προσδιορισμός ονόματος αρχείου


Άνοιγμα αρχείου
Ανάγνωση από το αρχείο
ΕΚΤΥΠΩΣΗ επωνύμου (eponymo)
ΕΚΤΥΠΩΣΗ ονόματος (onoma)
Κλείσιμο αρχείου
Έτσι, το πρόγραμμα διαμορφώνεται ως εξής:
PROGRAM dat3;

TYPE

eggrafi = RECORD
eponymo :string[12];
onoma :string[10] ;
END;
VAR
arxeio : FILE OF eggrafi;
synolo : eggrafi;

procedure anoigma;
BEGIN
ASSIGN ( arxeio, 'ΟΝΟΜΑ.DAT');
REWRITE (arxeio) ;
CLOSE (arxeio) ;
END;

procedure eisagogi;
BEGIN
page 29
ASSIGN (arxeio, 'ONOMA.DAT') ;

RESET (arxeio) ;
WRITE ('Επώνυμο : ' ) ;
readln (synolo.eponymo);
WRITE ('Όνομα : ');
readln (synolo. onoma) ;
WRITE (arxeio, synolo) ;
CLOSE (arxeio) ;
END;

procedure exodos;

BEGIN
ASSIGN (arxeio, 'ONOMA. DAT' ) ;

RESET (arxeio) ;
READ (arxeio, synolo) ;
writeln ('To επώνυμο που δώσατε είναι: ' , synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι:' , synolo. onoma) ;
CLOSE (arxeio) ;
END;
BEGIN (* Κύριο πρόγραμμα *)
anoigma;
eisagogi;
exodos;
writeln ('Συνέχεια με <Enter>');
readln;
END.
Με ένα πράγμα δεν ασχοληθήκαμε ακόμη: το κύριο πρόγραμμα. Είναι αυτονόητο ότι δεν
αρκεί να γράφετε μόνο τις διαδικασίες, αλλά χρειάζεται και το κύριο πρόγραμμα, που τις χρη-
σιμοποιεί. Αυτό γίνεται βέβαια πολύ γρήγορα: αρκεί να γράψετε μετά τη λέξη BEGIN τα
ονόματα των διαδικασιών, το ένα μετά το άλλο, χωρισμένα με (ελληνικά) ερωτηματικά, και το
κύριο πρόγραμμα είναι έτοιμο.

page 30
Η ροή του προγράμματος: Μ’ αυτό το παράδειγμα είδατε καθαρά, πώς πρέπει να γράφο-
νται τα προγράμματα ώστε να είναι δομημένα και ευανάγνωστα. Αν εκτελέσετε αυτό το
πρόγραμμα, και πάλι δε θα παρατηρήσετε καμία διαφορά σε σχέση με το πρώτο πρόγραμμα.
Έτσι θα πρέπει άλλωστε, αφού δεν κάνατε και τίποτε περισσότερο από το να γράψετε το
πρόγραμμα σε ενοποιημένη μορφή.
Αφού ασχοληθήκαμε αρκετά με τη μορφή του προγράμματος, ας εξετάσουμε τώρα και τα
αποτελέσματα. Μόλις αρχίσει το πρόγραμμα εισάγεται μια εγγραφή (επώνυμο και όνομα), που
κατόπιν αποθηκεύεται στη δισκέτα, και αργότερα διαβάζεται πάλι από τη δισκέτα.
Παρακολουθώντας πότε ανάβει και πότε σβήνει το φωτάκι του οδηγού δίσκου, μπορείτε να
καταλάβετε αν εκτελείται προσπέλαση του δίσκου (για λειτουργία εγγραφής ή ανάγνωσης).
Άνοιγμα του αρχείου με το διορθωτή κειμένων: θα προσπαθήσουμε τώρα να εξετάσουμε τα
περιεχόμενα του αρχείου ONOMA.DAT χρησιμοποιώντας έναν άλλο τρόπο. Δε θα
χρησιμοποιήσετε το πρόγραμμα, αλλά την ίδια την Borland Pascal. Η διαδικασία σας είναι ήδη
γνωστή. Απλώς φορτώνετε το αρχείο ONOMA.DAT στο διορθωτή κειμένου. Αυτό γίνεται ως
εξής: Επιλέγετε από τη γραμμή μενού της Pascal την επιλογή File. Από τις διαταγές που σας
προσφέρονται επιλέξτε το άνοιγμα αρχείου (Open). Διαλέξτε το αρχείο οnoma.dat. Η
προέκταση dat είναι απαραίτητη, επειδή στην περίπτωση που δε δίνεται προέκταση, η Borland
Pascal θεωρεί αυτονόητη την προέκταση pas. Εμφανίζεται στην οθόνη το περιεχόμενο του
αρχείου onoma.dat, που αποτελείται τώρα από μια εγγραφή.
Δε χρειάζεται να πειράξετε τα διάφορα σύμβολα που εμφανίζονται. Η παρουσία τους
οφείλεται στον ορισμό του αρχείου σαν αρχείο με τύπο.
Όσες φορές κι αν εκτελέσετε το πρόγραμμα, το περιεχόμενο του αρχείου θα είναι πάντα
μόνο μια εγγραφή. Το πρόγραμμα εκτελεί στο ξεκίνημα του μια πρόταση REWRITE, που έχει
αποτέλεσμα να γράφει πάνω στο παλιό αρχείο.
Για να μην ξαναγράφετε συνέχεια πάνω στο παλιό αρχείο, θα αλλάξουμε το πρόγραμμα,
έτσι ώστε χρησιμοποιώντας ένα μενού να μπορείτε να εκτελείτε ξεχωριστά τις βασικές
λειτουργίες anoigma (δημιουργία αρχείου), eisagogi (εισαγωγή δεδομένων), και exodos
(εκτύπωση δεδομένων).

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

page 31
Συναρτήσεις με Διαβίβαση Παραμέτρων
Οι διαδικασίες δεν είναι τίποτε άλλο από υποπρογράμματα. Στο προηγούμενο παράδειγμα
χρησιμοποιήθηκαν για τη διάσπαση του "μεγάλου" προγράμματος σε ενότητες. Σχεδόν
χωρίσαμε ολόκληρο το πρόγραμμα σε ξεχωριστές διαδικασίες. Οι διαδικασίες όμως μπορούν
να καταφέρουν πολύ περισσότερα από τη διάσπαση ενός προγράμματος. Μπορούν να
καλούνται από το κύριο πρόγραμμα με διαφορετικές παραμέτρους κάθε φορά.
Το κύριο πρόγραμμα διαβιβάζει σε κάθε διαδικασία που καλεί και τις κατάλληλες τιμές. Οι
τιμές αυτές ονομάζονται πραγματικές παράμετροι (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);

page 32
writeln ('Συνέχεια με <Enter>');
readln;
END.
Ας δούμε τι κάνουμε με το κύριο πρόγραμμα: Ορίζουμε δύο μεταβλητές a και b, και τις δύο
τύπου integer. Μετά δίνουμε τιμές στις μεταβλητές. Στη συνέχεια καλούμε τη διαδικασία,
όπου οι μεταβλητές a και b του κύριου προγράμματος διαβιβάζovται μέσα σε παρενθέσεις σαν
πραγματικές παράμετροι στη διαδικασία enallagi. Μετά την εκτέλεση της διαδικασίας εκτυ-
πώνονται οι τιμές των μεταβλητών του κύριου προγράμματος, και διαπιστώνουμε ότι έχουν
εναλλαγεί οι τιμές τους. Η διαδικασία επέστρεψε λοιπόν τις επεξεργασμένες τιμές στο κύριο
πρόγραμμα.
Κατά τον ορισμό της διαδικασίας enallagi, δίνονται μετά το όνομα της διαδικασίας οι
τυπικές παράμετροι μέσα σε παρενθέσεις. Αν θέλουμε η διαδικασία να ανταλλάξει τις τιμές
του κύριου προγράμματος, οι παράμετροι θα πρέπει να οριστούν σαν παράμετροι μεταβλητών
(VAR). Πρέπει δηλαδή, πριν τις παραμέτρους, να γραφεί η λέξη VAR.
Στη συνέχεια δηλώνονται οι τυπικές παράμετροι, χωρισμένες με κόμματα. Ακολουθεί μια
άνω και κάτω τελεία και ο καθορισμός του τύπου. Για να εναλλάξουν δύο μεταβλητές τις τιμές
τους, χρειάζεται και μια τρίτη βοηθητική μεταβλητή, που θα χρησιμεύει για την ενδιάμεση
αποθήκευση της τιμής της μιας μεταβλητής. Επειδή αυτή η τρίτη μεταβλητή χρειάζεται μόνο
μέσα στην διαδικασία, αρκεί να οριστεί σαν τοπική μεταβλητή (local variable). Η τοπική
μεταβλητή υφίσταται μόνο μέσα στη διαδικασία, και είναι άγνωστη έξω απ' αυτήν.
Μετά το τμήμα δηλώσεων ακολουθεί το τμήμα των προτάσεων, που ξεκινά με BEGIN και
καταλήγει σε END με ελληνικό ερωτηματικό.
Καθολικές μεταβλητές: Στο πρόγραμμα υπάρχουν εκτός από τοπικές, και καθολικές
μεταβλητές. Οι καθολικές μεταβλητές ορίζονται πριν τις διαδικασίες και τις συναρτήσεις και
πριν το πρώτο BEGIN. Ισχύουν για ολόκληρο το πρόγραμμα.
Οι διαδικασίες προσφέρουν επίσης στον προγραμματιστή τη δυνατότητα, να διαβιβάζει
τιμές από το κύριο πρόγραμμα στη διαδικασία, όπου θα γίνεται επεξεργασία τους και θα
τροποποιούνται, αλλά οι τροποποιημένες τιμές να μην επιστρέφονται στο κύριο πρόγραμμα.
Οι μεταβλητές του κύριου προγράμματος παραμένουν δηλαδή χωρίς αλλαγή.
Το επόμενο πρόγραμμα είναι ένα παράδειγμα αυτής της περίπτωσης:
PROGRAM procedure2;
VAR
a,b : integer;
page 33
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.
Παράμετροι τιμών: Οι παράμετροι a και b του κύριου προγράμματος δεν πρόκειται
αλλάξουν τιμή μετά την κλήση της διαδικασίας γι’ αυτό, στην αρχή της διαδικασίας, οι τυπικές
παράμετροι ορίζονται σαν παράμετροι τιμών. Πριν τις παραμέτρους δεν υπάρχει τώρα κανένα
χαρακτηριστικό (VAR).
Η εκτέλεση του προγράμματος γίνεται ως εξής: Στο κύριο πρόγραμμα γίνεται η εισαγωγή
των μεγεθών a και b. Οι τιμές αυτές διαβιβάζονται στη διαδικασία enallagi, που πραγματοποιεί
μιαν εναλλαγή των δύο τιμών.
Για καλύτερο έλεγχο του προγράμματος, τυπώστε τις τιμές μέσα από τη διαδικασία. Θα
διαπιστώσετε ότι τα αλλαγμένα μεγέθη δεν επιστρέφονται στο κύριο πρόγραμμα. (τυπώστε τις
κύριες μεταβλητές a και b μετά την εκτέλεση της διαδικασίας.)
Γενικά, η αρχή της διαδικασίας μπορεί να παρασταθεί ως εξής:

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

Συναρτήσεις με Διαβίβαση Παραμέτρων


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

page 35
υπολογίζεται η συνάρτηση. Η τιμή που επιστρέφει η συνάρτηση αποδίδεται στη μεταβλητή
apotelesma.
Δομή της συνάρτησης: Η ίδια η συνάρτηση είναι ένα υποπρόγραμμα, όπως και η διαδικασία.
Στην αρχή όμως μιας συνάρτησης θα πρέπει να ορίζεται ο τύπος δεδομένων του
αποτελέσματος της. Αυτό γίνεται προσθέτοντας μια άνω και κάτω τελεία και τον τύπο
δεδομένων μετά τη λίστα των τυπικών παραμέτρων (που βρίσκονται μέσα σε παρενθέσεις).
Στη συνέχεια ακολουθεί το τμήμα δηλώσεων, αν υπάρχει. Αν οριστούν εδώ μεταβλητές, θα
ισχύουν μόνο μέσα στη συνάρτηση (τοπικές μεταβλητές). Ακολουθεί το τμήμα προτάσεων,
που ξεκινά με BEGIN και τελειώνει σε END με (ελληνικό) ερωτηματικό. Το τμήμα
προτάσεων θα πρέπει οπωσδήποτε να περιέχει μια πρόταση απόδοσης τιμής για το όνομα της
συνάρτησης.
Αναδρομή: Πρέπει επίσης να σημειώσουμε ότι μια συνάρτηση μπορεί να καλεί άλλες
συναρτήσεις, ακόμη και τον ίδιον τον εαυτό της. Μια συνάρτηση που καλεί τον εαυτό της,
ονομάζεται αναδρομική συνάρτηση. Η διαβίβαση παραμέτρων γίνεται με τον ίδιον τρόπο,
όπως στις διαδικασίες.
Κλήση διαδικασιών από ένα Μενού
Στα μέχρι τώρα προγράμματα, όλες οι διαδικασίες εκτελούνταν με τη σειρά που είχαν
γραφεί. Αυτό όμως δεν είναι πάντα βολικό, θα πρέπει να τροποποιήσουμε το πρόγραμμα, έτσι
ώστε κάθε διαδικασία να μπορεί να καλείται ξεχωριστά, και, μάλιστα, ακόμη καλύτερα, από
ένα μενού. Ας γράψουμε λοιπόν μια διαδικασία menu, όπου η εκλογή θα γίνεται με τη γνωστή
πρόταση CASE.
Δομικό Διάγραμμα (για το κύριο πρόγραμμα):

Διαδικασία menu
ΕΙΣΑΓΩΓΗ εκλογής (eklogi)
Εάν Eklogi=
1 2 3
Διαδικασία Διαδικασία Διαδικασία
ανοίγματος εισαγωγής εξόδου

PROGRAM dat4;
USES crt;
TYPE
eggrafi= RECORD

page 36
eponymo :string[12] ;
onoma :string[10];
END;
VAR
arxeio : FILE OF eggrafi;
synolo : eggrafi;
eklogi : integer;
procedure anoigma; (* Διαδικασία ανοίγματος *)
BEGIN
ASSIGN (arxeio, 'ONOMA.DAT' ) ;
REWRITE (arxeio) ;
CLOSE (arxeio) ;
END;
procedure eisagogi; (* Διαδικασία εισαγωγής *)
BEGIN
ASSIGN ( arxeio, 'ΟΝΟΜΑ.DAT' ) ;
RESET (arxeio) ;
WRITE ('Επώνυμο : ' ) ;
readln (synolo. eponymo) ;
WRITE (' Όνομα : ');
readln ( synolo. onoma) ;
WRITE (arxeio, synolo) ;
CLOSE (arxeio) ;
END;
procedure exodos; (* Διαδικασία εξόδου *)
BEGIN
ASSIGN (arxeio, 'ONOΜA.DAT' ) ;
RESET (arxeio) ;
READ ( arxeio,synolo) ;
writeln ('To επώνυμο που δώσατε είναι:', synolo. eponymo) ;

page 37
writeln ('To όνομα που δώσατε είναι:' , synolo. onoma) ;
CLOSE (arxeio) ;
END;
procedure menu; (* Διαδικασία ΜΕΝΟΥ *)
BEGIN
clrscr;
writeln(' ( 1 ) Άνοιγμα νέου αρχείου! ');
writeln( ' ( 2 ) Εισαγωγή εγγραφών! ');
writeln(' ( 3 ) Εμφάνιση εγγραφών! ');
END;
BEGIN (* Κύρίως πρόγραμμα *)
menu;
readln (eklogi) ;
CASE eklogi OF
1: anoigma;
2: eisagogi;
3: exodos;
END;
writeln ('Συνέχεια με <Enter>' ) ;
readln;
END.
Εκτέλεση: Ας δούμε τώρα τα αποτελέσματα του προγράμματος. Ξεκινήστε το πρόγραμμα
και διαλέξτε την εκλογή 3. Το πρόγραμμα εμφανίζει πραγματικά το όνομα και το επώνυμο,
που περιέχονται στο αρχείο από κάποια προηγούμενη εκτέλεση του προγράμματος. Ξεκινήστε
ξανά το πρόγραμμα, κι επιλέξτε το 2, για να δώσετε μιαν άλλη εγγραφή. Στη συνέχεια
εκτελέστε και πάλι το πρόγραμμα, και κάνετε την εκλογή 3. θα διαπιστώσετε ότι η
προηγούμενη εγγραφή δεν υπάρχει πια. Αν φορτώσετε το αρχείο ONOMA.DAT στο διορθωτή
κειμένου της Borland Pascal, θα δείτε ότι σ' αυτό το αρχείο υπάρχει μόνο η τελευταία
εγγραφή. Παρ' όλο που δε χρησιμοποιήσατε καθόλου την πρόταση REWRITE, η πρώτη
εγγραφή έχει διαγραφεί.

page 38
Το γεγονός αυτό ερμηνεύεται εύκολα: με την πρόταση RESET ανοίγουμε ένα αρχείο για
επεξεργασία. Αυτό που δε είπαμε όμως είναι, ότι ταυτόχρονα τοποθετείται ο δείκτης αρχείου
-που δείχνει την κάθε εγγραφή- στην αρχή του αρχείου. Αυτό σημαίνει, ότι αν δε μετακινηθεί
ο δείκτης αρχείου, όλες οι λειτουργίες θα αφορούν την ίδια πάντα εγγραφή.
Σημείωση: Η θέση της πρώτης εγγραφής έχει "αύξοντα αριθμό" 0. ( Στην Borland Pascal )

Εισαγωγή Δεδομένων με Μετακίνηση του Δείκτη Αρχείου


RESET: Με το RESET ανοίγει ένα αρχείο (που ήδη υπάρχει), και προετοιμάζεται για
επεξεργασία των δεδομένων του. Ταυτόχρονα, ο δείκτης αρχείου τοποθετείται στην αρχή του
αρχείου, δηλαδή στην εγγραφή "με αύξοντα αριθμό" 0.
Για να μεγαλώσετε το αρχείο, δίνοντας κι άλλες εγγραφές, θα πρέπει πρώτα να τοποθετήσετε
το δείκτη αρχείου στο τέλος του αρχείου. Μόνο αφού προηγηθεί αυτή η ενέργεια μπορείτε να
εισαγάγετε μια νέα εγγραφή. Σε αντίθετη περίπτωση, η εγγραφή θα αντικαταστήσει την
εγγραφή, που δείχνει ο δείκτης αρχείου.
Τοποθέτηση του δείκτη αρχείου : Με την πρόταση
SEEK ( μεταβλητή αρχείου , αριθμός εγγραφής );
ο δείκτης αρχείου τοποθετείται στην εγγραφή με τον αντίστοιχο αριθμό. Το πλήθος των
εγγραφών ενός αρχείου δεν είναι όμως πάντα γνωστό.
Εύρεση του αριθμού των εγγραφών : Μπορείτε να το βρείτε με την πρόταση
FILESIZE ( μεταβλητή αρχείου );
Για να τοποθετήσετε το δείκτη αρχείου στο τέλος του αρχείου, αρκεί να συνδυάσετε τη
SEEK και τη FILESIZE:
SEEK ( αρχείο , FILESIZE ( αρχείο ));

Με δεδομένο ότι η πρώτη εγγραφή είναι η 0 και ότι η FILESIZE επιστρέφει τον αριθμό των εγγραφών, ο δείκτης
αρχείου θα τοποθετηθεί στο τέλος του αρχείου, για να καταχωρηθεί μια νέα εγγραφή.

Η Βελτιωμένη διαδικασία eisagogi θα γίνει τώρα:


Δομικό Διάγραμμα της διαδικασίας εισαγωγής

Προσδιορισμός ονόματος αρχείου


page 39
Άνοιγμα αρχείου

Τοποθέτηση δείκτη αρχείου στο τέλος του αρχείου

ΕΙΣΑΓΩΓΉ επωνύμου (eponymo)

ΕΙΣΑΓΩΓΉ ονόματος (onoma)

Εγγραφή στο αρχείο

Κλείσιμο αρχείου

procedure eisagogi;
BEGIN
ASSIGN (arxeio, 'ΟΝΟΜΑ.DAT') ;
RESET (arxeio) ;
SEEK (arxeio, FileSize( arxeio) );
WRITE ('Επώνυμο : '); readln ( synolo. eponymo) ;
WRITE ('Όνομα : '); readln ( synolo. onoma);
WRITE ( arxeio,synolo);
CLOSE (arxeio) ;
END;
Δοκιμάστε τώρα τη νέα έκδοση του προγράμματος, δίνοντας περισσότερες εγγραφές. Μην
ξεχνάτε μετά από κάθε εκλογή να δίνετε πάλι τη διαταγή εκτέλεσης Run. Αργότερα, όταν όλες
οι λειτουργίες θα εκτελούνται σωστά, θα προγραμματίσετε ένα βρόχο εισαγωγής δεδομένων,
που θα απλοποιεί τη διαδικασία αυτή. Και αυτός ο τρόπος εργασίας είναι χαρακτηριστικός για
το δομημένο προγραμματισμό.
Αφού εισάγετε αρκετές εγγραφές μ' αυτόν τον τρόπο, επιλέξτε τη διαδικασία exodos.
Εμφανίζεται τότε μόνο η εγγραφή που δόθηκε πρώτη. Το αποτέλεσμα δε θα σας φανεί
παράλογο αν μελετήσετε τη διαδικασία exodos. Και Σ' αυτήν τη διαδικασία χρησιμοποιείται η
πρόταση RESET, με αποτέλεσμα ο δείκτης αρχείου να τοποθετείται πάντοτε στην πρώτη
εγγραφή και να είναι δυνατή η ανάγνωση της πρώτης εγγραφής μόνο.
Αν φορτώσετε το αρχείο ONOMA.DAT στο διορθωτή κειμένου, θα διαπιστώσετε ότι σ' αυτό
υπάρχουν όλες οι εγγραφές, που δώσατε, θα πρέπει λοιπόν να τροποποιήσετε και τη
διαδικασία exodos.
Έξοδος όλων των Εγγραφών Για να εμφανίσετε όλες τις εγγραφές, πρέπει να τοποθετήσετε το δείκτη αρχείου

page 40
στην πρώτη εγγραφή. Αυτό γίνεται ήδη στη διαδικασία exodos με τη χρήση της πρότασης RESET. Στη συνέχεια
όμως, θέλετε να διαβάσετε όλες τις εγγραφές, και όχι μόνο μια. Αυτό θα μπορούσε να εκφραστεί, με απλά λόγια,
ως εξής: "Μέχρι να φτάσεις στο τέλος του αρχείου, θα διαβάζεις εγγραφές από το αρχείο και θα τις εμφανίζεις
στην οθόνη".

Χρειαζόμαστε το βρόγχο while. Έτσι, η διαδικασία exodos διαμορφώνεται ως εξής:


Δομικό Διάγραμμα:

Προσδιορισμός ονόματος αρχείου

Άνοιγμα αρχείου

Εφόσον όχι τέλος αρχείου

Ανάγνωση από το αρχείο

ΕΞΟΔΟΣ επωνύμου (eponymo)

ΕΞΟΔΟΣ ονόματος (onoma)

Κλείσιμο αρχείου

procedure exodos;
BEGIN
ASSIGN (arxeio, 'ONOMA.DAT') ;
RESET (arxeio);
WHILE NOT EOF(arxeio) DO
BEGIN
READ ( arxeio, synolo) ;
writeln ('To επώνυμο που δώσατε είναι:',synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι:',synolo. onoma) ;
END;
CLOSE (arxeio) ;
writeln ('Συνέχεια με <Enter>') ;
readln;
END;
EOF : Η EOF (End Of File = Τέλος Αρχείου) είναι μια λογική τιμή, που παίρνει την τιμή
"αληθής" όταν ο δείκτης αρχείου δείχνει στο τέλος του αρχείου.

page 41
Πριν αρχίσετε να βελτιώνετε το πρόγραμμα, θα πρέπει να ασχοληθείτε με δύο λειτουργίες
ακόμη, που είναι απαραίτητες σε κάθε πρόγραμμα επεξεργασίας αρχείων.
Έξοδος Συγκεκριμένων Εγγραφών

Σ' αυτήν την παράγραφο θα μάθετε πώς να αναζητάτε και να παρουσιάζετε συγκεκριμένες
εγγραφές. Η έρευνα θα πρέπει να γίνεται σε όλο το αρχείο, δηλαδή θα πρέπει να διαβάζονται
όλες οι εγγραφές, από το 0 μέχρι το EOF.

Η εμφάνιση μιας εγγραφής όμως, θα εξαρτάται από την εκπλήρωση μιας συνθήκης. Όταν η συνθήκη είναι αληθής,
η εγγραφή θα εμφανίζεται.

Η ευκολότερη περίπτωση είναι όταν η συνθήκη αφορά μόνο ένα πεδίο της εγγραφής. Μια
τέτοια συνθήκη ενσωματώνεται εύκολα στο πρόγραμμα με μια πρόταση IF.
Μια και γνωρίζετε πια την τεχνική των διαδικασιών, θα προγραμματίσετε τη διαδικασία
epilogi. ( Δεν είναι παρά η διαδικασία exodos, με μια πρόσθετη πρόταση IF για τον έλεγχο της
συνθήκης. )
procedure epilogi;
BEGIN
ASSIGN (arxeio, 'ΟΝΟΜΑ.DAT' ) ;
RESET (arxeio) ;
WHILE NOT EOF(arxeio) DO
BEGIN
READ ( arxeio, synolo);
IF synolo. eponymo = ' ΜΥΛΩΝΑΣ' THEN
BEGIN
writeln ('To επώνυμο που δώσατε είναι:',synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι:',synolo. onoma) ;
END;
END;
CLOSE (arxeio) ;
END;
Με τη διαδικασία epilogi εμφανίζονται όσοι έχουν το επώνυμο ΜΥΛΩΝΑΣ, καθώς και το
όνομα του καθενός. Μην ξεχάσετε να αλλάξετε τη διαδικασία menu, ώστε να μπορείτε να
επιλέγετε και τη διαδικασία epilogi. Και φυσικά θα πρέπει να προστεθεί στο κύριο πρόγραμμα
κι αυτή η διαδικασία.

page 42
Προσέξτε ότι ο τρόπος γραφής του ονόματος που δίνεται, πρέπει να συμπίπτει μ' αυτόν που
έχει το αποθηκευμένο όνομα. Ο ΜΥΛΩΝΑΣ δεν είναι Μυλωνάς.

Διόρθωση μιας Εγγραφής

Τοποθέτηση του δείκτη αρχείου: Για να διορθώσετε μια εγγραφή θα πρέπει πρώτα να την
εντοπίσετε ακριβώς. Αυτό γίνεται με τον αριθμό εγγραφής. Αρκεί να χρησιμοποιήσετε την
πρόταση SEEK για να τοποθετήσετε το δείκτη αρχείου στην αντίστοιχη πρόταση, θα πρέπει
όμως να λάβετε υπόψη ότι η αρίθμηση των εγγραφών αρχίζει από το 0.
θα γράψετε τη διαδικασία diorthosi έτσι ώστε η εγγραφή που πρόκειται να διορθωθεί, να
εμφανίζεται πριν από τη διόρθωση. Ας υποθέσουμε για παράδειγμα, ότι θέλετε να διορθώσετε
την τέταρτη εγγραφή.
Δομικό Διάγραμμα της διαδικασίας διόρθωσης

Προσδιορισμός ονόματος αρχείου


Άνοιγμα αρχείου
Ο δείκτης αρχείου στην εγγραφή n
Ανάγνωση οπό το αρχείο
ΕΞΟΔΟΣ επωνύμου (eponymo)
ΕΞΟΔΟΣ ονόματος (onoma)
Ο δείκτης αρχείου στην εγγραφή n
ΕΙΣΑΓΩΓΗ επωνύμου (eponymo)
ΕΙΣΑΓΩΓΗ ονόματος (onoma)
Αποθήκευση στο αρχείο
Κλείσιμο του αρχείου

procedure diorthosi;

page 43
BEGIN
ASSIGN (arxeio, 'ΟΝΟΜΑ.DAT' ) ;
RESET (arxeio) ;
SEEK (arxeio,3);
READ (arxeio, synolo) ;
writeln ('To αποθηκευμένο επώνυμο είναι: ',synolo. eponymo) ;
writeln ('To αποθηκευμένο όνομα είναι: ',synolo. onoma) ;
SEEK (arxeio, 3) ;
writeln ('To διορθωμένο επώνυμο είναι: ',synolo. eponymo) ;
readln ( synolo.eponymo) ;
writeln ('To διορθωμένο όνομα είναι: ',synolo.onoma) ;
readln (synolo.onoma) ;
WRITE (arxeio, synolo);
CLOSE (arxeio);
END;
Σημείωση : Πριν εκτελέσετε το πρόγραμμα, μην ξεχάσετε να συμπεριλάβετε τη διαδικασία
diorthosi από κύριο πρόγραμμα και στο menu.
Προσέξτε ότι η διαδικασία diorthosi χρησιμοποιεί δυο φορές την πρόταση SEEK (arxeio,3).
Την πρώτη φορά η SEEK τοποθετεί το δείκτη αρχείου στην τέταρτη εγγραφή. Στη συνέχεια
διαβάζεται η εγγραφή και ο δείκτης αρχείου αυξάνεται κατά ένα.
Η δεύτερη SEEK χρησιμοποιείται για την επαναφορά του δείκτη αρχείου.
Το ολοκληρωμένο πρόγραμμα έχει ως εξής:
PROGRAM dat5;
USES crt;
TYPE
eggrafi = RECORD
eponymo :string[12];
onoma : string[10] ;
END;
VAR
arxeio : FILE OF eggrafi;
page 44
synolo : eggrafi;
eklogi : integer;

procedure anoigma; (* Διαδικασία ανοίγματος *)


BEGIN
ASSIGN (arxeio, 'ΟΝΟΜΑ.DAT' ) ;
REWRITE (arxeio) ;
CLOSE (arxeio) ;
END;
procedure eisagogi; (* Διαδικασία εισαγωγής *)
BEGIN
ASSIGN (arxeio, 'ΟΝΟΜΑ.DAT' );
RESET (arxeio) ;
SEEK (arxeio, FileSize( arxeio)) ;
WRITE ('Επώνυμο : '); readln (synolo. eponymo) ;
WRITE (Όνομα : ' ); readln ( synolo. onoma) ;
WRITE (arxeio, synolo) ;
CLOSE (arxeio) ;
END;
procedure exodos; (* Διαδικασία εξόδου*)
BEGIN
ASSIGN ( arxeio, 'ΟΝΟΜΑ.DAT' ) ;
RESET ( arxeio) ;
WHILE NOT EOF(arxeio) DO
BEGIN
READ (arxeio, synolo) ;
writeln ('To επώνυμο που δώσατε είναι:',synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι:',synolo. onoma) ;
END;
CLOSE ( arxeio ) ;

page 45
END;

procedure epilogi; (* Διαδικασία επιλογής *)


BEGIN
ASSIGN ( arxeio, 'ΟΝΟΜΑ.DAT' ) ;
RESET ( arxeio) ;
WHILE NOT EOF(arxeio) DO
BEGIN
READ ( arxeio,synolo);
IF synolo. eponymo = 'ΜΥΛΩΝΑΣ' THEN
BEGIN
writeln ('To επώνυμο που δώσατε είναι:',synolo. eponymo) ;
writeln ('To όνομα που δώσατε είναι:',synolo. onoma) ;
END;
END;
CLOSE ( arxeio) ;
END;

procedure diorthosi; (* Διαδικασία διόρθωση *)


BEGIN
ASSIGN ( arxeio, 'ONOMA.DAT' ) ;
RESET ( arxeio) ;
SEEK ( arxeio, 3) ;
READ (arxeio, synolo) ;
writeln ('To αποθηκευμένο επώνυμο είναι: ',synolo. eponymo) ;
writeln ('To αποθηκευμένο όνομα είναι: ',synolo. onoma);
SEEK (arxeio, 3);
writeln('To διορθωμένο επώνυμο είναι: ',synolo. eponymo) ;
readln (synolo. eponymo) ;
writeln('To διορθωμένο όνομα είναι: ',synolo. onoma) ;

page 46
readln( synolo. onoma) ;
WRITE (arxeio, synolo);
CLOSE (arxeio) ;
END;
procedure menu; (* Διαδικασία μενού *)
BEGIN
clrscr;
writeln('(1) Άνοιγμα νέου αρχείου ');
writeln('(2) Εισαγωγή εγγραφών ');
writeln('( 3) Εμφάνιση εγγραφών ');
writeln(‘( 4) Επιλογή εγγραφών ');
writeln('(5) Διόρθωση εγγραφών ' ) ;
END;
ΒEGIN (* Κυρίως πρόγραμμα *)
menu;
readln (eklogi) ;
CASE eklogi OF
1: anoigma;
2: eisagogi;
3: exodos;
4: epilogi;
5: diorthosi;
END;
writeln ('Συνέχεια με <Enter>') ;
readln;
END.

Με την καθιερωμένη συνάρτηση ERASE (μεταβλητή αρχείου);


μπορείτε να σβήσετε ένα αποθηκευμένο αρχείο.

page 47
Η αλλαγή του ονόματος ενός αρχείου γίνεται με την καθιερωμένη διαδικασία
RENAME (μεταβλητή αρχείου, 'NeoOnoma' ) ;

Ασκήσεις Προγραμματισμού

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

Άσκηση 1:
Γράψτε μια διαδικασία eisagogi που να τοποθετεί τις εγγραφές στο αρχείο ΟΝΟΜΑ.DAT
Κάθε εγγραφή αποτελείται από τα πεδία αριθμός , επώνυμο και όνομα. Ο αριθμός είναι ο ίδιος
με τον αριθμό που αποδίδει η Pascal στην εγγραφή και θα αποθηκεύεται αυτόματα. Η
εισαγωγή δεδομένων θα σταματά όταν για επώνυμο δινεται το ".0"
Υπόδειξη : Η συνάρτηση FilePos ( arxeio ) επιστρέφει την τρέχουσα θέση του εσωτερικού
δείκτη αρχείου. ( Ο αριθμός αυτός είναι ίδιος με τον αριθμό εγγραφής )

Άσκηση 2:
Η διαδικασία exodos θα πρέπει να τροποποιηθεί έτσι ώστε η παρουσίαση να είναι ως εξής:

page 48
Αρ. Επώνυμο Όνομα
0 Μυλωνάς Ευριείδης
1 Ρώτας Κώστας
2 Δρέττας Ζαχαρίας
Υπόδειξη: Με την καθιερωμένη συνάρτηση GOTOXY (στήλη, γραμμή) μπορείτε να
τοποθετείτε το δρομέα οπουδήποτε στην οθόνη. Η οθόνη έχει 80 στήλες (1 μέχρι 80) και 25
γραμμές (1 μέχρι 25). Μια και η GOTOXY είναι διαδικασία συνεργασίας με την οθόνη, θα
πρέπει με την Turbo Pascal να συνδέσετε στο πρόγραμμα σας τη Μονάδα Crt με μια πρόταση
USES.
Λύση:
Προσδιορισμός ονόματος αρχείου (I- οστό αρχείο)

Άνοίγμα αρχείου (I- οστό αρχείο)

ΕΞΟΔΟΣ "Επικεφαλίδα"

I=0

Εφόσον όχι τέλος αρχείου

Ι := Ι + 1

Ανάγνωση από το αρχείο

Τοποθέτηση δρομέα

ΕΞΟΔΟΣ αριθμού (arithmos)

Τοποθέτηση δρομέα

ΕΞΟΔΟΣ επωνύμου (eponymo)

Τοποθέτηση δρομέα

ΕΞΟΔΟΣ ονόματος (onoma)

Κλείσιμο του αρχείου

Όπως Βλέπετε, το δομικό διάγραμμα είναι ιδιαίτερα επεξηγηματικό. Περιέχει ακόμη και την
"Επικεφαλίδα" που θα τυπώνεται στη οθόνη. (Κατά κανόνα, στο δομικό διάγραμμα δε συμπε-
ριλαμβάνουμε κείμενο για εκτύπωση, επειδή απομακρύνει τη σκέψη μας από το πραγματικό
πρόβλημα.)

page 49
Ο καθορισμός τιμής I:=0 και η αρίθμηση με I:=I+1 είναι απαραίτητα για την τοποθέτηση του
δρομέα (εύρεση της γραμμής).
Στην εναλλακτική περίπτωση όπου για το διάβασμα του αρχείου χρησιμοποιείται ένας βρόχος
FOR (FOR i:=l TO FileSize (arxeio)), δε χρειάζεται πρόσθετος μετρητής i για την τοποθέτηση
του δρομέα. Αυτή η εναλλακτική λύση περιλαμβάνεται στον κώδικα του προγράμματος, σαν
σχόλιο.

Άσκηση 3: ( επιλογή δεδομένων )


Να τροποποιηθεί η διαδικασία epilogi, έτσι ώστε το όνομα που θα αναζητηθεί, να δίνεται από
τον χρήστη.

Άσκηση 4: ( διόρθωση δεδομένων )


Να τροποποιηθεί η διαδικασία diorthosi, ώστε να μπορεί να διορθωθεί οποιαδήποτε εγγραφή.
Υπόδειξη:
Χρειάζεται αναζήτηση του αριθμού της εγγραφής, που θα διορθωθεί. Οι αριθμοί αυτοί
μπορούν να βρεθούν με τη διαδικασία exodos.
Άσκηση 5: (διαγραφή δεδομένων )
Στις λειτουργίες του προγράμματος πρέπει να προστεθεί και μια διαδικασία διαγραφής, με
όνομα diagrafi.
Με τη διαδικασία diagrafi θα είναι δυνατή η διαγραφή οποιασδήποτε εγγραφής. Το
πρόγραμμα θα ρωτά, ποια εγγραφή να διαγραφεί.
Υπόδειξη:
Αρχίστε με ανάγνωση των εγγραφών του αρχείου. Αν ο αριθμός της εγγραφής που
διαβάστηκε δε συμπίπτει με τον αριθμό της εγγραφής που θέλετε να διαγράψετε, αντιγράψτε
την σε ένα άλλο αρχείο.To δεύτερο αρχείο θα περιέχει όλες τις εγγραφές εκτός απ' αυτήν που
θέλετε να διαγραφεί. (Μπορείτε να σκεφτείτε ένα τρόπο εικονικής διαγραφής εγγραφών ;)

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


PROGRAM dat6;
USES crt;
TYPE
eggrafi = RECORD
page 50
arithmos : integer;
eponymo : string[12];
onoma : string[10] ;
END;
VAR
arxeio : FILE OF eggrafi;
synolo : eggrafi;
i : integer;
eklogi : integer;

procedure anoigma; (* διαδικασία ανοίγματος *)


BEGIN
ASSIGN (arxeio, 'ONOMA1.DAT' ) ;
REWRITE (arxeio) ;
CLOSE (arxeio) ;
END;
procedure eisagogi; (* διαδικασία εισαγωγής *)
BEGIN
ASSIGN (arxeio. 'ONOMA1. DAT' ) ;
RESET (arxeio) ;
WRITE (' Επώνυμο: ') ;
readln ( synolo. eponymo) ;
WHILE (synolo. eponymo <> '.0') DO
BEGIN
WRITE ( 'Όνομα ') ;
readln ( synolo. onoma) ;
SEEK (arxeio,FileSize(arxeio)) ;
synolo. arithmos := FilePos(arxeio) ;
WRITE (arxeio, synolo) ;
WRITE ('Επώνυμο; ' ) ;

page 51
readln ( synolo. eponymo);
END;
CLOSE (arxeio) ;
END;

procedure exodos; (* διαδικασία εξόδου*)


BEGIN
clrscr;
ASSIGN (arxeio, 'ONOMA1.DAT' ) ;
RESET (arxeio);
writeln('Ap. Επώνυμο Όνομα ');
writeln ('--------------------------------');
i : = 0;
WHILE NOT EOF(arxeio) DO
{ Η εναλλακτική δυνατότητα με το βρόχο FOR είναι:
FOR i : = 1 TO FileSize(arxeio) DO
οπότε δε θα χρειάζονται πια ούτε ο μετρητής i, ούτε και οι προτάσεις i : = 0, i := i+1 }
BEGIN
i : = i + 1;
READ ( arxeio, synolo) ;
GOTOXY (1, i+3) ;
WRITE ( synolo. arithmos) ;
GOTOXY ( 8, i+3) ;
WRITE ( synolo. eponymo);
GOTOXY ( 20, i+3) ;
WRITE ( synolo. onoma) ;
END;
CLOSE (arxeio) ;
END;
procedure epilogi; (* διαδικασία επιλογής *)

page 52
VAR
zitoumeno : string[15];
BEGIN
WRITE ('Ζητούμενο επώνυμο; ');
readln (zitoumeno);
ASSIGN (arxeio, 'ONOMAI.DAT' ) ;
RESET (arxeio) ;
WHILE NOT EOF(arxeio) DO (* FOR i: = 1 TO
FileSize (arxeio) DO *)
BEGIN
READ (arxeio, synolo) ;
IF synolo. eponymo = zitoumeno THEN
BEGIN
writeln ('To επώνυμο που δώσατε είναι:', synolo. eponyno) ;
writeln ('To όνομα που δώσατε είναι:',synolo. onoma) ;
END;
END;
CLOSE (arxeio);
END;

procedure diorthosi; (* διαδικασία διόρθωσης*)


VAR
n : integer;
BEGIN
ASSIGN (arxeio,'ONOMA1.DAT' ) ;
RESET (arxeio) ;
write('Αριθμός εγγραφής προς διόρθωση; ');
readln(n) ;
SEEK (arxeio,n) ;
READ (arxeio, synolo);

page 53
writeln ('To αποθηκευμένο επώνυμο είναι: ',synolo. eponymo) ;
writeln ('To αποθηκευμένο όνομα είναι: ',synolo. onoma) ;
SEEK ( arxeio,n) ;
writeln ('To διορθωμένο επώνυμο είναι: ',synolo. eponymo) ;
readln ( synolo. eponymo);
writeln ('To διορθωμένο όνομα είναι: ',synolo. onoma) ;
readln ( synolo. onoma) ;
WRITE (arxeio, synolo);
CLOSE (arxeio) ;
END;

procedure diagrafi; (* διαδικασία διαγραφής *)


VAR
prosor_arxeio : FILE of eggrafi;
n : integer;
BEGIN
ASSIGN (arxeio, 'ONOMA1.DAT' ) ;
RESET (arxeio);
WRITE {'Διαγραφή ποιας εγγραφής; ');
readln(n);
ASSIGN ( prosor_arxeio, 'TEMP.DAT' ) ;
REWRITE (prosor_arxeio);
WHILE NOT EOF (arxeio) DO
BEGIN
READ (arxeio, synolo);
IF ( (synolo. arithmos) <>n) THEN
BEGIN
synolo. arithmos := FilePos ( prosor_arxeio);
WRITE ( prosor_arxeio, synolo);
END;

page 54
END;
CLOSE (arxeio);
CLOSE (prosor_arxeio) ;
ERASE ( arxeio) ;
RENAME (prosor_arxeio, 'ONOMAl.DAT ) ;
END;

procedure menu; (* διαδικασία menu *)


BEGIN
writeln;
writeln;
writeln(' ( 1) ΑΝΟΙΓΜΑ ');
writeln('(2) ΕΙΣΑΓΩΓΗ ');
writeln('(3) ΕΜΦΑΝΙΣΗ ');
writeln('(4) ΕΠΙΛΟΓΗ ');
writeln('(5) ΔΙΟΡΘΩΣΗ ');
writeln('(6) ΔΙΑΓΡΑΦΗ ΕΓΓΡΑΦΗΣ ');
writeln('(0) ΤΕΛΟΣ ΕΡΓΑΣΙΑΣ ');
readln (eklogi) ;
END;
BEGIN (* Κυρίως πρόγραμμα*)
REPEAT
menu;
CASE eklogi OF
1: anoigma;
2: eisagogi;
3: exodos;
4: epilogi;
5: diorthosi;
6: diagrafi;

page 55
ELSE end;
UNTIL eklogi = 0;
END.
Μεταβλητές : Αναμφίβολα θα έχετε προσαρμόσει κατάλληλα τις δηλώσεις των μεταβλητών.
Αν μια νέα μεταβλητή είναι απαραίτητη μόνο μέσα σε μια διαδικασία» μπορεί να δηλώνεται
στην αρχή της διαδικασίας.
Η μεταβλητή αυτή θα έχει τότε ισχύ μόνο μέσα στη διαδικασία. θα μπορούσε επίσης να
οριστεί στο γενικό τμήμα δηλώσεως των μεταβλητών, στην αρχή του προγράμματος. Τότε θα
είχε καθολική ισχύ.
Ενδιαφέρον παρουσιάζει η διαδικασία εισαγωγής των δεδομένων. Μετά από κάθε εισαγωγή
δεδομένων, η εγγραφή αποθηκεύεται στο αρχείο με μια πρόταση WRITE (αρχείο,εγγραφή).
Αν δώσετε όμως περισσότερες από μια εγγραφές διαδοχικά, θα παρατηρήσετε ότι δεν
αποθηκεύεται καθεμία ξεχωριστά στο αρχείο. Η αποθήκευση στη δισκέτα γίνεται μόνο όταν
εκτελείται η πρόταση CLOSE (αρχείο) ή γεμίσει η περιοχή προσωρινής αποθήκευσης της
Borland Pascal. Δώστε 20, και μετά δώστε 40 εγγραφές χωρίς να σταματήσετε, για να
παρατηρήσετε το φαινόμενο αυτό.

ΑΣΚΗΣΕΙΣ 6 - 12
Με τις ασκήσεις 6 ως 12 δημιουργούμε ένα άλλο πρόγραμμα αρχείων. Σ' αυτό το πρόγραμμα
διαχωρίζονται οι λειτουργίες εισαγωγής και αποθήκευσης δεδομένων. Το πρόγραμμα περιέχει
επίσης και μια διαδικασία ταξινόμησης.
Επειδή οι εγγραφές που θα ταξινομηθούν, θα πρέπει να είναι σε μορφή πίνακα, θα πρέπει να
γίνουν ορισμένες αλλαγές σε σχέση με το πρόγραμμα των ασκήσεων 1 ως 5.
(θα βρείτε τον κώδικα του προγράμματος μετά την άσκηση 12. )

page 56
Άσκηση 6:
Γράψτε το τμήμα δηλώσεων για το νέο πρόγραμμα (dat7). Κάθε εγγραφή θα αποτελείται από
το επώνυμο και το όνομα. Ο πίνακας εγγραφών θα πρέπει να μπορεί να συμπεριλάβει 100
εγγραφές.

Άσκηση 7: ( δημιουργία αρχείου )


Γράψτε μια διαδικασία anoigma, που θα δημιουργεί το αρχείο "ONOMA2.DAT".

Άσκηση 8: (εισαγωγή στο αρχείο )


Γράψτε μια διαδικασία eisagogi με την οποία θα κάνετε εισαγωγή των δεδομένων. Η εισαγωγή
των δεδομένων θα διακόπτεται όταν δοθεί σαν επώνυμο το ".0".
Υπόδειξη:
Με τα δεδομένα συμπληρώνεται ένας πίνακας. Η αποθήκευση των δεδομένων γίνεται με
ξεχωριστή διαδικασία, ανεξάρτητη από την τακτοποίηση.
Λύση:

I:=0

ΕΙΣΑΓΩΓΗ synolo [I].eponymo

Εφοσον synolo [I].eponymo <> .0

ΕΙΣΑΓΩΓΗ synolo [I].onoma

I := I + 1

ΕΙΣΑΓΩΓΗ synolo [I].eponymo

Plithos:=I-1

Στη μεταβλητή plithos αποθηκεύεται ο αριθμός των εγγραφών που δόθηκαν. Επειδή σ' αυτές
συμπεριλαμβάνεται και η τελευταία, που είναι η συνθήκη διακοπής, θα πρέπει ο αριθμός αυτός
να μειώνεται κατά 1.

Άσκηση 9: (αποθήκευση των δεδομένων )


Γράψτε μια διαδικασία αποθήκευσης, με όνομα apothikefsi, που θα αποθηκεύει τον πίνακα
των εγγραφών στο αρχείο ONOMA2.DAT.
Λύση:
page 57
Προσδιορισμός ονόματος αρχείου

Άνοιγμα αρχείου

Δείκτης αρχείου στο τέλος του αρχείου

από Ι := 1 μέχρι plithos

καταχώριση του synolo [I] στο αρχείο

Κλείσιμο αρχείου

Άσκηση 10: ( έξοδος των δεδομένων )


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

Προσδιορισμός ονόματος αρχείου

Άνοιγμα αρχείου

από Ι := 1 μέχρι FileSize (arxeio)

ανάγνωση εγγραφής eggrafi [I] από το αρχείο

από I := 1 μέχρι FileSize (arxeio)

ΕΞΟΔΟΣ synolo[I].eponymo

ΕΞΟΔΟΣ synolo [I].onoma

Κλείσιμο αρχείου

Άσκηση 11: ( ταξινόμηση των δεδομένων )


Τώρα, θα πρέπει να γράψετε και μια διαδικασία ταξινόμησης με όνομα taxinomisi. Η
διαδικασία θα κάνει τα εξής: Αρχικά θα τοποθετεί όλες τις εγγραφές στον πίνακα εγγραφών.
Μετά θα αρχίζει τη διαδικασία της ταξινόμησης. Μόλις τελειώσει την ταξινόμηση, θα
εμφανίζει στην οθόνη το μήνυμα "Η ταξινόμηση τέλειωσε". Μετά την ταξινόμηση, στο αρχείο
θα αποθηκεύονται οι ταξινομημένες εγγραφές.
Υπόδειξη:
page 58
Η ταξινόμηση ακολουθεί τη σειρά των χαρακτήρων στον κώδικα ASCII.

Άσκηση 12: ( αλλαγή μενού )


1. Να τροποποιηθούν κατάλληλα η διαδικασία menu και το κύριο πρόγραμμα.
2. Να βελτιωθεί η διαδικασία επιλογής, ώστε ν' αντιμετωπίζονται καλύτερα οι λανθασμένες
επιλογές. Αν πατηθεί γράμμα αντί για ψηφίο, τυπώνεται το μήνυμα "Λάθος Πληκτρο-
λόγηση" και να μη διακόπτεται το πρόγραμμα.
Υποδείξεις για τη λύση του 1.:
Η μεταβλητή epilogi, που ήταν τύπου integer, να γίνει τύπου char.
Λάβετε υπόψη ότι έτσι θα χρειαστεί να προσθέσετε αποστρόφους
(') στα κατάλληλα σημεία.

Λύση των ασκήσεων 6 ως 12:


PROGRAM dat7;
USES crt;
TYPE
eggrafi = RECORD
eponymo : string[12];
onoma : string[10];
END;
VAR
arxeio : FILE OF eggrafi;
synolo : array [1..100] of eggrafi;
plithos, i : integer;
eklogi : char;

procedure anoigma;
BEGIN
ASSIGN ( arxeio, 'ONOMA2.DAT' ) ;
REWRITE (arxeio);
CLOSE (arxeio) ;
page 59
END;
procedure eisagogi;
BEGIN
i := 1;
WRITE (' Επώνυμο : ' ) ;
readln (synolo[ i].eponymo) ;
WHILE (synolo[ i] . eponymo <> '.0') DO
BEGIN
WRITE (' Όνομα : ' );
readln ( synolo[ i]. onoma) ;
i := i+l;
WRITE ('Επώνυμο; ');
readln { synolo[ i].eponymo)
END;
plithos := i-1; (* Για να μην αποθηκεύεται και η πληκτρολόγηση .0 *)
END;

procedure apothikefsi;
BEGIN
ASSIGN( arxeio, 'ONOMA2.DAT' ) ;
RESET(arxeio) ;
SEEK (arxeio, FileSize( arxeio));
FOR i : = 1 TO plithos DO
WRITE ( arxeio, synolo[i]);
CLOSE (arxeio) ;
END;

procedure exodos;
BEGIN
ASSIGN (arxeio, 'ONOMA2.DAT') ;

page 60
RESET (arxeio) ;
FOR i : = 1 TO FileSize (arxeio) DO
READ (arxeio, synolo[i]);
clrscr;
writeln ('Επώνυμο Όνομα ')
writeln ('--------------------------');
FOR i := 1 TO FileSize (arxeio) DO
BEGIN
GOTOXY ( 1,i+3) ;
WRITE ( synolo[ i]. eponymo) ;
GOTOXY ( 20, i+3) ;
WRITE ( synolo[ i].onoma);
END;
CLOSE ( arxeio) ;
END;

procedure taxinomisi; (* μέθοδος της φυσσαλίδας *)


VAR
endiamesos : eggrafi;
j : integer;
BEGIN
ASSIGN (arxeio, 'ONOMA2.DAT') ;
RESET (arxeio) ;
FOR i : = 1 TO FileSize (arxeio) DO
READ (arxeio, synolo[i]);
FOR j : = 1 TO (FileSize (arxeio) - 1) DO
FOR i : = 1 TO (FileSize (arxeio) -1) DO
IF synolo[i]. eponymo > synolo[i+1]. eponyno THEN
BEGIN
endiamesos := synolo [i];

page 61
synolo [ i] := synolo [i+1];
synolo [i+1] := endiamesos;
END;
writeln ('Η ταξινόμηση τέλειωσε');
plithos := FileSize (arxeio);
REWRITE (arxeio) ;
FOR i := 1 TO plithos DO
WRITE (arxeio, synolo[ i]);
CLOSE (arxeio) ;
END;

procedure menu;
BEGIN
writeln;
writeln;
writeln( '(1) ΑΝΟΙΓΜΑ ‘);
writeln('(2) ΕΙΣΑΓΩΓΗ ‘);
writeln('(3) ΕΞΟΔΟΣ ‘);
writeln(1(4) ΑΠΟΘΗΚΕΥΣΗ ‘);
writeln('(5) ΤΑΞΙΝΟΜΗΣΗ ‘);
writeln('(0) ΤΕΛΟΣ ΕΡΓΑΣΙΑΣ ‘);
readln ( eklogi) ;
END;

BEGIN (* ΚΎΡΙΟ ΠΡΟΓΡΑΜΜΑ *)


REPEAT
menu;
CASE eklogi OF
'1' : anoigma;
'2' : eisagogi;

page 62
'3' : exodos;
'4' : apothikefsi;
'5': taxinomisi;
'0' : ;
ELSE writeln ('Λάθος Πληκτρολόγηση');
END;
UNTIL eklogi = '0';
END.
Παρατήρηση: Μετά από κάθε την ταξινόμηση, οι αριθμοί εγγραφής που περιέχονται στο
αντίστοιχο πεδίο κάθε εγγραφής, δε θα παραμένουν σε αύξουσα σειρά. Μπορείτε όμως να
αντικαθιστάτε τους αριθμούς αυτούς κατά τη νέα αποθήκευση των δεδομένων, ώστε και μετά
την ταξινόμηση να εμφανίζονται σε αύξουσα σειρά. (Σχετικά, μελετήστε τις ασκήσεις 1 και 6)

Χρήσιμες συναρτήσεις - διαδικασίες


IORESULT Η συνάρτηση αυτή δίνει σαν ακέραιο το αποτέλεσμα μιας πράξης I/O. Αν δεν
υπήρξε σφάλμα το αποτέλεσμα είναι 0 αλλιώς κάποιος αριθμός μεταξύ του 1 και του 255

0 Δεν υπήρξε σφάλμα


1 Ανύπαρκτο αρχείο
2 Το αρχείο δεν έχει ανοιχτεί για εισαγωγή
3 Το αρχείο δεν έχει ανοιχτεί για έκδοση

page 63
4 Το αρχείο δεν έχει ανοιχτεί
16 Σφάλμα στο αριθμητικό σχήμα
32 Δεν επιτρέπεται η πράξη αυτή σε λογική συσκευή
33 Δεν επιτρέπεται σε άμεση λειτουργία
34 Δεν επιτρέπεται η καταχώριση σε τυποποιημένα αρχεία
144 Ασυμφωνία μήκους εγγραφής
145 Αναζήτηση πέρα από το τέλος του αρχείου
153 Απροσδόκητο τέλος αρχείου
240 Σφάλμα εγγραφής σε δίσκο
241 Πλήρης πίνακας περιεχομένων
242 Υπερχείλιση μεγέθους αρχείου
243 Πολλά ανοιχτά αρχεία
255 Το αρχείο εξαφανίστηκε

Παράδειγμα:
PROGRAM ex1;
VAR
arxeio : FILE OF byte;
BEGIN
ASIGN( arxeio,'TEMP.DAT');
{$I-}
RESET(arxeio);
{$I+}
IF IOResult = 0 then
writeln(' file size in bytes :', FileSize(arxeio));
else
writeln(' file not found');
END.

ChDir Η διαδικασία αυτή αλλάζει τον τρέχοντα κατάλογο. Η σύνταξη της είναι :
Chdir ( s : string );
παράδειγμα:
BEGIN
page 64
{$I-}
ChDir (C:\Temp);
IF IOResult <>0 THEN
writeln(' The directory is not found ');
END.

MkDir Η διαδικασία αυτή δημιουργεί καινούργιο κατάλογο. Η σύνταξη της είναι :


Mkdir ( s : string );
παράδειγμα:
BEGIN
{$I-}
MkDir (C:\Temp1);
IF IOResult <>0 THEN
writeln(' The directory not created ')
ELSE
writeln(‘ new directory created’);
END.

RmDir Η διαδικασία αυτή διαγράφει ένα άδειο κατάλογο. Η σύνταξη της είναι :
Rmdir ( s : string );
παράδειγμα:
BEGIN
{$I-}
RmDir (C:\Temp1);
IF IOResult <>0 THEN
writeln(' Cannot remove directory ')
ELSE
writeln('directory removed');
END.

page 65
GetDir Η διαδικασία αυτή επιστρέφει τον τρέχοντα κατάλογο ενός συγκεκριμένου δίσκου.
Η σύνταξη της είναι :
Getdir (d : byte; var s : string );
Το d είναι μια ακέραιου τύπου έκφραση και η s μια μεταβλητή τύπου string στην οποία
αποθηκεύεται ( αυτό σημαίνει το var) ο τρέχον κατάλογος του καθορισμένου από το d δίσκου
Εάν d=0 σημαίνει τον τρέχον δίσκο, d=1 το δίσκο Α, d=2 το δίσκο Β κ.λ.π

Exit Η διαδικασία αυτή πετυχαίνει την άμεση έξοδο από το τρέχον block. Αν βρίσκεται μέσα
σε υποπρόγραμμα το αναγκάζει να επιστρέψει στο κυρίως πρόγραμμα, αν βρίσκεται στο
κυρίως πρόγραμμα το αναγκάζει να τερματίσει
παράδειγμα:
PROGRAM exit1;
USES crt;
procedure wastetime;
BEGIN
REPEAT
IF KeyPressed THEN Exit;
write('Xx');
UNTIL False;
END;
BEGIN
wastetime;
END.

KeyPressed Η συνάρτηση αυτή επιστρέφει την τιμή TRUE αν πατηθεί κάποιο πλήκτρο (εκτός
των Shift, Numlock, Alt κ.λ.π ) αλλιώς την τιμή FALSE
παράδειγμα:
PROGRAM key;
USES crt;
BEGIN
REPEAT
page 66
write('Xx');
UNTIL KeyPressed;
END.

WITH Η εντολή αυτή χρησιμοποιείται για να δηλώσουμε το όνομα μιας εγγραφής


μοναδικά στο block των εντολών που τη χρησιμοποιούμε (τη συγκεκριμένη εγγραφή)
παράδειγμα :
PROGRAM with1;
TYPE
eggrafi = RECORD
eponymo : string[12] ;
onoma :string[10];
END;
VAR
arxeio : FILE OF eggrafi;
synolo : eggrafi;
BEGIN
ASSIGN ( arxeio, 'TEMP2.TXT') ;
REWRITE( arxeio) ;
WITH synolo DO { χρήση της εντολής WITH }
BEGIN
WRITE ('Επώνυμο : ' ) ;
readln (eponymo) ;
WRITE ('Ονομα : ' );
readln (onoma) ;
END;
WRITE (arxeio, synolo) ;
CLOSE (arxeio) ;

RESET (arxeio);
READ ( arxeio, synolo) ;
writeln ('To Επώνυμο είναι: ' , synolo. eponymo) ;
writeln ('To Όνομα είναι :' , synolo. onoma) ;
CLOSE (arxeio) ;
page 67
writeln ('Συνέχεια με <Enter>') ;
readln;
END.
Παρατηρήστε τη διαφορά μεταξύ της εισαγωγής στοιχείων με χρήση της WITH και χωρίς
χρήση της στο πρόγραμμα dat1.

page 68
Αρχεία Κειμένου
Μήκος Εγγραφής: Ένα από τα χαρακτηριστικά των αρχείων με τύπο είναι ότι όλες οι
εγγραφές τους έχουν το ίδιο σταθερό μήκος. Από εγγραφές αποτελούνται και τα αρχεία
κειμένου (text files), με μια διαφορά όμως: οι εγγραφές ενός αρχείου έχουν διαφορετικά μήκη.
Το τέλος κάθε εγγραφής σημειώνεται με ένα σύμβολο end-of-line (τέλος γραμμής). Επίσης,
στο τέλος του αρχείου υπάρχει ένα σύμβολο end-of-file (τέλος αρχείου). Οι εγγραφές
ταυτίζονται με τις γραμμές ενός κειμένου και, όπως ξέρετε, αυτές δεν έχουν πάντα το ίδιο
μήκος.
Από όσα αναφέρθηκαν παραπάνω θα έχετε αντιληφθεί τις επιπτώσεις των διαφορών των δύο τύπων
αρχείων.

Επιτρεπτές Εντολές:

Οι εντολές
ASSIGN για τον καθορισμό του ονόματος του αρχείου,
REWRITE για τη δημιουργία ενός νέου αρχείου,
RESET για το άνοιγμα ενός αποθηκευμένου αρχείου,
CLOSE για το κλείσιμο ενός αρχείου

EOF για την αναγνώριση του τέλους του αρχείου μπορούν να χρησιμοποιηθούν.
Τύπος δεδομένων text
Η μεταβλητή αρχείου είναι τύπου text και ορίζεται ως εξής:

' μεταβλητή αρχείου text

Σειριακή Επεξεργασία: Κάθε εγγραφή έχει διαφορετικό μήκος. Έτσι δεν μπορούμε να
ξέρουμε σε ποια θέση έχει αποθηκευτεί η κάθε εγγραφή, και άρα δεν μπορούμε να
προσπελάσουμε απ' ευθείας μια συγκεκριμένη εγγραφή. Η επεξεργασία των εγγραφών γίνεται
σειριακά, και σύμφωνα με τη σειρά που έχουν αποθηκευτεί.

Μη επιτρεπτές εντολές: Οι εντολές

SEEK για την τοποθέτηση του δείκτη αρχείου σε συγκεκριμένη εγγραφή,


και
FILESIZE για τον υπολογισμό του αριθμού των εγγραφών δεν μπορεί να χρησιμοποιηθούν
σε αρχεία κειμένου.

page 69
Εμφάνιση ενός Αρχείου Κειμένου στην Οθόνη
Έξοδος Κειμένου: Τα προγράμματα που γράφουμε στο διορθωτή κειμένου της Borland
Pascal αποτελούν, από την άποψη των αρχείων, αρχεία κειμένου. Με το επόμενο πρόγραμμα
θα προσπαθήσουμε να εμφανίσουμε ένα τέτοιο αρχείο.
Δομικό διάγραμμα

Δομικό διάγραμμα του textl

Προσδιορισμός ονόματος αρχείου

Άνοιγμα αρχείου

Εφό δεν έφτασε το τέλος του αρχείου


σον επαναλάμβανε τα 1, 2
1. Ανάγνωση από το αρχείο

2. ΕΜΦΑΝΙΣΗ της γραμμής

Κλείσιμο αρχείου

Πρόγραμμα text1

PROGRAM text1;

VAR
arxeio : text;
grami : string[255];

BEGIN
ASSIGN (arxeio, ' DAT1. PAS');

RESET (arxeio) ;
WHILE NOT EOF(arxeio) DO BEGIN
READLN ( arxeio, grammi) ;
writeln ( grammi) ;
END;
CLOSE(arxeio) ;
writeln ('Συνέχεια με <Enter>') ;
readln;

END.

page 70
To αρχείο που διαβάζεται είναι τύπου text, και ονομάσαμε καθεμία από τις εγγραφές του
grammi. To μέγιστο μήκος της κάθε εγγραφής είναι 255 χαρακτήρες. Η READLN διαβάζει
μια γραμμή και η writeln την εμφανίζει στην οθόνη. Η διαδικασία αυτή επαναλαμβάνεται
μέχρι να φτάσει το τέλος του αρχείου, δηλαδή μέχρι να διαβαστεί το σύμβολο end-of-file. To
αποτέλεσμα του προγράμματος text1 είναι η εμφάνιση στην οθόνη του κώδικα του
προγράμματος DAT1.PAS.

Εκτύπωση ενός Αρχείου Κειμένου στον Εκτυπωτή


Στη συνέχεια θα τυπώσουμε τα περιεχόμενα ενός αρχείου κειμένου στον εκτυπωτή. Πριν φθάσουμε
όμως σ' αυτό, θα πρέπει να περιγράψουμε μερικές εργασίες που εκτελεί αυτόματα η Borland Pascal

Περιφερειακές συσκευές: Οι περιφερειακές συσκευές όπως π.χ. η οθόνη, το πληκτρολόγιο, και ο


εκτυπωτής, αντιμετωπίζονται από την Borland Pascal σαν αρχεία κειμένου. Η Borland Pascal γνωρίζει
ορισμένα "καθιερωμένα" αρχεία κειμένου. Αυτά έχουν το πλεονέκτημα ότι μπορεί να χρησιμοποιούνται
χωρίς να είναι απαραίτητο να καλούνται οι εντολές ASSIGN. RESET, REWRITE και CLOSE.

Καθιερωμένα αρχεία: Οι ακόλουθες περιφερειακές ή λογικές συσκευές, αντιστοιχούν σε καθιερωμένα


αρχεία κειμένου:

Con Con=ConsoIe Κονσόλα. Για την έξοδο χρησιμοποιείται η οθόνη, για την είσοδο
το πληκτρολόγιο.
Kdb Kdb=Keyboard Πληκτρολόγιο. Τα πάντα εξαρτώνται από το πληκτρολόγιο. Η
εισαγωγή δεδομένων γίνεται χωρίς αντήχηση (echo), δηλαδή ό,τι πληκτρολογείται δεν
εμφανίζεται στη οθόνη.
Lst Lst=Lister Η έξοδος γίνεται στον εκτυπωτή.

θα πρέπει να συνδέσετε στο πρόγραμμα σας τη Μονάδα printer με την εντολή USES. Η
καθιερωμένη Μονάδα printer δημιουργεί μια μεταβλητή τύπου text με το όνομα Lst.
Μέχρι τώρα, κάθε εισαγωγή δεδομένων με την εντολή READ γινόταν από το πληκτρολόγιο με
ταυτόχρονη εμφάνιση στην οθόνη. Επίσης, μετά από την εντολή WRITE, κάθε έξοδος
εμφανιζόταν στην οθόνη.
Είσοδος / Εξοδος
Αυτές οι λειτουργίες γίνονται με τα καθιερωμένα αρχεία input (Είσοδος) και Output (Έξοδος).
Επειδή αυτά τα καθιερωμένα αρχεία χρησιμοποιούνται πάρα πολύ συχνά, επιλέγονται
αυτόματα όταν δεν καθορίζεται κάποιος άλλος τύπος αρχείου.
Αν η είσοδος ή η έξοδος γίνεται σε άλλες συσκευές, τότε θα πρέπει στις εντολές READ και
WRITE να χρησιμοποιηθούν τα κατάλληλα καθιερωμένα αρχεία.
Για να τυπωθεί το αρχείο κειμένου στον εκτυπωτή, θα πρέπει το πρόγραμμα να γραφεί ως
εξής:
PROGRAM text2;

USES printer;
VAR
arxeio : text;
grammi : string[255];
BEGIN

page 71
ASSIGN(arxeio, ' DAT1. PAS' ) ;
RESET(arxeio) ;
WHILE not EOF(arxeio) DO
BEGIN
READLN ( arxeio, grammi) ;
writeln ( LST, grammi) ;
END;
CLOSE(arxeio);
END.
Όπως βλέπετε αρκεί στην εντολή writeln να προστεθεί το όνομα "αρχείου" Lst.

Ασκήσεις Προγραμματισμού

Πρόβλημα 1:

Εισαγωγή και Εκτύπωση κειμένου


Γράψτε ένα πρόγραμμα, με το οποίο θα διαβάζεται ένα αρχείο κειμένου, και είτε θα
εμφανίζεται στην οθόνη, είτε θα τυπώνεται στον εκτυπωτή, σύμφωνα με την κατάλληλη
επιλογή.
Λύση:
Δομικό διάγραμμα για το πρόγραμμα ektyposi

ΕΙΣΑΓΩΓΗ ονόματος αρχείου

Προσδιορισμός αρχείου
Άνοιγμα αρχείου
ΕΙΣΑΓΩΓΗ εκλογής
Αν εκλογή =?

1. εφόσον όχι τέλος αρχείου

Ανάγνωση από αρχείο

Εμφάνιση γραμμής στην οθόνη

2. εφόσον όχι τέλος αρχείου

Ανάγνωση από αρχείο

Εμφάνιση γραμμής στον εκτυπωτή

ΑΛΛΙΩΣ

ΕΞΟΔΟΣ “λάθος πληκτρολόγηση”

Κλείσιμο αρχείου

Πρόγραμμα ektyposi

page 72
PROGRAM ektyposi;

USES crt, printer;


VAR
Arxeio : text;
grammi : string[255];
onoma_arxeiou :string[14];
eklogi :char;
I :integer;
BEGIN
clrscr;
write ('Δώστε το όνομα του αρχείου, μαζί με την Προέκταση του ') ;
readln(onoma_arxeiou);
writeln;
writeln (' (1) Έξοδος στην Οθόνη ');
writeln (' (2) Έξοδος στον Εκτυπωτή ');
writeln;
writeln ('Πατήστε τον αριθμό της επιλογής που θέλετε! ');
readln (eklogi) ;
clrscr;
ASSIGN( arxeio, onoma_arxeiou) ;
RESET(arxeio) ;
CASE eklogi of
‘1’ : BEGIN
WHILE NOT EOF (arxeio) DO
BEGIN
READLN ( arxeio, grammi) ;
writeln ( grammi) ;
END;
END;
‘2’: BEGIN
WHILE NOT EOF (arxeio) DO
BEGIN
READLN ( arxeio, grammi) ;
writeln ( Lst, grammi) ;
END;
END;
ELSE writeln( ' Λάθος πληχτρολόγηση ');
END;
CLOSE (arxeio) ;
writeln ('Συνέχεια με <Enter>') ;
readln;
END.
Μεγάλο αρχείο

Στην περίπτωση που το κείμενο γεμίζει περισσότερο από μια οθόνη, μπορείτε να
σταματήσετε και να ξανασυνεχίσετε την εμφάνιση του στην οθόνη με ταυτόχρονο πάτημα των
πλήκτρων <Ctrl> και <S>.

page 73
Πρόβλημα 2:

Βελτιώσεις στο πρόγραμμα: Στο πρόγραμμα επεξεργασίας κειμένου text θα γίνουν οι πα-
ρακάτω αλλαγές:
1. Η εκτύπωση στον εκτυπωτή και, αντίστοιχα, η αποθήκευση της γραμμής στο αρχείο, δε θα
γίνεται μετά από κάθε γραμμή που εισάγεται.(Υπόδειξη: Οι γραμμές εισάγονται σ' έναν
πίνακα.)
2. Το κείμενο θα αποτελείται από 60 το πολύ γραμμές. Μόλις δοθεί και η 60ή γραμμή το
πρόγραμμα θα εμφανίσει ένα μήνυμα, υποδεικνύοντας ότι πρέπει να δοθεί π συνθήκη
διακοπής. (Στην αρχή, δοκιμάστε χωρίς αυτήν την υπόδειξη)
3. Όταν δίνεται η συνθήκη διακοπής, θα επακολουθεί η εκτύπωση και η αποθήκευση του
κειμένου.
4. Η εισαγωγή του κειμένου θα σταματάει όπως συνήθως, με την εισαγωγή του ".Ο".

Δομικό διάγραμμα του text5

Δημιουργία

page 74
Ι:= 1
ΕΙΣΑΓΩΓΗ γραμμής grammi [Ι]
Εφόσον grammi [Ι] <> '.0'
Ι:= + 1
Εάν αληθές ότι I = 60 ΕΞΟΔΟΣ 'Δώστε .0'

ΕΙΣΑΓΟΓΗ orammi [Ι]


Plithos := I –1
Για 1 := 1 μέχρι plithos
ΕΚΤΥΠΟΣΗ γραμμής grammi[I] στον εκτυπωτή
ΕΙΣΑΓΩΓΗ ονόματος αρχείου
Προσδιορισμός αρχείου
Ανοιγμα αρχείου
Για I = 1 μέχρι pll+hos
Καταχώριση στο αρχείο
Κλείσιμο αρχείου

Πρόγραμμα text5

PROGRAM text5;

USES crt, printer;


VAR
Onoima_arxeiou : string[14];
arxeio : text;
grammi : array[1..60] of string[80];
I, plithos : integer;

BEGIN
clrscr;
I : = 1; (* Δημιουργία *)
readln( grammi [ I ]);
WHILE grammi[ I ] < > '.0' DO
BEGIN
I := I+1;
IF I = 60 THEN
writeln(' Δώστε . 0 ' ) ;
readln grammi[ I ]) ;
END;
plithos : = I-1;
FOR I:=l TO plithos DO (* Εκτύπωση *)
writeln (Lst, grammil[ I ]);
clrscr;
writeln(‘ Δώστε το όνορα του αρχείου: ‘);
(* Αποθήκευση *)
readln( onoma_arxeiou);
ASSIGN ( arxeio,onoμα_arxeiou);
REWRITE (arxeio) ;
FOR I:= 1 TO plithos DO
WRITELN ( arxeio, grammi[ I ]) ;
CLOSE (arxeio) ;
END.
Περιγραφή To πρόγραμμα δε χρειάζεται να εξηγηθεί λεπτομερώς. Η μεταβλητή plithos θα
πρέπει να είναι κατά ένα μικρότερη από το I, γιατί αλλιώς θα τυπώνεται ή, ανάλογα με την
περίπτωση, θα αποθηκεύεται, και η συνθήκη διακοπής. Στην εισαγωγή των δεδομένων,
αντί για το βρόχο WHILE μπορεί να χρησιμοποιηθεί και ο βρόχος REPEAT-UNTIL
Δοκιμάστε το.

Τυχόν αλλαγές Προσπαθήστε να διασπάσετε το πρόγραμμα σε υπορουτίνες που θα


καλούνται από ένα μενού. Μπορείτε επίσης να αυξήσετε το όριο των 60 γραμμών. Αν
επιτρέψετε όμως να δίνονται πάρα πολλές γραμμές, θα εμφανιστεί ένα μήνυμα από την
Borland Pascal, που θα σας πληροφορεί ότι δεν επαρκεί η μνήμη εργασίας του
υπολογιστή.
PROGRAM dat3;

TYPE

eggrafi = RECORD

eponymo :string[12];

onoma :string[10] ;

mistos :LongInt;

END;

VAR

arxeio : FILE OF eggrafi;

synolo : eggrafi;

eklogi : integer;

procedure anoigma;

BEGIN

ASSIGN ( arxeio, 'ETAIRIA.DAT');

REWRITE (arxeio) ;

CLOSE (arxeio) ;

END;

procedure eisagogi;

BEGIN

ASSIGN (arxeio, 'ETAIRIA.DAT') ;

RESET (arxeio) ;

WRITE ('Επώνυμο : ' ) ;

readln (synolo.eponymo);
WRITE ('Όνομα : ' ) ;

readln (synolo.onoma) ;

WRITE ('Μισθός: ');

readln (synolo.mistos) ;

WRITE (arxeio, synolo) ;

CLOSE (arxeio) ;

END;

procedure exodos;

BEGIN

ASSIGN (arxeio, 'ETAIRIA.DAT' ) ;

RESET (arxeio) ;

READ (arxeio, synolo) ;

writeln ('To επώνυμο που δώσατε είναι: ' , synolo.eponymo) ;

writeln ('To όνομα που δώσατε είναι:' , synolo.onoma) ;

writeln ('Ο μισθός που δώσατε είναι:' , synolo.mistos) ;

CLOSE (arxeio) ;

END;

procedure menu; (* Διαδικασία ΜΕΝΟΥ *)

BEGIN
clrscr;

writeln(' ( 1 ) Άνοιγμα νέου αρχείου! ');

writeln( ' ( 2 ) Εισαγωγή εγγραφών! ');

writeln(' ( 3 ) Εμφάνιση εγγραφών! ');

END;

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

ChDir('D:\Bp\pascal');

menu;

readln (eklogi) ;

CASE eklogi OF

1: anoigma;

2: eisagogi;

3: exodos;

END;

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

readln;

END.

You might also like