106
Σημειώσεις για το Μάθημα : Σχεδίαση Προγράμματος Pascal Τομέας : Πληροφορικής Ειδικότητα : Προγραμματιστής Εφαρμογών Πολυμέσων page 1

Files in Pascal

Embed Size (px)

Citation preview

Page 1: Files in Pascal

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

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

Τομέας : Πληροφορικής

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

Εξάμηνο : Β

page 1

Page 2: Files in Pascal

ΕΙΣΑΓΩΓΗ

ΓΕΝΙΚΑ

Στη γενική του έννοια, αρχείο είναι μία σειρά από στοιχεία του ίδιου τύπου, που έχει ένα όνομα

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

Pascal, χρησιμοποιoύνται τα τυποποιημένα ονόματα (των αρχείων της Pascal) INPUT και

OUTPUT, για τη λήψη στοιχείων από το πληκτρολόγιο και την εμφάνιση των αποτελεσμάτων

στην οθόνη, Μετά το τέλος της επεξεργασίας, τα στοιχεία των αρχείων χάνονται. Έτσι τα

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

χρησιμοποιηθούν στο μέλλον σαν στοιχεία εισόδου σε ένα άλλο πρόγραμμα. Δηλαδή τα

στοιχεία εισόδου και εξόδου ήταν στενά συνδεμένα με το συγκεκριμένο πρόγραμμα.

Όταν τα στοιχεία ενός αρχείου είναι γραμμένα σε μία βοηθητική μνήμη (δίσκος, δισκέτα

κλπ.), τότε λέμε ότι το αρχείο είναι εξωτερικό. Τα βασικά πλεονεκτήματα των εξωτερικών

αρχείων είναι τα ακόλουθα:

1. Τα στοιχεία είναι ανεξάρτητα από τα προγράμματα που τα δημιουργούν και που τα

επεξεργάζονται.

2. Επιτρέπουν την αποθήκευση μεγάλου όγκου στοιχείων. Ο όγκος των στοιχείων του αρχείου

μπορεί να υπερβεί τη χωρητικότητα της κύριας μνήμης (RAM) του υπολογιστή.

3. Τα στοιχεία των αρχείων δε χάνονται μετά το τέλος της επεξεργασίας, πράγμα που συμβαίνει

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

μπορούμε να χρησιμοποιήσουμε τα δεδομένα που περιέχει σαν στοιχεία εισόδου σε ένα άλλο

πρόγραμμα.

Οι περισσότερες εφαρμογές χρειάζονται εξωτερικά αρχεία. Τα στοιχεία που είναι

αποθηκευμένα σε βοηθητική μνήμη, μεταφέρονται τμηματικά στην κύρια μνήμη και υφίστανται

τη σχετική επεξεργασία. Επίσης τα προγράμματα που δημιουργούν εξωτερικά αρχεία,

μεταφέρουν τα στοιχεία διαδοχικά από την κύρια μνήμη και τα γράφουν στη βοηθητική μνήμη.

Το γράψιμο και το διάβασμα εξωτερικών αρχείων είναι βασικές εργασίες στον

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

νων. Στο εξής με τον όρο αρχεία θα εννοούμε εξωτερικά αρχεία, εκτός αν αναφέρεται σχετική

επεξήγηση.

Είπαμε λοιπόν ότι αρχείο είναι μία σειρά στοιχείων του ίδιου τύπου, που είναι γραμμένα σε

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

οποίες αυτό αποτελείται. Το αρχείο είναι και αυτό ένας τύπος δόμησης των στοιχείων. Ένα

αρχείο για παράδειγμα μπορεί να αποτελείται από σειρές ή εγγραφές. Δηλαδή τα στοιχεία ενός

αρχείου της Pascal, μπορεί να είναι οποιουδήποτε τύπου δεδομένων που επιτρέπεται στην

Pascal. Δεν επιτρέπονται όμως αρχεία σε αρχεία.page 2

Page 3: Files in Pascal

Το αρχείο είναι μια δομή δεδομένων, που το μήκος της μπορεί να μεταβάλλεται δυναμικά κατά

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

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

δεν είναι καθορισμένο, δηλαδή δεν προκαθορίζεται με τη δήλωση του. Το αρχείο έχει μία αρχή

και ένα τέλος. Για να είναι δυνατό να εντοπιστεί το τέλος, το αρχείο έχει στο τέλος των

στοιχείων του μία ιδιαίτερη σήμανση EOF (End-Of-File/τέλος αρχείου).

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

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

Ένα αρχείο μπορεί να χρησιμοποιηθεί ή για διάβασμα ή για γράψιμο. Όταν το αρχείο

διαβάζεται (input), το πρόγραμμα παίρνει ένα στοιχείο του αρχείου, το μεταφέρει στην κύρια

μνήμη και το επεξεργάζεται. Όταν το αρχείο γράφεται (output), δημιουργείται το στοιχείο στην

κύρια μνήμη και μετά μεταφέρεται και γράφεται στο αρχείο. Δηλαδή το αρχείο διαβάζεται ή

γράφεται στοιχείο προς στοιχείο. Το διάβασμα και το γράψιμο των αρχείων είναι από τις

βασικές εργασίες των προγραμμάτων.

Υπάρχουν βασικά δύο τρόποι λήψης ή γραψίματος (επεξεργασίας) αρχείων, η σειριακή και η

τυχαία. Στη σειριακή επεξεργασία η πρόσβαση στο αρχείο γίνεται σειριακά, δηλαδή το ένα

στοιχείο μετά το άλλο. Για να εντοπιστεί ένα στοιχείο, πρέπει υποχρεωτικά να διαβαστούν όλα

τα προηγούμενα, άσχετα αν αυτά χρειάζονται στην επεξεργασία ή όχι. Στην τυχαία

επεξεργασία, ένα στοιχείο εντοπίζεται αμέσως, χωρίς να εξεταστούν τα προηγούμενα. Δεν είναι

δυνατό να γίνει πήδημα προς τα εμπρός ή προς τα πίσω, προκειμένου να γίνει εντοπισμός ενός

στοιχείου. ( Η τυποποιημένη Pascal έχει μόνο σειριακή επεξεργασία. )

Στην Pascal τα αρχεία είναι τύπου μεταβλητής, δηλαδή οι πράξεις που μπορούν να γίνουν στα

δεδομένα ενός στοιχείου είναι οι γνωστές. Μόνο τα επιμέρους δεδομένα ενός στοιχείου

μπορούν να χρησιμοποιηθούν σε μία δεδομένη χρονική στιγμή (κάθε φορά) και αυτό, γιατί το

αρχείο διαβάζεται στοιχείο προς στοιχείο. Όπως είπαμε, στην Pascal επιτρέπονται τα κενά

αρχεία. Ένα κενό αρχείο δημιουργείται, μόλις οριστεί αυτό για πρώτη φορά στο πρόγραμμα,

δηλαδή ένα αρχείο που πρόκειται να χρησιμοποιηθεί για έξοδο (output).

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

σύστημα. Όταν δημιουργείται ένα αρχείο από ένα πρόγραμμα Pascal, το λειτουργικό σύστημα

το γράφει στη βοηθητική μνήμη (δίσκο ή δισκέτα) και το καταχωρεί στον κατάλογο (Directory)

με το όνομα του. Μετά μπορεί να το αντιγράψει, να του αλλάξει το όνομα, να το διαγράψει

(σβήσει) και να μεταφέρει στοιχεία από ή και προς το αρχείο, μετά από σχετικές εντολές του

προγράμματος. Ο μόνος τρόπος να αυξηθούν τα στοιχεία ενός αρχείου, είναι να προστεθούν

στοιχεία στο τέλος του.

page 3

Page 4: Files in Pascal

Η 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 -

19.3

... 195.

8

EOF

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

A Κ Ρ Τ ... Ν EOF

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

page 4

Page 5: Files in Pascal

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

Page 6: Files in Pascal

ΑΥΤΟ ΕΙΝΑΙ ΕΝΑ ΠΑΡΑΔΕΙΓΜΑ ΑΡΧΕΙΟΥ ΤΕΧΤ[ΤΓ] 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

Page 7: Files in Pascal

στο δίσκο. Κατά το διάβασμα, μετατρέπει τα στοιχεία από τον κώδικα ASCII στην εσωτερική

μορφή. Έτσι τα στοιχεία ενός αρχείου τύπου TEXT είναι εμφανίσιμα, δηλαδή μπορούν να

εμφανιστούν στην οθόνη από τον Editor ή με την εντολή ΤΥΡΕ του λειτουργικού συστήματος

(DOS), σε αντίθεση με τα στοιχεία των αρχείων δεδομένων (binary), που δεν μπορούν να

εμφανιστούν με αυτά.

Τα αρχεία τύπου TEXT διαβάζονται ή γράφονται ένας ένας χαρακτήρας κάθε φορά. Όπως

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

page 7

Page 8: Files in Pascal

Σειριακά αρχεία (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

Page 9: Files in Pascal

Γρήγορη και απλή η διαδοχική προσπέλαση των 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.

Ο σχετικός αριθμός του record αποτελεί και το κλειδί για τον εντοπισμό του, αλλά αυτό δεν

ανήκει στο record του αρχείου, δηλαδή δεν είναι πεδίο (στοιχείο) του record. Τα records

page 9

Page 10: Files in Pascal

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

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

προσπέλασης.

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. Άμεση

προσπέλαση υπάρχει μόνο σε αρχεία δεδομένων και όχι σε αρχεία τύπου TEXT. Τα αρχεία

άμεσης προσπέλασης στην Pascal είναι γνωστά και σαν αρχεία σχετικής θέσης (relative files).

page 10

ΕΥΡΕΣΗ ΘΕΣΗΣ

Page 11: Files in Pascal

Η Οργάνωση Άμεσης Προσπέλασης (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) όπου

ο αλγόριθμος μετατροπής των κλειδιών σε διευθύνσεις, στέλνει αρκετά records σε κάθε

bucket. Μάλιστα υπάρχει και η πρόβλεψη για υπερχείλιση (overflow) ενός bucket, γεγονός

page 11

Page 12: Files in Pascal

που μπορεί να εμφανιστεί όταν σ' ένα 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.

Είναι φανερό λοιπόν ότι ο ακέραιος πι πρέπει να εκλεγεί κατάλληλα και σύμφωνα με τις

αριθμητικές τιμές του συνόλου των κλειδιών μας.

β) η μέθοδος του πολ/σμού του κλειδιού με τον εαυτό του και ο καθορισμός των μεσαίων

ψηφίων του αριθμού που προκύπτει σα διεύθυνση, (midsquare hashing method). Για

παράδειγμα έστω το κλειδί 1234 τότε το τετράγωνο του είναι 1522756. Μπορούμε να page 12

Page 13: Files in Pascal

θεωρήσουμε σαν διεύθυνση το 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 5621 582 0 538 17 6172 571 0 532 1 5233 547 0 510 475 5434 521 247 494 5 5455 502 0 500 9 4796 486 25 469 78 4307 451 0 502 135 4278 420 0 471 642 4569 393 0 487 7 448

page 13

Page 14: Files in Pascal

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

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

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

όταν ενημερώνεται» μικρός αριθμός records και έχουμε λίγες περιοχές υπερχείλισης.

Ένα όχι και τόσο ασήμαντο μέρος από τον φυσικό χώρο του direct αρχείου παραμένει

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

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

γνωρίζοντας ότι έχουμε «φτωχή» χρησιμοποίηση του φυσικού χώρου.

Τα records μπορούν να προσπελαστούν σειριακά κατά την «τυχαία» σειρά που βρίσκονται

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

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

επίσης και οι μεταβολές δεν χρειάζεται να Είναι ταξινομημένες.

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

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

αποτέλεσμα αύξηση του χρόνου απόκρισης του συστήματος

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

page 14

Page 15: Files in Pascal

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

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

Page 16: Files in Pascal

Παράδειγμα :

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 16

Page 17: Files in Pascal

Mistos : real;

END;

Ο Τύπος File Ο δομημένος τύπος δεδομένων file (Αρχείο) είναι ιδιαίτερα σημαντικός κατά την

επεξεργασία δεδομένων. Στον τύπο record εξηγήσαμε ήδη τι είναι ένα αρχείο. Εδώ απλώς θα

συνοψίσουμε ακόμα μια φορά. Ένα αρχείο αποτελείται από έναν ορισμένο αριθμό εγγραφών.

Οι εγγραφές, με τη σειρά τους, αποτελούνται από έναν ορισμένο αριθμό πεδίων. Με τη

βοήθεια των εγγραφών, θα διαχωρίσουμε τους τύπους αρχείων, που χρησιμοποιούνται στην

Borland Pascal.

Αρχεία με τύπο : Όταν η διαμόρφωση της εγγραφής εξαρτάται από μας, αναφερόμαστε σε

αρχείο με τύπο. Κάθε εγγραφή μπορεί να αποτελείται από ένα μόνο πεδίο ή από περισσότερα

πεδία, διαφορετικού μήκους το καθένα.

Τυχαία προσπέλαση: Όλες οι εγγραφές ενός αρχείου έχουν ακριβώς την ίδια διαμόρφωση

επίσης, η Borland Pascal διαθέτει ένα δείκτη για κάθε αρχείο που επεξεργάzεται. Έτσι είναι

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

δυνατότητα τυχαίας προσπέλασης (random access).

Αρχεία κειμένου: Τα αρχεία τύπου text ή αρχεία text (αρχεία κειμένου), είναι ο δεύτερος

επιτρεπτός τύπος αρχείων στην Borland Pascal. Τα αρχεία κειμένου αποτελούνται επίσης από

εγγραφές, μεταβλητού όμως μήκους.

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

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

θέση αποθήκευσης τους. Έτσι δεν είναι δυνατή η τυχαία προσπέλαση τους, αλλά για να βρεθεί

κάποια εγγραφή θα πρέπει να διαβαστούν πρώτα όλες οι προηγούμενες με τη σειρά. Εδώ

έχουμε σειριακή προσπέλαση.

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

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

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

Ο Τύπος Set

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

όνομα, με το οποίο μπορούμε να τα χειριστούμε όλα μαζί.

page 17

Page 18: Files in Pascal

TYPE

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;

page 18

Page 19: Files in Pascal

Begin

Clrscr;

new(a);

new(b);

new(c);

a^:=1;

b^:=2;

c^:=3;

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

END.

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

Μέσα στο πρόγραμμα οι μεταβλητές παίρνουν συγκεκριμένες τιμές

Π.χ a^:=1;

Με την πρόταση new(a); δημιουργείται η δυναμική μεταβλητή a και ένας δείκτης που δείχνει

σε αυτήν. Για να δούμε αν η δυναμική μεταβλητή αποθηκεύτηκε στη μνήμη σωρού την

εμφανίζουμε στην οθόνη με την εντολή writeln.

Απελευθέρωση της μνήμης: Το πρόγραμμα deiktis2 έχει σκοπό να σας ευαισθητοποιήσει

σχετικά με τη διαχείριση της μνήμης στο σωρό. Δεν μπορούμε πάντα, μόνο να

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

Ιδιαίτερα όταν εργάζεστε με την Turbo Vision θα πρέπει να προσέχετε να απελευθερώνετε

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

PROGRAM deiktis2;

USES crt;

VARdeiktis : ^string;

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

(* dispose (deiktis); *)

writeln ('Η διαθέσιμη μνήμη σωρού είναι ', MemAvaii,' Byte');

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

page 19

Page 20: Files in Pascal

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

page 20

Page 21: Files in Pascal

onoma = string[14];

VAR

Eponumo : onoma;

BEGIN

END.

Είναι πραγματικά άσκοπο το πρόγραμμα askopo του παραδείγματος; Με μια πρώτη ματιά

φαίνεται ότι θα ήταν απλούστερο να γράψετε το πρόγραμμα ως εξής:

PROGRAM skopimo;

VAR

Eponumo : string[14];END.

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

χρησιμοποιήσουμε στα προγράμματα διαχείρισης αρχείων. Σ' αυτήν την περίπτωση, η

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

page 21

Page 22: Files in Pascal

Αρχεία με τύπο

Πρόγραμμα για Αρχεία

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

Όμως στην Borland Pascal μπορείτε ν’ αποθηκεύετε μόνιμα τα δεδομένα, που επεξεργάζεστε Μ' αυτόν τον τρόπο

θα μπορείτε πάντοτε να ξαναχρησιμοποιείτε παλαιότερα δεδομένα.

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

δίνεται ένα όνομα στο πρόγραμμα και μετά αρχίζει η πληκτρολόγηση του.

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

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

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

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

θέλετε.

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

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

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

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

Στη συνέχεια θα γράψουμε ένα πρόγραμμα, που θα μας επιτρέπει να αποθηκεύουμε εγγραφές

καθορισμένης δομής σε ένα αρχείο και, αντίστοιχα, να τις διαβάζουμε. Αρχικά θα πρέπει να

δώσετε ένα όνομα στο αρχείο. Αυτό γίνεται με την πρόταση:

Καθορισμός ονόματος αρχείου :

ASSIGN ( μεταβλητή αρχείου, μεταβλητή ) ;

Αν μετά τη μεταβλητή αρχείου δώσετε σαν σταθερά το όνομα του αρχείου, θα πρέπει να το

περικλείσετε σε αποστρόφους. Αν θέλετε π. χ. να ονομάσετε το αρχείο ONOMA.DAT, θα

πρέπει να γράψετε ‘ONOMA.DAT’. Τα ονόματα των αρχείων δεν πρέπει να υπερβαίνουν τους

οκτώ χαρακτήρες, πριν την τελεία.

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

ακολουθείται ένας συγκεκριμένος τρόπος ονοματολογίας. Έτσι, όλα τα αρχεία των προ-

γραμμάτων θα έχουν την προέκταση .PAS. Για αρχεία με τύπο χρησιμοποιείται η

προέκταση .DAT Μ' αυτόν τον τρόπο, αν κάποιος εξετάσει τον κατάλογο περιεχομένων της

δισκέτας θα έχει αμέσως μια συνολική εικόνα του είδους των αρχείων. Η μεταβλητή αρχείου

είναι η μεταβλητή τύπου FILE OF, που βρίσκεται στο τμήμα δηλώσεων του προγράμματος.

Ένα σχετικό παράδειγμα προσφέρει το πρόγραμμα dat1 με τις επεξηγήσεις του. Μετά

δημιουργούμε ένα νέο αρχείο στη δισκέτα. Το όνομα του θα είναι αυτό που αποδόθηκε στη

μεταβλητή αρχείου με την εντολή ASSIGN. Αυτό γίνεται με την ακόλουθη πρόταση:

page 22

Page 23: Files in Pascal

Δημιουργία αρχείου :

REWRITE( μεταβλητή αρχείου ) ;

Η πρόταση αυτή θα πρέπει να χρησιμοποιείται με προσοχή, επειδή στην περίπτωση που

υπάρχει ήδη αρχείο με το όνομα αυτό, θα το διαγράψει.

Οι βασικότερες λειτουργίες σ' ένα αρχείο είναι η γραφή και η ανάγνωση δεδομένων, που

υλοποιούνται με τις επόμενες προτάσεις:

Γράψιμο σε αρχείο :

WRITE (μεταβλητή αρχείου, μεταβλητή ) ;

και με τις προτάσεις:

Διάβασμα από αρχείο :

READ (μεταβλητή αρχείου, μεταβλητή ) ;

Αν θέλετε να γράψετε σε αρχείο που υπάρχει ήδη, ή να διαβάσετε μια εγγραφή απ' αυτό, θα

πρέπει πρώτα να το ανοίξετε. Αυτό γίνεται με την πρόταση

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

RESET ( μεταβλητή αρχείου ) ;

Όταν τελειώσετε την εργασία με το αρχείο το κλείνετε με την πρόταση

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

CLOSE ( μεταβλητή αρχείου ) ;

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

χάσετε δεδομένα.

Έτσι ολοκληρώσαμε τον εφοδιασμό με όλα τα απαραίτητα για το πρώτο πρόγραμμα

διαχείρισης αρχείων. Σ' αυτό θα δημιουργήσουμε ένα αρχείο με όνομα ONOMA.DAT. Κάθε

εγγραφή θα αποτελείται από όνομα και επώνυμο.

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

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

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

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

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

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

page 23

Page 24: Files in Pascal

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

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

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

ΕΞΟΔΟΣ ονόματος (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) ;

page 24

Page 25: Files in Pascal

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

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 25

Page 26: Files in Pascal

Χωρισμός του Προγράμματος Διαχείρισης Αρχείου σε Διαδικασίες

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

βασικές λειτουργίες κάθε επεξεργασίας αρχείων. Αυτό γίνεται για να κατανοήσετε καλύτερα

τις βασικές λειτουργίες, και να φτάσετε αργότερα στο σημείο να μπορείτε να καλείτε την

καθεμία τους πατώντας απλώς ένα πλήκτρο.

Για να χωριστούν οι βασικές λειτουργίες, θα κλείνετε κάθε φορά το αρχείο και όταν

χρειάζεται, θα το ανοίγετε ξανά. Κάθε φορά θα δίνετε στη μεταβλητή αρχείου το όνομα του

αρχείου της δισκέτας. Αυτό δεν είναι οπωσδήποτε απαραίτητο, αλλά ο τρόπος αυτός

προσφέρεται για εξάσκηση και καλύτερη κατανόηση.

Το πρόγραμμα γίνεται τότε ως εξής:

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

page 26

Page 27: Files in Pascal

WRITE ( arxeio, synolo) ;

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

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

Προσπέλαση αρχείου στη δισκέτα

page 27

Page 28: Files in Pascal

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

eisagogi

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

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

ΕΙΣΑΓΩΓΗ επωνύμου (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

page 28

Page 29: Files in Pascal

ASSIGN ( arxeio, 'ΟΝΟΜΑ.DAT');

REWRITE (arxeio) ;

CLOSE (arxeio) ;

END;

procedure eisagogi;

BEGIN

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>');

page 29

Page 30: Files in Pascal

readln;

END.

Με ένα πράγμα δεν ασχοληθήκαμε ακόμη: το κύριο πρόγραμ μα . Είναι αυτονόητο ότι δεν

αρκεί να γράφετε μόνο τις διαδικασίες, αλλά χρειάζεται και το κύριο πρόγραμμα, που τις χρη-

σιμοποιεί. Αυτό γίνεται βέβαια πολύ γρήγορα: αρκεί να γράψετε μετά τη λέξη BEGIN τα

ονόματα των διαδικασιών, το ένα μετά το άλλο, χωρισμένα με (ελληνικά) ερωτηματικά, και το

κύριο πρόγραμμα είναι έτοιμο.

Η ροή του προγράμματος: Μ’ αυτό το παράδειγμα είδατε καθαρά, πώς πρέπει να γράφο-

νται τα προγράμματα ώστε να είναι δομημένα και ευανάγνωστα. Αν εκτελέσετε αυτό το

πρόγραμμα, και πάλι δε θα παρατηρήσετε καμία διαφορά σε σχέση με το πρώτο πρόγραμμα.

Έτσι θα πρέπει άλλωστε, αφού δεν κάνατε και τίποτε περισσότερο από το να γράψετε το

πρόγραμμα σε ενοποιημένη μορφή.

Αφού ασχοληθήκαμε αρκετά με τη μορφή του προγράμματος, ας εξετάσουμε τώρα και τα

αποτελέσματα. Μόλις αρχίσει το πρόγραμμα εισάγεται μια εγγραφή (επώνυμο και όνομα), που

κατόπιν αποθηκεύεται στη δισκέτα, και αργότερα διαβάζεται πάλι από τη δισκέτα.

Παρακολουθώντας πότε ανάβει και πότε σβήνει το φωτάκι του οδηγού δίσκου, μπορείτε να

καταλάβετε αν εκτελείται προσπέλαση του δίσκου (για λειτουργία εγγραφής ή ανάγνωσης).

Άνοιγμα του αρχείου με το διορθωτή κειμένων: θα προσπαθήσουμε τώρα να εξετάσουμε τα

περιεχόμενα του αρχείου ONOMA.DAT χρησιμοποιώντας έναν άλλο τρόπο. Δε θα

χρησιμοποιήσετε το πρόγραμμα, αλλά την ίδια την Borland Pascal. Η διαδικασία σας είναι ήδη

γνωστή. Απλώς φορτώνετε το αρχείο ONOMA.DAT στο διορθωτή κειμένου. Αυτό γίνεται ως

εξής: Επιλέγετε από τη γραμμή μενού της Pascal την επιλογή File. Από τις διαταγές που σας

προσφέρονται επιλέξτε το άνοιγμα αρχείου (Open). Διαλέξτε το αρχείο οnoma.dat. Η

προέκταση dat είναι απαραίτητη, επειδή στην περίπτωση που δε δίνεται προέκταση, η Borland

Pascal θεωρεί αυτονόητη την προέκταση pas. Εμφανίζεται στην οθόνη το περιεχόμενο του

αρχείου onoma.dat, που αποτελείται τώρα από μια εγγραφή.

Δε χρειάζεται να πειράξετε τα διάφορα σύμβολα που εμφανίζονται. Η παρουσία τους

οφείλεται στον ορισμό του αρχείου σαν αρχείο με τύπο.

Όσες φορές κι αν εκτελέσετε το πρόγραμμα, το περιεχόμενο του αρχείου θα είναι πάντα

μόνο μια εγγραφή. Το πρόγραμμα εκτελεί στο ξεκίνημα του μια πρόταση REWRITE, που έχει

αποτέλεσμα να γράφει πάνω στο παλιό αρχείο.

Για να μην ξαναγράφετε συνέχεια πάνω στο παλιό αρχείο, θα αλλάξουμε το πρόγραμμα,

έτσι ώστε χρησιμοποιώντας ένα μενού να μπορείτε να εκτελείτε ξεχωριστά τις βασικές

page 30

Page 31: Files in Pascal

λειτουργίες anoigma (δημιουργία αρχείου), eisagogi (εισαγωγή δεδομένων), και exodos

(εκτύπωση δεδομένων).

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

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

Οι διαδικασίες δεν είναι τίποτε άλλο από υποπρογράμματα. Στο προηγούμενο παράδειγμα

χρησιμοποιήθηκαν για τη διάσπαση του "μεγάλου" προγράμματος σε ενότητες. Σχεδόν

χωρίσαμε ολόκληρο το πρόγραμμα σε ξεχωριστές διαδικασίες. Οι διαδικασίες όμως μπορούν

να καταφέρουν πολύ περισσότερα από τη διάσπαση ενός προγράμματος. Μπορούν να

καλούνται από το κύριο πρόγραμμα με διαφορετικές παραμέτρους κάθε φορά.

Το κύριο πρόγραμμα διαβιβάζει σε κάθε διαδικασία που καλεί και τις κατάλληλες τιμές. Οι

τιμές αυτές ονομάζονται πραγματικές παράμετροι (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;

page 31

Page 32: Files in Pascal

END;

BEGIN

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

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

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

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

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

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

readln;

END.

Ας δούμε τι κάνουμε με το κύριο πρόγραμμα: Ορίζουμε δύο μεταβλητές a και b, και τις δύο

τύπου integer. Μετά δίνουμε τιμές στις μεταβλητές. Στη συνέχεια καλούμε τη διαδικασία,

όπου οι μεταβλητές a και b του κύριου προγράμματος διαβιβάζovται μέσα σε παρενθέσεις σαν

πραγματικές παράμετροι στη διαδικασία enallagi. Μετά την εκτέλεση της διαδικασίας εκτυ-

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

εναλλαγεί οι τιμές τους. Η διαδικασία επέστρεψε λοιπόν τις επεξεργασμένες τιμές στο κύριο

πρόγραμμα.

Κατά τον ορισμό της διαδικασίας enallagi, δίνονται μετά το όνομα της διαδικασίας οι

τυπικές παράμετροι μέσα σε παρενθέσεις. Αν θέλουμε η διαδικασία να ανταλλάξει τις τιμές

του κύριου προγράμματος, οι παράμετροι θα πρέπει να οριστούν σαν παράμετροι μεταβλητών

(VAR). Πρέπει δηλαδή, πριν τις παραμέτρους, να γραφεί η λέξη VAR.

Στη συνέχεια δηλώνονται οι τυπικές παράμετροι, χωρισμένες με κόμματα. Ακολουθεί μια

άνω και κάτω τελεία και ο καθορισμός του τύπου. Για να εναλλάξουν δύο μεταβλητές τις τιμές

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

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

μέσα στην διαδικασία, αρκεί να οριστεί σαν τοπική μεταβλητή (local variable). Η τοπική

μεταβλητή υφίσταται μόνο μέσα στη διαδικασία, και είναι άγνωστη έξω απ' αυτήν.

Μετά το τμήμα δηλώσεων ακολουθεί το τμήμα των προτάσεων, που ξεκινά με BEGIN και

καταλήγει σε END με ελληνικό ερωτηματικό.

Καθολικές μεταβλητές: Στο πρόγραμμα υπάρχουν εκτός από τοπικές, και καθολικές

μεταβλητές. Οι καθολικές μεταβλητές ορίζονται πριν τις διαδικασίες και τις συναρτήσεις και

πριν το πρώτο BEGIN. Ισχύουν για ολόκληρο το πρόγραμμα.

page 32

Page 33: Files in Pascal

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

τιμές από το κύριο πρόγραμμα στη διαδικασία, όπου θα γίνεται επεξεργασία τους και θα

τροποποιούνται, αλλά οι τροποποιημένες τιμές να μην επιστρέφονται στο κύριο πρόγραμμα.

Οι μεταβλητές του κύριου προγράμματος παραμένουν δηλαδή χωρίς αλλαγή.

Το επόμενο πρόγραμμα είναι ένα παράδειγμα αυτής της περίπτωσης:

PROGRAM procedure2;

VAR

a,b : integer;

procedure enallagi ( x, y : integer);

VAR

endiamesos : integer;

BEGIN

endiamesos : = x;

x:=y;

y := endiamesos;

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

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

END;

BEGIN

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

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

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

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

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

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

readln;

END.

Παράμετροι τιμών: Οι παράμετροι a και b του κύριου προγράμματος δεν πρόκειται

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

παράμετροι ορίζονται σαν παράμετροι τιμών. Πριν τις παραμέτρους δεν υπάρχει τώρα κανένα

χαρακτηριστικό (VAR).

page 33

Page 34: Files in Pascal

Η εκτέλεση του προγράμματος γίνεται ως εξής: Στο κύριο πρόγραμμα γίνεται η εισαγωγή

των μεγεθών a και b. Οι τιμές αυτές διαβιβάζονται στη διαδικασία enallagi, που πραγματοποιεί

μιαν εναλλαγή των δύο τιμών.

Για καλύτερο έλεγχο του προγράμματος, τυπώστε τις τιμές μέσα από τη διαδικασία. Θα

διαπιστώσετε ότι τα αλλαγμένα μεγέθη δεν επιστρέφονται στο κύριο πρόγραμμα. (τυπώστε τις

κύριες μεταβλητές a και b μετά την εκτέλεση της διαδικασίας.)

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

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

page 34

Page 35: Files in Pascal

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

readln;

END.

Κύριο πρόγραμμα : Στο κύριο πρόγραμμα εισάγεται μια τιμή. Η τιμή αυτή διαβιβάζεται

στη συνάρτηση diplasio. Αποτελεί πραγματική παράμετρο και τοποθετείται σε παρενθέσεις

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

υπολογίζεται η συνάρτηση. Η τιμή που επιστρέφει η συνάρτηση αποδίδεται στη μεταβλητή

apotelesma.

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

Στην αρχή όμως μιας συνάρτησης θα πρέπει να ορίζεται ο τύπος δεδομένων του

αποτελέσματος της. Αυτό γίνεται προσθέτοντας μια άνω και κάτω τελεία και τον τύπο

δεδομένων μετά τη λίστα των τυπικών παραμέτρων (που βρίσκονται μέσα σε παρενθέσεις).

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

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

που ξεκινά με BEGIN και τελειώνει σε END με (ελληνικό) ερωτηματικό. Το τμήμα

προτάσεων θα πρέπει οπωσδήποτε να περιέχει μια πρόταση απόδοσης τιμής για το όνομα της

συνάρτησης.

Αναδρομή: Πρέπει επίσης να σημειώσουμε ότι μια συνάρτηση μπορεί να καλεί άλλες

συναρτήσεις, ακόμη και τον ίδιον τον εαυτό της. Μια συνάρτηση που καλεί τον εαυτό της,

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

όπως στις διαδικασίες.

Κλήση διαδικασιών από ένα Μενού

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

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

ώστε κάθε διαδικασία να μπορεί να καλείται ξεχωριστά, και, μάλιστα, ακόμη καλύτερα, από

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

πρόταση CASE.

Δομικό Διάγραμμα (για το κύριο πρόγραμμα):

Διαδικασία menu

ΕΙΣΑΓΩΓΗ εκλογής (eklogi)

Εάν Eklogi=

1 2 3

Διαδικασία Διαδικασία Διαδικασία

page 35

Page 36: Files in Pascal

ανοίγματος εισαγωγής εξόδου

PROGRAM dat4;

USES crt;

TYPE

eggrafi= RECORD

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

page 36

Page 37: Files in Pascal

END;

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

BEGIN

ASSIGN (arxeio, 'ONOΜA.DAT' ) ;

RESET (arxeio) ;

READ ( arxeio,synolo) ;

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

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. Το πρόγραμμα εμφανίζει πραγματικά το όνομα και το επώνυμο,

page 37

Page 38: Files in Pascal

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

ξανά το πρόγραμμα, κι επιλέξτε το 2, για να δώσετε μιαν άλλη εγγραφή. Στη συνέχεια

εκτελέστε και πάλι το πρόγραμμα, και κάνετε την εκλογή 3. θα διαπιστώσετε ότι η

προηγούμενη εγγραφή δεν υπάρχει πια. Αν φορτώσετε το αρχείο ONOMA.DAT στο διορθωτή

κειμένου της Borland Pascal, θα δείτε ότι σ' αυτό το αρχείο υπάρχει μόνο η τελευταία

εγγραφή. Παρ' όλο που δε χρησιμοποιήσατε καθόλου την πρόταση REWRITE, η πρώτη

εγγραφή έχει διαγραφεί.

Το γεγονός αυτό ερμηνεύεται εύκολα: με την πρόταση RESET ανοίγουμε ένα αρχείο για

επεξεργασία. Αυτό που δε είπαμε όμως είναι, ότι ταυτόχρονα τοποθετείται ο δείκτης αρχείου -

που δείχνει την κάθε εγγραφή- στην αρχή του αρχείου. Αυτό σημαίνει, ότι αν δε μετακινηθεί ο

δείκτης αρχείου, όλες οι λειτουργίες θα αφορούν την ίδια πάντα εγγραφή.

Σημείωση: Η θέση της πρώτης εγγραφής έχει "αύξοντα αριθμό" 0. ( Στην Borland Pascal )

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

RESET: Με το RESET ανοίγει ένα αρχείο (που ήδη υπάρχει), και προετοιμάζεται για

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

αρχείου, δηλαδή στην εγγραφή "με αύξοντα αριθμό" 0.

Για να μεγαλώσετε το αρχείο, δίνοντας κι άλλες εγγραφές, θα πρέπει πρώτα να τοποθετήσετε

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

εισαγάγετε μια νέα εγγραφή. Σε αντίθετη περίπτωση, η εγγραφή θα αντικαταστήσει την

εγγραφή, που δείχνει ο δείκτης αρχείου.

Τοποθέτηση του δείκτη αρχείου : Με την πρόταση

SEEK ( μεταβλητή αρχείου , αριθμός εγγραφής );

ο δείκτης αρχείου τοποθετείται στην εγγραφή με τον αντίστοιχο αριθμό. Το πλήθος των

εγγραφών ενός αρχείου δεν είναι όμως πάντα γνωστό.

Εύρεση του αριθμού των εγγραφών : Μπορείτε να το βρείτε με την πρόταση

FILESIZE ( μεταβλητή αρχείου );

page 38

Page 39: Files in Pascal

Για να τοποθετήσετε το δείκτη αρχείου στο τέλος του αρχείου, αρκεί να συνδυάσετε τη

SEEK και τη FILESIZE:

SEEK ( αρχείο , FILESIZE ( αρχείο ));

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

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

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

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

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

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

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

ΕΙΣΑΓΩΓΉ επωνύμου (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. Αργότερα, όταν όλες

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

που θα απλοποιεί τη διαδικασία αυτή. Και αυτός ο τρόπος εργασίας είναι χαρακτηριστικός για

το δομημένο προγραμματισμό.

page 39

Page 40: Files in Pascal

Αφού εισάγετε αρκετές εγγραφές μ' αυτόν τον τρόπο, επιλέξτε τη διαδικασία exodos.

Εμφανίζεται τότε μόνο η εγγραφή που δόθηκε πρώτη. Το αποτέλεσμα δε θα σας φανεί

παράλογο αν μελετήσετε τη διαδικασία exodos. Και Σ' αυτήν τη διαδικασία χρησιμοποιείται η

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

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

Αν φορτώσετε το αρχείο ONOMA.DAT στο διορθωτή κειμένου, θα διαπιστώσετε ότι σ' αυτό

υπάρχουν όλες οι εγγραφές, που δώσατε, θα πρέπει λοιπόν να τροποποιήσετε και τη

διαδικασία exodos.

Έξοδος όλων των Εγγραφών Για να εμφανίσετε όλες τις εγγραφές, πρέπει να τοποθετήσετε το δείκτη αρχείου

στην πρώτη εγγραφή. Αυτό γίνεται ήδη στη διαδικασία 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) ;

page 40

Page 41: Files in Pascal

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

END;

CLOSE (arxeio) ;

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

readln;

END;

EOF : Η EOF (End Of File = Τέλος Αρχείου) είναι μια λογική τιμή, που παίρνει την τιμή

"αληθής" όταν ο δείκτης αρχείου δείχνει στο τέλος του αρχείου.

Πριν αρχίσετε να βελτιώνετε το πρόγραμμα, θα πρέπει να ασχοληθείτε με δύο λειτουργίες

ακόμη, που είναι απαραίτητες σε κάθε πρόγραμμα επεξεργασίας αρχείων.

Έξοδος Συγκεκριμένων Εγγραφών

Σ' αυτήν την παράγραφο θα μάθετε πώς να αναζητάτε και να παρουσιάζετε συγκεκριμένες

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

όλες οι εγγραφές, από το 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) ;page 41

Page 42: Files in Pascal

END;

END;

CLOSE (arxeio) ;

END;

Με τη διαδικασία epilogi εμφανίζονται όσοι έχουν το επώνυμο ΜΥΛΩΝΑΣ, καθώς και το

όνομα του καθενός. Μην ξεχάσετε να αλλάξετε τη διαδικασία menu, ώστε να μπορείτε να

επιλέγετε και τη διαδικασία epilogi. Και φυσικά θα πρέπει να προστεθεί στο κύριο πρόγραμμα

κι αυτή η διαδικασία.

Προσέξτε ότι ο τρόπος γραφής του ονόματος που δίνεται, πρέπει να συμπίπτει μ' αυτόν που

έχει το αποθηκευμένο όνομα. Ο ΜΥΛΩΝΑΣ δεν είναι Μυλωνάς.

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

Τοποθέτηση του δείκτη αρχείου: Για να διορθώσετε μια εγγραφή θα πρέπει πρώτα να την

εντοπίσετε ακριβώς. Αυτό γίνεται με τον αριθμό εγγραφής. Αρκεί να χρησιμοποιήσετε την

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

όμως να λάβετε υπόψη ότι η αρίθμηση των εγγραφών αρχίζει από το 0.

θα γράψετε τη διαδικασία diorthosi έτσι ώστε η εγγραφή που πρόκειται να διορθωθεί, να

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

την τέταρτη εγγραφή.

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

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

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

Ο δείκτης αρχείου στην εγγραφή n

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

page 42

Page 43: Files in Pascal

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

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

Ο δείκτης αρχείου στην εγγραφή n

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

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

Αποθήκευση στο αρχείο

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

procedure diorthosi;

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;

page 43

Page 44: Files in Pascal

USES crt;

TYPE

eggrafi = RECORD

eponymo :string[12];

onoma : string[10] ;

END;

VAR

arxeio : FILE OF eggrafi;

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' ) ;

page 44

Page 45: Files in Pascal

RESET ( arxeio) ;

WHILE NOT EOF(arxeio) DO

BEGIN

READ (arxeio, synolo) ;

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

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

END;

CLOSE ( arxeio ) ;

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

page 45

Page 46: Files in Pascal

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;

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;

page 46

Page 47: Files in Pascal

END;

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

readln;

END.

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

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

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

RENAME (μεταβλητή αρχείου, 'NeoOnoma' ) ;

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

Υπόδειξη:

Οι πιο κάτω ασκήσεις αφορούν το αρχείο ONOMA.DAT. Σε κάθε άσκηση, οι διάφορες

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

χρήσιμες. ( θα βρείτε τον κώδικα της κάθε διαδικασίας στον κώδικα του πλήρους

προγράμματος, μετά την άσκηση 5. )

Άσκηση 1:

Γράψτε μια διαδικασία eisagogi που να τοποθετεί τις εγγραφές στο αρχείο ΟΝΟΜΑ.DAT page 47

Page 48: Files in Pascal

Κάθε εγγραφή αποτελείται από τα πεδία αριθμός , επώνυμο και όνομα. Ο αριθμός είναι ο ίδιος

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

εισαγωγή δεδομένων θα σταματά όταν για επώνυμο δινεται το ".0"

Υπόδειξη : Η συνάρτηση FilePos ( arxeio ) επιστρέφει την τρέχουσα θέση του εσωτερικού

δείκτη αρχείου. ( Ο αριθμός αυτός είναι ίδιος με τον αριθμό εγγραφής )

Άσκηση 2:

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

Αρ. Επώνυμο Όνομα

0 Μυλωνάς Ευριείδης

1 Ρώτας Κώστας

2 Δρέττας Ζαχαρίας

Υπόδειξη: Με την καθιερωμένη συνάρτηση GOTOXY (στήλη, γραμμή) μπορείτε να

τοποθετείτε το δρομέα οπουδήποτε στην οθόνη. Η οθόνη έχει 80 στήλες (1 μέχρι 80) και 25

γραμμές (1 μέχρι 25). Μια και η GOTOXY είναι διαδικασία συνεργασίας με την οθόνη, θα

πρέπει με την Turbo Pascal να συνδέσετε στο πρόγραμμα σας τη Μονάδα Crt με μια πρόταση

USES.

Λύση:

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

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

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

I=0

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

Ι := Ι + 1

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

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

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

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

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

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

page 48

Page 49: Files in Pascal

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

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

Όπως Βλέπετε, το δομικό διάγραμμα είναι ιδιαίτερα επεξηγηματικό. Περιέχει ακόμη και την

"Επικεφαλίδα" που θα τυπώνεται στη οθόνη. (Κατά κανόνα, στο δομικό διάγραμμα δε συμπε-

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

πρόβλημα.)

Ο καθορισμός τιμής I:=0 και η αρίθμηση με I:=I+1 είναι απαραίτητα για την τοποθέτηση του

δρομέα (εύρεση της γραμμής).

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

FOR (FOR i:=l TO FileSize (arxeio)), δε χρειάζεται πρόσθετος μετρητής i για την τοποθέτηση

του δρομέα. Αυτή η εναλλακτική λύση περιλαμβάνεται στον κώδικα του προγράμματος, σαν

σχόλιο.

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

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

τον χρήστη.

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

Να τροποποιηθεί η διαδικασία diorthosi, ώστε να μπορεί να διορθωθεί οποιαδήποτε εγγραφή.

Υπόδειξη:

Χρειάζεται αναζήτηση του αριθμού της εγγραφής, που θα διορθωθεί. Οι αριθμοί αυτοί

μπορούν να βρεθούν με τη διαδικασία exodos.

Άσκηση 5: (διαγραφή δεδομένων )

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

όνομα diagrafi.

Με τη διαδικασία diagrafi θα είναι δυνατή η διαγραφή οποιασδήποτε εγγραφής. Το

πρόγραμμα θα ρωτά, ποια εγγραφή να διαγραφεί.

Υπόδειξη:

page 49

Page 50: Files in Pascal

Αρχίστε με ανάγνωση των εγγραφών του αρχείου. Αν ο αριθμός της εγγραφής που

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

την σε ένα άλλο αρχείο.To δεύτερο αρχείο θα περιέχει όλες τις εγγραφές εκτός απ' αυτήν που

θέλετε να διαγραφεί. (Μπορείτε να σκεφτείτε ένα τρόπο εικονικής διαγραφής εγγραφών ;)

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

PROGRAM dat6;

USES crt;

TYPE

eggrafi = RECORD

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 (' Επώνυμο: ') ;page 50

Page 51: Files in Pascal

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 ('Επώνυμο; ' ) ;

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

page 51

Page 52: Files in Pascal

WRITE ( synolo. arithmos) ;

GOTOXY ( 8, i+3) ;

WRITE ( synolo. eponymo);

GOTOXY ( 20, i+3) ;

WRITE ( synolo. onoma) ;

END;

CLOSE (arxeio) ;

END;

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

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; (* διαδικασία διόρθωσης*)

page 52

Page 53: Files in Pascal

VAR

n : integer;

BEGIN

ASSIGN (arxeio,'ONOMA1.DAT' ) ;

RESET (arxeio) ;

write('Αριθμός εγγραφής προς διόρθωση; ');

readln(n) ;

SEEK (arxeio,n) ;

READ (arxeio, synolo);

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' ) ;

page 53

Page 54: Files in Pascal

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;

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 (* Κυρίως πρόγραμμα*)

page 54

Page 55: Files in Pascal

REPEAT

menu;

CASE eklogi OF

1: anoigma;

2: eisagogi;

3: exodos;

4: epilogi;

5: diorthosi;

6: diagrafi;

ELSE end;

UNTIL eklogi = 0;

END.

Μεταβλητές : Αναμφίβολα θα έχετε προσαρμόσει κατάλληλα τις δηλώσεις των μεταβλητών.

Αν μια νέα μεταβλητή είναι απαραίτητη μόνο μέσα σε μια διαδικασία» μπορεί να δηλώνεται

στην αρχή της διαδικασίας.

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

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

είχε καθολική ισχύ.

Ενδιαφέρον παρουσιάζει η διαδικασία εισαγωγής των δεδομένων. Μετά από κάθε εισαγωγή

δεδομένων, η εγγραφή αποθηκεύεται στο αρχείο με μια πρόταση WRITE (αρχείο,εγγραφή).

Αν δώσετε όμως περισσότερες από μια εγγραφές διαδοχικά, θα παρατηρήσετε ότι δεν

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

εκτελείται η πρόταση CLOSE (αρχείο) ή γεμίσει η περιοχή προσωρινής αποθήκευσης της

Borland Pascal. Δώστε 20, και μετά δώστε 40 εγγραφές χωρίς να σταματήσετε, για να

παρατηρήσετε το φαινόμενο αυτό.

page 55

Page 56: Files in Pascal

ΑΣΚΗΣΕΙΣ 6 - 12

Με τις ασκήσεις 6 ως 12 δημιουργούμε ένα άλλο πρόγραμμα αρχείων. Σ' αυτό το πρόγραμμα

διαχωρίζονται οι λειτουργίες εισαγωγής και αποθήκευσης δεδομένων. Το πρόγραμμα περιέχει

επίσης και μια διαδικασία ταξινόμησης.

Επειδή οι εγγραφές που θα ταξινομηθούν, θα πρέπει να είναι σε μορφή πίνακα, θα πρέπει να

γίνουν ορισμένες αλλαγές σε σχέση με το πρόγραμμα των ασκήσεων 1 ως 5.

(θα βρείτε τον κώδικα του προγράμματος μετά την άσκηση 12. )

Άσκηση 6:

Γράψτε το τμήμα δηλώσεων για το νέο πρόγραμμα (dat7). Κάθε εγγραφή θα αποτελείται από

το επώνυμο και το όνομα. Ο πίνακας εγγραφών θα πρέπει να μπορεί να συμπεριλάβει 100

εγγραφές.

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

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

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

Γράψτε μια διαδικασία eisagogi με την οποία θα κάνετε εισαγωγή των δεδομένων. Η εισαγωγή

των δεδομένων θα διακόπτεται όταν δοθεί σαν επώνυμο το ".0".

Υπόδειξη:

Με τα δεδομένα συμπληρώνεται ένας πίνακας. Η αποθήκευση των δεδομένων γίνεται με

ξεχωριστή διαδικασία, ανεξάρτητη από την τακτοποίηση.

Λύση:

I:=0

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

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

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

page 56

Page 57: Files in Pascal

I := I + 1

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

Plithos:=I-1

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

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

να μειώνεται κατά 1.

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

Γράψτε μια διαδικασία αποθήκευσης, με όνομα apothikefsi, που θα αποθηκεύει τον πίνακα

των εγγραφών στο αρχείο ONOMA2.DAT.

Λύση:

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

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

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

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

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

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

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

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

του αρχείου και, μετά την ενημέρωση του πίνακα, θα εμφανίζει τις εγγραφές στη γνωστή

μορφή.

Λύση:

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

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

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

page 57

Page 58: Files in Pascal

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

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

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

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

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

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

Τώρα, θα πρέπει να γράψετε και μια διαδικασία ταξινόμησης με όνομα taxinomisi. Η

διαδικασία θα κάνει τα εξής: Αρχικά θα τοποθετεί όλες τις εγγραφές στον πίνακα εγγραφών.

Μετά θα αρχίζει τη διαδικασία της ταξινόμησης. Μόλις τελειώσει την ταξινόμηση, θα

εμφανίζει στην οθόνη το μήνυμα "Η ταξινόμηση τέλειωσε". Μετά την ταξινόμηση, στο αρχείο

θα αποθηκεύονται οι ταξινομημένες εγγραφές.

Υπόδειξη:

Η ταξινόμηση ακολουθεί τη σειρά των χαρακτήρων στον κώδικα ASCII.

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

1. Να τροποποιηθούν κατάλληλα η διαδικασία menu και το κύριο πρόγραμμα.

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

επιλογές. Αν πατηθεί γράμμα αντί για ψηφίο, τυπώνεται το μήνυμα "Λάθος Πληκτρο-

λόγηση" και να μη διακόπτεται το πρόγραμμα.

Υποδείξεις για τη λύση του 1.:

Η μεταβλητή epilogi, που ήταν τύπου integer, να γίνει τύπου char.

Λάβετε υπόψη ότι έτσι θα χρειαστεί να προσθέσετε αποστρόφους

(') στα κατάλληλα σημεία.

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

PROGRAM dat7;

USES crt;

TYPE

eggrafi = RECORDpage 58

Page 59: Files in Pascal

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

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;

page 59

Page 60: Files in Pascal

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') ;

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;

page 60

Page 61: Files in Pascal

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

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) ΑΝΟΙΓΜΑ ‘);

page 61

Page 62: Files in Pascal

writeln('(2) ΕΙΣΑΓΩΓΗ ‘);

writeln('(3) ΕΞΟΔΟΣ ‘);

writeln(1(4) ΑΠΟΘΗΚΕΥΣΗ ‘);

writeln('(5) ΤΑΞΙΝΟΜΗΣΗ ‘);

writeln('(0) ΤΕΛΟΣ ΕΡΓΑΣΙΑΣ ‘);

readln ( eklogi) ;

END;

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

REPEAT

menu;

CASE eklogi OF

'1' : anoigma;

'2' : eisagogi;

'3' : exodos;

'4' : apothikefsi;

'5': taxinomisi;

'0' : ;

ELSE writeln ('Λάθος Πληκτρολόγηση');

END;

UNTIL eklogi = '0';

END.

Παρατήρηση: Μετά από κάθε την ταξινόμηση, οι αριθμοί εγγραφής που περιέχονται στο

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

αντικαθιστάτε τους αριθμούς αυτούς κατά τη νέα αποθήκευση των δεδομένων, ώστε και μετά

την ταξινόμηση να εμφανίζονται σε αύξουσα σειρά. (Σχετικά, μελετήστε τις ασκήσεις 1 και 6)

page 62

Page 63: Files in Pascal

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

IORESULT Η συνάρτηση αυτή δίνει σαν ακέραιο το αποτέλεσμα μιας πράξης I/O. Αν δεν

υπήρξε σφάλμα το αποτέλεσμα είναι 0 αλλιώς κάποιος αριθμός μεταξύ του 1 και του 255

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

1 Ανύπαρκτο αρχείο

2 Το αρχείο δεν έχει ανοιχτεί για εισαγωγή

3 Το αρχείο δεν έχει ανοιχτεί για έκδοση

4 Το αρχείο δεν έχει ανοιχτεί

16 Σφάλμα στο αριθμητικό σχήμα

32 Δεν επιτρέπεται η πράξη αυτή σε λογική συσκευή

33 Δεν επιτρέπεται σε άμεση λειτουργία

34 Δεν επιτρέπεται η καταχώριση σε τυποποιημένα αρχεία

144 Ασυμφωνία μήκους εγγραφής

145 Αναζήτηση πέρα από το τέλος του αρχείου

153 Απροσδόκητο τέλος αρχείου

240 Σφάλμα εγγραφής σε δίσκο

241 Πλήρης πίνακας περιεχομένων

page 63

Page 64: Files in Pascal

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

{$I-}

ChDir (C:\Temp);

IF IOResult <>0 THEN

writeln(' The directory is not found ');

END.

page 64

Page 65: Files in Pascal

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.

GetDir Η διαδικασία αυτή επιστρέφει τον τρέχοντα κατάλογο ενός συγκεκριμένου δίσκου.

Η σύνταξη της είναι :

Getdir (d : byte; var s : string );

Το d είναι μια ακέραιου τύπου έκφραση και η s μια μεταβλητή τύπου string στην οποία

αποθηκεύεται ( αυτό σημαίνει το var) ο τρέχον κατάλογος του καθορισμένου από το d δίσκου

Εάν d=0 σημαίνει τον τρέχον δίσκο, d=1 το δίσκο Α, d=2 το δίσκο Β κ.λ.π

page 65

Page 66: Files in Pascal

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

write('Xx');

UNTIL KeyPressed;

END.

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

στο block των εντολών που τη χρησιμοποιούμε (τη συγκεκριμένη εγγραφή)

page 66

Page 67: Files in Pascal

παράδειγμα :

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

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

readln;

END.

Παρατηρήστε τη διαφορά μεταξύ της εισαγωγής στοιχείων με χρήση της WITH και χωρίς

χρήση της στο πρόγραμμα dat1.

page 67

Page 68: Files in Pascal

page 68

Page 69: Files in Pascal

Αρχεία Κειμένου

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

Από όσα αναφέρθηκαν παραπάνω θα έχετε αντιληφθεί τις επιπτώσεις των διαφορών των δύο τύπων

αρχείων.

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

Οι εντολές

ASSIGN για τον καθορισμό του ονόματος του αρχείου,

REWRITE για τη δημιουργία ενός νέου αρχείου,

RESET για το άνοιγμα ενός αποθηκευμένου αρχείου,

CLOSE για το κλείσιμο ενός αρχείου

EOF για την αναγνώριση του τέλους του αρχείου μπορούν να χρησιμοποιηθούν.

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

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

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

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

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

page 69

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

Page 70: Files in Pascal

Εμφάνιση ενός Αρχείου Κειμένου στην Οθόνη

Έξοδος Κειμένου: Τα προγράμματα που γράφουμε στο διορθωτή κειμένου της 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

Page 71: Files in Pascal

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

Page 72: Files in Pascal

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. εφόσον όχι τέλος αρχείου

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

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

ΑΛΛΙΩΣ

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

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

page 72

Page 73: Files in Pascal

Πρόγραμμα ektyposi

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.

page 73

Page 74: Files in Pascal

Μεγάλο αρχείο

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

Πρόβλημα 2:

Βελτιώσεις στο πρόγραμμα: Στο πρόγραμμα επεξεργασίας κειμένου text θα γίνουν οι πα-ρακάτω αλλαγές:

1. Η εκτύπωση στον εκτυπωτή και, αντίστοιχα, η αποθήκευση της γραμμής στο αρχείο, δε θα γίνεται μετά από κάθε γραμμή που εισάγεται.(Υπόδειξη: Οι γραμμές εισάγονται σ' έναν πίνακα.)

2. Το κείμενο θα αποτελείται από 60 το πολύ γραμμές. Μόλις δοθεί και η 60ή γραμμή το πρόγραμμα θα εμφανίσει ένα μήνυμα, υποδεικνύοντας ότι πρέπει να δοθεί π συνθήκη διακοπής. (Στην αρχή, δοκιμάστε χωρίς αυτήν την υπόδειξη)

3. Όταν δίνεται η συνθήκη διακοπής, θα επακολουθεί η εκτύπωση και η αποθήκευση του κειμένου.

4. Η εισαγωγή του κειμένου θα σταματάει όπως συνήθως, με την εισαγωγή του ".Ο".

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

Δημιουργία

page 74

Page 75: Files in Pascal

Ι:= 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;

BEGINclrscr; 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 ]);

Page 76: Files in Pascal

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, που θα σας πληροφορεί ότι δεν επαρκεί η μνήμη εργασίας του

υπολογιστή.

Page 77: Files in 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);

Page 78: Files in Pascal

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

Page 79: Files in Pascal

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.