147 37 10MB
Greek Pages 286 Year χ.χ.
Π ΡΟ ΓΡΑ Μ Μ Α ΤΙΣΜ Ο Σ Α ΡΧΕΙΩ Ν ΓΙΑ ΤΟ Ν
IBM PC ► και τους συμβατους
ALAN SIMPSON
ΚΛΕΙΔΑΡΙΘΜΟΣ Στουρνάρα 27Β 1°^ όροφος Αθήνα 106 82 · Τηλ. 3632044
Τ ίτλ ο ς πρω τοτύπου: Data FHe Programming on Msur IBM PC..
Ε γκεκριμένη
μ ετάφ ρασ η
τη ς
Α γγχική ς
Έ κ δοσ η ς
Α π ο κ λ εισ τικ ό τη τα για τη ν Ε λ λ η ν ικ ή γλ ώ σ σ α Ε κδόσ εις Κ Λ ΕΙΔ Α ΡΙΘ Μ Ο Σ Στουρνάρα 27β Α Θ Η Ν Α 10682 ΤΗ Λ . 3632044
Cover art by Loris Kalafat Book Design by Ingrid Owen Layout and technical illustration by Gene Hirsh IBM is a registered trademark of IBM Corp. SYBEX is not affiliated with any manufacturer. Every effort has been made to supply complete and accurate information. However, SYBEX assumes no responsibility for its use, nor for any infringements of patents or other rights of third parties which would result. Copyright©1984 SYBEX Inc.. 2344 Sixth Street. Berkeley, CA 94710. World rights reserved. No part of this publication may be stored in a retrieval system, transmitted, or reproduced in any way. including but not limited to photocopy, photograph, magnetic or other record, without the prior agreement and written permission of the publisher. Library of Congress Card Number: 84-50366 ISBN 0-69588-146-2 Printed in the United States of America 10 9 8 7 6 5 4 3 2 1
ΜΕΤΑΦΡΑΣΗ: ΝΙΚΟΣ ΣΑΡΑΝΤΑΚΟΣ ΩΙΠΛ.ΕΜΠ
ΠΕΡΙΕΧΟΜΕΝΑ ΕΝΑ ΑΡΧΕΙΑ
Εισαγω γή Δόμηση ενός Α ρχείου Δεδομένων
/5
Σειριακά Αρχεία Δεδομένων
17
Α ρχεία Δεδομένων Τυχαίας
ΔΕΔΟΜΕΝΩΝ
Προσπέλασης
18
ΔΥΟ Δημιουργία ενός Σειριακού
ΣΕΙΡΙΑΚΑ
Αρχείου Δεδομένων
ΑΡΧΕΙΑ
Α ρχείο
22
Κ λείσιμο του Σειριακού Αρχείου
24
21
Εγγραφή στο Σειριακό
ΔΕΔΟΜΕΝΩΝ
Προσπέλαση στα Σειριακά Δεδομένα
25
Σειριακή Ανάγνωση Εγγραφών
26
Προγραμματισμός με Σειριακά Αρχεία
30
ΣΧΕΔΙΑΣΜΟΣ
Ορισμός του Προβλήματος και των Α ναγκαίων Εργασιών
37
ΣΥΣΤΗΜΑΤΩΝ
Σχεδιασμός της Δομής μιας Βάσης Δεδομένων
ΣΕΙΡΙΑΚΩΝ
/ Έ ξοδο Α ρχείου Δίσκου
ΤΡΙΑ
38
Γράψιμο ρουτινών για Είσοδο 40
ΑΡΧΕΙΩΝ
ΤΕΣΣΕΡΑ ΣΥΣΤΗΜΑ
Παρουσίαση των Επιλογών: Το Κύριο Μενού
47
ΒΙΒΛΙΟΥ
Σβήσιμο των Παλιών Δεδομένων: Έναρξη Νέου Εξαμήνου
49
Ενημέρωση του Αρχείου:
ΒΑΘΜΟΛΟΓΙΑΣ
Προσθήκη Βαθμών
52
ΜΕ ΣΕΙΡΙΑΚΑ
Φορμαρισμένα αποτελέσματα: Εκτύπωση του Βαθμολογίου
55
3
Αλλαγές Δεδομένων: Διόρθωση
ΑΡΧΕΙΑ
του Βαθμολογίου Εκτέλεση Πράξεων: Αθροίσματα και Μ έσοι Ό ρ ο ι
57 61
Χειρισμός Πολλαπλών Αρχείων: Πολλές Τάξεις
62
ΑΡΧΕΙΑ
Ανοιγμα ενός Αρχείου Τυχαίας Π ροσπέλασης
72
ΔΕΔΟΜΕΝΩΝ
Γράψιμο Δεδομένων σε Αρχεία Τυχαίας Προσπέλασης
74
ΤΥΧΑΙΑΣ
Ανάγνωση Δεδομένων από Αρχεία Τυχαίας Προσπέλασης
77
ΠΡΟΣΠΕΛΑΣΗΣ
Κ λείσιμο του Αρχείου Τυχαίας Π ροσπέλασης
77
ΠΕΝΤΕ
Μετατροπή Αριθμών σε Αλφαριθμητικές για Αποθήκευση
78
Βήμα 1. Η Γενική Ιδέα Βήμα 2. Σχεδιασμός της Βάσης
83
ΣΧΕΔΙΑΣΜΟΣ
Δεδομένων Βήμα 3. Σχεδιασμός της Δομής του
84
ΣΥΣΤΗΜΑΤΩΝ ΛΟΓΙΣΜΙΚΟΥ
Συστήματος Βήμα 4. Ρουτίνες Εισόδου-Εξόδου
85 86
ΕΞΗ
(SOFTWARE) ΜΕ ΑΡΧΕΙΑ ΤΥΧΑΙΑΣ ΠΡΟΣΠΕΛΑΣΗΣ
ΕΠΤΑ ΤΟ ΠΡΟΓΡΑΜΜΑ ΕΓΚΑΤΑΣΤΑΣΗΣ
Το Πρόγραμμα INSTALL (εγκατάστασης)
91
Το Πρόγραμμα MAIN M ENU
94
ΚΑΙ TO ΠΡΟΓΡΑΜΜΑ ΤΟΥ ΚΥΡΙΟΥ ΜΕΝΟΥ
ΟΚΤΩ Λεκτική Διατύπωση του
ΠΡΟΣΘΗΚΗ
Προγράμματος A PPEND Εύρεση της Τελευταίας Εγγραφής
ΕΓΓΡΑΦΩΝ
Αποθήκευσή τους
ΣΤΟ ΑΡΧΕΙΟ
99 100
Ερώτηση για Νέα Δεδομένα και 102
Σημάδεμα του Τέλους του Αρχείου
103
Χρήση του Προγράμματος A PPEND
105
ΤΥΧΑΙΑΣ ΠΡΟΣΠΕΛΑΣΗΣ
ΕΝΝΙΑ Σχεδιασμός της Αναφοράς
ΕΚΤΥΠΩΣΗ
109
Λεκτική Διατύπωση του Προγράμματος REPO R T Έ λεγχος αν Έ ξοδος είναι η Οθόνη
110
ΑΝΑΦΟΡΩΝ ΑΠΟ ΑΡΧΕΙΟ
ή ο Εκτυπωτής Καθορισμός της Επικεφαλίδας και
111
της Φόρμας Εκτύπωση της Φ ορμαρισμένης
Π2
ΤΥΧΑΙΑΣ
Αναφοράς Σταμάτημα της Αναφοράς πάνω
ι 12
ΠΡΟΣΠΕΛΑΣΗΣ
στην Οθόνη
ι j3
Παρουσίαση Συνόλων
116
Σελιδοποίηση και Παρουσίαση κατά Οθόνη
119
5
ΔΕΚΑ ΔΙΟΡΘΩΣΕΙΣ
Έ να Σενάριο Διόρθωσης Δεδομένων Λεκτική Διατύπωση του
123
Π ρογράμματος ED IT
125
ΣΕ ΑΡΧΕΙΟ
Το Πρόγραμμα ED IT
j 25
ΔΕΔΟΜΕΝΩΝ
Ερωτήσεις για Επιλογές Διόρθωσης Παρουσίαση Δεδομένων και
ΤΥΧΑΙΑΣ
Ερώτηση για Αλλαγές 127 Φ υλλομέτρηση στο Α ρχείο Δεδομένων 129
ΠΡΟΣΠΕΛΑΣΗΣ
Σημάδεμα των Εγγραφών που Π ρόκειται να Απαλειφθούν
130
Υπερπήδηση των Απαλειφόμενων Εγγραφών Γράψιμο πάνω στις Α παλειφόμενες
133
Εγγραφές Στοίβαγμα των Απαλειφόμενων
134
Εγγραφών
140
ΤΑΞΙΝΟΜΗΣΗ
Αλγόριθμοι Ταξινόμησης Ταξινόμηση του Α ρχείου Δεδομένων
145 j 50
ΔΕΔΟΜΕΝΩΝ
Ταξινόμηση μέσω Ευρετηρίου Ταξινόμηση Μέσα στην Τ αξινόμηση
157 153
ΕΝΤΕΚΑ
Ταξινόμηση Οριζόμενη απ’ το Χρήστη ι 65
ΣΕ ΑΡΧΕΙΑ ΤΥΧΑΙΑΣ ΠΡΟΣΠΕΛΑΣΗΣ
ΔΩΔΕΚΑ Αναζήτηση ενός Πεδίου
177
ΑΝΑΖΗΤΗΣΗ
Π ροαιρετική Αναζήτηση
183
ΣΕ ΑΡΧΕΙΑ
Αναζήτηση Π εριοχής Αναζήτηση Πολλαπλών Πεδίων
185 189
6
ΔΕΔΟΜΕΝΩΝ ΤΥΧΑΙΑΣ ΠΡΟΣΠΕΛΑΣΗΣ ΔΕΚΑΤΡΙΑ Φορμάρισμα Αλφαριθμητικών
ΣΥΜΠΛΗΡΩΜΑΤΙΚΕΣ
Μεγάλου Μήκους στην Οθόνη
209
Μετατροπή των Χαρακτήρων σε
ΤΕΧΝΙΚΕΣ
Κεφαλαία Έ λεγχος για Αποδεκτές Ημερομηνίες Αυτόματο Κεντράρισμα των Επικεφαλίδων
213
Εμφάνιση χαρακτήρων για Γραφικά ... Και Λίγη Διασκέδαση!
214
Επίλογος
217
210 211
214
ΠΑΡΑΡΤΗΜΑ A
ΤΟ ΤΟΣΥΣΤΗΜΑ ΣΥΣΤΗΜΑSALES SALES
ΠΑΡΑΡΤΗΜΑ Β
ΣΥΣΤΗΜΑ ΣΥΣΤΗΜΑΤΥΧΑΙΑΣ ΤΥΧΑΙΑΣ ΠΡΟΣΠΕΛΑΣΗΣ ΓΙΑ ΓΡΑΦΗ ΔΙΕΥΘΥΝΣΕΩΝ 236
ΠΑΡΑΡΤΗΜΑ Γ
ΠΑΡΑΡΤΗΜΑ Δ
220
ΣΥΣΤΗΜΑ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ ΒΙΒΛΙΟΓΡΑΦΙΚΩΝ ΠΑΡΑΠΟΜΠΩΝ
256
ΠΕΡΙΛΗΨΗ ΤΟΥ ΛΕΞΙΛΟΓΙΟΥ ΤΗΣ BASIC
276
Πρόλογος της Ελληνικής Έκδοσης Είναι γνω στό σε όλους μας το πρόβλημ α των λα τινικώ ν φράσεω ν που συναντά κανείς στη B A SIC και τη ς ανάγκ ης ύπαρξης ελληνικώ ν μηνυμάτων στα προγράμματα που χρ η σιμ οποιού μ ε για τις ανάγκες μας σ την Ελλάδα. Επειδή υπάρχουν πολ λοί χρ ή σ τες που θα τους ενδιέφ ερε να χ ρ η σ ι μοποιήσ ουν τις α γγλικ ές φ ρ άσ εις του πρω τότυπου βιβλίου, η διαδικ α σία που ακολουθήθηκε σ τη ν παρουσ ίασ η των προγραμμάτω ν είναι η ε ξής: Κάθε πρόγραμμα παρατίθεται αυτούσιο, ως έχει, με τα λα τινικά μηνύματα, και στο τέλος του, ανάμεσα σε δύο μαύρες συμπαγείςγραμμές, δίνονται οι γραμμές που πρέπει να πληκ τρ ολογη θούν, αν θέλουμε τα μηνύματα στα ελληνικ ά. Γ ια να χρ η σ ιμ ο π ο ιή σ ετε τους ελλ ηνικ ούς χα ρ ακτήρ ες, θα πρέπει να πατήσ ετε A lt-C trl-F2 και για επάνοδο στους λα τινικούς χα ρακτήρες A lt-C trl-F l.
9
ΕΙΣΑΓΩΓΗ Π α ρ ’ όλο που σ τις μέρες μας ο αναγνώ σ τη ς έχει στη διάθεσή του χ ι λιάδες β ιβ λία πάνω σ τη B A S IC , ελά χισ τα είναι εκείνα που αναφέρονται σε τεχν ικ έ ς προγραμματισμού. Ό π ω ς και με κάθε γλώ σ σ α προ γραμματισμού, η κα τανόησ η των εντολώ ν και του συντακτικού της B A SIC αποτελεί μέρος μόνο του σ τόχου. Το απ αρα ίτητο επόμενο β ή μα είναι η εκμάθηση της χ ρ ή σ η ς των εντολώ ν της γλώ σ σ α ς για πρα κτικές εφ αρμογές. Κ αι μ’ αυτό ασ χ ο λείτα ι, απ οκλεισ τικά, το β ιβ λίο μας. Ο χρ ό ν ο ς που καταναλώ νετε μαθαίνοντας σ τοιχειώ δεις τεχνικές προγραμματισμού δεν είναι χα μένος χρ όν ος, Το προφ ανές πλ εονέκ τη μα που αποκτάτε είναι ότι μαθαίνετε να α ξιοποιείτε καλύτερα τον υπο λ ογισ τή σας, για τί μ πορείτε να τον κάνετε να κάνει περισ σ ότερα. Υ πάρχουν κι άλλα πλεονεκτήμ ατα όμως, ό χι τόσ ο φανερά. Π ρώ τον, με τις τεχνικές προγραμματισμού αποκτάτε κάποια ευχέ ρεια στη σ υγκεκριμένη γλώσσα. Η ευ χερ ής χρ ή σ η μιας γλώ σ σ ας πρ ο γραμματισμού μοιάζει αρκετά με την ευχερή χρ ή σ η μιας ανθρώ πινης γλώ σσας. Μ πορείτε να εκφ ράσ ετε τις ιδέες σας γρ ήγορα και απ οτελε σματικά χω ρ ίς πολ λή σκέψ η ή μετάφ ραση. Σε μια γλώ σ σ α προγραμ ματισμού αυτό σ ημ αίνει ότι μ πορείτε να μετατρέψετε τις ιδέες σας σε προγράμματα εργασ ία ς μέσα σε σ χετικ ά σύντομο χρ ο ν ικ ό διάστημα. Δεύτερον, η ευ χερ ής χρ ή σ η μιας γλώ σ σ α ς προγραμματισμού σας διευ κολύνει πολύ να μάθετε κι άλλες γλώ σ σ ες προγραμματισμού. Π αρ’ όλο που η κάθε γλώ σ σ α χρ η σ ιμ ο π ο ιεί διαφ ορ ετικ ές εντολές και έχει άλ λους συντακτικούς κανόνες, όλες τους χρ η σ ιμ οποιού ν τις ίδιες τεχ νι κές για να εκτελέσουν μια εργασία. Για παράδειγμα αν ήδη χρ η σ ιμ ο ποιείτε μ’ ευχέρεια τη B A SIC και θέλετε να μάθετε Pascal ή C το μόνο που σας λείπει είναι να μάθετε ένα νέο λεξιλόγιο. Οι τεχνικές πρ ο γραμματισμού της καινούριας γλώ σ σ α ς δεν πρόκειται να διαφέρουν πολύ από αυτές που χρ η σ ιμ οποιού σ ατε στη B A SIC , αλλά τα προγράμ ματα σας ίσω ς «τρέχουν» πολύ γρηγορότερα. Τ ρίτον, μένοντας στα πλ αίσ ια της ίδιας γλώ σσας, όσο προχω ράτε με τις τεχνικές το κάθε βήμα θα σας φ αίνεται απλούσ τερο α π’ το προηγούμενο διότι μπορείτε να εφ αρμόσετε πα ρόμοιες τεχνικές. Συχνά για να δημ ιουργήσ ετε ένα νέο πρόγραμμα δεν θα έχετε παρά να τρ οπ οποιήσ ετε ένα ήδη σ χεδια σμένο. Μ ια και τα περ ισ σ ότερ α προγράμματα απαιτούν την αποθήκευση δε δομένων σε α ρ χεία δεδομένων, αυτό είναι και το βασ ικό θέμα του β ι βλίου μας. Κάθε σύστημα λογισμ ικού (S oftw are) που περιλαμβάνει αρ
10
χεία δεδομένω ν χρ ειά ζετα ι να έχει α π ’ το σχεδία σ μά του ορισμένες ι κανότητες, όπως: τη δυνατότητα να προσ τίθενται δεδομένα στα αρ χεία δεδομ ένω ν να τυπώ νονται αναφ ορές από τα αρχεία· να αλλάζουν τα δεδομένα· να ταξινομ ούνται τα δεδομένα· τέλος, να μπορεί να γίνεται αναζή τησ η κατά τύπους δεδομένων. Η κάθε μια α π ’ αυτές τις ικα νότη τες σ χετίζεται με ορισ μένες τεχνικές προγραμματισμού· οι τεχνικές προγραμματισμού που χρ η σ ιμ οποιού ντα ι για το χειρ ισ μ ό αρχείω ν με δεδομένα είνα ι σε πολύ μεγάλο βαθμό γενικές. Δ ηλαδή, δεν έχει σ ημ α σ ία αν γράφ ετε ένα πρόγραμμα που ασ χολείτα ι με έναν κατάλογο συν δρομητώ ν, με τον θεματικό κα τάλογο μιας β ιβ λιο θ ή κ η ς ή ένα πακέτο λ ογισ τική ς. Κ ατά πάσα πιθα νότητα θα χρ εια σ τεί να διευθετήσετε δε δομένα σε α ρ χεία δεδομένων και σ χεδόν σ ίγουρα σε κάθε σ ύστημα που αναπτύσσετε θα χρ η σ ιμ ο π ο ιή σ ετε τις ίδιες ρουτίνες. Ά ν «παίξετε σω στά τα χα ρ τιά σας», θα φ τιάξετε τέτοιες ρουτίνες που θα μ πορείτε να τις χρ η σ ιμ ο π ο ιείτε σε όλη τη ν προγρα μμ ατιστική ζωή σας. Ό τα ν τις χρ εια σ τείτε σε κάποια μ ελλοντική εργασ ία θα είστε σε θέση να ξεση κώ νετε ολόκ λη ρ ες ρουτίνες από τα πα λιά προγράμμα τα σε νέα, χω ρ ίς να πρέπει να τις ξαναγράψ ετε. Καθώς θα μεγαλώνει η προσ ω πική σ ας β ιβ λιοθήκ η με ρουτίνες B A S IC , μπορείτε ν ’ α ρ χίσ ετε να γράφ ετε τα προγράμματά σας κατά παραγράφους και ό χι σε χω ρ ι στές γραμμές. Αυτό μειώνει θεαματικά τον χρ όν ο που απαιτείτα ι για τη ν εκτέλεση και τη ν αποκω δικ οποίησ η των λαθώ ν του προγράμματος και είναι μια τεχνική την οποία οι περ ισ σ ότερ οι κα λοί προγρα μμ ατι στές τηρούν με θρησ κευτική ευλάβεια. Γ ια να μάθετε τεχνικές προγραμματισμού, πρέπει ήδη να γνω ρίζετε μερικά για τη ν ίδια τη γλώ σσα. Π αρ’ όλο που το β ιβ λίο αυτό δεν είναι γραμμένο για κά ποιον εντελώ ς αρ χάρ ιο, θα δείτε ότι αρκεί η απλή γνώ ση των σ τοιχειω δώ ν τη ς BA SIC . Γ ια λ ό γ ο υ ς σ α φ ή νεια ς, σ το κ εί μ ενο π ο λ λ ές γρα μμές προγρα μμά τω ν σ υ ν εχίζο ν τα ι σ τ η ν αποκάτω γρα μμή. Ό τ α ν τις π λ η κ τ ρ ο λ ο γ ή σ ε τ ε σ τ η ν οθόνη θα εμ φ α ν ισ το ύ ν σε μ ια γρα μμή . Γ ι ’ αυτό να ε ίσ τε π ρ ο σ ε χ τ ικ ο ί σ τ η ν π λ η κ τ ρ ο λ ό γ η σ η , να μ η ν π α τή σ ε τε το π λ ή κ τ ρ ο *------1 δεν φ τ ά σ ετ ε σ τ ο ν επ ό μ ενο αριθμό γρα μμής. Α ν καταλαβαίνετε εντολές της B A SIC όπω ς τις PR IN T , IN P U T , G O S U B και G O T O είσ τε έτοιμ ος για την ανάγνω ση και κα τα νόησ η του βιβλίου. Ό μ ω ς, για την περίπτω ση που σ υναντήσετε σ ’ ένα πρόγραμμα μια εντολή που δεν τη ν ξέρετε, στο τέλος του βιβλίου περιλαμβάνεται π ερ ίλ ηψ η των εντολώ ν όπου μπορείτε εύκολα ν ’ ανα τρέχετε. Φ υσικά, σ το εγχ ειρ ίδιο B A SIC του IBM PC σ ας θα βρείτε ό σ ες επιπ λέον πλ η ρ ο φ ο ρ ίες χρεια στείτε. Τ ο β ιβ λίο είναι δομημένο ως εξής: Στο κεφ άλαιο 1 γίνετα ι εισαγω γή για το τι είναι ένα αρ χείο δεδομένων, χρ η σ ιμ οποιώ ντας ένα πα ράδειγ μα α ρχείου δεδομένων από τη ν καθημερινή ζωή. Στο Κ εφ άλ αιο 2 ως 4 εξετάζονται τα σ ειρ ιακά α ρ χεία σε B A SIC και οι τεχ νικ ές προγραμμα
11
τισμού που χρ η σ ιμ οποιού ντα ι όταν εργαζόμαστε μ’ αυτά τ ’ αρχεία. Γ ί νεται επίσ η ς λόγος για τις δομές δεδομένων (πίνακες). Τα Κ εφ άλαια 5 και 12 ασ χολούνται με τεχ νικ ές χειρ ισ μ ού αρχείω ν τυχαία ς πρ οσ π έλα σης. Εδώ εξετάζεται η προσ θήκ η εγγρα φώ ν (records), η εκτύπωση φ ορμαρισμένω ν αναφ ορώ ν, η τρ οπ οποίησ η και απάλειψ η δεδομένων, οι τεχνικές για αναζή τησ η και κατάταξη. Τ ο Κ εφ άλαιο 13 σας πρ ο σ φ έρει μερικές επιπρόσ θετες χρ ή σ ιμ ες ρουτίνες που βοηθούν σε πολλές περιπτώ σεις. Το παράρτημα Α έχει π ερ ίλ ηψ η όλω ν των προγραμμάτω ν που χρ η σ ιμ ο ποιού ντα ι στα παραδείγματα των αρχείω ν τυχαία ς πρ ο σ π έλασης. Το παράρτημα Β α σ χο λείτα ι με ένα σ ύσ τημα που επεξεργά ζεται έναν κατάλογο σ υνδρομητώ ν. Στο παράρτημα Γ δίνεται ένα σ ύ σ τημα δημ ιουργία ς καταλόγου β ιβ λιοθ ή κ η ς που α ξιοποιεί και διαφ ω τίζει παραπέρα τις τεχνικές προγραμματισμού που εκτίθενται σ το βι βλίο αυτό. Το παράρτημα Δ π ερ ιέχει περίληψ η των εντολώ ν και των σ υναρτήσεω ν που χρ η σ ιμ οποιού ντα ι σ το β ιβ λίο και χρ η σιμ εύ ει σαν βοήθημα αναφοράς. Μ ιας και πο λ λο ί αναγνώ στες προτιμούν να μαθαίνουν κάνοντας, το β ιβ λίο έχει γρ αφ τεί με τέτοιο τρόπ ο που να μ πορείτε να το διαβάζετε πλ ηκ τρολογώ ντας τα υτόχρονα προγράμματα-δείγματα και τρέχοντάς τα. Ό μ ω ς αυτή η μορφή πα ρουσ ίασ η ς δεν σ ας περ ιορ ίζει σε σ υγκεκρ ι μένες λίστες. Οι τεχνικές που σας δίνουμε εδώ είναι γενικ ή ς χ ρ ή σ η ς μια και μπορούν να χρ η σ ιμ οποιη θ ούν σε πολλές διαφ ορ ετικ ές προγραμ μ ατισ τικές καταστάσεις. Εγώ χρ η σ ιμ οποιώ αυτές τις ίδιες τεχ νι κές και σ τις δικές μου δρ α σ τηρ ιότητες σαν συμβούλου και όταν πρ ο γραμματίζω σε άλλες γλώ σ σ ες προγραμματισμού. Σ τις άλλες γλώ σσες, η όψη των προγραμμάτω ν είναι διαφ ορ ετικ ή γιατί διαφ έρουν οι εντο λές, αλλά η ίδια γενικ ή α ν τίληψ η, η ίδια λ ο γ ικ ή υπάρχει παντού. Για να μπορείτε να παρακολουθείτε τα προγράμματα του βιβλίου, ε τοιμάστε μια άγραφ η δισ κέτα χρ η σ ιμ οποιώ ντα ς τη ν εντολή DOS F O R M A T Β:. Ύ στερ α, θάλτε ένα αντίγρ αφ ο της B A S IC A .C O M σ την άγραφ η δισκέτα. Γ ια να το κάνετε αυτό, π λ η κ τρ ολογή σ τε τη ν εν τολή C O PY B A S IC A .C O M Β:. Ύ στερ α, περάστε σ τον οδηγό Β π λ η κτρολογώ ντας τη ν εντολή Β: και πατώ ντας R E T U R N . Για να καλέσετε τη B A SIC , π λ η κ τρ ολογή σ τε τη ν εντολή B A SIC A . Αυτό θα προκαλέσει την εμφάνιση του προτρεπτικού σ ήμ ατος B A SIC O k. Α ν θέλετε να εγκαταλείψ ετε τη B A SIC , χρ η σ ιμ ο π ο ιείσ τε την εντολή SYSTEM που θα ξαναεμφ ανίσει το προτρεπ τικό σήμα Β > . Μ ην βάλετε πρ οσ τα σία εγγρ α φ ή ς στη δισκέτα. Σ η μείω ση τη ς ε λ λ η ν ικ ή ς έκδ οση ς: Οι λίσ τες των προγραμμάτω ν πε
12
ριέχουν πολλά μηνύματα κτλ. τα οποία φ υσ ικά είνα ι γραμμένα στα α γ γλικά. Επειδή ορ ισ μένοι αναγνώ στες δεν καταλαβαίνουν απόλυτα τα μηνύματα, ενώ άλ λοι θέλουν να «ελληνοποιούν» τα προγράμματά τους, έχουμε μεταφ ράσει αυτές τις γραμμές. Για να μη διασ πάται όμως η ε νότη τα του προγράμματος και η πρ οσ οχή του αναγνώ στη, τις παραθέ τουμε σ το τέλος τη ς κάθε λ ίσ τα ς όλες μαζί.
13
Ό τ α ν γράφουμε προγράμματα σε BASIC, συνήθω ς αποθηκεύουμε π λ η ρ ο φ ο ρ ίες σε α ρ χεία δεδομένω ν.Η έννοια της λέξης «αρχείο δεδο μένων» σ ’ έναν υ πολογισ τή είναι ίδια μ’ αυτή της λέξη ς «αρχείο» στα .αγγλικά. Α ς δούμε την οργάνω ση ενός τύπου αρ χειοθή κη ς, ενός κου τιού γεμάτου με κάρτες ευρετηρίου, που φ αίνετα ι στο Σ χήμα 1.1 Το κουτί π ερ ιέχει κάρτες ευρετηρίου πάνω σ τις οποίες είναι γραμ μένες διευθύνσεις ανθρώπων, και σε κάθε κάρτα περιλαμβάνεται ονο ματεπώνυμο, διεύθυνση, πόλη, πολ ιτεία και τα χυδρομ ικός κώδικας. Στο μπρ οσ τινό μέρος του κουτιού βλέπουμε το όνομα του αρχείου αυ τού, Κ Α Τ Α Λ Ο Γ Ο Σ ΣΥ Ν Δ Ρ Ο Μ Η Τ Ω Ν .
Δόμηση ενός Αρχείου Δεδομένων Στη γλώ σσα των υπολογιστώ ν, το κουτί και τα περιεχόμενά του αν τιπροσω πεύουν ένα α ρ χείο δεδομένων. Κάθε κάρτα ευρετηρίου α ντι προσω πεύει μια εγ γρ α φ ή και κάθε πλ η ρ ο φ ο ρ ία τη ς κάρτας που από μόνη τη ς έχει νόημα, αντιπροσω πεύει ένα π λ η ρ οφ ορ ια κό πεδίο. Στον υ πολογισ τή, το α ρ χείο δεδομένω ν με τα ίδια περιεχόμενα θα είχε την ε ξή ς πάνω κάτω εικόνα: MAIL.DAT Joe Smith, 123 A St., San Diego, CA, 92122 Arlene Vega, 345 C St., Los Angeles, CA, 91234 Andy Jones, 333 Third Ave., New York, NY, 01234
Σχήμα 1.1:
Μια αρχειοθήκη σε κουτί
15
Το όνομα του α ρχείου δεδομένων είνα ι M A IL .D A T και κάτω από το όνομα είναι η βάση δεδομένων (data base). Στον IBM χρ η σ ιμ ο π ο ιο ύ ν ται ονόματα αρχείω ν με το πολύ ως 8 γράμματα, για τί αυτό είνα ι το μέ γισ το μήκος που επιτρέπει το λειτουρ γικό σ ύσ τημα δίσκου (D O S) του PC. ·Η προέκτασ η του ονόμ ατος (.D A T ) έχει το νόημα ότι πρόκειται για α ρ χείο δεδομένων. Το α ρ χείο περ ιέχει τρεις εγγρα φές (τα ονόματα και τις διευθύνσεις τριώ ν ατόμων). Η κάθε εγγρα φ ή , με τη σειρά της, περιέχει πέντε πεδία: Ο Ν Ο Μ Α . ΔΙΕ Υ Θ Υ Ν ΣΗ , Π Ο ΛΗ . Π Ο Λ ΙΤ Ε ΙΑ . Τ Α Χ Υ Δ Ρ Ο Μ ΙΚ Ο Σ Κ Ω Δ ΙΚ Α Σ
Η εγγρα φ ή έχει πέντε πεδία π λ η ρ οφ ορ ιώ ν για τί η πόλη, η πολιτεία και ο κώ δικας αποτελούν τρία ξεχω ριστά πεδία. Ό π ω ς θα προσέξατε, η δομή τη ς εγγρ α φ ή ς σ τον υπολογιστή δεν είναι απόλυτα σύμφω νη με τη δομή των πλ ηρ οφ ορ ιώ ν σ τη ν κάρτα του Σχ. 1.1. Η κάρτα έχει τρεις γραμμές πληροφ οριώ ν: 1) όνομα, 2) διεύθυνση και 3) πόλη, πολιτεία, ταχ. κώδικα. Έ να απ’ τα πιο σ υνηθισ μένα λάθη που κάνουν οι χρ ή σ τες όταν δομούν αρ χεία δεδομένω ν είναι ότι προσπαθούν να οργανώ σουν τα πεδία σ τη ν εγγρα φ ή έτσ ι όπω ς τα βλέπουν γενικά τυπωμένα στα β ι βλία. Αν επρόκειτο να δομήσουμε τα πεδία τη ς κάθε εγγρ α φ ή ς στο αρ χείο δεδομένων μας έτσ ι όπω ς είνα ι οι πλ η ρ ο φ ο ρ ίες σ τη ν κάρτα, δηλ α δή: Ο Ν Ο Μ Α , ΔΙΕ Υ Θ Υ Ν ΣΗ , Π Π Τ
(όπου Π Π Τ είναι ένα πεδίο που περ ιέχει πόλη, πολ ιτεία και ταχ. κώ δι κα), θα είχα με προβλήματα. Για παράδειγμα, αν θέλαμε να τα ξινομ ή σουμε τη λίσ τα των συνδρομητώ ν μας κατά σ ειρά ταχυδρομικού κώ δι κα, θα ήταν αδύνατο να το κάνουμε. Γιατί; Δ ιότι μ’ αυτή τη δομή ο υπο λο γ ισ τή ς δεν μπορεί ν ’ αναγνω ρίσ ει τον ταχυδρομ ικό κώδικα. Εγώ κι εσ είς μπορούμε να ξεχω ρίσουμ ε από ολόκ λη ρ η τη γραμμή π οιός είνα ι ο τα χυδρομ ικός κώ δικας, αλλά ο υ π ολογισ τή ς δεν μ πορεί να κάνει τέ τοιες διερευνήσεις. Μ ια και για πόλη, πολ ιτεία και τα χυδρομ ικό κώ δι κα υπάρχει ένα μόνο πεδίο, ο υ πολογισ τή ς το μεταχειρίζεται σ αν μια και μόνη πλ η ρ οφ ορ ια κή μονάδα. Έ τ σ ι, μπορεί να τα ξινομ ήσ ει ανάλο γα με την πόλη, ό χι όμως ανάλογα με τη ν πολ ιτεία ή τον ταχυδρ. κώ δι κα. Έ τ σ ι, έχει μεγάλη σ ημ ασ ία σ ’ ένα α ρ χείο δεδομένων τις π λ η ρ ο φ ο ρίες κάθε εγγρ α φ ή ς να τις αναλύουμε σε μικρότερες μονάδες. Η δομή: Ο Ν Ο Μ Α , ΔΙΕ Υ Θ Υ Ν ΣΗ . Π Ο ΛΗ , Π Ο Λ ΙΤ Ε ΙΑ . Τ ΑΧ ΥΔΡ . Κ Ω Δ ΙΚ Α Σ
16
είναι προτιμ ότερη, γιατί το κάθε πλ ηρ οφ ορ ικό σ το ιχείο έχει το δικό του πεδίο. Επομένως, έτσι μπορούμε να αποκτήσουμε άμεση πρ όσ β α ση σε κάθε πεδίο. Έ χ ει επ ίσ η ς σ ημ ασ ία η κάθε εγγρα φ ή ενός αρχείου δεδομένων στον υ πολογιστή να περιλαμβάνει ακριβώ ς τον ίδιο αριθμό πεδίων. Για πα ράδειγμα, αν θέλουμε να αποθηκεύσουμε και τους αριθμούς τηλεφώ νου για μερικούς μόνο α π’ τους συνδρομητές του αρχείου δεδομένων, θα πρέπει ό λες οι εγγρα φ ές του αρχείου να έχουν ένα πεδίο διαθέσιμο για την αποθήκευση των τηλεφώνω ν. Δ ηλαδή, η κάθε εγγρα φ ή θα πρέπει να έχει αυτή τη δομή: Ο Ν Ο Μ Α . ΔΙΕ Υ Θ Υ Ν ΣΗ . Π Ο ΛΗ . Π Ο Λ ΙΤ Ε ΙΑ . ΤΑΧ ΥΔΡ . Κ Ω Δ ΙΚ Α Σ . Τ Η ΛΕΦ Ω Ν Ο
Αυτό γίνεται γιατί ο υ πολογισ τή ς δουλεύει με πεδία και εγγρα φές και προϋποθέτει ότι αφού μια εγγρ α φ ή έχει έξι πεδία, τότε όλες έχουν έξι πεδία. Η B A SIC μας επιτρέπει να εργαστούμε με δυο τύπους α ρχείω ν δεδο μένων: σ ειρια κά αρ χεία και αρ χεία τυχαίας πρ ο σ π έλα σ η ς. Π α ρ' όλο που και οι δύο τύποι έχουν την ίδια δομή, δηλ. το κάθε α ρ χείο αποτελείται από εγγρα φές και η κάθε εγγρα φ ή από πεδία, υπάρχουν μεταξύ τους αρκετές διαφ ορές.
Σειριακά Αρχεία Δεδομένων Τα σ ειριακά αρ χεία δεδομένων παίρνουν το όνομά τους α π ’ το γεγο νός ότι η προσ πέλα σ η σ τις εγγρα φές γίνετα ι πάντοτε κατά σειρά, α π ’ την πρώ τη εγγρ α φ ή σ τη ν τελευταία. Για να διαβάσουμε ένα μεμονω μένο σ το ιχείο ενός σ ειριακού αρχείου, πρέπει πρώτα να περάσουμε απ' όλα τα προηγούμενα. Τα σ ειριακά αρχεία αποθηκεύουν τις εγγρα φές τους χω ρ ίς πολλή απόσ τασ η ανάμεσά τους, γ ι ’ αυτό και λέμε ότι είναι ο ικονομικά από την άποψη του χώ ρου. Για παράδειγμα, αν μπορούσα με να δούμε τρία ονόματα και διευθύνσεις αποθηκευμένα σ ’ ένα σ ειρ ια κό α ρ χείο δεδομένων, θα έδιναν την εξής εικόνα: Joe Smith, 123 A St., San Diego, CA, 92122 Arlene Vega, 345 C St., Los Angeles, CA, 91234 Andy Jones, 333 Third Ave., New York, NY, 01234
Λ άβετε υπ’ όψ η σας ότι ανάμεσα στα πεδία δεν υπάρχει κενός χώ ρος. Αυτό είναι καλό από τη ν άποψη τη ς οικονομίας, αλλά σ τον προ17
γραμματισμό δεν είνα ι πλεονέκτημα. Ας υποθέσουμε, για παράδειγμα ότι η δεύτερη σ υνδρομή τρια μετακομίζει και η καινούρια της διεύθυν σ η είναι 12345 H oneycutt Blvd. A p t 4Α . Αν θέλαμε να ενημερώ σουμε το α ρ χείο μας περιλαμ βάνοντας τη νέα της διεύθυνση, δεν θα μπορού σαμε. Η νέα διεύθυνση δεν χω ρά ει σ τη ν εγγρ α φ ή , όπως βλέπετε: 12345 Honeycutt Blvd. Apt.4A 92122 Arlene Vega, 345 C St., Los Angeles, CA, 92122 Andy Jones
Ό π ω ς θα δούμε, υπάρχουν κά ποιες τεχνικές προγραμματισμού που ασ χολού νται μ’ αυτό το πρόβλημα. Α λλά γενικά αν ένα αρ χείο χρ ειά ζεται σ υχνά αρκετές τρ ο π ο π ο ιή σ εις ή ενημέρω ση, χρ η σιμ οποιού μ ε αρ χείο τυχαία ς προσ πέλα σ ης.
Αρχεία Δεδομένων Τυχαίας Προσπέλασης Τα α ρ χεία τυχαία ς πρ οσ π έλα σ ης παίρνουν τ ’ όνομά τους α π ’ το γε γονός ότι το πρόγραμμα μπορεί να βρει μια εγγρα φ ή σ το α ρ χείο κατά οποια δήποτε σειρά. Μ ια και η κάθε εγγρα φ ή είνα ι προσ πελά σ ιμ η σαν ανεξάρτητη μονάδα, το πρόγραμμα δεν χρειά ζετα ι να διατρέξει σ τη ν α νάγνω σή του άλλες πλη ρ ο φ ο ρ ίες για να βρει μια συγκεκριμένη εγγρ α φή. Τα α ρ χεία τυχαία ς πρ οσ π έλα σ ης, όμως, έχουν ένα μειονέκτημα: δεν κάνουν ο ικονομία χώρου. Π ρέπει να υπολογίσουμ ε από τα πριν το α κριβές μ ήκος κάθε πεδίου και κάθε εγγρ α φ ή ς του α ρχείου και να αφ ήσουμε περιθώ ριο για τη ν μεγαλύτερη περίπτω ση. Ο ι τρ εις εγγρα φ ές του σ ειριακού αρχείου που είδαμε παραπάνω σ ’ ένα α ρ χείο τυχαίας πρ οσ π έλα σ ης θα έδιναν την εξής εικόνα: Joe Smith Arlene Vega Andy Jones
123 A St. 345 C St. 333 Third Ave.
San Diego CA 92122 Los Angeles CA 91234 New York NY 01234
Ό π ω ς βλέπετε, υπάρχει αρκετός ελεύθερος χώ ρος εδώ, πράγμα που β έβαια καταλαμβάνει και χώ ρο σ το δίσκο. Ό μ ω ς, αν η δεύτερη συνδ ρομ ήτρια μετακομίσει στη διεύθυνση 12345 H oneycutt Blvd. A pt. 4Α δεν θα υπάρχει πρόβλημ α σ τη ν ενημέρω ση του αρχείου με τη νέα της διεύθυνση. Ν α γιατί: 12345 Honeycutt Blvd Apt.A Arlene Vega
18
12345 Honeycutt Blvd Apt.A
Los Angeles CA 91234
Στα σ ειρ ιακά α ρ χεία ο υ πολογισ τή ς δεν έχει τρόπ ο να γνω ρίζει πού τελειώ νει μια εγγρα φ ή και πού α ρ χ ίζει η επόμενη. Στα α ρ χεία τυχαίας πρ οσ π έλα σ ης, όμως, ο υ πολογισ τή ς μ πορεί να βρει τη ν αρ χή μιας εγ γρ α φ ή ς για τί το μήκος τη ς καθεμιάς είνα ι προκαθορισμένο. Γ ια πα ρά δειγμα, αν κάθε εγγρ α φ ή του αρχείου τυχαία ς πρ οσ π έλα σ ης έχει μή κος 100 bytes τότε η ένατη εγγρ α φ ή του αρ χείου β ρίσ κετα ι 900 bytes μακριά α π ’ τη ν πρώ τη εγγραφή. Το αν θα πρέπει σε μια συγκεκριμένη εφ αρμ ογή να χρ η σ ιμ ο π ο ιη θ εί σ ειριακό αρ χείο ή αρ χείο τυχαία ς πρ οσ π έλα σ ης είνα ι ένα θέμα που θα το συζητάμε κατά περίπτω σ η σ ’ ο λόκ λη ρ ο το βιβ λίο. Στο Κ εφ άλ αιο 2 θα προχω ρή σ ουμ ε σ τη ν εξέταση τω ν σ ειριακώ ν αρχείω ν.
19
Για να καταλάβετε με ποιό τρόπο δουλεύει η B A SIC με τα α ρ χεία δε δομένων, είναι σ ημ αντικό να κα τανοήσ ετε ορισ μένα θέματα σ χετικ ά με τη μ ν ή μ η τυ χα ία ς π ρ ο σ π έλ α σ η ς (τη R A M ) και τους δείκτες. Λ οι πόν, η μνήμη R A M είναι η β ασ ική μνήμη του υ πολογισ τή , το μέρος του υ πολογισ τή όπου γίνετα ι όλη η επεξεργασία. Η R A M είναι περ ιο ρισμένου μεγέθους, ανάμεσα στα 64Κ και τα 128Κ. Τ ο Κ σ ημ αίνει Ki lobyte ή, σε απλούσ τερη ορολογία , χιλ ιά δες γράμματα. Δ ηλαδή, ένας υ π ολογισ τή ς των 64Κ μπορεί να κρα τήσ ει ανά πάσα σ τιγμ ή 64000 αλ φ αβ ητικ ούς χα ρ α κτή ρ ες σ τη ν κύρια μνήμη του, τη R A M . Μ ην σας κάνει τόσ η εντύπω ση αυτός ο αριθμός. Για παράδειγμα μια δακτυλο γραφ ημ ένη σ ελίδα (με απλό διάσ τημα) έχει περίπου 3200 γράμματα (δηλαδή 3.2Κ bytes), άρα ένας υ πολογισ τή ς των 64Κ μπορεί να «χωρέσει» το ισοδύναμο 17 ως 20 σ ελίδω ν κειμένου. Μ ια και αυτό σαφώ ς δεν επαρκεί για τις περ ισ σ ότερ ες εφ αρμογές, ο υ π ολογισ τή ς απ οθη κεύει επιπ λέον πλ η ρ ο φ ο ρ ίες σε δίσκους, οι ο ποίοι μπορούν να κρ α τή σουν από 90Κ ω ς... εκατομμύρια bytes πλ ηροφ οριώ ν. Το να μάθετε να χειρ ίζεσ τε αρ χεία δεδομένων απαιτεί σε μεγάλο βαθμό να μ πορείτε να φ αντασ τείτε τι συμβαίνει σ τη R A M κάθε σ τιγμ ή καθώς τρ έχει το πρόγραμμα. Αυτό χρ ειά ζετα ι κά ποια εξάσ κη ση , γιατί δεν μπορούμε να δούμε τη R A M . Α λλά μπορούμε να εξακριβώ σουμε τι υπάρχει κάθε σ τιγμ ή στη R A M με τη βοήθεια κάποιω ν εντολώ ν της B A SIC . Α ς συζητήσ ουμ ε τις διάφ ορες εντολές που χρ η σιμ οποιού μ ε όταν δουλεύουμε στη B A SIC με σ ειρ ιακά α ρ χεία δεδομένων.
Δημιουργία ενός Σειριακού Αρχείου Δεδομένων Ό τ α ν πρω τοανοίγουμε τον υ πολογιστή και φορτώ νουμε τη B A SIC , εμ φανίζεται σ τη ν οθόνη το προτρεπ τικό σήμα B A SIC O k. Αυτό σ η μαίνει ότι ο υ π ολογισ τή ς είνα ι έτοιμ ος να δεχτεί εντολές τη ς BA SIC . Σ ’ αυτό το σ ημ είο μπορούμε να φανταστούμε τη σ χέσ η ανάμεσα στη μνήμη R A M και σ το δίσ κο αποθήκευσ ης έτσ ι όπως φ αίνετα ι στο Σ χήμα 2.1.Η εντολή O P E N λέει στη B A SIC να συνδέσει τη R A M μ’ ένα αρ χ είο δεδομένω ν αποθηκευμένο σ το δίσ κο. Ό τα ν χρ η σ ιμ οποιού μ ε την O P E N πρέπει να πούμε σ τον υ πολογισ τή το όνομα του α ρχείου του δί σκου με το ο ποίο θα γίνει σύνδεση και να πρ οσ διορίσ ουμε ποιό κανάλι θα χρ η σ ιμ οποιή σ ουμ ε για τη σύνδεση. Επιπλέον, όταν δουλεύουμε με σ ειρ ιακά αρ χεία πρέπει να πρ οσ διορίσ ουμε αν οι πλη ρ ο φ ο ρ ίες θα έρ χοντα ι στη R A M από το αρ χείο του δίσ κου ή αν θα πη γαίνουν από τη R A M προς το αρ χείο του δίσκου. Ας δούμε το αποτέλεσμα της παρα κάτω εντολής:
21
OPEN "O'*,#1 "NAMES.DAT"
(Σ ημείω ση: Σε όλο το β ιβ λίο, το σύμβολο «------1 θα α ν τισ το ιχεί με το βέλος τη ς επα ναφ οράς (return) του π λ η κ τρ ολόγιου του IB M PC). .Η εντολή αυτή λέει στη B A SIC να ανοίξει ένα α ρ χείο δεδομένω ν για έξοδο (δηλαδή από τη R A M προς το δίσκο), μέσω του κα ν α λιο ύ # 1 , προς ένα αρ χείο του δίσ κου που ονομάζεται N A M E S .D A T . Στο σ χή μ α 2.2 φ αίνετα ι πα ρασ τα τικά η σ χέσ η ανάμεσα σ ε R A M και δίσκο, σ ’ αυτή τη φ άση. Π α ρατηρή στε ότι έχουμε εγκ ατα στήσ ει μια σύνδεση ή κανάλι από τη R A M σε ένα α ρ χ είο δεδομένω ν με το όνομα N A M E S .D A T . Στο κα νά λι έχει δοθεί ένας αριθμός, # 1. Η διεύθυνση του βέλους είνα ι από τη R A M στο δίσκο. Π α ρ ατηρ ή στε επ ίσ η ς ότι υπάρχει ένας δείκτης (> ) που υποδεικνύει τη ν πρώ τη διαθέσιμη γραμμή κάτω από το όνομα α ρ χείου N A M E S .D A T . Τ ο αποτέλεσμ α της διαταγής O P E N , π ρ οη γου μένως, ήταν να κα θορίσ ει αυτή τη σ χέσ η ανάμεσα στη R A M και το αρ χείο δεδομένων N A M E S .D A T .
Εγγραφή στο Σειριακό Αρχείο Η εντολή W R IT E # χρ η σ ιμ ο π ο ιείτα ι με τα σ ειρ ιακά α ρ χεία για να παίρνει μια ομάδα δεδομένω ν από τη R A M και να τη γρ άφ ει σ το αρ χείο του δίσκου σ αν εγγρα φ ή . Ας δούμε τι κάνει η εντολή W R IT E # . Ό τα ν δώσουμε τη ν παρακάτω διαταγή: WRITE #1, "Alan", "123 A St", "SD", "C A " «------- 1
τα πεδία (που χω ρ ίζονται με κόμματα το ένα από το άλλο), γρ άφ ονται σε μια εγγρα φ ή που υποδηλώ νεται από το δείκτη και ύστερα ο δείκτης μετακινείται σ τη ν επόμενη γραμμή. Έ τ σ ι, η R A M και το α ρ χείο δεδο μένων έχουν τα περιεχόμενα που εικονίζοντα ι σ το Σχ. 2.3.
22
Μ νήμη R A M
Σχήμα 2.1:
Δ ίσ κος Α ποθήκευσ ης
Η σχέση ανάμεσα στη R A M και το δίσκο πριν ανοίξουμε αρχείο δεδομένων
23
γραφή σ ' αυτό Είπαμε σ τον υπολογιστή να γράψ ει με τη W R IT E μέσω του κανα λιού # 1 (του καναλιού που συνδέεται με το α ρ χείο N A M E S .D A T ) αυ τά τα 4 πεδία πληροφοριώ ν:- A lan, 123 A S t., SD , και C A . Η εντολή W R IT E μ ετακίνησ ε αυτόματα τον δείκτη στη θέση τη ς επόμενης εγ γρ αφ ής. Α ν δώσουμε τώρα τη διαταγή: WRITE # 1 , "Bob", "234 Β St", "LA", "C A "
4--------1
τα πεδία αυτά γίνοντα ι η δεύτερή μας εγγρα φ ή . Κ αι πά λι ο δείκτης κα τεβαίνει αυτόματα σ την επόμενη θέση, όπω ς δείχνει και το Σχ. 2.4.
Κ λείσιμο του Σειριακού Αρχείου Α ν δώσουμε τη διαταγή: CLOSE 1 4------- 1
η σύνδεση ανάμεσα στη R A M και το α ρ χείο δεδομένων μέσω του κα ναλιού 1 τερματίζεται. Τα δεδομένα τώ ρα είναι αποθηκευμένα κατά α σφ αλή τρόπο σ το α ρ χείο δεδομένων N A M E S .D A T για μ ελλοντική χρ ή σ η . Τώρα, η R A M και ο δίσ κος έχουν τα περ ιεχόμενα που βλέπετε στο Σ χήμα 2.5.
24
Τώ ρα που κλείσαμε το αρ χείο, σύνδεση δεν υπάρχει. Θα πρέπει πά ν τα να κλείνετε το α ρ χείο όταν τελειώ νετε τη δουλειά σ ας για τί ανάμε σ α σ τη R A M και το δίσ κο υπάρχει μια προσ ω ρινή μνήμη αποθήκευ σης. Η εντολή C L O S E εξ ασ φ αλίζει ότι όσα δεδομένα είνα ι «στο δρ ό μο» από τη R A M προς τον δίσ κο θα σταλούν σ το α ρ χείο του δίσκου. Α ν ξεχάσ ετε να κλείσ ετε ένα α ρ χείο δεδομένω ν και βγείτε από τη B A SIC , ίσω ς χά σ ετε δεδομένα.
Προσπέλαση στα σειριακά δεδομένα Ας δούμε τώ ρα ορισ μένες εντολές με τις οποίες αποκτάμε πρ οσ π έλα σ η στα σ ειρ ιακά αρχεία. Ό τ α ν ανοίγουμε ένα σ ειρ ιακό α ρ χείο για ε ί σ οδο (δηλ. για να διαβάσουμε δεδομένα α π ’ το αρ χείο σ τη R A M ) χ ρ η σιμοποιούμε “ I” . Ό π ω ς και με την έξοδο, πρέπει να προσ διορίσ ουμε αριθμό καναλιού και όνομα αρχείου. Η παρακάτω διαταγή ανοίγει για είσοδο (ανάγνω ση) το α ρ χείο που μ όλις δημιουργήσαμε: OPEN
"NAMES.DAT"
Αυτό σ ημ αίνει «Σύνδεσε τη R A M , μέσω του καναλιού # 1 με το αρ χ είο του δίσκου που ονομάζεται N A M E S .D A T και κάνε τη ροή των πλ ηρ οφ ορ ιώ ν να π η γαίνει από το δίσ κο σ την (I) R A M ». Η διαταγή αυ τή τοποθετεί επίσ η ς τον δείκτη σ τη ν πρώ τη εγγρα φή . Η σ χέσ η ανάμε25
RAM
Δ ίσ κος Α ποθήκευσ ης
Σχήμα 2.5: R A M και δίσκος ύστερα από το κλείσιμο του N A M E S.D A T σα στη R A M και το α ρ χ είο δεδομένων είνα ι τώρα έτσ ι όπω ς παρου σιάζεται σ το Σ χήμα 2.6. Κ αι πά λι συνδέσαμε τη R A M και το αρ χείο N A M E S .D A T μέσω του καναλιού # Ι,α λλά αυτή τη φ ορά το βέλος πη γα ίνει από το δίσ κο στη R A M . Ο δείκτης είνα ι σ αν πρώ τη εγγρα φή .
Σειριακή Ανάγνωση Εγγραφών Η εντολή IN P U T # χρ η σ ιμ ο π ο ιείτα ι για τη ν προσ π έλα σ η σ τις εγ γραφ ές ενός σ ειριακού αρχείου. Κ άνει αρκετά πράγματα. Π ρώ τον, πα ίρνει όσα πεδία τη ς πρ οσ διορ ίζονται. Δεύτερον, τοποθετεί τα πεδία αυτά στη R A M και τρ ίτον μετακινεί το δείκτη σ τη ν επόμενη εγγραφή. Ά ρ α , αν δώσουμε στη B A SIC τη ν παρακάτω διαταγή: INPUT. #1. ΝΜ$. AD$, CY$, ST$
4 ------- 1
θα έχουμε ανάμεσα στη R A M και το α ρ χείο N A M E S .D A T τη σ χέσ η που εικονίζεται σ το Σ χήμα 2.7. Π ροσ έξτε ότι οι μ εταβλητές ΝΜ $, A D $, CY$ και ST$ β ρ ίσ κοντα ι τώρα στη R A M και έχουν αποθηκευμένα τα περιεχόμενα της πρώ της εγγρα φή ς. Η πρώ τη εγγρ α φ ή εξακολουθεί να βρίσ κετα ι σ το αρ χείο N A M E S .D A T διότι η εντολή IN P U T # απλώ ς διαβάζει αντίγραφ α των δεδομένων, δεν τα απομακρύνει απ’ το δίσ κο. Μ πορούμε ε πίσ η ς να
26
Σχήμα 2.6:
Η R A M και ο δίσκος μετά από το άνοιγμα του N A M E S.D A T για ανάγνωση (Input) δούμε ότι ο δείκτης τώ ρα δείχνει στη δεύτερη εγγρ α φ ή τη ς βάσ ης δε δομένων, για τί τον μετακίνησ ε αυτόματα η εντολή IN P U T # . Σ τη ν οθόνη του υπολογιστή δεν βλέπουμε να συμβαίνει τίπ οτα προς το παρόν, για τί απλώ ς διαβάζουμε τα δεδομένα στη R A M . Αν όμως ζη τήσουμε α π ’ τον υ πολογιστή να μας δείξει τα περιεχόμενα των μετα β λητώ ν Ν Μ $, A D $, CY$ και ST$ με τη διαταγή: PRINT ΝΜ$. AD$, CY$. ST$
4------- 1
θα βλέπαμε ότι η R A M όντω ς περ ιέχει τα περιεχόμενα της πρώ της εγ γ ρ α φ ή ς του αρχείου δεδομένων: Alan 123 A St SD CA
Αν τώρα πληκτρολογή σ ουμ ε: INPUT #1, ΝΜ$. AD$, CY$, ST$
4 --------1
η εντολή IN P U T # θα διαβάσ ει τα πεδία τη ς δεύτερης εγγρ α φ ή ς, γιατί ο δείκτης τώρα δείχνει εκεί. Η σ χέσ η εικονίζεται στο Σ χήμα 2.8. Ο ι μεταβλητές σ τη R A M περ ιέχουν τώρα τα περιεχόμενα τη ς δεύτε ρης εγγρ α φ ή ς και ο δείκτης έχει κατέβει στο τέλος του αρχείου. Μ πο ρούμε ν ’ αποδείξουμε ότι τώρα σ τις μ εταβλητές της R A M βρίσ κοντα ι τα δεδομένα τη ς δεύτερης εγγρ α φ ή ς πληκτρολογώ ντας:
27
εγγραφής από το αρχείο N A M E S.D A T PRINT ΝΜ$. AD$. CY$, ST$
4--------1
που θα εμ φ α νίσ ει σ τη ν οθόνη: Bob 234 Β St LA CA
Ί σ ω ς να σ κέφ τεσ τε τώρα: «Εντάξει, αλλά τι θα γίνει αν εγώ θελήσω να βρεθούν σ τη R A M ό λα τα ονόματα και οι διευθύνσεις;». Δεν είναι όμως πάντοτε αναγκαίο να διαβαστούν όλα τα ονόματα στη R A M για να δουλέψετε μ’ αυτά. Γ ια παράδειγμα, ας πούμε ότι θέλετε να τυπώ σε τε τα χυδρομ ικές ετικέτες από το αρ χείο σας. Μ πορείτε να γράψ ετε ένα πρόγραμμα που να α νοίγει το N A M E S .D A T , να διαβάζει μια εγγρα φή , να τυπώ νει τη ν ετικέτα τη ς μιας αυτής εγγρ α φ ή ς, ύστερα να διαβάζει την επόμενη εγγρ α φ ή , να τυπώ νει μια ετικέτα γ ι ’ αυτή, και ούτω καθ’ ε ξ ή ς μέχρι που ο κάθε σ υνδρομη τής να έχει τη δίκιά του ετικέτα. Αυτό μπορεί να γίνει για οποιονδήπ οτε αριθμό ονομάτω ν, είτε δέκα είτε δέ κα εκατομμύρια, για τί η R A M κάθε φ ορά θα περ ιέχει μια μόνο εγγρα φή. Μ ε τον τρόπο αυτό ποτέ δεν θα ξεπεράσετε την ικα νότητα αποθή κευσης τη ς R A M σας. Π ροσ έξτε στο Σ χήμα 2.8 ότι ο δείκτης δείχνει μιαν ανύπαρκτη εγ γραφ ή. Α ν προσπαθούσαμε να διαβάσουμε (με IN PU T ) ακόμα μια εγ γραφ ή, θα παίρναμε σ τη ν οθόνη μήνυμα λάθους που θα δήλω νε ότι προσπαθήσαμε να διαβάσουμε πέρα α π ’ το τέλος του αρχείου δεδομέ νων. Π ρος το παρόν, μια σ οφ ή ενέργεια θα είναι να κλείσουμε το α ρ χείο, ως εξής:
28
γραφής από το αρχείο N A M E S.D A T CLOSE 1
4------- 1
Τώ ρα προκύπτει η σ χέσ η που φ αίνετα ι σ το Σ χήμα 2.9. Η R A M και το αρ χείο N A M E S .D A T δεν είναι πια συνδεδεμένα, και το N A M E S .D A T εξακολουθεί να κρατάει με ασ φ άλεια τα δεδομένα. Η R A M εξακολουθεί να έχει τις μ εταβλητές ΝΜ $, A D $, CY$ και STS με τιμή ίση με τα περιεχόμενα τη ς τελευταίας εγγρ α φ ή ς που διαβάστηκε. Αυτό ισ χύ ει επειδή π α ρ ’ όλο που η εντολή C L O S E τερματίζει τη σύν δεση με το α ρ χείο δεδομένων, δεν επη ρεάζει άμεσα τα τρ έχοντα περ ιε χόμ ενα τη ς R A M . Α ς μεταφέρουμε τώ ρα τη διαδ ικ ασ ία που εξετάσαμε σ τη ν παλιά, κα λή αρ χειοθή κη του κουτιού. Η εντολή O P E N “Ο ” είναι σ αν να αφαιρούμε το καπάκι του κουτιού με σ κοπ ό να προσθέσουμε μερικές κάρ τες. Η εντολή W R IT E # είνα ι ανάλογη με το να συμπληρώ σουμε μια κάρτα και να τη βάλουμε πίσ ω α π ’ τις ήδη υπάρχουσες κάρτες σ το κου τί. Η εντολή C L O S E είνα ι ισοδύναμη με το να ξαναβάλουμε το σ κέπα σμα σ το κουτί και να βάλουμε το κουτί στη θέση που το φυλάμε. Η εν τολή O P E N “I” είνα ι σαν να βγάζουμε το καπάκι του κουτιού με σ κο πό να διαβάσουμε τις κάρτες. Η εντολή IN PU T # είναι ισοδύναμη με το να κοιτάξουμε μια κάρτα του κουτιού. Μ ε κάθε κα ινούργιο IN PU T # είναι σαν να προχω ράμε κατά μια κάρτα σ το κουτί.
29
RAM NM$ - "Bob" AD$ » "123 A St." C Y$-"SD " ST$ - "CA"
Σχήμα 2.9: ‘ R A M και δίσκος ύστερα από το κλείσιμο του αρχείου N A M E S.D A T
Προγραμματισμός με Σειριακά Αρχεία Α ς δοκιμάσουμε τώρα ένα πρόγραμμα που χ ρ η σ ιμ ο π ο ιεί σ ειριακά α ρ χεία δεδομένων και έναν πίνα κα (array) δεδομένων. Τα σ ειρ ιακά αρ χεία χρ η σ ιμ οποιού ντα ι με τον καλύτερο τρόπο όταν όλα τα δεδομένα του αρχείου μπορούν να αποθηκευτούν σε πίνακες σ τη R A M . Ο πίνα κας είναι απλά ένας κα τάλογος (σε μια ή δυο διασ τάσ εις) με συναφή δεδομένα. Ο τηλεφ ω νικός κα τάλογος αποτελεί έναν τερ άσ τιο πίνακα με τα ονόματα, τις διευθύνσεις και τους αριθμούς τηλεφ ώ νου των κα τοίκω ν μιας περ ιοχή ς. Ό τα ν θέλουμε να δημ ιουργήσ ουμ ε στη B A SIC έναν πίνακα δεδομένω ν πρέπει να πούμε στον υ πολογισ τή να δώσει δ ια σ τά σ εις σ τον πίνακα. Αυτό γίνετα ι χρ η σ ιμ οποιώ ντας την εντολή DIM (α π’ το D IM E N SIO N = διάσ τασ η). Η εντολή αυτή λέει σ τον υ πολ ογισ τή το όνομα τη ς μ εταβλητής που αν τισ το ιχεί σ τον πίνακα και πόσα σ το ιχεία θέλουμε να περιλαμβάνει ο πίνακας. Γ ια παράδειγμα, ας υποθέσουμε ότι πρόκ ειται να βάλουμε σ τον πίνακα δέκα ονόματα. Η διαταγή για τις διασ τάσ εις είναι: DIM ΝΜ$(10)
30
Αυτό σ ημ αίνει «δώσε σ τον πίνακα Ν Μ $ διάσ τασ η 10 στοιχείω ν». Το Ν Μ $ είνα ι ένα όνομα μεταβ λητής που το διάλεξα αυθαίρετα επειδή μου θυμίζει τη λέξη «nam e» - όνομα. Ας δούμε ένα παράδειγμα πιο ο λοκληρω μένο. Μ ε το προτρεπ τικό σ ήμ α B A SIC O k σ τη ν οθόνη, π λ η κτρολογήστε: new
« --------1
το ο ποίο θα καθαρίσ ει τελείω ς τη R A M για να δουλέψουμε σε ελεύθε ρο πεδίο. Ύ σ τερ α π λ η κ τρ ο λο γή σ τε το εξή ς πρόγραμμα: 10 20 30 40 50 60 70
REM * * * * * * * * * * * * * * * * * * * * * * * * * * An array of 10 names. DIM NM$(10) REM * * * * * * * * * * * * * * * * * * * * * Accept 10 names from the user. FOR X % «1 TO 10 PRINT X%; INPUT “ Enter a name ";NM$ . Α ς δούμε αν δούλε ψε η ρουτίνα μας. Π λ η κτρολ ογή σ τε τη διαταγή: ΤΥΡΕ GRADES.DAT « ------- 1
Και να που επιτέλους περνούν σ αν ασ τραπή μπροστά μας πενήντα σειρές: "",0,0,ο , ο.ο '"'.0,ο,ο.ο,ο "",0,0,0,ο ,ο "",0,0,ο ,ο .ο "",0,0,ο ,ο ,ο "".0,ο ,ο ,ο ,ο
"",0,0,0,0.0 "".0,0.0,0.0 "",0,0.0,0.0 "",0,0,0.0,ο "",0.0,0,0,0 "",0,0,0.0,ο "",0,0,ο,ο ,ο "".0,0,0,0,ο "".0,0.0,ο,ο
(κτλ...) Για τον υ πολογιστή, τα παραπάνω είναι μια λευκή σ ελίδα του θαθμ ολόγιου που περιμένει να τη γεμίσουμε. Σ τη ν αρ ισ τερ ή πλευρά υπάρ-
42
χει μια σ τήλ η για τα ονόματα, αλλά μια και δεν υπάρχουν ακόμα περα σμένα ονόματα, οι θέσ εις τους είναι άδειες (“ ”). Υ πάρχουν επίσ η ς και πέντε θέσ εις για τους βαθμούς δίπλα σε κάθε όνομα, αλλά μια και κανείς ακόμα δεν έχει β αθμολογηθεί, είναι όλα μηδέν. Π αρεπιπτόντω ς, αν τώρα π λ η κ τρ ολογή σ ετε τη διαταγή: TYPE WRITEGB.BAS
4------- 1
θα δείτε την υπορουτίνα που μ όλις γράψαμε. Α ς επιστρέψ ουμε τώ ρα σ τη B A SIC και ας γράψ ουμε μια ρουτίνα που θα διαβάζει το βαθμ ολόγιο από το δίσ κο στη R A M . Φ ορτώ στε τη B A S IC έτσ ι που να εμ φ α νισ τεί το πρ οτρεπ τικό σήμα O k και πλ η κ τρ ο λο γήσ τε τη ρουτίνα: 2000 REM * * * * * * * * * * * * * * * * * Read grade book data from disk file. 2010 OPEN "l",#1,"GRADES.DAT" 2020 FOR R % - 1 TO 50 2030 INPUT #1,NM$(R%)1SC%(R%,1).SC%(R%,2),SC% (R%,3),SC%(R%14),SC%(R%15) 2040 NEXT R% 2050 CLOSE 1 2060 RETURN 2000 R EM
· *
Ανάγνωση των δεδομένων του βαθμολογίου από το αρχείο του δίσκου
Μ οιάζει αρκετά με τη ν προηγούμενη ρουτίνα που γράψαμε, οι αρ ιθ μοί τω ν γραμμώ ν όμως α ρ χίζου ν από 2000. Ε π ίσ η ς, ανοίγει για είσοδο (“ I” ) το G R A D E S .D A T και χρ η σ ιμ ο π ο ιεί τη ν εντολή IN P U T # 1 και ό χι τη W R IT E # 1 μια και διαβάζει, δεν γράφ ει, δεδομένα. Μ πορούμε να δούμε κι αυτή τη ρουτίνα σ τη ν πράξη. Α ρχίζοντα ς, πρέπει να π λ η κ τρολογήσ ουμε τη διαταγή: DIM NM$(50).SC%(50,5)
4 ------- 1
που θα δημ ιουργήσ ει τους πίνακες. Μ ετά, αν πληκτρολογή σ ουμ ε: GOSUB 2000
4------- 1
θα δούμε το φ ω τάκι του οδηγού του δίσ κου να δουλεύει, καθώς η ρου τίνα διαβάζει τα δεδομένα από το G R A D E S .D A T . Φ υσικά, και πάλι έχουμε κενά και μ ηδενικά. Α ν πλ ηκ τρ ολογή σ ουμ ε τη διαταγή: PRINT SC%(5,2)
« ν“ επιστρ έφ ετε στο κύριο μενού":ΖΖ5
Στη γραμμή 563 πρόσ θεσ α τη μεταβλητή ΤΑ, η οποία υπολογίζει το σύνολο των βαθμών ενός μαθητή. Στη γραμμή 565 πρόσθεσα τη μετα βλητή D IV η οποία έχει τη ν έννοια του διαιρέτη. Μ ετράει πόσ οι βαθ μοί της δεδομένης σ ειράς είναι πάνω από μηδέν. Δεν παίρνει υπ’ όψη της τα μ ηδενικά για τί το μηδέν κατά πάσα πιθα νότητα σ ημ αίνει ότι ο μαθητής δεν έχει ακόμα πάρει βαθμό σ το μάθημα αυτό. (Φ υσικά, αν κά ποιος μ αθητής βαθμολογηθεί σ ’ ένα διαγώ νισμα με μηδέν, η ρουτίνα αυτή δεν θα είναι ακριβή ς. Γ ι’ αυτό καλύτερα να βεβαιω θείτε ότι οι μα θητές βαθμολογούνται το υ λά χισ τον με ένα). Η γραμμή 580 τυπώνει το μέσο βαθμό διαιρώ ντας το άθροισμα τω ν βαθμών με τον αριθμό των βαθμών (πάνω από μηδέν), δηλαδή Τ Α /D IV . Η διαίρ εσ η γίνετα ι μόνο αν η D IV είναι πάνω από μηδέν, για τί αν το πρόγραμμα προσ παθήσ ει να διαιρέσ ει με μηδέν θα έχουμε μήνυμα λάθους. Η γραμμή 585 κάνει
61
τις ΤΑ και D IV ίσ ες με μηδέν ώ στε να αρ χ ίσ ο υ ν να συγκεντρώ σουν τους βαθμούς του επόμενου μαθητή. Α ν .θέλετε το βαθμ ολόγιό σ ας να κατευθύνεται σ τον εκτυπωτή και ό χ ι σ τη ν οθόνη αλλά ξτε τις P R IN T των γραμμώ ν 510, 540, 560 και 580 σ ε L P R IN T.
Χειρισμός Πολλαπλών Αρχείων: Π ολλές Τάξεις Μ ια και οι περ ισ σ ότερ οι κα θηγητές διδάσκουν σε πάνω από μια τά ξεις, χρ ειά ζοντα ι ένα σ ύστημα που να μ πορεί να χειρ ίζεται πολ λά βαθ μ ολόγια ταυτόχρονα. Δεν είναι δύσκολο να προσθέσουμε τη δυνατότη τα αυτή το σ ύσ τημά μας, α π ’ τη σ τιγμ ή που κάθε βαθμολόγιο θ ’ αποθη κεύεται σε διαφ ορ ετικ ό α ρ χ είο δεδομένω ν με διαφ ορ ετικ ό (και μοναδι κό) όνομα. Γ ια όνομα αρ χείου μπορούμε να χρ η σ ιμ οποιή σ ουμ ε το ό νο μα τη ς τά ξης, με τον όρο να περιορισ τούμε στους 8 χα ρ ακτήρ ες που είναι το μέγισ το για ένα όνομα αρχείου. Γ ια να μπορέσουμε να έχουμε πολ λά βαθμολόγια, λ οιπ όν, πρέπει σ τη ν α ρ χή του προγράμματος να προσθέσουμε τη ν εξή ς ρουτίνα: 32 REM * * * * * * * * * * * * * * * * * * * * * * * * * 34 CLS 35 INPUT " Which class ";FILENAME$ ............................. 32 R E M 35 IN P U T "Π οια τά ξη ”;Ρ ΙίΕ Ν Α Μ Ε $
Ask which grade book.
Ε ρώ τηση για πο ιο β α θμ ολόγιο πρόκειτα ι
Ό τα ν ο χ ρ ή σ τ η ς το τρέξει, το πρόγραμμα G R A D E S θα ρω τήσει σ τη ν αρχή: Π οια τάξη;
και θα αποθηκεύσει τη ν απάντησ η σ τη μεταβλητή FIL E N A M E S. Τ ώ ρα πρέπει να τρ οπ οποιήσ ουμε τις υ πορουτίνες 1000 και 2000 έτσι που να συνδέονται με το α ρ χείο που το όνομά του πρ οσ διορ ίζεται από τη μεταβλητή FIL E N A M E S και ό χ ι με το G R A D E S .D A T . Αυτό δεν εί ναι κάτι δύσκολο. Σ τη ν υπορουτίνα 1000 πρέπει ν’ αλλάξουμε τη γραμ μή 1010 σε: 1010 OPEN "0",#1 .FILENAMES
και σ τη ν υπορουτίνα 2000 αλλάζουμε τη γραμμή 2010 σε: 2010 OPEN "l",#1 .FILENAMES
62
Τώ ρα το σ ύσ τημά μας μπορεί να χ ειρ ισ τεί όσ ες τάξεις θέλει, και χρειά ζετα ι, ο χρ ή σ τη ς. Η μόνη αδυναμία του προγράμματός μας είνα ι ότι δεν επιτρέπει στο χρ ή σ τη να περάσει σε μια άλ λη τάξη (σε άλλο βαθμολόγιο), ενώ το πρόγραμμα τρέχει. Για να το διορθώ σουμε αυτό πρέπει να προσ θέσ ου με μια επιλογή σ το κύριο μενού. Τώ ρα η ρουτίνα του μενού πρέπει να γίνει όπω ς παρακάτω (οι νέες γραμμές είναι με παχύτερα γράμματα): 10 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * Grade Book system. 20 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Main menu 30 DIM NM$(50),SC%(50,5) 32 REM * * * * * * * * * * * * * * * * * * * * * * * * Ask which grade book. 34 CLS 35 INPUT ” Which c la u “;FILENAMES 40 CLS 50 PRINT TAB(30);"Grade Book System60 PRINT TAB(30);" Main Menu" 70 PRINT 80 PRINT TAB(25);"1. Start a New Semester" 90 PRINT TAB(25);"2. Add some test scores" 100 PRINT TAB(25);"3. Print Grade Book" 110 PRINT TAB 0 THEN DIV - D IV+ 1 NEXT COL% IF DIV > 0 THEN PRINT USING " ###.##";TA/DIV T A -0 :D IV -0 NEXT ROW% PRINT:PRINT INPUT " Press 4------- 1 to return to main menu ";ZZ$ GOTO 40
§!§§
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLS GOSUB 2000 :REM Read in grade book data. INPUT "Edit which student (by row number) ";ROW% CLS PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT INPUT
Edit student data.
" Present data for ";NM$(ROW%) "1. "2. "3. "4. "5. "6.
Test #1 :";SC(ROW%,1) Test #2 :";SC%(ROW%,2) Test #3 :";SC%(ROW%,3) Test #4 :";SC%(ROW%.4) Test #5 :";SC%(ROW%,5) Name :";NM$(ROW%)
"Edit which (1-6, 0 for save) ";COL%
PRINT:PRINT IF C O L % -0 THEN GOSUB lOOOrGOTO 40 IF C O L % -6 THEN Θ30 :REM edit name.
i si
PRINT " Enter new score for test #";COL%; INPUT SC%(ROW%,COL%) GOTO 660 Edit name.
ill
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LINE INPUT " Enter new name ";NM$(ROW%) GOTO 660
65
860 $70 880 890
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLS PRINT " Exiting Grade Book System" STOP
End of program.
1000 REM * * * * * * * * * * * * * * * * * * * Write grade book data to disk file. 1010 OPEN 0",#1,FILENAMES 1020 FOR R% = 1 TO 50 1030 WRITE #1 ,NM$(R%),SC%(R%11),SC%(R%,2),SC°A(R%.3), SC%(R%,4),SC%(R%.5) 1040 NEXT R% 1050 CLOSE 1 1060 RETURN 2000 REM * * * * * * * * * * * * * * * * * Read grade book data from disk file. 2010 OPEN "l",#1.FILENAMES 2020 FOR R % - 1 TO 50 2030 INPUT #1,NM$(R%),SC%(R%,1).SC%(R%.2).SC%(R%.3). SC%(R%,4).SC%(R%,5) 2040 NEXT R% 2050 CLOSE 1 2060 RETURN 10 REM · . · · · · · . · · « · « · · · · · » · · · · · · · · · · Σύστημα Βαθμολόγιου ..................... . . . . . . . . . Κ ύριο Μ ενού 20 RE M 32 REM . . . . . . . . . . . . . . . . . . . . 35 IN P U T "Ποια τά ξη ";Π Ι.Ε Ν Α Μ Ε $
Ε ρώ τηση για ποιο βαθμ ολόγιο πρόκειται
50 PR IN T Τ Α Β(30);"Σύστημα Βαθμολόγιου" 60 PR IN T ΤΑ Β (30);"Κ ύριο Μενού" 80 P R IN T Τ Α Β(25);" I. Έ να ρ ξη νέου εξαμήνου" 90 P R IN T Τ Α Β (25);" 2. Π ροσθή κη βαθμών" 100 P R IN T ΤΑΒ(25);"3. Εκτύπω ση βαθμολόγιου" 110 PR IN T ΤΑΒ(25);"4. Διόρθω ση δεδομένων βαθμολογίου" 115 P R IN T ΤΑΒ(25);"5. Ε ξέταση ά λ λη ς τά ξη ς” 120 PR IN T ΤΑΒ(25);"6. Έ ξοδος" 140 IN P U T "Δώστε τη ν επιλο γή σας (1-6) από τα παραπάνω";(ΓΗ Ο ΙΟ Ε% 170 REM 240 260 300 330 340
Έ να ρ ξη νέου εξαμήνου
R E M ................. Τώρα δώστε τα ονόματα των μαθητώ ν PR IN T 'Π λ η κ τρ o λ o γή σ τε τα ονόματα των μαθητώ ν (0 όταν τελειώσετε)" L IN E ΙΝ Ρ υ Τ 'Δ ώ σ τε όνομα μ α θη τή :";Ν Μ $ (Η Ο \ν% ) REM . . . . . . . . . . Έ χο ντα ς τελειώ σει τα ονόματα, σώ στε σε α ρ χε ίο δίσκου G O SU B 1000:REM αποθήκευση δεδομένων θαθμολόγιου
360 RE M · · * · · · . · · * « · « · · · . . . . » . . · Π ροσθή κη μιας ομάδας βαθμών 380 IN P U T "Για ποιο διαγώ νισμα είνα ι οι βαθμοί αυτοί (l-5)";C O L % 395 G O SU B 2000:REM Α νάγνω ση τρεχόντω ν δεδομένων θαθμολόγιου 420 PR IN T "Δώστε βαθμό Yia";N M $(R O W % );":"; 450 REM ..................... Η προσθήκη των βαθμών τελείωσε 460 G O SU B 1000:R EM Σώσιμο δεδομένων θαθμολόγιου
66
470 G O T O 4 0:R E M Ε πισ τρ ο φ ή στο Κ ύριο Μ ενού 480 490 510 530
REM ................................ Εκτύπω ση του β α θμολογίου G O SU B 2000:R EM Α νάγνω ση δεδομένων βαθμολόγιου από το δίσκο PR IN T : PR IN T "Βαθμολόγιο": PR IN T IF N M $(R O W % )= 'O " T H E N 600:R EM Τελευταίο όνομα καταλόγου
605 IN P U T "Π ατήστε 4 --------1 για να επιστρέψ ετε στο κύριο μενού";ΖΖ$ 620 R E M · · · · · · · · · · · · · · · · · · · · · · · · Διόρθω ση δεδομένων μαθητών 640 G O SU B 2000:R E M Α νάγνω ση δεδομένων βαθμολογίου 650 IN P U T " Π οιον θέλετε να διορθώ σετε (με αύξοντα α ρ ιθ μ ό ) " ^ 0 \ ν % 670 690 700 710 720 730 740 760
PR IN T 'Τ ρ έ χο ντ α δεδομένα xou";N M $(R O W % ) P R IN T "1. Διαγώ νισμα # l:" ;S C % (R O W % ,l) PR IN T "2. Διαγώ νισμα # 2 :";S C % (R O W % ,2 ) PR IN T "3. Δ ιαγώ νισμα # 3 :";S C % (R O W % ,3 ) PR IN T "4. Διαγώ νισμα # 4 :";S C % (R O W % ,4 ) P R IN T "5. Διαγώ νισμα # 5 :";S C % (R O W % ,5 ) P R IN T "6. Ό ν ο μ α :" ;Ν Μ $ ^ Ο λ ν % ) IN P U T "Π οια διορθώ νετε (1-6, 0 για σώ σιμ ο)";(Γ Ο ί%
790 IF C O L % = 6 T H E N 830:REM διόρθω ση ο νόματος 800 PR IN T "Δώστε νέο θαθμό για το διαγώ νισμα # ";C O L % ; 830 RE M ...................... Δ ιόρθω ση ονόματος 840 L IN E IN P U T "Δώστε νέο ό ν ο μ α " ;Ν Μ $ ^ 0 \ν % ) 860 R E M ............... ... 880 PR IN T " Έ ξ ο δ ο ς α πό το Σ ύστημα του Βαθμολόγιου" 1000 R E M
. . . . . . . . .
2000 R E M
. . . . . . .
Τ έλος προγράμματος
Ε γγρα φ ή δεδομένων βαθμολόγιου στο α ρ χείο του δίσκου
Α νάγνω ση δεδομένων βαθμολόγιου α πό το α ρ χείο του δίσκου
Το σ υνολικό πρόγραμμα δουλεύει πάνω σ τη ν εξής αρχή: διαβάζεται ολόκ λη ρ ο το αρ χείο δεδομένων από τη R A M κάθε φ ορά που χρ ειά ζε ται. Κάθε φ ορά που ο χρ ή σ τ η ς κάνει μια αλλα γή στα δεδομένα του βαθμολόγιου, το πρόγραμμα ξανα γράφ ει όλα τα δεδομένα σ το α ρ χείο δεδομένων, γρ άφ οντας έτσ ι πάνω από τα δεδομένα που ήσ α ν π ρ ιν εκεί. Το πρόγραμμα θα μ πορούσε να γίνει πολύ πιο αποδοτικό, αν διάβαζε από και έγραφ ε σ το α ρ χ είο δεδομένω ν μόνο όταν αυτό θα ήταν απολύ τως αναγκαίο, αλλά όταν έχουμε ένα μικρό σ ειρ ια κό α ρ χείο σαν κι αυ τό, ο χ ρ ό ν ο ς ανάγνω σ ης και εγγρ α φ ή ς ολόκ λη ρ ου του α ρχείου είναι ε λά χισ τος. Το πρόγραμμα του βαθμολογίου μας έδωσε τη ν ευκαιρία να δοκιμά σουμε πολ λές τεχ νικ ές προγραμματισμού με σ ειρ ιακά αρχεία: παρου σίασ η επιλογώ ν, σ β ή σ ιμ ο πα λιώ ν δεδομένων, προσ θήκ η νέων δεδομέ
67
νων, εμ φά νισ η δεδομένων σε φ ορμα ρισ μ ένες εκτυπώ σεις, πραγμ ατο π οίη σ η αλλαγώ ν. Είχα με επ ίσ η ς τη ν ευκαιρία να κάνουμε υ πολογι σμούς' σ υνόλω ν και μέσων όρω ν πάνω σ τα αποθηκευμένα δεδομένα και να δώσουμε στο χ ρ ή σ τη τη δυνατότητα να χειρ ίζετα ι πολ λά ανεξά ρτη τα α ρ χεία δεδομένων. Στο επόμενο κεφ άλαιο θ ’ α ρχίσουμ ε τη μελέτη των α ρ χείω ν τυχαία ς προσ π έλα σ ης, τα οποία σ ας επιτρέπουν να χειρ ίζεσ τε πολύ μεγαλύτε ρα α ρ χεία δεδομένων.
68
Τ ο αρ χεία δεδομένω ν τυχαία ς προσπέλασης χρ η σ ιμ οποιού ντα ι κατά πρώ το λόγο όταν το α ρ χείο δεδομένων μας είναι πολύ μεγάλο. Μ ια και το σ ειρ ιακό μας α ρ χείο με το βαθμ ολόγιο ήτα ν πολύ μικρό, γράψαμε ρ ουτίνες που διάβαζαν από τη R A M ή έγραφ α ν στη R A M ολόκ λη ρ ο το αρχείο. Ό π ο ιε ς α λλα γές κάναμε σ το αρ χείο γινόντουσ α ν στη R AM και μετά ξαναγράφ αμε σ το δίσ κο ο λόκ λη ρ ο το αρχείο. Στο πα ράδειγ μά μας, είχα με μια λίσ τα 50 ονομάτω ν (το μέγιστο). Αν υποθέσουμε ότι το κάθε όνομα έχει κατά μέσο όρο 10 γράμματα, έχουμε σύνολο 500 χα ρ ακτήρ ες για τα ονόματα, δηλαδή 500 bytes αποθήκευσ ης ή 1/2 Κ. Ο κάθε μ αθητής από τους 50 είχε 5 βαθμούς, άρα σ υνολικά είχαμε 250 βαθμούς. Οι βαθμοί ήτα ν ακέραιοι (SC % ) και ο κάθε ακέραιος απ αι τούσε δύο bytes αποθήκευσ ης, άρα οι βαθμοί καταλάμβαναν επίσ η ς 500 bytes σ υνολικά (5*50*2) ή 1/2 Κ. Αρα, ολόκ λη ρ η η βάση δεδομέ νων G R A D E S δεν απ ασ χολού σε παρά 1Κ της R A M , που είναι πολύ λ ίγο για έναν υπολογιστή των 64Κ. Ό μ ω ς δεν είναι όλα τα α ρ χεία μικρά. Σ τη ν πραγμ ατικότητα, τα πε ρισ σ ότερα είναι μεγάλα και ενδέχεται το μέγεθος τους να αυξηθεί α πρόβλεπτα. Έ ν α α ρ χ είο δεδομένων μπορεί κά λλισ τα να είναι 100Κ., 500Κ ή και πάνω από 1 m egabyte (1000Κ). Κ αι βέβαια μια τέτοια βάση δεδομένων είναι αδύνατο να χω ρέσ ει στα 64Κ ή 128Κ τη ς R A M . Ό τα ν τα α ρ χεία δεδομένω ν είναι πάνω από 20Κ, προτιμούνται τα α ρ χεία τυ χα ίας προσ π έλα σ ης. Τα α ρ χεία τυχαία ς πρ οσ π έλα σ ης μας επιτρέπουν να χειρ ιζόμ α στε το αρ χείο δεδομένων σ αν να ήταν ο λ ό κ λ η ρ ο στη R A M , ενώ σ τη ν πρα γμ ατικότητα μ ονάχα μια εγγρ α φ ή είναι κάθε σ τιγ μή αποθηκευμένη στη R A M . Στο πρόγραμμα G R A D E S , αναφ ερόμα σταν στους μαθητές με τη σ ειρ ά που είχα ν σ τον κατάλογο (R O W % ). Τα α ρ χεία τυχαία ς πρ οσ π έλα σ ης μας επιτρέπουν να χειρ ισ τού με μια ο λόκ λη ρ η εγγρ α φ ή ενός α ρχείου δεδομένω ν σ αν μια σειρά με έναν α ριθμό. Α λλά σ τη R A M είναι αποθηκευμένη μόνο η εγγρα φ ή εκείνη με τη ν οποία εργαζόμαστε εκείνη τη σ τιγμ ή και όχι όλες, όπως συνέθαινε στο πρόγραμμα του βαθμολογίου. Καθώς θα προχω ρήσ ουμ ε σ τα συ στήματα τυχαία ς πρ οσ π έλα σ ης, θα δούμε πώς αυτό μπορεί να διευκο λύνει τον προγραμματισμό μας. Τα α ρ χεία τυ χαία ς πρ οσ π έλα σ ης πα ρέχουν σ τον πρ ογραμμ ατιστή μεγάλη ευελιξία στο χειρ ισ μ ό τω ν α ρ χείω ν δεδομένων. Ω σ τόσ ο, π ο λ λοί αρ χά ρ ιοι χρ ή σ τες τρομάζουν κάπως με τη ν ιδέα των α ρχείω ν αυ τών. Για την κατασκευή τους, χρ ειά ζοντα ι μερικές εντολές που... η χούν παράξενα, όπω ς οι LSET, F IE L D και Μ ΚΙ$. Ω στόσο, ο πρ ο γραμματισμός με α ρ χεία τυ χαία ς π ρ οσ π έλα σ ης καθόλου δεν είναι τόσο δύσκολος, όσο ίσω ς σας κάνουν να πιστέψ ετε αυτές οι εντολές. Και μάλιστα, α π ’ τη σ τιγμ νή που θα εξοικειω θείτε μ’ αυτές, ο προγρα μμ ατι σμός με αρ χεία τυ χαία ς πρ οσ π έλα σ ης θα είναι πολύ ευκολότερος α π ’
71
RAM
Σχήμα 5.1:
Π ρ οσω ρινή Μ νήμη
Δ ίσ κος Α ποθήκευσ ης
R A M , προσωρινή μνήμη και δίσκος ύστερα από το άνοιγμα ενός αρχείου τυχαίας προσπέλασης
ότι με τα σ ειρ ιακά α ρ χεία δεδομένων.
Άνοιγμα ενός Αρχείου Τυχαίας Προσπέλασης Τα αρ χεία τυχαία ς πρ οσ π έλα σ ης δεν δουλεύουν με είσ οδο (I) και έ ξοδο (Ο). Ό τα ν ανοίγετε ένα α ρ χείο τυχαία ς πρ οσ π έλα σ ης, το κανάλι που συνδέει τη R A M με το α ρ χείο του δίσκου, και σ τέλ νει και δέχεται δεδομένα. Για τα α ρ χεία τυχαία ς πρ οσ π έλα σ ης χρ η σιμ οποιού μ ε το σύμβολο R. Η διαταγή που ανοίγει το αρ χείο τυ χαία ς πρ οσ π έλα σ ης M A IL .D A T είναι: OPEN "R ", #1, "MAIL.DAT"
Τα αρ χεία τυχαία ς πρ οσ π έλα σ ης χρ η σ ιμ οποιού ν μια προσω ρινή μ ν ή μ η (buffer) ανάμεσα στο δίσ κο και τη R A M , κι έτσ ι η παραπάνω δια ταγή ό χ ι μόνο ανοίγει το αρ χείο αλλά και δημ ιουργεί αυτόματα την προσ ω ρινή μνήμη. Α π’ τη σ τιγμ ή που θα εκτελεσ τεί, η διαταγή εγκαθιστά μια σ χέσ η ανάμεσα στη R A M και το δίσ κο αποθήκευσης, που πα ρουσιάζεται στο Σ χήμα 5.1. Η προσ ω ρινή μνήμη δρα σαν ενδιάμεσο ανάμεσα στη R A M και το δίσ κο για να επιταχύνει την εκτέλεσ η. Το διάβασμα και το γράψ ιμο των δεδομένων του δίσκου απαιτούν τη μ ηχα νική κίνη σ η της κεφ αλής
72
RAM
Σχήμα 5.2:
Π ρ οσω ρινή Μ νήμη
Δ ίσ κος Α ποθήκευσ ης
Η δομή της προσωρινής μνήμης ύστερα από την εκτέλεση της πρότασης FIELD
του δίσκου, πράγμα που επιβραδύνει την εκτέλεση. Η προσ ω ρινή μνήμη κάνει πιο γρ ή γορη τη διαδικ ασ ία αυτή, κρατώ ντας, προσω ρινά, «κομμάτια» του α ρχείου δεδομένων μ έχρι που να μπορεί να διαβάσει ή να γράψ ει πολλές εγγρα φ ές μαζί. Η προσ ω ρινή μνήμη πρέπει να δο μ η θ εί ανάλογα με το μέγεθος του κάθε πεδίου τη ς κάθε εγγρ α φ ή ς τη ς βάσ ης δεδομένων. Η εντολή F IE L D χρ η σ ιμ ο π ο ιείτα ι για να π ρ οσ διο ρ ίσ ει τη δομή της πρ οσ ω ρ ινής μ νήμης (και μέσω αυτής και τη δομή τη ς κάθε εγγραφής). Η σύνταξη τη ς εντολής F IE L D είναι: F IE L D αριθμός καναλιού, μήκος πεδίου AS όνομα πεδίου. Έ τ σ ι, αν δώσουμε τη διαταγή: FIELD #1, 20 AS F1$, 10 AS F2$
το α ρ χείο δεδομένω ν τυ χαία ς πρ οσ π έλα σ ης θα έχει εξ υποθέσεω ς δύο πεδία σε κάθε εγγρα φ ή . Τ ο πρώ το πεδίο, F l$ , θα έχει προκαθορισ μένο μήκος 20 bytes (χαρακτήρες). Το δεύτερο πεδίο, F2$, θα έχει προκαθο ρ ισμένο μήκος 10 bytes. Έ τ σ ι, το μ ήκος κάθε εγγρ α φ ή ς θα είναι 30 by tes. Στον υ πολογιστή, το αποτέλεσμα τη ς εντολ ής F IE L D φαίνεται σ το Σ χήμα 5.2.
73
L SET
Γράψιμο Δεδομένων σε Αρχεία Τυχαίας Προσπέ λασης Ό τα ν χρ η σιμ οποιού μ ε αρ χεία τυχαία ς πρ οσ π έλα σ ης, δεν γράφ ουμε τα δεδομένα α π’ ευθείας στο δίσ κο. Α ντίθετα, τα βάζουμε πρώτα σ την προσω ρινή μνήμη. Αυτό γίνετα ι με τις εντολές L SET και R SET. Η εν τολή LSET θα θάλει τα δεδομένα σ τη ν προσ ω ρινή μνήμη κατά τέτοιο τρόπο, ώστε να είνα ι ευθυγραμμισμένα από τ’ αρισ τερά (και θ ’ ακολου θούν κενά αν το δεδομένο είναι πιο μ ικρό από το πεδίο). Η LSET χ ρ η σ ιμοπ οιείται συνήθω ς με μη αρ ιθμ ητικά δεδομένα (ονόματα, διευθύν σεις, πόλεις, κτλ.). Η διαταγή R S E T ευθυγραμμίζει τα δεδομένα από τα δεξιά, μέσα σ τη ν προσ ω ρινή μνήμη (π ροηγούνται κενά, αν τα δεδομέ να είναι πιο μικρά α π ’ το πεδίο). Χ ρ ησ ιμ οποιείτα ι συνήθω ς με αριθμ η τικά δεδομένα. Π ρος το παρόν θα χρ η σ ιμ οποιή σ ουμ ε μόνο μη αριθμ η τικά δεδομένα και εντολές LSET. Γ ια παράδειγμα, με τις διαταγές: LSET F1$ » "Andy Adams" LSET F 2$«"123 A St."
βάζουμε το όνομα A ndy A dam s και τη διεύθυνση 123 A St. σ τη ν π ρ ο σ ω ρινή μνήμη, έτσι όπως δείχνει το Σ χήμ α 5.3. Γ ια να περάσουμε τα δεδομένα απ’ τη ν προσ ω ρινή μνήμη σ το δίσκο,
74
'RAM
Σχήμα 5.4:
Π ρ οσω ρινή Μ νήμη
Δ ίσ κος Α ποθήκευσ ης
Τα περιεχόμενα του αρχείου M A IL .D A T ύστερα από την το ποθέτηση της πρώτης εγγραφής στο δίσκο
χρ η σ ιμ οποιού μ ε τη ν εντολή P U T. Η P U T απαιτεί να δώσουμε αριθμό καναλιού όπω ς και αριθμό εγγρ α φ ή ς. Ο αριθμός εγγρ α φ ή ς είναι η θέ σ η της εγγρ α φ ή ς σ τη θάση δεδομένων, κατά τον ίδιο περίπου τρόπο που η μ εταβλητή R O W % ήτα ν η θέση του μαθητή σ το β αθμολόγιο προηγουμένω ς. Γ ια παράδειγμα, αν δώσουμε τη διαταγή: PUT #1, 1
όλα όσα β ρίσ κοντα ι τη σ τιγμ ή εκείνη σ τη ν πρ οσ ω ρινή μνήμη τοποθε τούνται σ τη ν εγγρ α φ ή 1 του αρχείου δεδομένων, όπω ς δείχνει το Σ χ ή μα 5.4. Η σ ειρ ά τω ν διαταγών: LSET F l$ « "A n d y Adams" LSET F 2$«"123 A St." PUT #1,1
έχει σ ’ ένα α ρ χείο τυχαία ς πρ οσ π έλα σ ης τη ν ίδια επίδρα σ η μ’ αυτή που έχει σ ’ ένα σ ειρ ιακό αρ χείο η διαταγή W R IT E # 1, “A ndy A dam s’’, “ 123 A S t.” . Γ ράφ ει δηλαδή στο α ρ χείο δεδομένων μια εγγρα φ ή με δύο πεδία πλ ηροφ οριώ ν. Για να προσθέσουμε μια δεύτερη εγγρα φ ή σ το αρ χείο δεδομένων, πρέπει πρώ τα να τοποθετήσουμε τα νέα δεδομένα σ τη ν προσ ω ρινή μνήμη, με τις διαταγές:
75
χείο
Σχήμα 5.6:
Η πρώτη εγγραφή παίρνεται από το αρχείο M A IL .D A T και τα δεδομένα της αποθηκεύονται στη ν προσωρινή μνήμη
LSET F l$«"Barabara Bok" LSET F 2 $ - "234 B St."
Θ έλουμε να γράψ ουμε αυτά τα δεδομένα σ τη ν εγγρ α φ ή 2, κι έτσ ι χ ρ η σιμοποιούμε τη ν διαταγή: PUT #1.2
76
Τώ ρα η σ χέσ η ανάμεσα στη R A M και στο α ρ χείο δεδομένω ν είναι όπω ς φ αίνετα ι στο Σ χήμ α 5.5. Α ς δούμε τώρα πώς ανακτάμε δεδομένα α π’ το α ρ χείο τυ χαία ς πρ ο σ πέλασης.
Ανάγνωση Δεδομένων από Αρχεία Τυχαίας Προσ πέλασης Μ ια και τα α ρ χεία τυχαία ς πρ οσ π έλα σ ης δουλεύουν σ ε δύο κατευ θύνσεις, δεν χρ ειά ζετα ι να κλείσουμε τώ ρα το αρ χείο και να το ξανανοίξουμε για είσ οδο (I). Μ πορούμε, απλά, να πάρουμε όποια εγγραφή θέλουμε. Χ ρ ησ ιμ οποιούμε τη ν εντολή G E T για να φ έρνουμε σ την π ροσ ω ρινή μνήμη δεδομένα από το αρ χείο τυχαία ς πρ οσ π έλα σ ης. Γ ια να φέρουμε τη ν εγγρ α φ ή 1 από το δίσ κο σ τη ν προσ ω ρινή μνήμη π λ η κτρολογούμε τη διαταγή: GET #1, 1
Α υτό ανακτά τα δεδομένα τη ς εγγρ α φ ή ς 1 από το δίσ κο και τα τοπ ο θετεί σ τη ν πρ οσ ω ρινή μ νήμη, όπω ς δείχν ει το Σ χήμ α 5.6. Γ ια να διαβάσουμε τα δεδομένα της εγγρ α φ ή ς 2, δεν έχουμε παρά να χρ η σ ιμ οποιή σ ουμ ε τη ν εντολή G E T # , π ρ οσ διορ ίζοντα ς όμως τώρα τη ν εγγρα φ ή 2, δηλαδή: GET #1, 2
Ο πότε η R A M και ο δίσ κος θα έχου ν τη ν εικόνα του Σ χήμα τος 5.7.
Κλείσιμο του Αρχείου Τυχαίας Προσπέλασης Γ ια να κλείσ ουμ ε το αρ χείο τυ χαία ς πρ οσ π έλα σ ης, χρ η σιμ οποιού μ ε απλώ ς τη ν C LO SE: CLOSE #1
και το κανάλι # 1 ανάμεσα σ τη R A M και στο α ρ χείο δεδομένω ν παύει να είνα ι ενεργό.
77
τηση και της εγγραφής 2 από το M A IL .D A T
Μετατροπή Αριθμών σε Αλφαριθμητικά για Απο θήκευση. Υ π άρχει ένας πολύ σ πουδαίος κανόνας που πρέπει να τον έχετε πά ν τα κατά νουν όταν δουλεύετε με α ρ χεία τυχαία ς πρ οσ π έλα σ ης. Ό λ α τα δεδομένα πρέπει να είνα ι α λ φ αρ ιθ μη τικά όταν τοποθετούνται σ την προσ ω ρινή μνήμη. Α ν ένα δεδομένο του προγράμματος είνα ι α ρ ιθ μ ητι κό και θέλετε να το αποθηκεύσετε σε αρ χείο τυχαία ς προσ π έλα σ ης, πρέπει πρώ τα να το μετατρέψετε σε αλφ αρ ιθμη τικό. Η B A SIC διαθέτει 3 σ υναρτήσ εις γ ια τη ν τοποθέτησ η αριθμ ητικώ ν δεδομένων σ τη ν πρ ο σω ρινή μνήμη:
78
Μ Κ Ι$
Φ τιά χνει α λ φ αρ ιθμη τικό από ακέραιο αριθμό (χρ η σ ιμ ο π ο ιεί 2 bytes)
MKS$
Φ τιά χνει αλ φ αρ ιθ μ η τικό από αριθμό απ λή ς ακ ρίβεια ς (χρ η σ ιμ ο π ο ιεί 4 bytes)
M KD$
Φ τιά χνει α λ φ αρ ιθμη τικό από αριθμό διπ λή ς ακ ρίβεια ς (χρ η σ ιμ ο π ο ιεί 8 bytes).
(με RSET) στη ν προσωρινή μνήμη Για παράδειγμα, άν είχα με στη R A M τα εξής δεδομένα: Α$ - "ABC" Χ% - 10 Υ - 123.45 Z# - 123456789.12345
όπου το Α$ είναι α λ φ αρ ιθμη τικό, ο Χ% ακέραιος (%), ο Υ αριθμός α π λ ή ς ακρίβεια ς και ο Ζ # αριθμός διπ λή ς ακ ρίβεια ς (# ), η εντολή F IE L D για να αποθηκεύσουμε μια εγγρα φ ή με αυτά τα δεδομένα θα ή ταν ως εξής: FIELD #1. 20 AS F1$, 2 AS F2$, 4 AS F3$, 8 AS F4$
Αυτή διαθέτει 20 το πολύ χα ρ ακτήρ ες για το Α$ (αν και θα μ πορούσα με να καθορίσουμε μ έχρ ι και 254). Στο F2$, που θα αποθηκεύσει τα δε δομένα της μ εταβλητής X, κατανέμονται 2 bytes, μια και οι ακ έρ αιοι α παιτούν 2 bytes αποθήκευσης. Στο F3$ θα αποθηκεύσουμε τα δεδομένα της μ εταβ λητής Υ. Μ ια και οι αριθμοί απ λή ς ακ ρίβεια ς απαιτούν τέσ σερα bytes αποθήκευσης, κατανέμονται 4 bytes σ το F3$. Το πεδίο F4$ θα κρα τήσ ει τα δεδομένα της μεταβ λητής διπ λή ς α κρίβεια ς Ζ # . Μ ια και οι αριθμοί διπ λή ς α κρίβεια ς απαιτούν 8 bytes αποθήκευσης, η π ρόταση F IE L D κατανέμει 8 bytes στο F4$. Γ ια να τοποθετήσουμε αυτές τις μ εταβλητές σ τη ν προσ ω ρινή μνήμη χρ η σιμ οποιού μ ε τις διαταγές:
79
LSET F l$ = A$ RSET F2$-MKI$(X%) RSET F3$-MKS$(Y) RSET F4$ = MKD$(Z#) Γ ια το πρώ το πεδίο χρ η σιμ οποιού μ ε LSET, μια και πρόκειται για α λ φαριθμη τικό. Τα αρ ιθμ ητικά δεδομένα τα τοποθετήσαμε με τη ν εντολή R SET. Το αποτέλεσμα των εντολώ ν αυτών είναι η τοποθέτησ η των δε δομένων σ τη ν προσ ω ρινή μνήμη, έτσ ι όπως φ αίνετα ι σ το Σ χήμα 5.8. Γ ια να αποθηκεύσουμε τα δεδομένα τη ς πρ οσ ω ρ ινής μνήμης σε μια εγγρα φή του α ρχείου του δίσκου χρ η σιμ οποιού μ ε την εντολή PUT. Ό τα ν διαβάζουμε δεδομένα από τη ν προσ ω ρινή μνήμη στη R A M , χρειά ζετα ι να μετατρέψουμε τις α λ φ αρ ιθμη τικές μεταβλητές πάλι σε α ριθμούς. Η B A SIC διαθέτει τρ εις σ υναρ τήσ εις και γ ι’ αυτό: C VI
Μ ετατροπή ξανά σε ακέραιο
CVS
Μ ετατροπή ξανά σε αριθμό απλή ς ακρίβεια ς
CVD
Μ ετατροπή ξανά σε αριθμό διπ λής ακρίβεια ς
Η παρακάτω σ ειρ ά διαταγώ ν θα πάρει δεδομένα από τη ν προσ ω ρινή μνήμη και θα τα φ έρει σ τη R A M μετατρέποντάς τα ανάλογα: Α$ - F l$ Χ% - CVI(F2$) Υ - CVS(F3$) Z# - CVD{F4$) Η Α$ δεν χρ ειά ζετα ι μετατροπή για τί είνα ι ήδη α λφ αριθμη τικό. Η Χ% χρ η σ ιμ ο π ο ιεί τη σ υνάρτησ η C VI για να μετατρέψ ει το F2$ ξανά σε ακέραιο α ριθμ ητικό. Η Υ χρ η σ ιμ ο π ο ιεί τη ν CVS για να μετατρέψει το F3$ ξανά σε α ριθμ ητικό απ λή ς ακ ρίβεια ς και όμ οια η Z # μέσω της C V D μετατρέπει το F4$ σε αρ ιθμ ητικό διπ λή ς ακρίβειας. Έ τ σ ι το πρόγραμμα θα μπορέσ ει ξανά να χ ειρ ισ τεί τις Χ%, Υ και Z # σ αν πρ α γ ματικούς αριθμούς, πα ρ ’ όλο που για τη ν αποθήκευση σ το αρ χείο δε δομένων είχα ν μ ετατραπεί σ ε αλφ αριθμη τικά. Αυτές είνα ι οι βασ ικές εντολές με τις οποίες εργαζόμαστε με τ’ αρ
χεία τυχαία ς προσ π έλα σ ης. Μ πορεί τώρα να σας φ αίνονται αφ ηρημένες και ίσω ς νομ ίσ ετε ότι είνα ι πολύ δύσκολο να τις χρ η σ ιμ οποιή σ ετε. Α λλά, όπω ς θα δείτε σ τα παρακάτω κεφ άλαια, τα α ρ χεία τυ χαία ς πρ ο σ πέλασ η ς δεν είνα ι τόσ ο δύσκολα, όσ ο φ αίνονται σ ε πρώ τη ματιά. Αν πρ οσ εγγίσετε τον προγραμμ ατισμ ό τους με τρόπο ορ θολογικ ό, βήμα προς θήμα, σ ύντομα θα δείτε ότι η προσ πάθειά σ ας θ ’ αποδόσ ει άφ θ ο νους καρπούς σ ’ ότι αφ ορά τη ν ευελιξία του προγραμματισμού και τη ν πρόσ βαση στα δεδομένα.
81
ΣΧΕΔΙΑΣΜΟΣ ΣΥΣΤΗΜΑΤΩΝ ΛΟΓΙΣΜΙΚΟΥ ΜΕ ΑΡΧΕΙΑ
Ό τ α ν αρχίζουμε να αναπτύσσουμε ένα σύστημα λογισμ ικού με α ρ χεία τυ χαία ς πρ οσ π έλα σ ης, θα κερδίσουμε αρκετό κόπο, αν έχουμε αίϊό τα πρ ιν σ χεδιά σ ει το σύστημα. Η φ άσ η του σχεδια σ μού περιλαμ βάνει αρκετά βήματα, που το καθένα τους μας φέρνει λίγ ο κοντύτερα π ρος τον τελικό σ τόχο. Αν δεν κάνετε σ χεδια σ μό από τα πριν, θα βρε θείτε μπροστά σ ’ ένα τεράσ τιο τέλμα από προγράμματα και προτάσ εις που θα είναι δύσ κολο και να τα χειρ ισ τείτε και να α π οκω δικοποιήσ ετε τα λάθη. Επομένω ς, η βήμα προς βήμα π ρ οσ έγγισ η είναι καλή ιδέα. Αυτή η πρ οσ έγγισ η είναι αρκετά παρόμοια μ’ αυτήν που περιγράψαμε σ το Κ εφ άλαιο 3, για το σ χεδια σ μ ό συστημάτω ν με σ ειριακά α ρ χεία δε δομένων. Κ αι, όπω ς συνήθω ς, καλύτερο είναι ν’ α ρχίσουμ ε με τη γενι κή ιδέα.
Βήμα 1. Η Γενική Ιδέα Για τα παραδείγματά μας με τα α ρ χεία τυ χαία ς πρ οσ π έλα σ ης, θα χρ η σ ιμ οποιή σ ουμ ε ένα σ ύσ τημα λογισμ ικού που κρατάει λογαριασ μ ό των πω λήσεω ν που πρα γμ ατοποιούν διάφ ορ οι πω λητές και των κω δι κών τω ν πω λούμενω ν πρ οϊόντω ν.Ο ι γενικ ές τεχνικές προγρα μμ ατι σμού που θα μάθετε γρ άφ οντας αυτό το συγκεκριμένο πρόγραμμα θα α ποδειχτού ν πολύτιμες αργότερα. Μ πορείτε να χρ η σ ιμ ο π ο ιή σ ετε τις ί διες ακριβώ ς τεχ νικ ές για να χειρ ισ τείτε, με α ρ χεία τυχαία ς πρ οσ π έλα σης, κάθε είδους δεδομένα. Π ράγματι, αυτές οι τεχνικές μπορούν να ε φ αρμ οσ τούν σε ο π ο ιο δ ή π ο τε πρόγραμμα θελή σ ετε να γράψ ετε, είτε εί ναι κα τάλογος συνδρομητώ ν, είτε β ιβ λιοθ ή κ η ς, είτε σ ύστημα τή ρ η σ η ς λο γισ τικ ώ ν βιβλίω ν. Χ ρ ησ ιμ οποιώ αυτό το συγκεκριμ ένο παράδειγμα δ ιότι το αρ χείο δεδομένω ν μας θα έχει α λφ αρ ιθμη τικά δεδομένα, ακέ ραιους αριθμούς, ρητούς αριθμούς και ημερομηνίες. Μ ια και το καθέ να α π ’ αυτά χρ ειά ζετα ι διαφ ορ ετικ ό χειρ ισ μ ό, το αρ χείο του προγρά μ ματος μας είναι α ν τιπροσ ω πευτικό όλω ν των τύπων δεδομένων. Το σ ύστημα που αναπτύσσουμε κρατάει λογαριασ μ ό τω ν εμ πορικώ ν πράξεω ν που πρ α γμ ατοπ οιούν διάφ ορ οι πω λητές. Θ έλουμε να κατα γράψ ουμε τον κω δικό των πρ οϊόντω ν που πουλιούνται, το όνομα του πω λητή που τα πούλη σ ε, τη ν ποσ ότητα που πουλή θηκε, το ποσ όν αγο ράς και τη ν ημ ερ ομη νία τη ς πώ λησ ης. Θ έλουμε να μπορούμε, ανά πά σα σ τιγμ ή, να προσθέτουμε νέες πω λήσ εις σ τη ν βάση δεδομένω ν μας. Ε πιπλέον, το σύσ τημά μας θα έχει τη ν ικα νότητα να κάνει τα ξινόμ ησ η κατά ο ποιοδ ή ποτε πεδίο ή και κατά δύο συνδυασμένα πεδία (τα ξινόμη ση μέσα σ τη ν τα ξινόμ ησ η). Τ ο σ ύστημα θα δίνει αναφ ορές για τις πωλή σ εις, με αθροίσ μ ατα για τη ν ποσ ότητα των προϊόντω ν και το ποσ ό
83
των χρημάτω ν. Θ α επιτρέπ ει επ ίσ η ς τη ν α ναζή τησ η, έτσ ι που να μ πο ρούμε να πρα τηρήσ ουμε τις πω λ ήσ εις ενός σ υγκεκριμένου πρ οϊόντος ή ενός σ υγκεκριμένου πω λητή. Μ ε το σ ύστημα αυτό θα είμαστε σε θέ ση να διορθώ σουμε οποιοδήποτε σ το ιχείο τη ς βάσ ης δεδομένων και να κάνουμε σάρω ση στη βάση δεδομένων, ώ στε η διόρθω ση να γίνετα ι ευ κολότερη. Από τη σ τιγμ ή που έχουμε καταγραμμένη τη γενική ιδέα, μπορούμε να περάσουμε στο δεύτερο βήμα.
Βήμα 2. Σχεδιασμός της Βάσης Δεδομένων Τώρα πρέπει να σχεδιά σ ουμ ε το αρ χείο δεδομένων που θα αποθηκεύσει τα δεδομένα του συστήματος. Π ρέπει να καθορίσουμε το όνομα του αρχείου, τα ονόματα όλω ν των πεδίων, το μέγισ το εύρος τους και τους τύπους των πεδίων. Ν α η δομή της βάσ ης δεδομένω ν για το σύ στημα πα ρακ ολούθη σ ης των πω λήσεω ν: ’Ο νομα Α ρχείου Δεδομένων: SA L E S .D A T Ο ΝΟΜ Α Π ΕΔΙΟ Υ ΤΥ Π Ο Σ ΕΥ ΡΟ Σ Π Ε ΡΙΓΡ Α Φ Η CO D E S Α Λ ΦΑΡΙΘΜ ΗΤΙΚΟ 5 Κ ω δικός π ρ ο ϊό ντο ς (πεντα ψ ή φ ιο ς α λφ α ρ ιθμη τικό ς) PER SO N S Α Λ ΦΑΡΙΘΜ ΗΤΙΚΟ 15 Ό ν ο μ α του πω λητή Q TY% Α Κ ΕΡ Α ΙΟ 2 Π ο σό τη τα που πουλήθηκε (ακέραιος) AM OUNT Α Λ ΦΑΡΙΘΜ ΗΤΙΚΟ 4 Π ο σό ν συνα λλα γή ς (αριθμός α πλ ή ς α κρίβειας) D A TS Α Λ ΦΑ ΡΙΘΜ ΗΤΙΚΟ 8 Η μ ερομ ηνία πώ λη ση ς (στη μορφή Μ Μ /Η Η /Χ Χ , δηλ. μ ήνας-ημέρα-χρόνος) Μ ήκος ε γγραφής:
34
Π ροσ έξτε ότι ονομάσαμε το α ρ χείο S A L E S .D A T (από το sales = πω λήσ εις) και ότι κάθε εγγρ α φ ή π ρ όκ ειτα ι να έχει πέντε πεδία. Τα πε δία που είνα ι α λφ αρ ιθμη τικά έχουν το γνω σ τό μας σ ύμβολο $ σ το τέ λος του ονόμ ατός τους (C O D E S, PER S O N S , D A T S). Η «ποσότητα» είναι ακέραιος αριθμός (Q T Y % ) κι έτσ ι θα α π αιτή σ ει 2 bytes απ οθή κευσης. T o A M O U N T είνα ι αριθμός απ λή ς ακ ρίβεια ς, κι έτσ ι απαιτεί 4 bytes αποθήκευσης. Τ ο μ ήκος εγγρ α φ ή ς, 34, είνα ι το άθροισ μ α του εύρους των πέντε πεδίων. Τώ ρα πρέπει να σ χεδιά σ ουμ ε τη δομή του σ υσ τήμα τός μας.
84
IN ST A LL . Β AS
SA L E S.B A S
Π ρόγραμμα εγκα τά στασ ης
Τ ο κύριο μενού
(ξεχω ρ ιστό α π ' το σύστημα α υτό καθαυτό)
A P P E N D .B A S Π ρ οσθή κη νέων δεδομένων
Σχήμα 6.1:
1. Π ρ ο σθή κη νέων δεδομένων 2. Τ α ξινό μ η ση δεδομένων 3. Εκτύπω ση αναφορώ ν 4. Δ ιόρθω ση δεδομένων 5. Έ ξο δ ο ς από το σύστημα
SO R T . Β A S Τ α ξινό μ η σ η δεδομένων
R E P O R T .B A S Εκτύπω ση αναφορώ ν
E D IT .B A S Δ ιόρθω ση δεδομένων
Δομή των προγραμμάτων του συστήματος SAL E S
Βήμα 3. Σχεδιασμός της Δομής τον Σνστήματος Ό τ α ν αναπτύσσουμε σ υσ τήματα με τόσ ες δυνατότητες όσ ες το δικό μας, κα λή ιδέα είνα ι να αναλύσουμε το σ υνολικό σ ύστημα σ ε ξ εχω ρ ι σ τά προγράμματα και ό χ ι απλώ ς σε χω ρ ισ τές ρουτίνες. Αυτό μας επ ι τρέπει να δουλέψ ουμε σ ’ ένα πρόγραμμα, ύ στερα να το ελέγξουμε, να α π οκω δικ οποιήσ ουμε τα λάθη και να το φέρουμε σε τελειω μένη μορφή π ρ ιν προχω ρή σ ουμ ε σε άλ λο πρόγραμμα. Είναι πολύ ευκολότερο να δουλεύουμε μ’ ένα σ χετικ ά μικρό πρόγραμμα που έχει μια συγκεκριμ έ νη δουλειά να κάνει, παρά να προσ παθήσ ουμε να δουλέψουμε μ’ ένα τερ άσ τιο πρόγραμμα που κάνει πολ λά και ανεξά ρτητα πράγματα. Μ πο ρούμε να διασπάσουμε το σ υνολικό μας σ ύστημα στα προγράμματα που φ αίνονται σ το Σ χήμ α 6.1. Η δομή που σ χεδιά σ αμ ε εδώ μας επιτρέπ ει να διακρίνουμε ξεχω ρ ι στά προγράμματα που πρέπει ν ’ αναπτυχθούν και μας δίνει μικρότε ρους, ανεξά ρτητους σ τόχου ς που πρέπει να επιδιώ ξουμε. Εδώ κα ταλή ξαμε σε έξη ξ εχω ρ ισ τά προγράμματα, που το καθένα επιτελεί μια σ υγ κεκριμένη λειτουρ γία μέσα σ το σ υνολικό σύστημα. Το επόμενο θήμα είνα ι να γράψ ουμε τις ρουτίνες που διαβάζουν και γρ άφ ου ν δεδομένα σ το αρ χείο δεδομένων.
85
Βήμα 4. Ρουτίνες Εισόδου/Εξόδου Μ ια και όλα τα προγράμματα θα ανοίγουν α ρ χεία και θα γράφ ουν/ διαβάζουν εγγραφές, μπορούμε να γλυτώ σουμε αρκετή δουλειά, αν γράψουμε από τα πριν ρουτίνες, που να κάνουν ακριβώ ς αυτό, και χ ρ η σιμοποιούμε τις ίδιες ρουτίνες σε όλα μας τα επιμέρους προγράμματα. Γ ια παράδειγμα, ξέρουμε ότι οποτεδήποτε χρεια ζόμ ασ τε πρόσ βα ση στο α ρ χείο δεδομένων SA LES θα πρέπει να προσ διορίζουμ ε όνομα αρ χείου και μήκος εγγραφής- επ ίσ η ς θα πρέπει να καθορίζουμε τα πεδία (με την εντολή F IE L D ). Ά ρ α , τα περ ισ σ ότερ α προγράμματα θα πρέπει να περιλαμβάνουν τις εξή ς δύο γραμμές: 30 OPEN "R",#1 ."SALES.DAT",34 40 FIELD #1, 5 AS F1S.15 AS F2$,2 AS F3$,4 AS F4$,8 AS F5$
Οι αριθμοί γραμμών 30 και 40 χρ η σ ιμ οποιού ντα ι χά ρ ιν ευκολίας και σύντομα θα δούμε το γιατί. Π ροσ έξτε ότι στο τέλος της γραμμής 30 δίνουμε τον αριθμό 34. Αυτό ορίζει το μήκος της εγγρ α φ ή ς ίσ ο με 34 bytes. Η κάθε εγγρα φ ή π ερ ιέχει 34 bytes γιατί, όταν σ χεδιάζαμ ε τη δο μή της εγγρ α φ ή ς σ το βήμα 2, υ πολογίσα με το σ υνολικό άθροισ μ α του εύρους των πεδίων ίσ ο με 34. Αν δεν πρ οσ διορ ίσ ου με εμείς το μήκος της εγγρ α φ ή ς σ τη ν εντολή O P E N , η B A SIC θα υποθέσει αυτόματα μ ήκος εγγρ α φ ή ς ίσο με 128. Κ αι αυτό σ τη ν περίτπω σ ή μας αποτελεί μεγάλη σπατάλη του διαθέσιμου χώ ρου σ το δίσκο. Αν φορτώ σουμε τη B A SIC και πλ ηκ τρ ολογή σ ουμ ε τις δύο παραπά νω γραμμές προγράμματος, ακριβώ ς όπω ς τις βλέπουμε, μπορούμε μετά να τις σώσουμε σ ε A SC II πληκ τρ ολογώ ντας τη διαταγή: SAVE "OPENFILE.BAS",A
Τώρα έχουμε ένα μικρό πρόγραμμα που λέγεται O P E N F IL E .B A S αποθηκευμένο στο δίσκο. Γ ράφ οντας “ ,Α ” το κάναμε ν ’ αποθηκευτεί σε A S C II, πράγμα που θα φανεί πολύ β ολικ ό στη συνένω ση. Τώρα, θα α ναπτύξουμε μια υπορουτίνα που θα γρ ά φ ει μια εγγρα φ ή σ το αρ χείο δε δομένων. Α λλά πρώτα, ας κάνουμε το πρόγραμμα αυτό ένα νέο πρ ό γραμμα πληκτρολογώ ντας: NEW
Τώρα θα πληκ τρ ολογή σ ουμ ε τη ν υπορουτίνα μας ως εξής:
86
1000 1010 1020 1030 1040 1050 1060 1070
REM * * * * * * * * * * * * * * Write record number REC% to SALES.DAT LSET F1$-CODE$ LSET F2$-PERSONS RSET F3$-MKI$(QTY%) RSET F4$-MKS$(AMOUNT) LSET F5$«DAT$ PUT #1,REC% RETURN
1000 REM
.........................Γράψιμο της εγγρ α φ ή ς υπ' αριθμόν R E C % στο S A L E S .D A T
και Οα την σώσουμε σε A SC II με τη διαταγή: SAVE "WRITEREC.BAS",A 4 --------1
Η W R IT E R E C είναι μια υπορουτίνα που τοποθετεί με LSET τα α λ φ αριθμη τικά C O D E S , PERSO N S και DATS στα αρμόζοντα πεδία και με R SET τα αριθμ ητικά Q T Y % και A M O U N T στα δικά τους πεδία, κάνοντας και τις απαρα ίτητες μετατροπές. Α φού τοποθετήσ ει τις τιμές σ τη ν προσ ω ρινή μνήμη, η υπορουτίνα τοποθετεί την εγγρα φ ή σ τη ν βάση δεδομένων, σ αν εγγρα φ ή υ π’ αριθμόν R E C % . Η R E C % είναι η μ εταβλητή που θα χρ η σ ιμ οποιή σ ουμ ε για να αποδόσουμε τις εκάστοτε τιμές στα πεδία από τα προγράμματα. Μ ια και έχουμε υπορουτίνα, η τελευταία γραμμή είναι R E T U R N . Π ολλά προγράμματα θα χρ εια σ τούν τη δυνατότητα να διαβάζουν εγ γραφ ές και από τη βάση δεδομένω ν SA LES. Έ τ σ ι πρέπει να φ τιάξου με μια ρουτίνα και γ ι’ αυτό. Γ ια να βγάλουμε την W R IT E R E C από τη RAM πρέπει να πληκ τρ ολογή σ ουμ ε τη διαταγή: NEW 0 THEN REC% - DEL%(NO.DEL%): NO.t>EL% - NO.DEL% - 1:OW% - - 1
Η γραμμή 104 λέει ότι, αν δεν υπάρχουν στο α ρ χείο δεδομένων εγγρα φές σημαδεμένες για απ αλοιφ ή , τότε ο αριθμός εγγρ α φ ή ς για τα νέα ει σερχόμενα δεδομένα θα είναι αυτός τη ς τελευταίας εγγρ α φ ή ς στη βά
138
ση δεδομένων. Επομένως, θα προστεθούν νέα δεδομένα. Η γραμμή 105, από την άλλη , λέει ότι αν υπάρχουν εγγρα φ ές σημαδεμένες για απα λ ο ιφ ή , τότε ο αριθμός εγγρ α φ ή ς για τα νέα δεδομένα πρέπει να παρθεί από τον πίνακα D E L % (R E C % = D E L % (N O .D E L % )). Στο παράδειγμά μας, τα πρώ τα νέα δεδομένα, που θα εισ αχθούν, θα γραφ τούν πάνω από την εγγρα φ ή 5, σβ ήνοντάς την, γιατί η N O .D E L % είναι μεγαλύτερη από μηδέν (είναι δύο). Έ τ σ ι η R E C % έ χει τιμή D E L % (2 ), που αν τισ το ιχεί σ τη ν εγγραφή 5. Ε πίσ ης, η γραμ μή 105 αφ α ιρεί 1 από τη N O .D E L % , μια και τώρα μειώθηκε κατά ένα ο αριθμός των εγγραφώ ν που πρέπει να σ θ ησ τού ν από τη θάση δεδο μένων. Επιπλέον, θέτει τη μεταβλητή O W % ίση με -1, που σ ημ αίνει «αληθές», μια και άλλα μέρη του προγράμματος θα πρέπει να ξέρουν, αν έχει σ θ η σ τεί μια εγγρα φ ή ή όχι. Ο ι επόμενες λίγ ες γραμμές του προγράμματος A P P E N D μένουν αμε τάβλητες. Αυτές, απλώ ς, ζη τούν τα δεδομένα απ’ την οθόνη και μετά γράφ ουν τα δεδομένα σ τη ν εγγρα φ ή R E C % (G O SU B 1000). 110 120 130 140
CLS PRINT " Record Number ";REC% •PRINT " Enter 0 as code to exit" PRINT
150 160 170 180 190 200
INPUT " Enter Product Code ";CODE$ IF CODES- "0 " THEN 260 INPUT " Enter Salesman ";PERSON$ INPUT " Enter Quantity ";QTY INPUT " Enter Amount ";AMOUNT INPUT " Enter Date ";DAT$
210 220
REM ο * * * * * * * * * * * * * * * * * * * * * * GOSUB 1000 :REM write record number rec%.
120 130 150 170 180 190 200
PR IN T PR IN T PR IN T IN P U T IN P U T IN P U T IN P U T
"Αριθμός ε γ γ ρ α φ ή ς "^ Ε Ο % "Δώστε 0 για έξοδο" "Δώστε κω δικό προϊόντος";(ΓΟΟ Ε$ "Δώστε όνομα K(uXnTJi";PERSON$ "Δώστε ποσότητα";Ο Τ Ύ % "Δώστε χρη μ . ito a0 v ”;A M O U N T "Δώστε η μερομηνία";Ο Α Τ $
210 REM · · · * · · · · · · « · · · * · * · · · · · · · · · · · 220 G O SU B 1000:REM γράψ ιμο αριθμού ε γγρ α φ ή ς rec%
Σ ώσιμο νέων δεδομένων
Η υπορουτίνα 1000 γρ άφ ει πάντοτε τον αριθμό τη ς εγγρ α φ ή ς R E C % και η τιμή τη ς καθορίζεται προηγουμένω ς, από τη ν απόφ ασ η αν θα γ ί νει προσ θήκη εγγρ α φ ή ς ή γράψ ιμο πάνω σε μια ήδη υπάρχουσα. Στην περίπτω σή μας, έγινε γράψ ιμο πάνω σ τη ν εγγρα φ ή 5, για τί στη γραμμή 105 είχε τεθεί η R E C % ίση με 5. Τώ ρα το πρόγραμμα πρέπει να πάρει
139
μια σ ημ αντική απόφ ασ η. Αν η νέα εγγρα φ ή έχει γρ α φ τεί πάνω σε μια ήδη υπάρχουσα, αυτό δεν επηρέασ ε την τελευταία εγγρα φ ή . Δ ηλαδή, η νέα εγγρα φή παρεμβλήθηκε, κι έτσ ι το α ρ χείο μας εξακολουθεί να πε ριλαμβάνει 10 εγγραφές. Αν, όμως, η νέα εγγρα φ ή έχει προσ τεθεί στο τέλος του αρχείου υ πάρχει μια νέα εγγρα φ ή και, επομένως, πρέπει να αυξηθεί κατά ένα ο αριθμός της τελευταίας εγγρ α φ ή ς του α ρχείου δε δομένων. Η γραμμή 230 πα ίρνει αυτή τη ν απόφ αση. 225 REM Η not overwriting a delete, increment last rec #. 230 IF NOT OW% THEN LAST.REC% - LAST.REC% + 1 235 OW %- 0 :REM * * * * * * * * * * * reset overwrite flag (OW%) to false. 240 GOTO 104____________________________________________________________ 225 REM Αν δεν σβ ή νεται μια εγγρ α φ ή , αυξάνει κατά ένα ο αριθμ ός τη ς τελευταίας εγ-
Υραφής 235 O W % = 0 :R E M · » · · * ·
επαναφορά τη ς σ η μ α ία ς α πα λ ο ιφ ή ς (O W % ) στο ψευδές
Χ ρησιμοποιούμε τη μεταβλητή O W % σ ’ αυτό το πρόγραμμα σαν «σημαία» που απ οφ ασ ίζει, αν έχουμε ή ό χ ι γράψ ει πάνω σε μια υπάρ χουσ α εγγραφή. Α ν ναι, η O W % παίρνει τιμή -1 («αληθής»). Η γραμ μή 230 λέει ότι, αν δεν έχει γίνει γράψ ιμο πάνω σε υπάρχουσα εγγρα φή, τότε ο αριθμός εγγρ α φ ή ς τη ς τελευταίας εγγρ α φ ή ς του α ρχείου αυ ξάνει κατά ένα. Η γραμμή 235 θέτει τη σ ημ αία O W % και πά λι ίση με μηδέν («ψευδής») και μετά η γραμμή 240 επ ισ τρ έφ ει τον έλεγχο στη γραμμή 104, όπου ξ α να ρχίζει η όλη δ ια δ ικ α σ ία λή ψ η ς τη ς απ όφ ασ ης από την αρχή. Το υ πόλοιπο του προγράμματος A P P E N D μένει αμετά βλητο. - Έ να πλεονέκτημα της μεθόδου αυτής είνα ι ότι δεν χρ ειά ζετα ι πολύς χρ ό ν ο ς για ν’ απαλλαγούμε από τις απαλειφόμ ενες εγγραφές. Το πρ ό γραμμα E D IT βάζει απλώ ς ένα σ ημάδι μπροστά σ τις εγγραφές. Το μειονέκτημα της μεθόδου αυτής είναι ότι είναι κάπω ς αφ ηρη μένη και δύσκολη σ τον προγραμματισμό τη ς μέχρι να πιάσετε καλά το νόημα.
Στοίβαγμα των Απαλειφόμενων Εγγραφών Μ ια ενα λλακτική πρ οσ έγγιση στα παραπάνω θα ήταν να προστεθεί στο πρόγραμμα E D IT μια ρουτίνα που να απαλείφ ει όλες τις εγγρα φές από το αρ χείο δεδομένων, όταν ολοκλη ρω θεί η διόρθω ση. Ε ίναι μέθο δος δαπανηρή σε χρόνο, αλλά ευκολότερη σ τον προγραμματισμό της και σ τη ν α π οκω δικ οποίησ η των λαθών, σε περίπτω ση που συμθούν λάθη πλ η κ τρ ολόγη σ η ς. Θα σας δείξω μια ρουτίνα, που το κάνει αυτό, σ την οποία έχω βάλει μεγάλους αριθμούς γραμμών, έτσ ι που, αν θέλε τε, μπορείτε να την χρ η σ ιμ οποιή σ ετε στο πρόγραμμα E D IT . Για να
140
την χρ η σ ιμ οποιή σ ετε, πρέπει σ το πρόγραμμα E D IT να πρ οσθέσετε τη γραμμή 385 που έχει ως εξής: 385 GOSUB 8000
:REM Pack deleted records.
385 G O SU B 8000 :R EM Σ τοίβαγμα α παλειφόμ ενω ν εγγραφώ ν
Μ ε τη μέθοδο αυτή όλες οι εγγραφές, που έχουν σημαδευτεί για απα λοιφ ή , απομακρύνονται α π ’ το αρ χείο δεδομένων π ρ ιν φ ύγουμε από το πρόγραμμα E D IT . Θα πρέπει, θέθαια, να προσ θέσ ετε την υπορουτίνα που σ τοιβάζει τις απαλειφόμ ενες εγγρ α φ ές και που έχει ως εξής: 8000 REM * * * * * * * * * * * * * * * * * * * * * * * * * Pack deleted records. 8010 CLS 8020 PRINT " Removing deleted records..." 8030 FOR REC% - 1 TO 10000 8040 GOSUB 2000 : REM read record # rec%. 8050 IF LEFT$(CODE$,1) - "0 " THEN 8160 8060 IF LEFT$(CODE$,1) < > " * " THEN 8150 8070 REM * * * * * * * * * * * * * * * * Move all records below up one notch. 8080 TEMP% - REC% 8090 FOR l% - TEMP% TO 10000 8100 REC% - 1% + 1tGOSUB 2000 8110 REC% - l%:GOSUB 1000 8120 IF LEFT$(CODE$.1)-"0" THEN 8140 8130 NEXT l% 8140 R EC % «TE M P % -1 8150 NEXT REC% 8160 RETURN 8000 8020 8040 8070
R E M . . · » * · · · · · · · · · · · . · · · Σ τοίβαγμα απαλειφόμενω ν εγγραφώ ν PR IN T " Απομάκρυνση απαλειφόμενω ν εγγραφώ ν" G O SU B 2000 :R EM ανάγνωση εγγρ α φ ή ς # rec % R E M · Μ ετα κίνη ση όλων των επόμενων εγγραφώ ν κατά μια θέση προς τα πάνω
Ο ι γραμμές 8010 και 8020 απλώ ς καθαρίζουν την οθόνη και τυπώ νουν το μήνυμα «Α πομάκρυνση απαλειφόμενω ν εγγραφώ ν...» σ τη ν ο θόνη. Η γραμμή 8040 αρ χ ίζει ένα βρ όχο που διαβάζει κάθε εγγραφή του αρχείου. Η γραμμή 8050 ελέγχει, αν φτάσαμε στο τέλος του α ρ χ εί ου δεδομένων και, αν ναι, περνάει τον έλεγχο στη γραμμή 8160, η ο ποία τερματίζει τη ν υπορουτίνα. Η γραμμή 8060 ελέγχει αν μια εγγρα φή έχει σημαδευτεί για απ αλ οιφ ή . Α ν ό χι, απλώ ς περνάει τον έλεγχο στη διαταγή N E X T R E C % (γραμμή 8150), η οποία σ υνεχίζει το β ρόχο διατρέχοντα ς το α ρ χείο δεδομένων. Αν η εγγρα φ ή έχει σημαδευτεί για απ αλοιφ ή , περνάμε στη γραμμή 8070. Η γραμμή 8080 αποθηκεύει τον αριθμό της εγγρ α φ ή ς, που είχε σημαδευτεί για α π αλ οιφ ή , σε μια μετα βλητή με όνομα Τ Ε Μ Ρ % . Τότε, η γραμμή 8090 ξεκινάει έναν βρόχο, που α ρ χίζει από την εγγρα φ ή που έχει σημαδευτεί (Τ Ε Μ Ρ % ). Σ η μειώστε ότι η μεταβλητή 1% είναι η μεταβλητή - μ ετρητής του βρόχου.
141
Η γραμμή 8100 φέρνει στη R A M τη ν εγγρα φ ή που είναι κάτω από τη σημαδεμένη, θέτοντας τον αριθμό εγγρ α φ ή ς ίσ ο ν μ’ αυτόν τη ς επό μενης εγγρ α φ ή ς (Ι % + 1). Μ ετά, η γραμμή 8110 αποθηκεύει τα δεδομέ να της εγγρ α φ ή ς αυτής στη θέση τη ς σημαδεμένης, θέτοντας τον αρ ιθ μό εγγρ α φ ή ς ξανά ίσ ον με 1%. Καθώς σ υνεχίζετα ι ο β ρόχος, διαβάζει την εγγρα φ ή 1%+1 και την βάζει σ τη ν εγγρα φ ή 1%. Μ ’ αυτό τον τρ ό πο, όλες οι εγγρα φ ές του αρχείου μετακινούνται κατά μια θέση προς τα πάνω. Η γραμμή 8120 ελέγχει μήπω ς φ τάσαμε στο τέλος του αρχείου δεδομένων. Α ν ναι, περνάει τον έλεγχο στη γραμμή 8140, η οποία θέτει τον αριθμό εγγρ α φ ή ς, για το επόμενο πέρασμα του βρόχου, ίσο με την α ρ χική τιμή της R E C % μείον ένα. (Ε φ όσ ον όλες οι εγγρα φές του α ρ χείου δεδομένω ν έχουν μ όλις ανεβεί κατά μια θέση προς τα πάνω, ο β ρόχος που διατρ έχει το αρ χείο δεδομένω ν πρέπει να σ υνεχισ τεί με α ριθμό εγγρ α φ ή ς μειωμένο κατά ένα). Η διαδικ ασ ία αυτή σ υνεχίζετα ι μ έχρι που ο εξω τερικός β ρόχος (F O R R E C % ) να αναλύσει όλες τις εγγρα φ ές του α ρχείου και να πρα γμ ατοποιήσ ει τη ν εργασ ία τη ς «προς τα πάνω μ ετακ ίνησ ης κατά μια θέση» για όλες τις απαλειφόμ ενες εγγραφές. Α ν διαλέξετε να χ ρ η σιμοπ οιήσ ετε τη ν υπορουτίνα 8000 στο πρόγραμμα E D IT , δεν χρ ειά ζε ται να κάνετε καμιά αλλα γή σ το α ρ χικό πρόγραμμα A P PE N D . Στο επόμενο κεφ άλαιο, θα σ υζητήσουμε τεχ νικ ές τα ξινόμ η σ η ς δεδο μένων σε α ρ χεία τυχαίας προσ πέλα σ ης.
142
Οι ρουτίνες ταξινόμησης είναι συνήθως περίπλοκες και δύσκολες σ την απομνημόνευση. Έ τσ ι, συνήθω ς γράφουμε και ελέγχουμε μια φ ορά μια ρουτίνα τα ξινόμ ησ ης «γενικ ής χρ ή σ η ς» και τη ν αποθηκεύ ουμε σαν υπορουτίνα που μπορεί μετά να χρ η σ ιμ ο π ο ιη θ εί σε πολλές και διάφ ορες περιπτώ σεις. Για το θέμα τη ς τα ξινόμ η σ η ς έχουν γρ α φ τεί ολόκ λη ρ α β ιβ λία και υπάρχουν διάφ ορες ρουτίνες που χρ η σ ιμ ο ποιούνται, σ χετικ ά τακτικά. Θα εξετάσουμε δύο α π’ τους πιο διαδεδο μένους αλγόριθμους τα ξινόμ ησ ης, τη ν τα ξινόμ ησ η με τη μέθοδο της φ υσ αλίδας (bubble sort) και την τα ξινόμ ησ η Σελ-Μ έτσνερ (Shell-M etzner sort).
Αλγόριθμοι Ταξινόμησης Ο πιο γνω στός αλγόριθμος τα ξινόμ ησ ης είναι, ίσω ς, η ταξινόμ ησ η φ υσ αλίδας (bubble sort). Το όνομά του προέρχεται απ’ το γεγονός ότι ταξινομεί τα δεδομένα φ έρνοντας τα μ ικρότερα σ το ιχεία ενός πίνακα σ τη ν κορυφή. Έ χ ε ι την εξής μορφή: 5000 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 5010 F % - - 1 5020 WHILE F% 5030 F % - 0 5040 FOR l% - 1 TO NO.OF.ITEMS% -1 5050 IF SRT${I%)>SRT$(I% + 1) THEN SWAP SRT$(I%), SRT$(I% + 1):F% - - 1 5060 NEXT l% 5070 WEND 5060 RETURN 5000 R E M
· · * · · · · · · · · · « · · · · · · · · · · · · * ·
bubble sort
Τ α ξινό μ η ση φυσαλίδας
Π ροσέξτε ότι δώσαμε στη ρουτίνα αριθμούς γραμμώ ν που είναι σ την π ερ ιοχή του 5000, μια και μάλλον θα τη χρ η σ ιμ οποιή σ ουμ ε σαν υπο ρουτίνα. Γ ια να τη ν ελέγξουμε, πρέπει να δημιουργήσουμε ένα πίνακα (array) με α λ φ αρ ιθμη τικές μεταβλητές, SflT$. Μ ετά, με G O S U B 5000 ταξινομούμε τον πίνακα και ακολουθεί μια ρουτίνα που παρουσιάζει σ τη ν οθόνη τα περ ιεχόμενα του πίνακα SRTS ύστερα α π’ τη ν ο λ ο κ λ ή ρωση της τα ξινόμ ησ ης. Ν α ένα πρόγραμμα, που ελέγχει τη ν τα ξινόμ η ση φ υσαλίδας: 10 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * Test the bubble sort. 20 DIM SRT$(10) 30 DATA Fred.Zeppo.Lisa.Wendy.Bob.Alan.Scott.Dave.John.Billy
145
40 REM * * * * * * * * * * * * * * * * * * * * * * Read names into SRT$ array. 50 FOR l% - 1 TO 10 60 READ SRT$(I%) 65 PRINT SRT$(I%) 70 NEXT 1% 80 NO.OF.ITEMS% ■ 10 90 GOSUB 5000: REM Sort into proper order. 100 REM * * * * * * * * * * * * * * * * * * * * * * * * * * Display sorted items. 105 PRINT:PRINT "Sorted data...":PRINT 110 FOR l% - 1 TO 10 120 PRINT SRT$(I%) 130 NEXT l% 140 STOP 5000 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * bubble sort 5010 F % - - 1 5020 WHILE F% 5030 F % - 0 5040 FOR 1% - 1 TO NO.OF.ITEMS% - 1 5050 IF SRT$(I%)>SRT$(I% + 1) THEN SWAP SRT$(I%), SRT$(I% + 1):F % --1 5060 NEXT m 5070 WEND 5080 RETURN 10 R E M ..................... Έ λ ε γχ ο ς τη ς τα ξινό μ η σ η ς φυσαλίδας 40 R E M ......................... Α νάγνω ση ονομάτω ν στον πίνακα SRTS 90 G O SU B 5000: R E M Τ α ξινό μ η ση στη σω στή σειρά 100 R E M ................. Π α ρουσία ση των ταξινομημένω ν σ το ιχείω ν 105 P R IN T :P R IN T 'Τ α ξινο μη μ ένα δεδομένα...":PR IN T 5000 R E M . · · · · · · · · · · · · · · · · · · · · · · · · · · Τ α ξινό μ η ση φυσαλίδας
Για να κάνετε τον έλεγχο, απλώ ς π λ η κ τρ ο λο γή σ τε R U N ύστερα α π ’ την εισαγω γή του προγράμματος, οπότε σ τη ν οθόνη θα πρέπει να δεί τε: Fred Zeppo Lisa Wendy Bob Alan Scott Dave John Billy Τ α ξινομημένα δεδομένα... Alan Billy Bob Dave Fred
146
John Lisa Scott Wendy Zeppo
Me την ολοκ λή ρω σ η της τα ξινόμ ησ ης, τα ονόματα έχου ν έρθει σε αλ φ αβ ητικ ή σειρά. Η τα ξινόμ ησ η φ υσ α λίδας μπορεί να χρ η σ ιμ ο π ο ιη θ εί και με α ρ ιθ μούς. Γ ια να γίνει αυτό, πρέπει να αλλάξετε τη μεταβλητή SRTS σε S R T ή SR T% (αν όλο ι οι αριθμοί είναι ακέραιοι). Ν α ένα πρόγραμμα, που ταξινομεί μια ομάδα αριθμών: 10 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * Test the bubble sort. 20 DIM SRT(10) 30 DATA 14,1,1.01,1.02,0,-1,14.3,8,11.1,-2 40 REM * * * * * * * * * * * * * * * * * * * * * * * Read names into SRT array. 50 FOR l% - 1 TO 10 60 READ SRT(I%) 65 PRINT SRT(I%) 70 NEXT l% 80 NO.OF.ITEMS%-10 90 GOSUB 5000: REM Sort into proper order. 100 105 110 120 130 140
REM * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT:PRINT "Sorted data...":PRINT FOR l% - 1 TO 10 PRINT SRT(I%) NEXT l% STOP
5000 5010 5020 5030 5040 5050 5060 5070 5080
Display sorted items.
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * bubble sort F % « -1 WHILE F% F % -0 FOR l% - 1 TO NO.OF.ITEMS% - 1 IF SRT(I%) > SRT(I% + 1) THEN SWAP SRT(I%),SRT(I% + 1):F % - - 1 NEXT l% WEND RETURN
10 R E M · . · · · · · · · · · · · · . · . · · . · Έ λ ε γχ ο ς τη ς τα ξινό μ η σ η ς φυσαλίδας 40 REM . « * « * · · * » » · » · » · · · · . · Α νάγνω ση ονομάτω ν στο ν πίνακα SRT 90 G O SU B 5000: REM Τ α ξινό μ η ση στη σω στή σειρά 100 REM · · · · · · · · · · · · · · · · · Π αρουσίαση των ταξινομημένω ν σ το ιχείω ν 105 P R IN T :P R IN T 'Τ α ξινο μη μ ένα δεδομένα...":PR IN T 5000 R E M
. · · « · · · * · · * · » · . · » · « · · » . . . . .
Τ α ξινό μ η ση φυσαλίδας
Α ν και αυτό δεν φ αίνετα ι καθαρά όταν ταξινομ ούνται μικρές ομάδες δεδομένων, η μέθοδος της φ υσ αλίδας είναι πολύ αργή. Ό τ α ν μάλιστα
147
τα προς τα ξινόμ ησ η σ το ιχεία είνα ι πάνω από 100, γίνετα ι απαράδεκτα αργή. Μ ια καλύτερη και πολύ πιο γρ ή γορη μέθοδος τα ξινόμ ησ ης δε δομένω ν είναι ο α λγόριθμος Σελ-Μ έτσνερ. Η μέθοδος Σ ελ-Μ έτσνερ δουλεύει με διαδ οχικά βήματα. Μ ια τα ξινόμ ησ η που για να ολοκ λη ρ ω θεί με τη μέθοδο της φ υσ α λίδας θα χρ εια ζότα ν πάνω από μια ώρα, μπο ρεί σ υχνά να πρα γμ ατοποιηθεί μέσα σ ’ ένα λεπτό με τη μέθοδο ΣελΜ έτσνερ. Ό μ ω ς, η τα ξινόμ ησ η κατά Σ ελ-Μ έτσνερ είναι λίγ ο πιο π ο λύπλοκη. Αν πρόκειται να την πλ ηκ τρ ολογή σ ετε, δώστε προη γουμ έ νως τη διαταγή N E W , ώστε να μην μπερδευτεί με τη μέθοδο τη ς φ υσ α λίδας. Έ χ ει λ οιπ όν ως ε ξ ή ς : ' 5000 5010 5020 5030 5050 5060 5070 5080 5090 6000 6030 6040 6050 6060 6070 6080 6090
REM * * * * * * * * * * * * * * * * * * * * * * * * * * Shell-Metzner sort. Μ% ■ NO.OF.RECORDS% Μ% - ΙΝΤ(Μ%/2) IF Μ % «0 THEN 6080 Κ% - NO.OF.RECORDS% - Μ% J % -1 l% - J % L% - Ι% + Μ% IF SRT$(I%) < - SRT$(L%) THEN 6050 SWAP SRT$0%),SRT$(L%) l% = l% -M % IF l% > 0 THEN 5080 J% »J% + 1 IF J% >K% THEN 5020 GOTO 5070 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * Done with sort. RETURN
5000 REM 6080 REM
Τ α ξινό μ η ση Σελ-Μ έτσνερ · * « · « » » « « ♦ ♦ « « ♦ » ♦ « « ♦ ♦ ♦ ♦ » » ♦ ♦ ♦ ♦ ♦ Τ έλο ς τα ξινό μ η ση ς
Η παραπάνω ρουτίνα δεν είναι απ’ αυτές που μπορεί κανείς να απομνημονεύσει, γ ι’ αυτό καλό είναι να τη ν πλ η κ τρ ολογή σ ετε και να τη σώ σετε για μ ελλοντική χρ ή σ η . Μ πορείτε να την ελέγξετε με τη ν ίδια μέθοδο που χρ η σ ιμ οποιή σ α μ ε για τον έλεγχο τη ς τα ξινόμ η σ η ς φ υσ α λίδας. Π λ ηκτρολ ογήσ τε λ οιπ όν τις γραμμές 10-140: 10 REM * * * * * * * * * * * * * * * * * * * * * * * Test the Shell-Metzner sort. 20 DIM SRT$(10) 30 DATA Fred,Zeppo,Lisa,Wendy,Bob,Alan,Scott,Dave,John,Billy 40 REM * * * * * * * * * * * * * * * * * * * * * * Read names into SRT$ array. 50 FOR l% « 1 TO 10 60 READ SRT$(I%) 70 NEXT 1% 80 NO.OF.RECORDS% -1 0 90 GOSUB 5000: REM Sort into proper order. 100 REM * * * * * * * * * * * * * * * * * * * * * * * * * * Display sorted items. 110 FOR l% - 1 TO 10 120 PRINT SRT$(I%)
148
130 NEXT l% 140 STOP 5000 REM * * * * * * * * * * * * * * * * * * * * * * * * * * 5010 M% - NO.OF.RECORDS% 5020 M% - INT(M%/2) 5030 IF M % -0 THEN 6080 5050 K% - NO.OF.RECORDS% - M% 5060 J % - 1 5070 l% - J % 5080 L% - l + Μ»Λ> 5090 IF SRT$(I%) < - SRT$(L%) THEN 6050 6000 SWAP SRT$(I%). SRT$(L%) 6030 l % - l% - M % 6040 IF l% > 0 THEN 5080 6050 J % - J % + 1 6060 IF J% > K % THEN 5020 6070 GOTO 5070 6080 REM * * * * * * * * * * * * * * Done with sort. 6090 RETURN
Shell-Metzner sort.
10 REM . . . . . . . . . . . . . . . . . . . . Έ λ ε γ χ ο ς τη ς τα ξινό μ η ση ς Σελ-Μ έτσνερ 40 R E M ................. · Α νάγνω ση ονομάτω ν στον πίνακα SRTS 90 G O SU B 5000: REM Τ α ξινό μ η ση στη σω στή σειρά Ι00 REM ......................... Π αρουσίαση των ταξινομημένων στο ιχείω ν 5000 REM ................. Τ α ξινό μ η ση Σελ-Μ έτσνερ 6080 REM ................. Τ έλ ο ς τα ξινό μ η σ η ς
Ό τ α ν τρέξετε το πρόγραμμα, θα πρέπει να δείτε σ τη ν οθόνη τα ο νό ματα σε α λ φ αβ ητικ ή σειρά. Οι γραμμές 10-140 είναι μεν χρ ή σ ιμ ες για τον έλεγχο τη ς μεθόδου, α π’ τη σ τιγμ ή όμως που είσ τε βέβαιοι ότι ο α λγόριθμος δουλεύει σω στά, πρέπει Ο Π Ω Σ Δ Η Π Ο Τ Ε να σ β ήσ ετε τις γραμμές αυτές με τη δια ταγή: DELETE 1 0 -14 0 « --------1
Ο πότε απ’ τη ν τα ξινόμ ησ η Σελ-Μ έτσ νερ δεν θα μείνει παρά μια υπο ρουτίνα ονόματι S M SO R T .B A S , την οποία μ πορείτε να σώ σετε με: SAVE "SMSORT.BAS",A 4 --------1
Και πάλι τη σώσαμε με την επιλ ογή Α, έτσ ι που να μπορεί να συνενω θεί σε άλλα προγράμματα, όταν τη χρειαστούμε. Έ ν α ς α λγόριθμος τα ξινόμ η σ η ς μ πορεί να τοποθετήσ ει τα σ το ιχεία ενός πίνακα σ τη σω στή σ ειρά αλλά για τη ν τα ξινόμ ησ η των εγγραφώ ν μιας βάσ ης δεδομένων χρ ειά ζοντα ι και μερικά ακόμα βήματα.
149
Ταξινόμηση τον Αρχείου Δεδομένων Υ πάρχουν πολλές μέθοδοι που μ πορείτε να χρ η σ ιμ ο π ο ιή σ ετε για τη ν τα ξινόμ ησ η μια βάσ ης δεδομένων. Ίσ ω ς η πιο απλή και άμεση εί ναι να τρ οπ οποιήσ ετε απλώ ς τον α λγόριθμο Σελ-Μ έτσνερ. Αν θέλουμε να καθορίσουμε το αν θα εναλλάξουμε ή ό χι τη θέση δύο εγγραφώ ν, το πρόγραμμα μπορεί να συγκρ ίνει τα πεδία δύο εγγρα φώ ν αντί για τα δύο σ το ιχεία ενός πίνακα. Μ ια τροπ οποιημ ένη έκδοση της μεθόδου Σ ελ-Μ έτσνερ, ικανή να τα ξινομεί ολόκ λη ρ ες εγγραφές, έχει ως εξής (υποθέτουμε πάντοτε ότι η υπορουτίνα 1000 γράφ ει τη ν εγγρα φ ή υπ’ αριθμόν R E C % από ένα αρ χείο δεδομένων και ότι η υπορουτίνα 2000 διαβάζει τη ν εγγρα φ ή υ π’ α ριθμόν R E C % από το αρ χείο δεδομένων): 5000 5010 5020 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200
REM * * * * * * * * * * * * * * * * * * * * * * * * Start Shell-Metzner sort M%-NO.OF.RECORDS% M % -INT(M % /2) IF M % -0 THEN 5270 K% - NO.OF.RECORDS% - M% J % -1 l% - J % L % -I% + M REM * * * * * * * * * * * * * * * * * * * * * * Get records for comparison R EC% -l% :GOSUB 2000 :REM get record # rec% SR T1$- CODES REC%-L%:GOSUB 2000: REMget record # rec% SRT2S- CODES IF SRT1$< -SRT2S THEN 5240 REM * * * * * * * * * * * * * * * * * * * * * * * Set up temporary data. T1 $ - CODES:T2$ - PERSON$:T3% - QTY%:T4 - AMOUNT:T5S - DATS REC% - l%:GOSUB 2000 :REM read data from l% record. REC%-L%:GOSUB 1000 :REM put record l% data in record L%. REM * * * * * * * * * * * * * * * * * * * * * * * * * Use temp variables. CODES -T1S:PERSONS - T2$:OTY% - T3%: AMOUNT T4:DAT$-T5$ 5210 REC% -l% :GOSUB 1000 : REM put temp data into record l%. 5220 l% - l% - M % 5230 IF l% > 0 THEN 5080 5240 J% » J% +1 5250 IF J% > K % THEN 5020 5260 GOTO 5070 5270 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * Done with sort. 5280 RETURN
................................... Έ να ρ ξη τα ξινό μ η σ η ς Σελ-Μ έτσνερ 5000 RE M 5090 REM ................................... Α νάγνω ση των εγγραφώ ν για σύγκριση 5 100 R E C % = >Sl Η 2(K)0:REM Α νάγνω ση ε γγρ α φ ή ς υπ' αρ. rcc%
150
5120 5150 5170 5180
R E C % = L % :G O S U B 2000:R EM Α νάγνω ση ε γγρ α φ ή ς υπ’ αρ. rec% R E M · · · » · · · « . . . * . * · . . » » · Τ οποθέτη ση προσω ρινώ ν δεδομένων R E C % = I% :G O SU B 2000: R E M Α νάγνω ση δεδομένων από την εγγρα φή 1% R E C % = L % :G O S U B 1000:R E M Τ ο πο θέτη ση των δεδομένων τη ς ε γγρ α φ ή ς 1% στη ν εγγραφή L% 5190 R E M · · · · . · · · · · « · » · » » . . ♦ . · · Χ ρήση προσω ρινώ ν μ εταβλητώ ν 5210 R E C % = I% :G O S U B 1000:REM Τ ο πο θέτη ση προσω ρινώ ν δεδομένων στη ν εγγρα φή 1% 5270 R E M · » * · * · » · · » · « > » « < « » « » * · * . · » * « . Τ έλο ς τα ξινό μ η ση ς
μεταβλητές (ΤΙ-Τ5) Ο αλγόριθμος αυτός σ υγκρίνει το πεδίο C O D ES της εγγρ α φ ή ς 1% με το πεδίο C O D ES τη ς εγγρ α φ ή ς υπ’ αριθμόν L % , όταν κάνει την τα ξι νόμ ησ η. Η γραμμή 5100 διαβάζει απ’ το α ρ χείο δεδομένων την εγγρ α φή 1% και η γραμμή 5110 αποθηκεύει το πεδίο C O D ES της εγγρ α φ ή ς αυτής σε μια μεταβλητή με όνομα SRT1S. Η γραμμή 5120 φ έρνει την εγγραφή L% από το αρ χείο δεδομένων και η γραμμή 5130 αποθηκεύει τη ν C O D ES αυτής της εγγρ α φ ή ς σε μια μεταβλητή με όνομα SRT2S. Η γραμμή 5140 σ υγκρίνει τις δύο C O D ES. Α ν είναι ήδη στη σω στή σ ειρά, οι θέσεις τους στη βάση δεδομένω ν δεν αλλάζουν. Αν η SRT1S είναι μεγαλύτερη από την SRT2S, οι δύο εγγρα φ ές ενα λλάσ σ ουν τη θέση τους μέσα στη βάση δεδομένων. Η εναλλαγή αυτή των θέσεων
151
Σχήμα 11.2: Τα περιεχόμενα της R A M μετά από την ανάγνωση της εγγραφής υπ' αρ. /%
L%. Αυτή τη στιγμή οι εγγραφές είναι πανομοιότυπες δεν μπορεί να γίνει α π ’ ευθείας με τη χρ ή σ η μιας διαταγής SW A P, 152
διότι πρόκειται για ολόκ λη ρ ες εγγρ α φ ές και ό χ ι απλώ ς για σ τοιχεία , γΓ αυτό γίνετα ι σε μερικά βήματα, σ τις γραμμές 5150-5210. Σ τη ν α ρ χή, στη γραμμή 5160, τα δεδομένα που είναι επί του πα ρόντος σ τη R A M (απ’ την εγγρα φ ή L % ) αποθηκεύονται σε μεταβλητές (Τ1$, Τ2$, Τ3%, Τ4 και Τ5$). Η R A M και το αρ χείο του δίσκου έχουν την εικόνα του Σ χήμα τος 11.1. Μ ετά η γραμμή 5170 φ έρνει στη R A M τη ν εγγρα φ ή 1%, κΓ έτσ ι τώ ρα η R A M και το αρ χείο του δίσκου είναι όπω ς σ το Σ χήμ α 11.2. Ύ σ τερ α η γραμμή 5180 γρ άφ ει τα δεδομένα της εγγρ α φ ή ς υπ’ αρ ιθ μόν 1% σ τη ν εγγρα φ ή L % . Στο σ ημ είο αυτό οι δύο εγγρα φ ές περ ιέ χου ν τα ίδια ακριβώ ς δεδομένα, όπω ς φ αίνετα ι στο Σ χήμ α 11.3. Το επόμενο βήμα σ τη ν ενα λλαγή είναι να πάρουμε τα δεδομένα από τις προσ ω ρινές μ εταβλητές τη ς R A M και να τα αποδώ σουμε σ τις μετα βλη τές των πεδίω ν τω ν εγγραφώ ν, πράγμα που γίνετα ι στη γραμμή 5200 όπως δείχνει και το Σ χήμ α 11.4. Ύ σ τερ α η γραμμή 5210 γράφ ει αυτές τις εγγρα φ ές σ την εγγρα φή 1%. Στο σ ημ είο αυτό η εναλλαγή έχει ολοκλη ρω θεί, όπως δείχνει και το Σ χήμα 11.5. Τα δεδομένα στη R A M δεν επηρεάζονται, αλλά σύντομα θα σβηστούν, όταν γραφ τούν πάνω τους νέα δεδομένα, σ το επόμενο πέρασμα του αλγόριθμου τα ξινόμ ησ ης. Τα δεδομένα που είναι αποθηκευμένα στη R A M χρ η σ ιμ οποιού ντα ι απλώ ς σ αν προσ ω ρινή αποθήκευση για τη σ ύγκρισ η και, αν χρ εια σ τεί, τη ν εναλλαγή των εγγραφώ ν. Να, τώρα, ο λόκ λη ρ ο το πρόγραμμα τα ξινόμ η σ η ς για το σύστημα πω λήσεω ν. Το όνομά του είναι SO R T .B A S: 10 20 30 40
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SORT.BAS REM * * * * * * * * * * * * This is the version that 'physically' sorts records. OPEN "R",1,"SALES.DAT",34 FIELD #1,5 AS F1$,15 AS F2$,2 AS F3$,4 AS F4$,8 AS F5$
50 CLS 60 PRINT " Sorting........ 70 PRINT " (Please wait. I'll beep when I'm done.)" 80 REM * * * * * * * * * * * * * * * Count how many records in the data base. 90 FOR REC% - 1 TO 10000 100 GOSUB 2000 :REM read record # rec% 110 IF LEFT$(CODE$, 1) - "0 " THEN 130 120 NEXT REC% 125 REM * * * * * * * * * * * * * * * Note how many actual records in the file. 130 NO.OF.RECORDS% - REC% - 1 140 GOSUB 5000 : REM physically sort the records. 150 REM * * * * * * * * * * * * * * * 160 CLS :REM clear the screen.
Records are sorted, return to main menu.
153
RAM
Δ ίσ κος Α ποθήκευσ ης
CODE*- ΑΑΑ ·· PERSONS- 'Smith QTY% - 15 AMOUNT-234.56 DATES- 03/31 /84 ♦ T1S- AAA ·■ T2S-"Smith T3% - 15 T 4 -234.56 T5S- 03/31/64 ·
Σχήμα 11.4: Οι μεταβλητές τ v πεδίων παίρνουν νέες τιμές από προσωρινές μεταβλητές
RAM
Δίσκος Αποθήκευσης
CODES- ΑΑΑ ·· PERSONS · "Smith QTY%-15 AMOUNT-234.56 DATES- 03/31/64· TlS -A A A · T2S - "Smith · T3% -15 T 4 -234.56 T5S - "03/31/64··
Σχήμα 11.5: To αρχείο δεδομένων SA L E S.D A T μετά την ολοκλήρωση της εναλλαγής
170 BEEP:PRINT "Done sorting.. 180 CLOSE 1 190 CHAIN "SALES 1000 1010 1020 1030 1040 1050 1060 1070
REM * * * * * * * * * * * * * * * * * * * * * * * * * LSET F1$-CODES LSET F2S-PERSONS RSET F3S-MKIS(QTY%) RSET F4$-MKS$ K % THEN 5020 GOTO 5070 REM * * * * * * * * * * * * * * Done with sort. RETURN
) REM · · . » * · . * . · . .
η
Write one R/A record
Routine to read an R/A record
έκδοση αυτή ταξινομεί « φυσιολογικά » τις εγγραφές
155
60 PR IN T "Τ αξινόμηση..." 70 PR IN T "(Π αρακαλώ περιμένετε, θα ακούσετε το θόμ θο όταν τελειώσω)" 80 R E M Μ έτρημα των εγγραφώ ν που περ ιέχει η βάση δεδομένων 100 G O SU B 2000 :R EM ανάγνω ση τη ς ε γγρ α φ ή ς # rec % 125 R E M ............................ Σ ημείω σε πό σ ες είνα ι οι εν ενεργεία εγγρ α φ ές στο α ρ χείο 140 G O SU B 5000:R E M φυσικ ή τα ξινό μ η ση τω ν εγγραφώ ν 150 R E M * . » » « « . · . » Ο ι εγγρ α φ ές τα ξινομ ήθηκαν, επισ τρ ο φ ή στο κύριο μενού 160 CLS :R E M καθάρισμα τη ς οθόνης 170 B E E P :P R IN T 'Τ έ λ ο ς τα ξινόμησης..." 1000 R E M 2000 R E M
............................. » . » * « · . . »
Γ ράψιμο
μιας εγγραφής τυχαίας προσπέλασης
Ρουτίνα α νάγνω σης μιας ε γγρ α φ ή ς τυχα ία ς προσπ έλα ση ς
5000 R E M * · · · * · * * · · · · · · · · · · · · Έ να ρ ξη τα ξινό μ η σ η ς Σελ-Μ έτσνερ 5090 R E M Α νάγνω ση εγγραφώ ν για σύγκριση 5100 R E C % = I% :G O SU B 2000: R E M ανάγνω ση ε γγρ α φ ή ς υπ’ αρ. rec% 5120 R E C % = L % : G O SU B 2000: R E M ανάγνω ση εγγρ α φ ή ς υπ’ αρ. rec% 5150 R E M * ...................... » · · . « * » « . . . » Τ ο πο θέτη ση προσω ρινώ ν δεδομένων 5170 R E C % = I% :G O SU B 2000: R E M ανάγνω ση δεδομένων από τη ν εγγρα φή I % 5180 R E C % = L % :G O S U B 1000:REM τοποθέτησ η των δεδομένων τη ς ε γγρ α φ ή ς 1% στη ν L% 5190 R E M · * · · · « . · · « ♦ · » » . · . · . . . · Χ ρήση προσω ρινώ ν μ εταβλητώ ν 5210 R E C % = I% :G O SU B 1000:REM τοποθέτησ η προσω ρινώ ν δεδομένων στη ν εγγρ α φή 1% 5270 R E M · « · · · · · · · · · · · · · · · · · « · · · · · * · · · Τ έλο ς τα ξινό μ η σ η ς
Αν το σύστημα χρειά ζετα ι να τα ξινομ ήσ ει μια αριθμ ητική πο σ ό τη τα, όπω ς τις μ εταβλητές (ΤΪΎ % και A M O U N T , τότε για τη ν τα ξινό μηση πρέπει να χρ η σ ιμ οποιή σ ουμ ε μια μεταβλητή SR T% ή SRT. Γ ια παράδειγμα, αν θέλαμε το παραπάνω πρόγραμμα να τα ξινομ εί ανάλογα με τη ν ποσ ότητα (Ο Τ Υ % ) και ό χ ι με τον κω δικό του πρ οϊόντος, θα έ πρεπε ν ’ αλλάξουμε τις γραμμές 5110 μ έχρι 5140 ως εξής: 5110 SR T1% -QTY% 5120 REC%-L%:GOSUB 2000: REM get record # rec% 5130SR T2% -Q TY % 5140 IF SRT1%< -S R T 2% THEN 5240 5120 RF.C% = L % :G O S U B 2000:R E M ανάγνω ση ε γγρ α φ ή ς # rec %
Γ ια τα ξινόμ ησ η ανάλογα με το χρ η μ α τικ ό ποσ όν (A M O U N T ), θα έ πρεπε να γίνουν οι εξής αλλαγές: 5110 5120 5130 5140
156
SRT1 -AM OUNT R EC%-L%:GOSUB 2000: REM get record # rec SRT2-AMOUNT IF SRT1 < -S R T 2 THEN 5240
5120 R E C % = L % :G O SU B 2000:R EM ανάγνω ση ε γγρ α φ ή ς # rec %
Αυτή η τεχνική τα ξινόμ ησ ης έχει ορισμένα μ ειονεκτήματα. Γ ια πα ράδειγμα, είναι μάλλον αργή, διότι το πρόγραμμα πρέπει να π η γαίνει στο δίσ κο και να πα ίρνει εγγραφές, μάλλον συχνά. Αυτό μπορεί να ε πιταχυνθεί χρ η σ ιμ οποιώ ντας μια μέθοδο τα ξινόμ ησ ης που λέγεται ευρετηρ ιοπ οίησ η (indexing). Ε π ίσ η ς, το πρόγραμμα που είδαμε, απ’ τη δομή του επιτρέπει τα ξινόμ ησ η μόνο κατά ένα πεδίο. Μ ια καλύτερη πρ οσ έγγιση θα ήταν να σχεδιά σ ουμ ε μια ρουτίνα τα ξινόμ ησ ης γενικ ή ς χρ ή σ η ς, που θα μ πορεί να τα ξινομ εί σύμφω να με οποιοδήποτε πεδίο ή και κατά πολλα πλά πεδία, ώ στε να επιτρέπει τα ξινόμ ησ η μέσα σ την τα ξινόμ ησ η. Θα εξετάσουμε πρώ τα τις τεχνικές τα ξινόμ η σ η ς με ευρε τήριο.
Ταξινόμηση μέσω Ευρετηρίου Η τα ξινόμ ησ η μέσω ευρετηρίου είναι μια τεχνική που επιτρέπει με γάλο μέρος της εργασ ίας, που περιλαμβάνει η τα ξινόμ ησ η μιας βάσ ης δεδομένων, να εκτελεσ τεί σ τη R A M . Η διαδικ ασ ία είνα ι σε γενικές γραμμές η εξής: το πρόγραμμα δημ ιουργεί στη R A M ένα πίνακα (ar ray) που π ερ ιέχει όλες τις τιμές για ένα πεδίο. Ο πίνακας αυτός κα λεί ται ευρετήριο γιατί είναι μια περίληψ η τω ν περιεχομένω ν της βάσ ης δεδομένων. Ύ στερ α το πρόγραμμα αρ χίζει να τα ξινομ εί τον πίνακα στη R A M . Ό τα ν διαπιστώ νει ότι πρέπει να εναλλάξει δύο σ το ιχεία του πίνακα, τα ενα λλάσ σ ει στη R A M . Μ ετά, π η γαίνει σ το αρ χείο δε δομένων και ενα λλάσ σ ει τις θέσεις των α ν τίσ τοιχω ν εγγραφώ ν μέσα στο αρχείο. Θα αναπτύξουμε και θα ελέγξουμε το πρόγραμμα τα ξινό μ ησ ης μέσω ευρετηρίου, κομμάτι-κομμάτι. Η πρώτη ρουτίνα έχει ως ε ξής: 10 20 30 40
REM REM REM REM
50 CLS:PRINT "Sorting 60 DIM SRT$(1000)
* * * * * * * * * SORT.BAS Sort the data file by CODES
"
65 REM * * * * * * * * * * * * * * * * * * * * * * * 70 FOR REC%«1 TO 1000 60 GOSUB 2000 :REM read record # REC%. 90 IF LEFT$(CODE$, 1) - "0 " THEN 130 100 SRT$(REC%) - CODES 110 NEXT REC%
Create an index for sorting.
157
120 REM * * * * * * * * Done creating array of key fields. 130 NO.OF.RECORDS% - REC% - 1 140 STOP 20 R E M * · · · · · * · ·
Τ α ξινό μ η ση του αρ χείο υ δεδομένων σύμφωνα με το C O D E $
50 C L S :PR IN T 'Τ α ξιν ό μ η σ η ..." 65 R E M ............... ... . Δ ημιουργία ενός ευρετηρίου για τη ν τα ξινό μ η ση 80 G O SU B 2000 :R E M ανάγνωση τη ς εγγρ α φ ή ς υπ’ αρ. R E C % 120 R E M ...................... Τ έλος τη ς δη μιο υ ργία ς του πίνακα με τα πεδία-κλειδιά
. Γ ια να ολοκληρώ σ ουμε το κομμάτι αυτό του προγράμματος πρέπει να πληκ τρ ολογή σ ουμ ε επίσ η ς: MERGE "OPENFILE
και MERGE "READREC
Δεν πρόκ ειται για ο λόκ λη ρ ο το πρόγραμμα, είνα ι όμως καλή ιδέα να το π λ ηκ τρ ολογή σ ετε ως εδώ, έτσ ι που να μπορούμε να ελέγξουμε το τμήμα αυτό του προγράμματος, π ρ ιν προσθέσουμε τους επιπ λέον αλ γόριθμους. Ό τα ν τρέξουμε αυτό το κομμάτι, σ τη ν α ρ χή ανοίγει το αρ χείο, μετά δίνει διασ τάσ εις σ ’ ένα αλ φ αρ ιθ μ η τικό πίνακα χιλ ίω ν μετα βλητώ ν SRT$ και ύστερα δημ ιουργεί σ τη R A M ένα πίνακα μ εταβλη τών SRT$. Ο ι γραμμές 70-110 δημιουργούν τον πίνακα διαβάζοντας κάθε εγγρα φ ή τη ς βάσ ης δεδομένω ν και αποδίδοντας τη ν τιμή του κά θε πεδίου C O D E S σ ’ ένα μ οναδικό σ το ιχείο του πίνακα SRT$. Το απο τέλεσμα όλω ν αυτών είνα ι ότι φ τιάξαμε σ τη R A M ένα πίνακα SRTS, ο οποίος αποτελεί άμεση αντανάκλασ η των τιμώ ν τω ν πεδίων C O D ES του α ρχείου δεδομένων. Τ ο Σ χήμ α 11.6 δείχνει τη σ χέσ η ανάμεσα σ τον πίνακα SRTS τη ς R A M και σ το α ρ χείο δεδομένω ν SA LES. Π ροσ έξτε ότι η σειρά των δεδομένων σ τον πίνακα SRTS είνα ι α κ ρ ι βώς ίδια με τη σ ειρά των τιμών των πεδίων C O D ES σ το αρ χείο δεδο μένων. Γ ια να ελέγξουμε αν αυτό το μέρος του προγράμματος λειτουρ γεί σω στά, μπορούμε να τρέξουμε (με R U N ) το κομμάτι που έχουμε πλ ηκ τρ ολογή σ ει. Ό τα ν αυτό γίνει και ξαναφανεί το προτρεπ τικό σ ή μα O k, μπορούμε να δούμε, αν ο πίνακα ς είναι όντω ς στη R A M , π λ η κτρολογώ ντας: FOR Χ% - 1 TO NO.OF.RECORDS%:PRINT SRT$(X%):NEXT Χ%
Θα πρέπει τώρα να δούμε σ τη ν οθόνη τον πίνακα SRTS. Α νάλογα με το τι έχετε αποθηκεύσει σ το α ρ χείο δεδομένω ν σας, ο πίνακας θα εμ φ ανισ τεί κάπως έτσι:
158
SRT$(1)-"B0B SRT* LOOKS THEN 390 350 PRINT USING FMT$;CODE$,PERSONS,QTY%,AMOUNT,DAT$ 370 IF LP% THEN LPRINT USING FMT$;CODES.PERSON$.QTY LEFT$(CODE$,LEN(LOOK$)) THEN 390 350 PRINT USING FMT$;CODES.PERSONS,QTY%,AMOUNT,DATS 370 IF LP% THEN LPRINT USING FMT$;CODE$,PERSONS,OTY%, AMOUNT.DATS 380 TOTAL1 - TOTAL 1 + QTY%:TOTAL2 - TOTAL2 + AMOUNT 390 NEXT REC% 400 PRINT:IF LP% THEN LPRINT 405 PRINT USING FMTS;" ","Totals",TOTAL1 ,TOTAL2," " 407 IF LP% THEN LPRINT USING FMTS;" ","Totals",TOTAL1 .TOTAL2," " 410 IF NOT LP% THEN PRINT:INPUT "Press Return";DVS 430 CLOSE 1 450 CHAIN "SALES" 50 REM * · « * * * * * * * * * * * * * * * * * * Ερώτηση για αναζήτηση και εκτυπωτή 75 A LL% =0 :REM Λογική μεταβλητή, η all% είναι ψευδής 80 INPUT "Για ποιον κωδικό ψάχνετε ( για όλους)"; LOOKS 82 LOOK$= " "THEN A L L % = —1:REM η all% είναι αληθής 90 IN PU T "Θα σταλεί η αναφορά στον εκτυπωτή;(Υ/Ν )";Υ Ν$ 150 REM · · · · · · · · · » . · · · Καθορισμός φόρμας και επικεφαλίδας εκτύπωσης 190 H E A D IN G $ = " Πωλήσεις Προϊόντων" 210 Τ Ο Ρ ίΙΝ Ε $= "Κ ω δ ικ ό ς Πωλητής Q T Y Χρημ. Ποσό Ημερομηνία" 22Q TO TA L1=0 :T O T A L2 =0 :R E M Αρχικός καθορισμός των μεταβλητών πρόσθεσης
184
270 R E M » » · · · » * · · · · * » * « « * * · Α ρ χή β ρόχου μέσα στη βάση δεδομένω\ 310 G O SU B 2000 :R EM ανάγνωση εγγρ α φ ή ς υπ' αρ. rec% 340 IF L E F T $(C O D E $ ,l)= "* " T H E N 390:R EM Α πάλειψη διαγραμμένω ν εγγραφώ ν 405 PR IN T USING FM T$;" ", "Σύνολα", T O T A L 1 , T O T A L 2," " 407 IF LP% T H E N LP R IN T USING FMTS;" ” , ’Τύνολα",T O T A L 1, T O T A L 2," " 410 IF N O T LP% T H E N P R IN T :IN P U T "Π ατήστε R ETU R N ";D V$
Χ ρ ησ ιμ οποιή σα με μια λογική μεταβλητή (B oolean) για ν ’ απ οφ α σίσουμε, αν θα τυπωθούν σ τη ν αναφ ορά όλες οι εγγρα φ ές του αρχείου ή όχι. Στη γραμμή 75 θέτουμε την A L L % σ τη ν αρ χικ ή της κατάσταση που είναι η «ψευδής» (0). Στη γραμμή 80 παρουσιάζεται το π ρ οτρεπ τι κό σήμα σ το χρ ή σ τη και αποθηκεύεται η απάντησ ή του στη μ εταβλη τή LOO KS. Η γραμμή 82 ελέγχει, αν ο χρ ή σ τ η ς πάτησ ε μόνο το π λ ή κτρο τη ς επαναφ οράς «------1 . Α ν ναί, η LOO KS θα ισ ούται με κενό (“ ”) και η γραμμή 82 θα κάνει τη μεταβλητή A L L % αληθή (-1). Στη γραμμή 345 πρέπει να ικα νοποιούντα ι δύο συνθήκες για να υπερπηδηθεί μια εγγρα φ ή του αρχείου. Π ρώ τον, πρέπει να είνα ι ψ ευδής η A L L % (N O T A L L % ). Δεύτερον, πρέπει η LOO KS να ισούται με την C O D ES. Επομένω ς, αν ο χ ρ ή σ τη ς διαλέξει, όντω ς, να εμ φ α νίσ ει όλες τις εγγραφές, η A L L % είνα ι αλ η θ ή ς και καμιά εγγρα φ ή δεν παραλείπεται. Αν, πά λι, ο χ ρ ή σ τη ς διαλέξει να αναζη τήσ ει κά ποιον κω δικό πρ οϊόντος, τότε η A L L % είνα ι ψ ευδής και εμ φα νίζονται σ τη ν αναφ ο ρά μόνο οι εγγρ α φ ές με τον επιθυμητό κω δικό πρ οϊόντος. Π ρόκειται για μια πολύ πιο ευέλικτη τεχ νικ ή α να ζή τη σ η ς και μπορεί να χρ η σ ιμ ο ποιη θεί με όλους τους τύπους αναζητήσεω ν, που έχουμε ως τώρα εξε τάσει.
Αναζήτηση Περιοχής Μ ια άλλη τεχ νικ ή παρουσιάζεται, όταν η αναζή τησ η αφ ορά περ ιο χές τιμώ ν σ τις εγγραφές, για παράδειγμα, όταν ο χ ρ ή σ τ η ς θέλει να δει σ τη ν οθόνη τις εγγρα φ ές που έχουν χρ η μ α τικό ποσ ό πάνω απο 5000$, ή ανάμεσα σ τα 500$ και τα 1000$. Για να γίνει δυνατή αυτού του τύπου η αναζή τησ η, το πρόγραμμα πρέπει να π λ η ρ οφ ορ η θ εί το άνω και το κάτω όρ ιο της π ερ ιο χ ή ς και ύστερα να πα ραλείπει τις εγγρα φ ές που οι τιμές του α ντίσ τοιχου πεδίου τους δεν εντά σ σ ονται σ ’ αυττή την περ ιο χή . Η πα ραλλα γή του προγράμματος R E P O R T που ακολουθεί κάνει αυτό ακριβώς:
185
10 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 30 OPEN "R",#1 ."SALES.DAT",34 40 FIELD #1. 5 AS F1S.15 AS F2S.2 AS F3S.4 AS F4$.e AS F5$ 50 70 75 80
REM * * * * * * * * * * * * * * * * * * * * * * CLS INPUT " Enter lowest amount -.LOW INPUT " Enter highest amount ”;HIGH
REPORT.BAS
Ask about search and printer.
85 CLS 90 INPUT " Send report to printer? (Y/N) ";YN$ 110 IF YN$ - "Y " OR YN$ - "y " THEN L P % - - 1 130 CLS 150 REM * * * * * * * * * * * * * * * * * * * * Set up format and print heading. 170FMT$- " \ \ \ \ #### $$####.## \ \" 190 HEADINGS - " Product Sales" 210 TOPLINES-"Code Salesman Qty Amount Date" 220 TOTAL1 - 0:TOTAL2 - 0 :REM Initialize totaling variables. 230 IF LP% THEN LPRINT HEADING$:LPRINT:LPRINT TOPLINE$:LPRINT 250 PRINT HEADING$:PRINT:PRINT TOPLINE$:PRINT 270 REM * * * * * * * * * * * * * * * * * * * * Start loop through the data base. 290 FOR REC% - 1 TO 10000 310 GOSUB 2000 :REM read record # rec%. 330 IF LEFT$(CODE$, 1) - "0 " THEN 410 340 IF LEFT$(CODE$, 1 ) - " * " THEN 390 :REM Skip deleted records. 345 IF AMOUNT < LOW OR AMOUNT > HIGH THEN 390 350 PRINT USING FMT$;CODES.PERSON$,QTY%,AMOUNT,DATS 370 IF LP% THEN LPRINT USING FMT$;CODE$,PERSONS,QTY%, AMOUNT,DATS 380 TOTAL1 - TOTAL1 + OTY%:TOTAL2 - TOTAL2 + AMOUNT 390 NEXT REC% 400 PRINT:IF LP% THEN LPRINT 405 PRINT USING FMTS;" ","Totals",TOTAL1,TOTAL2," " 407 IF LP% THEN LPRINT USING FMTS;" ","Totals",TOTAL1 .TOTAL2," " 410· IF NOT LP% THEN PRINT:INPUT "Press Return";DVS 430 CLOSE 1 450 CHAIN "SALES50 REM * * * * * * * · * * · * * * * * * * · * * 75 INPUT "Δώστε χαμηλότερο noe0 ";LOW 80 INPUT "Δώστε υψηλότερο noo0";HIGH
Ερώτηση για αναζήτηση και εκτυπωτή
90 IN PU T "Θα σταλεί η αναφορά στον εκτυπωτή;(Υ/Ν )";Υ Ν$ 150 REM ........................Καθορισμός φόρμας και επικεφαλίδας εκτύπωσης 190 H E A D IN G $ = " Πωλήσεις Προϊόντων" 210ΤΟ ΡΜ ΝΕ $="Κ ω δικός Πωλητής Ποσότητα Χρημ. Ποσό Ημερομηνία" 220 T O TAL1 = 0 :T O T A L2 =0 :R E M Αρχικός καθορισμός των μεταβλητών πρόσθεσης
186
270 R E M .................. Α ρχή Βρόχοι· μέσα στη βάση δεδομένων 310 G O SU B 2(ΗΧ) :R EM ανάγνωση ε γγρ α φ ή ; αρ. rcc% 340 IK L E F T $ (('O D E $ . I ) = "*" T H E N 34(1:REM Α πάλειψη διαγραμμένω ν εγγραφώ ν
υπ
405 PRINT USIN G FMTS:" Τ ύνολα". T O T A L 1. T O T A L 2 ."" 407 IF LP% TH EN LP R IN T USIN G FMTS:" T iA w .u '.T O T A L I. T O T A L 2." " 410 IF N O T LP% T H E N P R 1 N T IN P U T Π α τή στε R E T U R N ':D V $
Οι γραμμές 75 και 80 ρωτούν για το κάτω (LO W ) και το άνω (H IG H ) όριο της περ ιο χ ή ς και η γραμμή 345 παραλείπει τις εγγρα φ ές που έ χουν τιμή του χρημ. ποσού είτε ανώτερη είτε κατώτερη απο τη ν αποδε κτή περ ιοχή. Μ ερικές φ ορές η αναζή τησ η περ ιο χ ή ς αφ ορά ημερομηνίες. Για πα ράδειγμα, ο χ ρ ή σ τη ς πιθανόν να θελήσει να δει τις εγγρα φ ές μόνο του πρώτου τριμήνου του έτους. Σ την περίπτω ση αυτή πρέπει η αναζή τησ η να γίνει σ το πεδίο των ημερομηνιώ ν και να δοθεί η μεγαλύτερη και η μικρότερη αποδεκτή ημερομηνία. Α κολουθεί η παραλλαγή του πρ ο γράμματος R E P O R T , που ικα νοποιεί αυτή την απάντηση: 10 REM A * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 30 OPEN "R",#1 ."SALES.DAT",34 40 FIELD #1, 5 AS F1$,15 AS F2S.2 AS F3S.4 AS F4$,8 AS F5$ 50 70 75 80
REPORTBAS
REM * * * * * * * * * * * * * * * * * * * * * * Ask about search and printer. CLS INPUT ' Enter starting date (MM/DD/YY) ";LOWS INPUT " Enter ending date (MM/OD/YY) ";HIGHS
85 CLS 90 INPUT " Send report to printer? (Y/N) ";YN$ 110 IF YN$ = "Y " OR YN$ = "y " THEN LP%= - 1 130 CLS 150 170 190 210 220
REM * * * * * * * * * * * * * * * * * * * * Set up format and print heading. F M T S -" \ \ \ \ #### $$####.## \ \" HEADINGS * " Product Sales" TOPLINES* "Code Salesman Qty Amount Date" TOTAL1 ~0:TOTAL2 = 0 :REM Initialize totaling variables.
230 IF LP% THEN LPRINT HEADING$:LPRINT:LPRINT TOPLINE$:LPRINT 250 PRINT HEADING$:PRINT:PRINT TOPLINEStPRINT 270 REM * * * * * * * * * * * * * * * * * * * * start loop throyqh the data base. 290 FOR REC% - 1 TO 10000 310 GOSUB 2000 :REM read record # rec%. 330 IF LEFT$(CODE$.1) - "0 " THEN 410 340 IF LEFT^CODES.I) - " * " THEN 390 :REM Skip deleted records. 345 IF DATS < LOWS OR DATS > HIGHS THEN 390 350 PRINT USING FMTS;CODES.PERSONS.QTY%.AMOUNT,DAT$ 370 IF LP% THEN LPRINT USING FMT$;CODES.PERSON$.QTY%,AMOUNT.
187
DATS 380 TOTAL1 = TOTAL1 + QTY°/b:TOTAL2 - TOTAL2 + AMOUNT 390 NEXT REC% 400 PRINT: IF LP% THEN LPRINT 405 PRINT USING FMTS;" "."Totals",TOTAL1 .TOTAL2," " 407 IF LP% THEN LPRINT USING FMTS:" ","Totals",TOTAL1 ,TOTAL2," " 410 IF NQT LP% THEN PRINTINPUT "Press Return";DVS 430 CLOSE 1 450 CHAIN "SALES" 50 REM * * * · * * * * * * * * * * * * * * * * * Ερώτηση για αναζήτηση και εκτυπωτή 75 INPUT "Δώστε ημερομηνία έναρξης (MM/HH/XX)";LOW$ 80 INPUT "Δώστε ημερομηνία λή ξη ς (MM/HH/XX)";HIGH$ 90 IN PU T "Θα σταλεί η αναφορά στον εκτυπωτή:(Υ Ν)":ΥΝ$ 150 R E M ...........................................Καθορισμός φόρμας και επικεφαλίδα; εκτύπωση; 190 H E A D IN G $ = " Π ω λήσει; Προϊόντων” 210 T O P L IN E $ = "K co6ik 0 ; Πωλητής Ο Τ Υ Χρημ. Ποσό Ημερομηνία" 220 TO TAL1 =0 :T O T A L2 =0 :R E M Α ρ χ ικ ό ; καθορισμό; των μεταβλητών πρόσθεση; 270 REM · · » * . » · « » » · . . » . . . . . Αρχή βρόχου μέσα στη βάση δεδομένων 310 GOSUB 2000 :R EM ανάγνωση εγγραφή; υπ' αρ. rcc% 340 IF LE F T $ (C O D E $ .l)= "*" T H E N 390:REM Απάλειψη διαγραμμένων εγγραφών 405 PRINT USIN G FMTS;" ", "Σύνολα". T O T A L 1 . T O T A L 2." " 407 IF LP% TH E N LP R IN T USING FMTS;" ". "Σ ύ ν ολ α '.Τ Ο Τ Α Μ . T O T A L 2." " 410 IF N O T LP% T H E N P R IN T :IN P U T "Πατήστε R E T U R N ";D V J
Στις γραμμές 75 και 80 το πρόγραμμα ζη τάει το κάτω (LO W $) και το άνω (H IG H S ) όρ ιο της π ερ ιοχή ς. Η γραμμή 345 υπερπηδά τις εγγρ α φ ές που έχουν η μ ερομη νίες μικρότερες απο τη LOW S ή μεγαλύτερες απο τη H IG H S. Δυστυχώ ς, όμως, αυτή .η π ρ οσ έγγισ η λειτουρ γεί μόνο όταν όλες οι ημ ερομη νίες του αρ χείου δεδομένων είναι του ιδίου έτους. Έ χουμ ε δηλαδή το ίδιο πρόβλημ α που είχαμε, όταν κάναμε τα ξινόμ η ση σύμφωνα με τη ν ημερομηνία. Γ ιατί ο πιο σ ημ αντικός αριθμός της ημερομηνίας, όταν αυτή γράφ ετα ι στη μορφή Μ Μ /Η Η /Χ Χ /, είναι φυ σ ικά οι δύο τελευταίοι χα ρακτήρες. Ό π ω ς και σ το πρόγραμμα της τα ξινόμη σ ης, θα πρέπει να φέρουμε τα ψ ηφ ία του έτους μπροστά. Αυτό απαιτεί να προστεθούν σ το πρόγραμμα οι παρακάτω γραμμές: 77 LOWS - RIGHTS(LOWS,2) + LEFTS(LOW$,6) 82 HIGHS - RIGHT$(HIGHS,2) + LEFT$(HIGHS,6) 342 DT$ - RIGHTS(DAT$,2) + LEFT$(DAT$,6) 345 IF DTSCLOWS OR DTS>HIGHS THEN 390
Μ πορούμε να τ’ αποφ ύγουμε όλα αυτά, αν για τις ημ ερομη νίες χ ρ η σ ι μοποιούμε πάντα τη μορφή Χ Χ /Μ Μ /Η Η /. Α λλά επειδή αυτό είναι κά πως άβολο για το χ ρ ή σ τη , μάλλον είνα ι καλύτερα να αφ ήσουμε τον υ π ολ ογισ τή να κάνει τις απαρα ίτητες μετατροπές. Β λέπετε, αυτός ποτέ δεν πα ραπονιέται για κάτι τέτοια!
Αναζήτηση Πολλαπλών Πεδίων Γ ια να φ τάσουμε σ τον ανώτατο βαθμό τω ν δυνατοτήτω ν αναζή τη σ ης, μπορούμε να δώσουμε στο χρ ή σ τη τη ν ικα νότητα να κάνει ανα ζή τη σ η σε πάνω απο μια μ εταβλητές, για παράδειγμα, να μπορεί ο χ ρ ή σ τη ς να πάρει σε κα τάλογο όλες τις π ω λ ήσ εις του π ρ οϊόντος ΑΑΑ που έκανε ο πω λ ητή ς Σμιθ. Το «σενάριο» για αυτή τη δυνατότητα θα ήταν περίπου το εξής. Σ τη ν α ρ χή , ο χρ ή σ τ η ς διαλέγει να τυπώ σει μια αναφ ορά και το πρόγραμμα εμ φα νίζει ένα μενού με επιλ ογές α ναζή τη σ ης, όπω ς το παρακάτω: Επιλογές αναζήτησης 1. Κ Ω Δ ΙΚ Ο Σ ΠΡΟΪΟΝΤΟΣ 2. Π Ω Λ Η Τ Η Σ 3. ΠΟΣΟ ΤΗΤΑ 4. ΧΡ Η Μ . ΠΟΣΟΝ 5. Η Μ Ε Ρ Ο Μ Η Ν ΙΑ 6. ΕΝΑΡΞΗ Α Ν Α Ζ Η Τ Η Σ Η Σ 7. Ε Κ Τ Υ Π Ω ΣΗ Ο Λ ΩΝ ΤΩ Ν ΔΕΔΟΜ ΕΝ Ω Ν 8. ΕΠΙΣ ΤΡΟΦΗ ΣΤΟ Κ Υ Ρ ΙΟ Μ ΕΝ Ο Υ Δώστε την επιλογή (1-8) από τα παραπάνω:
Α ς υποθέσουμε ότι ο χ ρ ή σ τ η ς διαλέγει σ τη ν α ρ χή τη ν επιλ ογή 2, δη λαδή την αναζή τησ η κατά όνομα πω λητή. Π λ η κτρολ ογεί 2 και ο υπο λο γ ισ τή ς ρωτάει: Δώστε την τιμή της αναζήτησης:
Ο χρ ή σ τ η ς απαντάει Smith και πατάει το π λ ήκ τρ ο τη ς επαναφοράς. Ύ στερα, ο χρ ή σ τ η ς βλέπει να παρουσιάζεται και πά λι το μενού σ την οθόνη, τώρα όμως εμφανίζεται και η πρώ τη επιλ ογή αναζή τησ ης, δη λαδή: Επιλογές αναζήτησης I. Κ Ω Δ ΙΚ Ο Σ ΠΡΟΪΟΝΤΟΣ
189
2. 3. 4. 5. 6. 7. 8.
ΠΩΛΗΤΗΣ Π Ο ΣΟ ΤΗΤΑ ΧΡ Η Μ . ΠΟΣΟΝ Η Μ Ε Ρ Ο Μ Η Ν ΙΑ ΕΝΑΡΞΗ Α Ν Α Ζ Η Τ Η Σ Η Σ ΕΚ Τ Υ Π Ω ΣΗ Ο Λ Ω Ν ΤΩ Ν ΔΕΔΟΜ ΕΝ Ω Ν ΕΠΙΣΤΡΟΦΗ ΣΤΟ Κ Υ Ρ ΙΟ Μ ΕΝ Ο Υ
:Smith
Δώστε την επιλογή (1-8) από τα παραπάνω:
Ας υποθέσουμε τώ ρα ότι ο χ ρ ή σ τη ς απ οφ ασ ίζει να κάνει αναζή τησ η και κατά κω δικό πρ οϊόντος. Π λ η κτρολ ογεί 1 και ο υ πο λο γ ισ τή ς ρω τάει: Δώστε-την τιμή της αναζήτησης:
Αυτή τη φ ορ ά /Λ η κτρ ολ ογεί ΑΑ Α και πατάει το π λ ή κ τρ ο τη ς επανα φοράς. Κ αι πάλι εμ φανίζεται το μενού τη ς α ν α ζή τη σ η ς με το επιπ ρ ό σθετο πεδίο: Επιλογές αναζήτησης 1. Κ Ω Δ ΙΚ Ο Σ ΠΡΟΪΟΝΤΟ Σ 2. Π Ω Λ Η Τ Η Σ 3. ΠΟΣΟ ΤΗΤΑ 4. ΧΡ Η Μ . ΠΟΣΟΝ 5. Η Μ Ε Ρ Ο Μ Η Ν ΙΑ 6. ΕΝΑΡΞΗ Α Ν Α Ζ Η Τ Η Σ Η Σ 7. Ε Κ Τ Υ Π Ω ΣΗ ΟΛΩΝ ΤΩ Ν ΔΕΔΟΜ ΕΝ Ω Ν 8. ΕΠΙΣΤΡΟΦΗ ΣΤΟ Κ Υ Ρ ΙΟ Μ ΕΝ Ο Υ
ΑΑΑ Smith
Δώστε την επιλογή (1-8) από τα παραπάνω:
Τώρα ο χ ρ ή σ τη ς απ οφ ασ ίζει ότι αυτά είνα ι τα δύο πεδία για τα ο ποία θέλει να κάνει α ναζή τησ η, κι έτσ ι πατάει το 6 για να αρ χ ίσ ει. Ο υ πολογισ τής εμφανίζει τα εξής: Κ Ω Δ ΙΚ Ο Σ ΠΡΟΪΟΝΤΟ Σ ΠΩΛΗΤΗΣ
ΑΑ Α Smith
ΠΟΣΟ ΤΗΤΑ
Πώς θέλετε να γίνει η αναζήτηση; 1. Εγγραφές με ΟΛΕΣ τις παραμέτρους 2. Εγγραφές με Ο Π Ο ΙΑ Δ Η Π Ο Τ Ε παράμετρο Δώστε την επιλογή σας (1-2) από τα παραπάνω:
190
Η ερώ τηση που φ αίνετα ι σ τη ν οθόνη αφ ορ ά τη λογική τη ς α ναζή τη σης. Δ ηλαδή, ο χρ ή σ τ η ς θέλει τις εγγρα φ ές εκείνες που έχουν είτε ΑΑΑ ε ίτ ε Sm ith, ή θέλει τις εγγρ α φ ές που έχουν και Smith σ αν όνομα και ΑΑΑ σ αν κω δικό προϊόντος; Γ ια να δει πόσ α προϊόντα με κω δικό ΑΑΑ πούλη σ ε ο Sm ith, ο χ ρ ή σ τ η ς θα διαλέξει τη ν επιλ ογή 1 (Ο ΛΕΣ τις παραμέτρους). Τότε θα τυπω θεί η αναφ ορά και θα εμ φ α νίσ ει όλες τις εγγρα φές που έχουν πω λητή τον Smith και κω δικό πρ οϊόντος ΑΑΑ. • Α υτός ο τύπος α να ζή τη σ η ς δίνει μεγάλη ευελιξία. Μ ’ αυτόν ο χ ρ ή σ της μπορεί να ψ άξει για ένα ή πολλά πεδία, ή και να εμ φ α νίσ ει όλες τις εγγραφές. Α ν επιλ έξει να ψ άξει σ ε πάνω απο ένα πεδία, ο χρ ή σ τη ς μπορεί να διαλέξει αν σ τη ν αναζή τησ η θα εφ αρμ οσ τεί λ ογική διάζευ ξη ( « ο γ » ) ή σύζευξη ( « a n d » ). Έ ν α τέτοιο πρόγραμμα χρ ειά ζετα ι, για να γρ αφ τεί, πολύ περ ισ σ ότε ρο απο τη ν απλή πρ οσ θήκ η μερικώ ν γραμμώ ν στο ήδη υ πάρχον R E P O R T . Κ αι μάλισ τα το πρόγραμμα τη ς α ναζή τησ ης είνα ι τόσ ο περ ί πλοκο, που τη ρουτίνα εκτύπω σης αναφ ορώ ν τη ν έχω θάλει σε υπο ρουτίνα για να μη β ρίσ κετα ι μες τη μέση. Ν α αρχίσουμ ε με τη λεκτική διατύπωση του προγράμματος μας: Λ εκτική διατύπωση του προγράμματος α ναζή τησ ης πολλαπλώ ν πεδίων Α νοιγμα του αρχείου δεδομένων Τοποθέτησ η των πεδίων σ τη ν προσ ω ρινή μνήμη Κ αθορισ μ ός της φ όρμας τη ς αναφ οράς Δ ια σ τα σ ιολόγη σ η τω ν πινάκω ν που αποθηκεύουν τιμές ανα ζή τη σ η ς, ονόματα πεδίων και δεδομένα πεδίων Α πόδοση των ονομάτω ν των πεδίω ν σε πίνακα Μ ηδενισ μ ός όλω ν των μεταβλητώ ν α ναζή τησ ης, τιμή «ψευδής» σε όλες τις λογικές μεταβλητές * Π α ρουσ ίασ η του μενού με τις επιλ ογές α ν αζή τησ ης Δώσε σ το χρ ή σ τη τη δυνατότητα να κάνει μια επιλογή Αν διάλεξε αναζή τησ η σε ένα πεδίο Πάρε τη ν τιμή α να ζή τη σ η ς Αν είναι αριθμός, μετάτρεψέ τον σε α λφ αρ ιθμη τικό Α ύξησε κατά 1 τον μετρητή του αριθμού των παραμέτρω ν Ξαναεμφ άνισε το μενού της α να ζή τη σ η ς Αν διάλεξε να α ρ χ ίσ ει η αναζή τησ η Α ρ χισ ε τη ν αναζή τησ η
191
Αν διάλεξε να εμ φα νισ τούν όλες οι εγγρα φές Κ άνε τη λογική μεταβλητή E V E R Y % «αληθή» Α ρ χ ισ ε τη ν αναζή τησ η Α ν διάλεξε την έξοδο Γύρνα πίσ ω σ το κύριο μενού ** Α ν διάλεξε αναζή τησ η σε πάνω απο ένα πεδίο Ε μφάνισε τα πεδία που διαλ έχτη κα ν Ρώτα αν η αναζή τησ η θα είνα ι τύπου «and» ή « ο γ » Κ άνε «αληθή» τη ν αν τίσ το ιχη λογική μεταβλητή Ρώτα για τον εκτυπωτή Αν ναι, κάνε «αληθή» την LP% Β ρόχος που διατρ έχει το αρ χείο δεδομένων Π άρε μια εγγραφή Αν τέλος αρχείου, σταμάτα τη ν αναζή τησ η Αν η εγγρα φ ή έχει σημειω θεί για α π αλ οιφ ή , πέρνα στο *""* Αν θα τυπωθούν όλες οι εγγραφές, τύπωσέ τις. Β ρόχος που διατρ έχει τις επιλ ογές α να ζή τη σ η ς Αν είσ αι στο πεδίο τη ς α ναζή τησ ης, υπάρχει ταύτιση; Αν ναι και η λογική είνα ι «Ο Π Ο ΙΑ Δ Η Π Ο ΤΕ», εμ φά νισ ε την εγγραφή Αν ναι και η λογική είναι «ΟΛΕΣ», σ ημείω σε την ταύτιση στο πεδίο αυτό. Συνέχισ ε το βρ όχο των επιλογώ ν α ναζή τησ ης Α ν έχουμε πολλα πλά πεδία και τη ν απ αίτη σ η «ΟΛΕΣ» και ικα νο ποιούνται όλες οι συνθήκες, τύπωσε τη ν εγγρα φή . Β ρόχος σ τη ν επόμενη εγγρα φ ή της βάσ ης δεδομένων Εμφάνιση των αθροισμάτω ν σ τη ν αναφ ορά Ε πισ τροφ ή σ το κύριο μενού Υ πορουτίνα 2000: Διαβάζει μια εγγρ α φ ή και φορμάρει τα πεδία (όλα αλφ αριθμητικά). Υ πορουτίνα 6000: Τυπώ νει, βγάζει αθροίσ μ ατα και φορμάρει τη ν α ναφορά.
192
Τ ο πρόγραμμα δουλεύει πάνω σ ’ ένα πίνακα δεδομένων στη R A M . Ο ι παραπάνω μ εταβλητές είναι πολύ σ ημ αντικές για τις απο φάσ εις που πα ίρνει το πρόγραμμα: EVERY%
: Έ χ ε ι τιμή «αληθής», αν ο χρ ή σ τη ς θέλει να εμ φα νισ τούν όλες οι εγγρα φές
N O .P A R A M %
: Μ ετράει σ ε πόσ ες παραμέτρους θα γίνει η αναζή τησ η
ΑΝΥ%
: Τ ίθεται «αληθής», αν γίνετα ι αναζή τησ η σε πολλα πλά πεδία βάσει τη ς λ ο γ ικ ή ς «or»
ALL%
: Τ ίθεται «αληθής», αν γίνετα ι αναζή τησ η σε πολλα πλά πεδία βάσει τη ς λ ο γ ικ ή ς «and»
Στη R A M υπάρχουν επ ίσ η ς και μερικοί μικροί πίνακες. Είναι οι FLD N A M S, SE A R C H S και F LD S.O πίνακα ς F L D N A M $ χρ η σ ιμ ο π οιείτα ι για να εμ φ α νίσ ει το μενού. Ο πίνακας S EA R C H S περ ιέχει τις π λ η ρ οφ ορ ίες για το σε ποιες τιμές γίνετα ι η αναζή τησ η. Η S E A R C H $(1) περ ιέχει τη ν τιμή για τον κω δικό πρ οϊόντος, η S E A R C H $(2) για το όνομα του πω λητή , η S E A R C H $(3) για τη ν ποσ ότητα και ούτω καθ’ εξής. Αν δεν γίνετα ι αναζή τησ η σε κά ποιο πεδίο, το α ν τίσ το ιχο σ το ιχείο του πίνακα S EA R C H S είναι ένα κενό αλφ αριθμη τικό. Γ ια παράδειγμα, αν ο χ ρ ή σ τη ς διάλεγε αναζή τησ η των προϊόντω ν με κω δι κό Α ΑΑ και όνομα πω λητή Sm ith, ο πίνακα ς S EA R C H S θα ήταν ως ε ξής: SEARCH$(1)-"AAA" SEARCH$(2)- "S mith" SEARCH$(3) - " " SEARCH$(4) - " " SEARCHES)
Α ν ο χ ρ ή σ τη ς διάλεγε τη ν ημ ερομη νία 03/31/54 και την ποσ ότητα 999 σαν βάσεις της αναζή τησ ης, ο πίνακας S EA R C H S θα είχε την ε ξής εικόνα: SEARCH$(1)-"" SEAR C H$(2)-""
193
SEARCH$(3) = " 999" SEARCH$(4) = " " SEARCH$(5) = "03/31/54"
Τα δεδομένα αυτά τοποθετούνται σ τον πίνακα καθώς ο χ ρ ή σ τη ς δια λέγει επιλογές α να ζή τη σ η ς απο την οθόνη. Το πρόγραμμα περιλαμβάνει και έναν πίνακα FLDS, όπου α π οθη κεύονται μεμονωμένα πεδία μιας εγγρα φ ή ς. Ό π ω ς και σ το πρόγραμμα της οριζόμ ενης απο το χρ ή σ τη τα ξινόμ ησ ης, τα αριθμ ητικά πεδία Ο ΤΥ % και Α Μ Ο Υ Ν Τ μετατρέπονται σε φ ορμαρισ μ ένα α λ φ α ρ ιθ μ η τι κά, πριν τοποθετηθούν σ ’ αυτό τον πίνακα. Γ ια παράδειγμα, αν η πρώ τη εγγραφή περ ιείχ ε ΑΑΑ , Sm ith, 999,123.45,03/31/54, όταν αυτά δια βαστούν σ τον πίνακα FLDS θα έχου ν την εξής εικόνα: FLD$(1) = "ΑΑΑ " FLD$(2) = "Smith F LD $ (3 )-" 999" FLD$(4) = " 123.45" FLD$(5) = "03/31/54"
Η απόφ ασ η, αν θα τυπωθεί ή ό χι μια εγγρ α φ ή , παίρνεται σ υγκρίνοντα ς τα περιεχόμενα του πίνακα S E A R C H $ με αυτά του πίνακα FLDS και ψ άχνοντας για ίσα αλφ αριθμη τικά. Γ ια παράδειγμα, να πώς θα παρου σιαζόταν απο λογική άποψη η σ ύγκρ ισ η ανάμεσα στους όρους της α να ζήτη σ ης (Sm ith και ΑΑΑ ) και σε μια εγγραφή: 1. 2. 3. 4. 5.
πίνακας SEARCHS "Α Α Α " "Smith" "" ""
— ταιριάζουν; ■-* — ταιριάζουν; — (αγνοείται) (αγνοείται) (αγνοείται)
πίνακας FLDS "Α Α Α " "Smith" "999" "123.45" "03/31/54"
Το πρόγραμμα δεν προσ παθεί καν να δει, αν υπάρχει τα ίρια σ μα σ τις περιπτώ σ εις που η S EA R C H S έχει κενό, μια και αυτό υποδηλώ νει ότι ο χρ ή σ τη ς δεν θέλει αναζή τησ η σ ’ αυτό το πεδίο. Μ ια και το SE A R C H $(1) δεν είναι κενό, το πρόγραμμα ελέγχει αν αυτό ισ ούται με το C O D E $[F L D $(l)]. Το ίδιο γίνετα ι και για το S E A R C H $(2). Γ ια τις υ πόλοιπες μ εταβλητές α ν αζή τησ ης και τα δεδομένα των άλλω ν πεδίων δεν επιχειρ ο ύντα ι σ υγκρ ίσ εις, για τί τα πεδία αυτά δεν έχουν επιλεγεί για αναζή τησ η. Καθώς το πρόγραμμα κάνει τις σ υγκρ ίσ εις πα ίρ νει υπ’ όψ η του τη δυ νατότητα λο γ ικ ή ς σύζευξης ή λ ο γ ικ ή ς διάζευξης. Γ ια παράδειγμα, αν έχουμε αναζή τησ η πολλα πλώ ν πεδίω ν με λογική διάζευξη (λ ογικό
194
«or»),τότε οποιοδ ήποτε τα ίρια σ μα σε όποια θέση των παραπάνω πινά κων θα οδη γή σ ει σ τη ν εκτύπωση τη ς εγγρ α φ ή ς. Αν όμως η αναζή τησ η χρ η σ ιμ ο π ο ιεί τη λ ογική σύζευξη (λ ογικό «and»), τότε οι δύο πίνακες πρέπει να σ υγκριθούν στο σύνολό τους. Το πρόγραμμα το κάνει αυτό μ ετρώ ντας πόσ ες φ ορ ές βρέθηκαν ίσ ες οι τιμές του πίνακα S EA R C H S μ’ αυτές του πίνακα FLD $. Ύ στερ α, το πρόγραμμα ελέγχει, αν ο αρ ιθ μός τω ν ισ οτήτω ν που διαπισ τώ θηκε είνα ι ίσ ος με τον αριθμό των πε δίων που είχα ν αρ χικ ά επιλ εγεί για αναζή τησ η. Αν ναι, τυπώ νει τη ν εγ γρ αφ ή. Α λλιώ ς, προχίοράει σ τη ν εξέταση τη ς επόμενης εγγρα φ ή ς. Έ ν α πρόγραμμα, σαν αυτό εδώ, έχει να πάρει πολ λές απ οφ άσ εις και επομένω ς τείνει να γίνετα ι μεγάλο και αφ ηρη μένο. Ας αρχίσουμ ε να ε πεξεργαζόμαστε τις εντολές του προγράμματος μας. 20 30 40 44 46
REM * * * * * * * * * * * * * * * * * * * * * Multiple-field search and report. OPEN "R".1 ."SALES.DAT",34 FIELD #1.5 AS F1S.15 AS F2$,2 AS F3$,4 AS F4$,8 AS F5$ REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Report Format. F M T S -" \ \ \ \ #### $$###,###.## \ \"
20 REM » » « « » » » » » » · · » · · * · * 44 R E M .............................
Αναζήτηση πολλαπλών πεδίων και αναφορά » « » . « » » » . . » Φόρμα της αναφορά;
Ό π ω ς συνήθω ς, το πρόγραμμα αρ χίζει με τον τίτλο, μια σύντομη περ ι γρ αφ ή, και τις π ρ οτάσ εις α νοίγμα τος του α ρχείου και τοπ οθέτησ ης των πεδίω ν απο τη ρουτίνα O P E N F ILE. 50 60 70 80
REM * * * * * * * * * * * * * * * * * * * * * * * * Dimension data for tables. DIM SEARCH$(5),FLDNAM$(5).FLD$(5) FLDNAMS - 5 5 THEN LPRINT CHRS(12):LF% = 0 6095 RETURN 6000 REM ...............................................Χειρισμός όλων των σχετικών με την εκτύπωση και το φορμάρισμα της αναφοράς 6005 REM Τύπωσε επικεφαλίδα αν χρειάζεται 6010 IF LF % = 0 A N D N O T LP% T H E N PRINT Τ Α Β (20);"Α Ν ΑΦ Ο ΡΑ Π Ω ΛΗ ΣΕΩΝ ": PRINT 6020 IF LF % = 0 A N D LP% TH E N LP R IN T T A B (20); "Α Ν ΑΦ Ο ΡΑ ΠΩ ΛΗ ΣΕΩΝ ": LP R IN T Εκτύπωση της πρώτης γραμμής της αναφοράς 6025 REM ................ Συγκέντρωση συνόλων 6045 REM • · Αύξηση κατά 1 του μετρητή των γραμμών 6065 REM 6075 REM . . . . . . . . . . . . . . . . . . . . . Σελιδοποίηση και διακοπές οθόνης 6080 IF N OT LP% A N D L F % > = 20 TH E N P R IN T :IN P U T "Π ατήστε R ETU R N";N O$: LF% =0
Η ρουτίνα αυτή δεν έχει τίποτα το κα ινούριο για μας, μια και χρ η σ ιμ ο ποιεί τις ίδιες τεχνικές, που εξετάσαμε προηγουμένω ς σ το πρόγραμμα R E P O R T . Η μόνη διαφ ορά είναι ότι μετράει πόσ ες γραμμές έχουν τυ πω θεί σ την αναφ ορά (με τη μεταβλητή L F % ) αντί, όπως πριν, να ελέγ
201
χει, αν ο αριθμός των εγγραφώ ν που τυπώ θηκαν διαιρ είτα ι ακριβώ ς απ’ την τιμή του μήκους της οθόνης ή της σ ελίδας. Ε ίναι απ αρα ίτητο να χρ η σ ιμ οποιή σ ουμ ε εδώ μ ετρητή, για τί ο αριθμός τω ν εγγρα φώ ν δεν α ν τισ το ιχεί πια σ τον αριθμό των εγγρα φώ ν που έχουν τυπωθεί σ τη ν α ναφορά. Έ χουμ ε αναζή τησ η, και τυπώ νονται μόνο οι εγγρα φ ές εκεί νες που ικα νοποιούν ορισ μένα κριτή ρια . Ας δούμε τώρα ολόκ λη ρ ο το πρόγραμμα ανα ζή τη σ η ς σε πολλα πλά πε δία: 10 20 30 40
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SEARCH.BAS REM * * * * * * * * * * * * * * * * * * * * Multiple-Field Search and Report. OPEN "R",1,"SALES.DAT",34 FIELD #1.5 AS F1$,15 AS F2$,2 AS F3$,4 AS F4$,8 AS F5$
44 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 48 FMTS - " \ \ \ \ #### $$###.###.## \ \" 50 60 70 80
Report format.
REM * * * * * * * * * * * * * * * * * Dimension data for tables. DIM SEARCH$5 THEN 350 270 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * Get search value. 280 PRINT:PRINT 290 INPUT " Enter Value to Search For ";SEARCH$(CHOICE%) 300 REM * * * * * * * * Pad qty and amount with leading blank (numeric string) 310 IF CHOICE% = 3 OR CHOICE% = 4 THEN SEARCH$(CHOICE%) - " " + SEARCH$(CHOICE%) 320 NO.PARAM% - NO.PARAM% + 1 330 GOTO 140 :REM re-display menu with choices.
202
340 REM * * * * * * * * * * * * * * * * * * * Done entering search parameters. 350 IF CHOICE% = 7 THEN EVERY% - - 1:G0T0 530 360 IF CHOICER = 8 THEN CLOSE:CHAIN "SALES370 REM If more than one search parameter selected, ask about logic. 380 IF NO.PARAM% = 1 THEN ANY%= - 1:GOTO 530 390 CLS 400 410 420 430 440 450 460 470 480 490 500 510 520 530 540 550 560
FOR X% - 1 TO 5 PRINT TAB(10) USING " \ \";FLDNAM$(X%); PRINT ";SEARCH$(X%) NEXT X% PRINT PRINT " How do you want to search?" PRINT PRINT " 1 . Records with ALL parameters" PRINT " 2. Records with ANY parameterPRINT INPUT " Enter choice (1-2) from above ";PARAM% IF PARAM%-1 THEN ALL% « - 1 ELSE ANY% « -1 REM * * * * * * * * * * * * * * * * * * * * * * * * * * Ask about hardcopy. CLS LP% · 0 : REM Line printer is false. INPUT " Send Report to Printer (Y/N) ";YN$ IF Y N $ -" Y " OR Y N $ « "y " THEN LP%= -1
570 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Begin search. 580 REM * * * * * * * * * * * * * Sub 6000 sends selected record to the report. 590 CLS 600 FOR REC%»1 TO 1000 610 GOSUB 2000 : REM get record # R% 620 IF LEFT$(FLD$(1), 1) - "0 " THEN 760 : REM end of file. 630 IF LEFT$(FLD$(1), 1)« " * " THEN 730 : REM Marked for deletion. 640 IF EVERY% THEN GOSUB 6000 : REM send record to report. 650 T R % «0 660 REM * * * * * * * * * * * * * * * * * * Loop through search parameters. 670 680 690 700
FOR Y% « 1 TO 5 IF SEARCH$(Y%) - " " THEN 710 IF LEFT$(FLD$(Y%),LEN(SEARCH${Y%))) - SEARCH$(Y%) AND ANY% THEN GOSUB 6000:GOTO 730 IF LEFT$(FLD$(Y%).LEN(SEARCH$(Y%))) - SEARCH$(Y%) AND ALL% THEN T R % -T R % + 1
710 NEXT Y% 720 IF ALL% AND TR% - NO.PARAM% THEN GOSUB 6000 730 NEXT REC% 740 REM * * * * * * * * * * * * * * * * * * 750 REM * * * * * * * * * * * * * * * * * Pr 760 PRINT:PRINT
203
770 7Θ0 790 800
PRINT USING FMT$;" ","Totals".TOT1 ,TOT2," " IF LP% THEN LPRINT USING FMT$;" ","Totals",TOT1 ,TOT2," " PRINT:PRINT:PRINT:INPUT "Press RETURN ";NOTHING$ GOTO 100 : REM Set all search Darameters back to nulls.
2000 2010 2020 2025 2030 2035 2040 2045 2050 2055 2060 2065 2070
REM * * * * * * * * * * * * * * * * * * * * GET #1,REC% CODES = F1$ FLD$(1)« CODES PERSONS-F2S FLDS(2) = PERSONS QTY%-CVI(F3S) FLDS(3) = STRS(QTY%) AMOUNT = CVS(F4S) FLD$(4)« STRS(AMOUNT) DATS « F5S FLD$(5) = DATS RETURN
Routine to read an R/A record
6000 REM * * * * * * * * Handle all aspects of printing and formatting the report. 6005 REM * * * * * * * * * * * * * * * * * * * * * * Print heading if necessary. 6010 IF LF % «0 AND NOT LP% THEN PRINT TAB(20);"SALESREPORT": PRINT 6020 IF LF % «0 AND LP% THEN LPRINT TAB(20);"SALESREPORT":LPRINT 6025 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * print report line. 6030 PRINT USING FMTS;CODES,PERSONS,QTY%,AMOUNT,DATS 6040 IF LP% THEN LPRINT USING FMT$;CODES,PERSONS,QTY%,AMOUNT, DATS 6045 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * 6050 TOT1 =TOT1 +QTY% 6060 TOT2 - TOT2 + AMOUNT 6065 REM * * * * * * * * * * * * * * * * * * * * * * 6070 LF% - LF% + 1
Accumulate totals.
Increment line feed counter.
6075 REM * * * * * * * * * * * * * * * * * * * Provide screen and page breaks. 6080 IF NOT LP% AND LF%> =20 THEN PRINT:INPUT "Press Return"; NO$:LF% = 0 6090 IF LP% AND L F % > = 5 5 THEN LPRINT CHRS(12):LF% - 0 6095 RETURN
20 REM . » · * · · * * * · · · · · * * · · Αναζήτηση πολλαπλών πεδίων και αναφορά .......................... φόρμα της αναφοράς 44 REM 50 REM .......................... Δεδομένα για τις διαστάσεις των πινάκων 70 F L D N A M $ (l)= "K n A IK O Z ΠΡΟ ΙΌ Ν Τ Ο Σ ";Ρ ίΟ Ν Α Μ $ (2 )= 'Π Ω Λ Η Τ Η Σ " 80 F L D N A M $ (3 )= "n O IO T H T A ":F L D N A M $ (4 )= "X P H M . Π Ο ΣΟ Ν":F LD N A M $(5 )= Η Μ Ε Ρ Ο Μ Η Ν ΙΑ " 90 REM ................ Μηδενισμός όλων των παραμέτρων
204
130 R E M ............................................................................ Παρουσίαση και εκλογή επιλογών 150 PR IN T T A B (10);"1. Κ Ω Δ ΙΚ Ο Σ ΠΡΟ ΙΌ Ν Τ Ο Σ ;SEARCH$(1) 160 PR IN T TAB(10);''2. Π Ω Λ Η Τ Η Σ SEARCH$(2) 170 PR IN T TAB(10);"3. Π Ο ΣΟ ΤΗΤΑ SEARCH$(3) 180 PR IN T TAB(10);"4. Χ Ρ Η Μ . ΠΟΣΟΝ SEARCH$(4) 190 PR IN T TAB(10);''5. Η Μ Ε Ρ Ο Μ Η Ν ΙΑ SEARCH$(5) 200 PR IN T TAB(10);"6. ΕΝΑΡΞΗ Α Ν Α Ζ Η Τ Η Σ Η Σ ' 210 PR IN T TAB(10);"7. ΕΚ Τ Υ Π Ω ΣΗ Ο Λ Ω Ν ΤΩ Ν ΔΕ ΔΟ Μ ΕΝ Ω Ν " 220 PR IN T ΤΑΒ(10);"8. ΕΠΙΣΤΡΟΦΗ ΣΤΟ Κ Υ Ρ ΙΟ Μ ΕΝ Ο Υ" 240 IN P U T ''Δώστε την επιλογή σας (1-8) από τα παραπάνω";ΟΗΟΙΟΕ% 270 R E M ...................................................................................... Πάρε την τιμή αναζήτησης 290 IN P U T "Δώστε την τιμή αναζήτησης"; SE AR C H $(C H O IC E % ) 300 R EM » * · » . » » » Συμπλήρωση των Q T Y % και A M O U N T με κενά στην αρχή 330 G O TO 140 :R EM παρουσίαση ξανά του μενού με επιλογές 340 REM
· · · · * * · * · « · · * · · » · *
Τέλος εισαγωγής παραμέτρων αναζήτησης
370 R EM Α ν επιλέχθηκε πάνω από μια επιλογή αναζήτησης, ρώτα για τη λογική 450 P R IN T " Πώς θέλετε να γίνει η αναζήτηση;" 470 P R IN T " 1. Εγγραφές με Ο ΛΕΣ τ ις παραμέτρους" 480 P R IN T " 2. Εγγραφές με Ο Π Ο ΙΑ Δ Η Π Ο Τ Ε παράμετρο" 500 IN PU T "Δώστε την επιλογή σας (1-2) από τα napan0v(o";PARAM% 520 R EM Ερώτηση για εκτυπωτή 540 LP % = 0 :R EM Η μεταβλητή LP% είναι ψευδής 550 IN P U T "Π ηγαίνει η αναφορά στον εκτυπωτή (Υ/Ν )";Υ Ν $ 570 R E M ............................................................................................. Έναρξη αναζήτησης 580 R EM · * · · Η υπορουτίνα 6000 στέλνει τις επιλεγόμενες εγγραφές στην αναφορά 610 620 630 640 660
GOSUB 2000 :R EM ανάγνωση εγγραφής υπ’ αρ. R% IF LE FT$(FLD $(1),1)="0".TH E N 760:REM τέλος αρχείου IF LE F T $(F LD $(1),1)= "*" T H E N 730:REM Σημειωμένη για απαλοιφή IF E V E R Y % T H E N GOSUB 6000:REM η εγγραφή πηγαίνει στην αναφορά REM · · · « · · · · · · · · · Βρόχος που διατρέχει τις παραμέτρους αναζήτησης
740 R EM 750 REM
» · . . * * .
................. Τέλος αναζήτησης Εκτύπωση συνόλων και επιστροφή στο μενού της αναζήτησης
770 PR IN T USING FMTS;" ", "Σύνολα”,TOT 1.ΤΟΤ2," " 780 IF LP% T H E N LP R IN T USIN G FMTS; * " , Τύνολα",ΤΟΤ1 ,TOT2," " 790 PR IN T :P R IN T :P R IN T:IN P U T "Π ατήστε R ET U R N "; NOTH IN GS 800 G O TO 100:REM Μ ηδενισμός και πάλι όλων των παραμέτρων της αναζήτησης 2000 REM
. . . . . . . . .
Ρουτίνα που διαβάζει μια εγγραφή τυχαίας προσπέλασης
205
6000 REM .................... Χειρισμός όλων των σχετικών με την εκτύπωση και το φορμάρισμα της αναφοράς 6005 R EM Τύπωσε επικεφαλίδα αν χρειάζεται 6010 IF L F % = 0 A N D N O T LP% T H E N P R IN T Τ Α Β (20);"Α Ν ΑΦ Ο ΡΑ Π Ω ΛΗ ΣΕΩΝ ": PRINT 6020 IF L F % = 0 A N D LP% TH E N LP R IN T T AB (20); "Α Ν ΑΦ Ο ΡΑ Π Ω ΛΗ ΣΕ ΩΝ ": LP R IN T 6025 REM ........................... Εκτύπωση της πρώτης γραμμής της αναφοράς 6045 REM ...................... Συγκέντρωση συνόλων 6075 REM ................. Σελιδοποίηση και διακοπές οθόνης 6080 IF N O T LP% A N D LF% > = 2 0 ΤΗ ΕΝ P R IN T :IN P U T "Π ατήστε RETU R N";N O$: LF % = 0
To πρόγραμμα είνα ι αρκετά μεγάλο και περίπλοκο, και κατά πάσα π ι θανότητα θα χρ εια σ τεί κά ποια εξάσ κη ση για τη ν πλήρ η κατανόησ ή του. Ω στόσο, οι ανα ζη τή σ εις πολλα πλώ ν πεδίων δίνουν μεγάλη ευελι ξία σ τις ανα ζη τή σ εις δεδομένων σε αρχεία. Για παράδειγμα, με το πρόγραμμα αυτό μ πορείτε να ξεχω ρ ίσετε απο έναν κα τάλογο συνδρο μητώ ν όλους όσ ους μένουν σ τη ν π ερ ιοχή με τα χυδρομ ικό κώ δικα 92037 ή όλους τους δικη γόρ ους που ζουν σ τη ν Καλαμάτα. Αν, πάλι, καταχω ρείτε επιταγές, μ πορείτε π.χ. να ξεχω ρ ίσετε όλες όσες εκδόθηκαν σ τις 31 του Μ άρτη, και σ ’ ένα σ ύστημα απ ογρ α φ ή ς εμπορευμάτων μπορείτε, είτε να π ερ ιορ ίσ ετε τη ν αναζή τησ η π.χ. σ το είδος υπ’ αρ ιθ μόν 1137Α, είτε να ψ άξετε σ τη ν ευρύτερη περ ιο χ ή των ειδών αντρικού ρ ουχισμού. Γ ια να χρ η σ ιμ ο π ο ιή σ ετε το παραπάνω πρόγραμμα για να εκτυπώνετε αναφ ορές απο το σύσ τημα SA L E S , χ ρ η σ ιμ ο π ο ιή σ τε τη διαταγή S A V E “R E P O R T για ν ’ αποθηκεύσετε το πρόγραμμα. Α υτή, ω στόσο, θα εξα φ ανίσ ει το υ πάρχον πρόγραμμα R E P O R T .' Α ν λ οιπ όν θέλετε να το δουλέψετε λ ιγάκι, πρ ιν το εντάξετε σ το σ ύστημα SA L E S , καλύτερα να το σώ σετε με κά ποιο άλ λο όνομα αρχείου, π.χ. S E A R C H . Ο λ όκλ ηρ ο το σύσ τημα S A LES που αναπτύξαμε σε όλα αυτά τα κε φάλαια παρουσιάζεται σ το παράρτημα Α. Στο παράρτημα Β θα θρείτε ένα σύστημα καταλόγου συνδρομητώ ν που έχει τις ίδιες δυνατότητες με το σ ύσ τημα πω λήσεω ν, δηλαδή προσ θέτει νέες εγγραφές, κάνει τα ξινόμη σ η, α ναζή τησ η, διορθώ σεις, απαλείψ εις ονομάτω ν και διευθύν σεων απο τη βάση δεδομένων. Τ ο σ ύσ τημα αυτό το ονομάζουμε M A IL και τυπώνει τα χυδρομ ικές ετικέτες αντί για αναφ ορές. Τ ο παράρτημα C παρουσιάζει έναν κα τάλογο β ιβ λιο θ ή κ η ς που αποθηκεύει παραπομ πές απο άρθρα που έχου ν δημοσιευτεί. Έ χ ε ι δυνατότητα τα ξινόμ ησ ης, όπως επίσ η ς και α να ζή τη σ η ς κατά συγγραφ έα, τίτλ ο ή θέμα (λέξηκλειδί). Οι ρουτίνες και οι τεχνικές των συστημάτω ν αυτών είναι κυ ριολεκ τικά ταυτόσημες μ’ αυτές που χρ η σ ιμ ο π ο ιεί το σ ύσ τημα SA LES, πα ρ ’ όλο που πρόκ ειται για ρ ιζικά διαφ ορ ετικ ές εφ αρμογές. Αυ τή είναι η ομ ορ φ ιά τω ν τεχν ικ ώ ν προγραμματισμού.
206
ΣΥΜΠΛΗΡΩΜΑΤΙ ΚΕΣ ΤΕΧΝΙΚΕΣ
Φορμάρισμα Αλφαριθμητικών Μεγάλου Μήκους στην Οθόνη Μ ερικές φ ορές αντιμετω πίζουμε προβλήμ ατα μ’ ένα α λφ αρ ιθμη τικό που περ ιέχει δεδομένα και που έχει πολύ μεγάλο μήκος. Για πα ράδειγ μα, αν είχα με ένα αρ χείο δεδομένω ν που αποθήκευε περ ιλ ήψ εις από β ι βλιογρ α φ ικ ές παραπομπές, και ένα α λ φ αρ ιθμη τικό μεγαλύτερου πλά τους από αυτό τη ς οθόνης, το α λ φ αρ ιθμη τικό θα πα ρουσ ιαζόταν σ την οθόνη κατά τον εξής τρόπο: Αυτό είναι παράδειγμα ενός αλφαριθμητικού που είναι εξαιρετικά μακρύ κα ι του τρόπου με τον οποίο θα το παρουσίαζε η BASIC χωρίς την κατάλληλη υπορ ουτίνα
Φ υσικά αυτός δεν είναι ο ιδανικός τρόπος για να πα ρουσ ιασ τεί ένα ε ξαιρ ετικά μακρύ αλφ αριθμητικό! Κ αλύτερη θα ήταν μια παρουσίαση όπως: Αυτό είναι παράδειγμα ενός αλφαριθμητικού που είναι εξαιρετικά μακρύ και του τρόπου με τον οποίο θα το παρουσίαζε η BASIC με την κατάλληλη υπορουτίνα.
Η υπορουτίνα 7000, που ακολουθεί, μ πορεί να πάρει οποιοδήποτε α λ φ αρ ιθμη τικό κειμένου και να το φορμάρει σ τη ν οθόνη, όπως στο παραπάνω παράδειγμα. Δ ηλαδή, όποιες διακοπές πραγμ ατοποιηθούν κατά την πα ρουσ ίασ η σ τη ν οθόνη θα συμπέσουν με κενά ανάμεσα σ τις λέξεις. 7000 REM * * * * * * * * * * * * * * * * * * * Subroutine to format long strings. 7010 IF LEN(LSTRINGS) < SW% THEN RETURN 7020 FOR X% - SW% TO 1 STEP - 1 7030 IF MID$(LSTRING$.X%,1)=." " THEN PRINT LEFTS (LSTRING$.X% - 1): LSTRINGS - MID$(LSTRING$, X% + 1.255):GOTO 7010 7040 NEXT X% 7050 RETURN 7000 REM
. . . . . . . .
Υπορουτίνα που φορμάρει αλφαριθμητικά μεγάλου μήκους
Γ ια να ελέγξετε την υπορουτίνα μ πορείτε να προσθέσετε λίγες γραμμές που θα τη ν μετατρέψ ουν σε πρόγραμμα, ως εξής: 10 REM * * * * * * * * * * * * * * * * * Check long-string formatting subroutine. 20 LINE INPUT " Enter a long string (up to 254 characters) ":A$ 30 PRINT:PRINT:PRINT
209
35 SW% = 80 40 LSTRINGS = A$:GOSUB 7000 :REM print a long string. 50 PRINT LSTRINGS 60 STOP 7000 REM * * * * * * * * * * * * * * * * * * * Subroutine to format long strings. 7010 IF LEN(LSTRINGS)< SW% THEN RETURN 7020 FOR X% - SW% TO 1 STEP - 1 7030 IF MIDS(LSTRING$,X%,1)-" " THEN PRINT LEFT$(LSTRINGS,X%- 1): LSTRINGS - MID$ (LSTRINGS.X% + 1,255):GOTO 7010 7040 NEXT X% 7050 RETURN 10 REM · · Υπορουτίνα που ελέγχει το φορμάρισμα αλφαριθμητικών μεγάλου μήκους 20 L IN E IN PU T "Δώστε ένα αλφαριθμητικό μεγάλου μήκους (μέχρι 254 χαρακτήρες)";Α$ 40 LSTRING$= A$:GOSUB 7(ΧΧ) :R EM εκτύπωση ενός αλφαριθμητικού μεγάλου μήκους Υπορουτίνα που φορμάρει αλφαριθμητικά μεγάλου μήκους 7000 REM ...............
Για γενική χρ ή σ η , ένα πρόγραμμα θα έπρεπε να αποθηκεύει το μακρύ αλφ αρ ιθμη τικό σε μια μεταβλητή με όνομα LSTRIN G S (όπως στη γραμμή 40), ύστερα θα έστελνε τον έλεγχο σ τη ν υπορουτίνα 7000 (ό πως στη γραμμή 40). Ε π ίσ η ς, θα χρεια ζότα ν και η γραμμή 50, μια και τυπώνει το τμήμα εκείνο της γραμμής που ήδη τα ιριά ζει σω στά στο εύρος της οθόνης. Η μεταβλητή SW % είναι το εύρος της οθόνης και στο πρόγραμμα αυτό τίθεται ίσ η με 80 (στη γραμμή 35). Μ πορείτε να δώσετε σ την SW % όποιο εύρος θέλετε, αλλά πρέπει να θυμηθείτε να κα θορίσετε τη ν τιμή κάπου μέσα σ το πρόγραμμα, που θα χρ η σ ιμ ο π οιή σ ει την υπορουτίνα 7000. Α ν κα θορίσετε μια μ ικρή τιμή (π.χ. 40), το μεγάλο σας α λφ αρ ιθμη τικό θα φ ορμα ρισ τεί έτι που να τα ιριά ζει σε μια σ τήλ η εύρους 40 χα ρακτήρω ν σ τη ν οθόνη. Αυτό μας δίνει μεγάλη ευελιξία, όταν φορμάρουμε αλφ αρ ιθμη τικά μεγάλου μήκους.
Μετατροπή των Χαρακτήρων σε Κεφαλαία Ο ι υ πολογιστές είναι μάλλον... ιδ ιότρ οπ οι με τη χρ ή σ η κεφ αλαίω ν και μικρώ ν χαρακτήρω ν. Ενώ στη γρ αφ ή μας εμείς τους χρ η σ ιμ ο π ο ι ούμε ελεύθερα και θεωρούμε πως σ ημ αίνουν το ίδιο, ο υ πολογισ τής τους παίρνει τοις μ ετρητοίς. Έ τ σ ι, για τον υ πολογιστή το όνομα Smith δεν είναι ίδιο με το όνομα SM ITH! Κ ι αυτό μπορεί να προκαλέσ ει ανα κριβή αποτελέσματα σε μερικές περιπτώ σ εις α ναζή τησ ης ή τα ξινόμ η σης. Αν λ οιπ όν σας προβ λημ ατίζει αυτό, μ πορείτε να μεταγράψετε όλα τα δεδομένα σας σε κεφ αλαίους χα ρ ακτήρ ες και να κάνετε τις τα ξινο μήσ εις και τις α ναζη τήσ εις σας με κεφ αλαία. Η υπορουτίνα 10000, που ακολουθεί, μπορεί να μεταγράψει οποιοδήποτε α λφ αρ ιθμη τικό σ το ι
210
σοδύναμό του με κεφ αλαία γράμματα. 10000 10010 10020 10030 10040 10050 10060
REM * * * * * * * * * * * * * * * * * * * * * * * Translate to upper case. FOR X % -1 TO LEN(UCS) IF ASC(MID$(UC$,X%t1)) < 97 THEN 10050 CD%-ASC(MID $(UC$,X %,1))-32 UC$ - LEFT$(UC$,X% - 1) + CHR$(CD%) + MID$(UC$,X% +1,255) NEXT X% RETURN
10000 REM
Μεταγραφή σε κεφαλαία γράμματα
Η ρουτίνα μεταγράφει όποιο α λφ αρ ιθμη τικό αποθηκευτεί σ τη ν UC$ σε κεφ αλαία γράμματα. Επομένως, αν θέλετε να μεταγράψετε κάποια άλλη μεταβλητή (π.χ. τη ν Α$) σε κεφ αλαία σ ’ ένα πρόγραμμα, αποδόσ τε τη ν τιμή τη ς σ τη ν U C $, πρ ιν τη στείλετε σ τη ν υπορουτίνα. Α κ ο λουθεί ένα πρόγραμμα ελέγχου που μεταγράφει μια μεταβλητή με όνο μα Α$ σε κεφ αλαία, χρ η σ ιμ οποιώ ντα ς την υπορουτίνα 10000: 5C LS 10 INPUT “ Enter a string";A$ 15 U C $-A $ 20 GOSUB 10000 30 PRINT:PRINT:PRINT 40 PRINT UC$ 50 STOP 10000 REM * * * * * * * * * * * * * * * * * * * * * * * Translate to upper case. 10010 FOR X % -1 TO LEN(UC$) 10020 IF ASC(MID$ - 5 5 THEN LPRINT CHR$(12):LF%-0 6095 RETURN ............................. Αναζήτηση πολλαπλών πεδίων και αναφορά 20 REM 44 REM · · · * · · · · · · · · · · · · · · · · · · · · » · · · · · Φόρμα της αναφοράς 50 R E M ................ Δεδομένα για τις διαστάσεις των πινάκων 70 F L D N A M $ (l)= 'K n A IK O Z ΠΡΟ IO N T O r :F L D N A M $ (2 )= ''n O A H T H I" 80 F L D N A M $(3 )= "n O Z O T H T A ":F L D N A M $(4)= "X P H M . n O IO N ":F L D N A M $ (5 )= "Η Μ Ε Ρ Ο Μ Η Ν ΙΑ "
232
90 REM
Μ η δενισμ ός όλων των παραμέτρων
130 REM Παρουσίαση καί πραγματοποίηση επιλογών 150 P R IN T Τ Α Β (Ι());"Ι. Κ Ω Δ ΙΚ Ο Ι ΠΡΟ ΙΌ Ν Τ Ο Σ SE AR C H S (l) 160 PR IN T ΤΑΒ(10);"2. Π Ω Λ Η Τ Η Σ SEARCH$(2) 170 PR IN T ΤΑΒ(10);"3. ΠΟΣΟ ΤΗΤΑ SEARCH$(3) 180 PR IN T Τ Α Β ( Ι0);"4. ΧΡ Η Μ . ΠΟΣΟΝ SEARCH$(4) 190 PR IN T ΤΑΒ(10);"5. Η Μ Ε Ρ Ο Μ Η Ν ΙΑ SEARCH$(5) 200 PR IN T TAB(10);"6. ΕΝΑΡΞΗ Α Ν Α Ζ Η Τ Η Σ Η Σ " 210 PR IN T TA B (1 0);”7. Ε Κ Τ Υ Π Ω ΣΗ Ο Λ ΩΝ ΤΩ Ν ΔΕΔΟΜ ΕΝ Ω Ν " 220 PR IN T ΤΑ Β (1 0);”8. ΕΠΙΣ ΤΡΟΦΗ ΣΤΟ Κ Υ Ρ ΙΟ Μ Ε Ν Ο Υ ” 240 IN PU T "Δώστε την επιλογή σας (1-8) από τα napandvco";CHOICE% Πάρε την τιμή αναζήτησης 270 REM · » . · · · · · · · · · · · . ................... 290 IN P U T "Δώστε την τιμ ή αναζήτησης"; SEAR C H $(C H O IC E % ) 300 REM . . « » . . « · Συμπλήρωση των Q T Y % και A M O U N T με κενά στην αρχή 330 G O TO 140 :R EM παρουσίαση ξανά του μενού με επιλογές 340 REM Τέλος εισαγωγής παραμέτρων αναζήτησης 370 REM Αν επιλέχθηκε πάνω από μια παράμετρος αναζήτησης, ρώτα για τη λογική 450 P R IN T ' Πώς θέλετε να γίνει η αναζήτηση;" 470 P R IN T " I . Εγγραφές με ΟΛΕΣ τις παραμέτρους" 480 P R IN T " 2. Εγγραφές με Ο Π Ο ΙΑ Δ Η Π Ο Τ Ε παράμετρο" ' 500 IN PU T "Δώστε την επιλογή σας (1-2) από τα πapaπάvω";PARAM% 520 R E M ............................................................. 540 LP % = 0 :REM Η τιμή της μεταβλητής LP% είναι "ψευδής" 550 IN P U T "Στέλνεται η αναφορά στον εκτυπωτή; (Υ Ν)";ΥΝ$
Ερώτησηγια εκτυπωτή
570 REM ........................................................ Έναρξη αναζήτησης 580 REM ................. Η υπορουτίνα 6000 στέλνει τις επιλεγόμενες εγγραφές στην αναφορά 610 GOSUB 2000 :R EM ανάγνωση εγγραφής υπ’ αρ. R% 620 IF LEFT$(FLD $( 1), 1)= ”0" T H E N 760-.REM τέλος αρχείου 630 IF LEFT$(FLD $( 1), 1)= "*" T H E N 730: R EM Σημειωμένη για απαλοιφή 640 IF EV E R Y % T H E N GOSUB 6000: R EM η εγγραφή πηγαίνει στην αναφορά 660 R EM ................. ... Βρόχος που δια τρέχει τις παραμέτρους αναζήτησης 740 R E M ............................. Τέλος αναζήτησης 750 R EM . . . . . . . Εκτύπωση συνόλων και επιστροφή στο μενού της αναζήτησης 770 PR IN T USIN G FMTS;" "Σύνολα",ΤΟΤ1.ΤΟΤ2........ 780 IF LP% T H E N LP R IN T USIN G FMTS; " " , 'Σ ύνολα",ΤΟ ΤΙ ,TOT2," " 790 PR IN T :P R IN T :P R IN T:IN P U T "Π ατήστε R ET U R N "; NO TH IN G S 800 G O TO 100:REM Μηδενισμός και πάλι όλων των παραμέτρων της αναζήτησης 2000 R EM
. . . . . . . . .
Ρουτίνα που διαβάζει μια εγγραφή τυχαίας προσπέλασης
6000 REM .............................. Χειρισμός όλων των σχετικών με την εκτύπωση και το φορμάρισμα της αναφοράς 6005 R EM .................... * ..................... Τύπωσε επικεφαλίδα αν χρειάζεται 6010 IF L F % = 0 A N D N OT LP% T H E N PR IN T Τ Α Β (2 0);'Ά Ν Α Φ Ο Ρ Α Π Ω ΛΗ ΣΕΩΝ ": PR IN T
233
6020 IF L F % = 0 A N D LP% T H E N LP R IN T T A B (20); "Α Ν ΑΦ Ο ΡΑ Π Ω ΛΗ ΣΕΩΝ ": LP R IN T 6025 R EM 6045 R EM
Εκτύπωση της πρώτης γραμμής της αναφοράς * * . · » · · « * « · . . . . . .
. . . . . . . . · ·
Συγκέντρωση συνόλων
6065 R EM . » . » · » · · » · . · · · · · · Αύξηση κατά 1 του μετρητή των γραμμών 6075 R EM . » « · · · · · · · · » * · * · · « * * · Σελιδοποίηση και διακοπές οθόνης 6080 IF N O T LP% A N D L F % > = 2 0 T H E N P R IN T :IN P U T "Πατήστε R ETU R N";N O$: L F % = 0 __________________________________________
234
Τ α προγράμματα που παρουσιάζονται στο παράρτημα αυτό αποτελούν ένα σ ύσ τημα που χειρ ίζετα ι έναν κατάλογο διευθύνσεω ν και τυπώνει τα χυδρομ ικές ετικέτες. Σας επιτρέπ ει να τα ξινομ είτε ονόματα και διευ θύνσ εις κατά οποια δήπ οτε τάξη (δηλ. κατά τα χυδρομ ικό κώ δικα ή α λ φ αβ ητικ ά κατά όνομα κτλ.). Ε π ίσ η ς, έχει δυνατότητα α ν αζή τησ ης μέ σω της οποία ς μπορείτε να πρ οσ διορ ίσ ετε ότι θα τυπωθούν ορισμένες μονο ετικέτες (π.χ. μια μόνο, για τον A dam Sm ith, ή οι ετικέτες όλω ν όσω ν κατοικούν σ το San Diego κτλ.). Διαβάζοντας τα προγράμματα, σ ίγουρα θα προσ έξετε ότι οι τεχνικές και οι ρουτίνες που χρ η σ ιμ οποιού ντα ι σ το σ ύσ τημα αυτό είνα ι σ χεδόν ταυτόσημες μ’ εκείνες του σ υσ τήμα τος SA LES. Το αρ χείο δεδομένων όμως, είνα ι αισ θητά διαφ ορετικό. Η κάθε εγγρ α φ ή περ ιέχει από ένα πεδίο για το επώνυμο, για το όνομα, τη διεύθυνση, την πόλη, την π ο λ ι τεία και τον τα χυδρομ ικό κώδικα. Η δομή του α ρχείου είναι συνοπτικά η εξής: ΟΝΟΜΑ ΠΕΔ ΙΟ Υ
ΤΥ Π Ο Σ Δ ΕΔ Ο Μ ΕΝ Ω Ν
1. LASTS 2. FIRSTS 3. A D D R ES S S 4. CITYS 5. STATES 6. ZIPS
Α Λ Φ Α Ρ ΙΘ Μ Η Τ ΙΚ Α Α Λ Φ Α Ρ ΙΘ Μ Η Τ ΙΚ Α Α Λ Φ Α Ρ ΙΘ Μ Η Τ ΙΚ Α Α Λ Φ Α Ρ ΙΘ Μ Η Τ ΙΚ Α Α Λ Φ Α Ρ ΙΘ Μ Η Τ ΙΚ Α Α Λ Φ Α Ρ ΙΘ Μ Η Τ ΙΚ Α
Μήκος εγγραφής
Μ ΕΓ ΙΣΤΟ Μ Η Κ Ο Σ Π ΕΡ ΙΓ Ρ Α Φ Η 15 15 20 15 5 10
Επώνυμο Ό νο μ α Διεύθυνση Π όλη Π ολιτεία Ταχυδ. Κ ώ δικας
80
Έ χ ο ντα ς α π οφ ασ ίσ ει τα μήκη και τους τύπους των πεδίων που π ρ ό κειται ν’ αποθηκευτούν σ το αρ χείο δεδομένων, μπορούμε ν’ αναπτύ ξουμε τις ρουτίνες με τις οποίες αποκτάμε πρόσ β α ση στο α ρ χείο δεδο μένων. Οι διαταγές, για ν' ανοίξουμε το α ρ χείο και να τοποθετήσουμε τα πεδία, είναι οι εξής: 30 OPEN "R",#1 ."MAIL.DAT",80 40 FIELD #1. 15 AS F1$,15 AS F2S.20 AS F3S.15 AS F4$,5 AS F5$,10 AS F6$
Σημειώ στε ότι το όνομα του α ρχείου δεδομένω ν είναι M A IL .D A T και το μ ήκος κάθε εγγρ α φ ή ς 80 bytes. Για να σώσουμε τη ρουτίνα, έτσι που να τη συνενώ σουμε μετά στα προγράμματά μας, πληκτρολογούμ ε S A V E , M O P E N .B A S ” , A.
237
Η υπορουτίνα που γρ άφ ει μια εγγρα φ ή σ το αρ χείο δεδομένων είναι η εξής: 1000 1010 1020 1030 1040 1050 1060 1070 1080
REM * * * * * * * * * * * * * * * * * * * LSET F1$-LASTS LSET F2$-FIRSTS LSET F3S-ADDRESSS LSET F4S-CITYS LSET F5S-STATES LSET F6S-ZIPS PUT #1,REC% RETURN
Write record REC% tc
■ Γ ράψιμο της εγγραφής υπ’ αρ. REC% στο M A IL .D A T
Σώστε την υπορουτίνα με τη διαταγή SA V E “ M W R IT E .B A S ” , Α για να μ πορείτε μ ελλοντικά να τη συνενώ σετε. Η υπορουτίνα που διαβάζει μια εγγρα φή παρουσ ιάζεται σ τη ν υπορουτίνα 2000, που ακολουθεί: 2000 2010 2020 2030 2040 2050 2060 2070 2080
REM * * * * * * * * * * * * * * * * * * GET #1, REC% LASTS-F1S FIRSTS-F2S ADDRESSS-F3S CITYS-F4S STATES-F5S ZIPS -F6S RETURN
2000 REM
* ..................
Ανάγνωση
Read record REC% from MAIL.DAT
της εγγραφής υπ' αρ. REC% από το M A IL .D A T
Χ ρ ησ ιμ οποιείσ τε τη διαταγή S A V E “M R E A D .B A S ” , Α για να σώ σε τε τη ρουτίνα αυτή. Τα προγράμματα, που χρ η σ ιμ οποιού ντα ι στο σ ύσ τημά μας, δίνονται συνοπτικά σ τον πίνακα που ακολουθεί: ΟΝΟΜΑ Π ΡΟ ΓΡΑΜ Μ ΑΤΟ Σ
Λ Ε ΙΤ Ο Υ Ρ ΓΙΑ
M IN S T A L L.B A S
Πρόγραμμα εγκατάστασης του συστήματος αναγραφής διευθύνσεων
Μ A IL . Β AS
Π ρόγραμμα με το κύριο μενού ( M A IN M E N U )
M APP EN D .BA S
Πρόγραμμα (APP EN D ) προσθήκης εγγραφών με δυνατότητα αυτόματης διαγραφής.
M SORT.BAS
Οριζόμενη από το χρήστη ταξινόμηση
LA B E LS .B A S
Προσφέρει οριζόμενη από το χρήστη αναζήτηση πολλαπλών πεδίων και τυπώνει ταχυδρομικές ετικέτες
συνεχούς μ ορφής M E D IT .B A S
Πρόγραμμα (E D IT ) διορθώσεων που επιτρέπει αλλαγές, απαλοιφή και φυλλομέτρηση
Τα προγράμματα που χρ η σ ιμ οποιού ντα ι για το χειρ ισ μ ό του σ υσ τή ματος παρουσ ιάζονται σ το παράρτημα αυτό. Ό μ ω ς, τα προγράμματα δεν έχουν γρ αφ τεί από το μηδέν. Α ντίθετα, το καθένα τους είναι μια τρ οποποιημ ένη έκδοση του αν τίσ το ιχο υ προγράμματος του συσ τήμα τος SA LES. Γ ια να κάνουμε πιο σ αφ είς τις ομ οιότητες ανάμεσα στις τεχνικές των συστημάτω ν M A IL και SA L E S , οι τρ οπ οποιημ ένες γραμ μές τυπώ νονται με παχύτερα γράμματα.
MINSTALL.BAS Είναι το πρόγραμμα εγκατά στασ ης του σ υστήματος M A IL . Π ρέπει να το π λ η κ τρ ολογή σ ετε και να το τρέξετε μια φ ορά, ώ στε να δημ ιουρ γήσ ετε το αρ χείο δεδομένων, π ρ ιν ελέγξετε κάποιο άλ λο πρόγραμμα του συστήματος. Το πρόγραμμα αυτό φ τιά χ τη κ ε φορτώ νοντας το π ρ ό γραμμα IN STA L L από το σ ύσ τημα SA LES με το συνηθισ μένο τρόπο (L O A D “ IN STA L L). Ύ σ τερ α χρ η σ ιμ οποιή σ α μ ε τη διαταγή M E R G E “Μ Ο Ρ Ε Ν για να συγχω νεύσουμε τις νέες γραμμές 30 και 40, που α ν ο ί γουν το αρ χείο και τοποθετούν τα πεδία. Μ ετά με τη διαταγή M E R G E “M W R IT E ενώσαμε τη νέα ρουτίνα που γρ άφ ει εγγραφές. Ό τα ν συνε νώνετε μια ρουτίνα σ ’ ένα πρόγραμμα, σ β ήνει τις γραμμές του που έ χουν ίδιους αριθμούς. Το σ ημάδι που δηλώ νει το τέλος του αρχείου είναι, για το σύστημα αυτό, ένα μηδενικό σ τη θέση του επώνυμου (πεδίο LASTS). Έ τ σ ι τροποιή σ αμ ε ανάλογα τη γραμμή 50 χρ η σ ιμ οποιώ ντας τη ν διαταγή E D IT τη ς B A SIC . Μ ια και το νέο μας πρόγραμμα εγκαθισ τά το σύστημα M A IL , χρ εια ζότα ν και μια τρ οπ οποίη σ η στο σ χό λ ιο στη γραμμή 10. Ν α λ οιπ όν το πρόγραμμα που εγκαθισ τά το α ρ χείο δεδομένων M A IL .D A T . Μ όλις τρ οπ οποιήσ ετε το (παλιό) IN ST A L L , ώ στε να εί ναι όπως η λίσ τα που ακολουθεί, χρ η σ ιμ ο π ο ιείσ τε τη διαταγή S A V E “M IN S TA LL για να το σώ σετε με το όνομα M IN S TA LL .B A S . Ύ σ τ ε ρα τρέξτε (με R U N ) το πρόγραμμα. 10 20 30 40
REM * * * * * * * * * * * * * * * * * * * * install Program for MAIL System REM * * * * * * * * * * * * * * * * * Used to create data file with one record. OPEN MR",#1 ,"MAIL.DAT",e0 FIELD #1, 15 AS F1S.15 AS F2$,20 AS F3$,15 AS F4$,5 AS F5$,10 AS FM
239
SO LA ST S- Ο" 60 REC% - 1 70 GOSUB 1000 :REM write record # rec%. 80 CLOSE 85 PRINT "MAIL.DAT has been initialized." 90 STOP 1000 1010 1020 1030 1040 1050 1060 1070 1080
REM * * * * * * * * * * * * * * * * * * LSET F1S * LASTS LSET F2S-FIRSTS LSET F3S * ADORESSS LSET F4S-CITYS LSET F 5S - STATES LSET F6S = ZIPS PUT #1,RECH RETURN
10 R E M .......................... 20 REM
Write record REC% to MAIL.DAT
Πρόγραμμα Εγκατάστασης για το Σύστημα M A IL Δημιουργεί ένα αρχείο δεδομένων με μία εγγραφή
70 GOSUB 1000 :R EM γράψιμο της εγγραφής υπ’ αρ. rec% 85 PR IN T 'T o M A IL .D A T τέθηκε σε αρχική κατάσταση" 1000 REM
.......................................... Γράψιμο της εγγραφής REC% στο M A IL .D A T
M AIL.BAS Το πρόγραμμα M A IL είναι το κύριο μενού του σ υσ τήματος αναγρα φ ή ς διευθύνσεων. Ε ίναι σ χεδόν ίδιο με το πρόγραμμα S A L E S .Β A S, με την εξαίρεσ η των εντολώ ν C H A IN σ τις γραμμές 170-200, οι οποίες άλ λαξαν. Μ ικρές αλλαγές υπάρχουν και σε μερικά προτρεπ τικά σ ήματα ή σ χό λ ια , και τα σημ εία που άλλα ξα ν είναι τυπωμένα με παχύτερα σ τοιχεία . Ο γρ ηγορότερ ος τρ όπος για να φ τιάξετε το πρόγραμμα είναι να δώ σετε τη διαταγή L O A D “SA L E S , να κάνετε τις αλλα γές που πρέπει με την εντολή E D IT και ύστερα να π λ η κ τρ ολογή σ ετε S A V E “ M A IL. 10 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIL.BAS 20 REM * * * * * * * * * * * * * * * * * * * * * * * * * Mail system main menu 30 REM 40 CLS 50 PRINT " 60 PRINT 70 P R IN T " 80 PRINT " 90 PRINT " 100 PRINT" 110 PRINT"
240
Main Menu" 1. 2. 3. 4. 5.
Add New Names" Sort Data" Print La be ls" Edit Data" Exit"
120 130 140 150
PRINT INPUT " Enter choice (1-5) from above ":CHOICE% IF CHOICE%< 1 OR CHOICE°/o>5 THEN BEEP:GOTO 130 ON CHOICE°/o GOTO 170.180,190.200,210
160 170 180 190 200 210
REM * CHAIN CHAIN CHAIN CHAIN END
* * * * * * * MAPPEND "MSORT" "LABELS" "MEOIT"
20 REM · · ■
appropriate program.
Κύριο μενού του συστήματος M A IL
Κύριο Μενού" 50 PR IN T " 1. Προσθήκη νέων ονομάτων" 70 P R IN T " 2. Ταξινόμηση δεδομένων" 80 PR IN T " 90 P R IN T " 3. Εκτύπωση ετικετών" 4. Διόρθωση δεδομένων" 100 PR IN T " 110 PR IN T " 5. Έξοδος" 130 IN PU T "Δώστε την επιλογή σας (1-5) από τα παραπάνω"; C H O IC E% αντίστοιχο πρόγραμμα
MAPPEND.BAS Το πρόγραμμα π ρ οσ θ ήκ ης εγγραφώ ν για το σύστημα αναγραφ ής διευθύνσεων δημ ιουργήθηκε φορτώ νοντας το (παλιό) πρόγραμμα A P P E N D , σ υνενώ νοντας σ ’ αυτό τις ρουτίνες Μ Ο Ρ Ε Ν , Μ W R IT E και M R E A D , και κάνοντας αλλα γές σε ορισ μένες γραμμές. Τώ ρα οι γραμ μές 75 και 80 ψ άχνουν να βρουν ειδικά σ ημ άδια σ το πεδίο LASTS (και όχι στο πεδίο C O D E S όπω ς ήταν σ το σύστημα των πω λήσεω ν). Α λ λα γές έγινα ν και στα προτρεπτικά σήματα σ τις γραμμές 150-200. ώ στε να α ντισ τοιχού ν στα δεδομένα του νέου συστήματος. Η γραμμή 260 μηδε νίζει τις μ εταβλητές του σ υσ τήματος και η γραμμή 290 περνάει τον έ λεγ χο ξανά σ το M A IL. Ό τ α ν κάνετε τις αλλαγές, μ πορείτε να σώ σετε το πρόγραμμα με τη διαταγή S A V E “ M A P PE N D . Ίσ ω ς θέλετε να τρέξετε το πρόγραμμα αυτό τώρα, και να προσ θέσ ε τε, έτσ ι, στο α ρ χείο δεδομένω ν μερικά ονόματα και διευθύνσεις. Μ ’ αυ τό τον τρόπο θα μ πορείτε να ελέγξετε και τα άλλα προγράμματα καθώς θα τα πληκ τρ ολογείτε. Ά λ λ ω σ τε, δύσ κολα μ πορεί να ελεγχθ εί ένα πρόγραμμα εκτύπω σης ετικετών, αν δεν υπάρχουν κάποια δεδομένα σ το αρ χείο, από τα οποία να γίνει η εκτύπωση! Α κολουθεί η λίσ τα του προγράμματος M A P PE N D . Οι τρ ο π ο π ο ιή σεις από το πρόγραμμα A P P E N D υποδηλώ νονται με παχύτερα σ το ι χεία.
241
10 20 30 40
REM * MAPPEND.BAS REM Add new records. OPEN "R",#1 ."MAIL.DAT",80 FIELD #1, 15 AS F1S.15 AS F2S.20 AS F3S.15 AS F4$,5 AS F5$,10 AS F6$
45 DIM DEL%(100) 50 REM * * * * * * * * * * * * * * * * * * * * Loop to last record. 60 FOR R E C % - 1 TO 10000 70 GOSUB 2000 :REM read record # rec%. 74 REM * * * * * * * * * * * * * * * * * No >leted records in DEL% array. 75 IF LEFT$(LAST$, 1) - " * " THEN NO.DEL% - NO.DEL% +1 :DEL% (NO.DEL%) m REC% 80 IF LEFT$(LAST$,1) · "0 " THEN 100 90 NEXT REC% 100 REM Get data for new record. 101 LAST.REC%-REC% 104 IF N O .D EL% -0 THEN REC% - LAST.REC% 105 IF NO.DEL%>0 THEN REC% - DEL%(NO.DEL%):NO.DEL% - NO. D E L% -1:O W % « -1 110 CLS 120 PRINT " Record Number ";REC% 130 PRINT " Enter 0 as last name to exit" 140 PRINT 150 INPUT " Enter Last Name -.LASTS 160 IF LASTS - "0 " THEN 260 170 INPUT " Enter First Name -FIRSTS 180 INPUT " Enter Address ";ADDRESSS 190 INPUT " Enter City -CITYS 200 INPUT " Enter State ";STATES 204 INPUT " Enter Zip Code ";ZIPS 210 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * Save new data. 220 GOSUB 1000 :REM write record number rec%. 225 REM If not overwriting a delete, increment last rec #. 230 IF NOT OW% THEN LAST.REC% - LAST.REC% + 1 235 OW % - 0 :REM * * * * * * * * * * * reset overwrite flag (OW%) to false. 240 GOTO 104 250 260 270 280 290
REM * * * * * * * * * * * * * * * Add bottom record & return to main menu. LASTS = "0-FIRSTS = ADDRESSS = "-CITYS = ' -STATES = "-ZIPS = "" GOSUB 1000 :REM Write record. CLOSE 1 CHAIN "MAIL
1000 1010 1020 1030 1040 1050 1060 1070
242
REM * * * * * * * * * * * * * * * * * * LSET F1S = LASTS LSET F2S = FIRSTS LSET F3S = ADDRESSS LSET F4S = CITYS LSET F5S = STATES LSET F6$ = ZIP$ PUT #1,REC LASTS = F1S FLDS(1) = LASTS FIRSTS = F2S FLDS(2) = FIRSTS ADDRESSS = F3S FLDS(3) = ADDRESSS CITYS = F4S FLDS(4) = CITYS STATES = F5S FLDS(5) = STATES ZIPS = F6S FLD$(6) = ZIPS RETURN
Write record REC% to MAIL.DAT
Read record REC from MAIL.DAT
5000 REM * * * * * * * * * * * * * * * * * * 5010 M% = NO.OF.RECORDS% 5020 M% - INT(M%/2) 5030 PRINT M% 5040 IF M% = 0 THEN 5270 5050 K% » NO.OF RECORDS0* - M% 5060 J% = 1 5070 l% = J% 5080 L% = I% + M% 5090 REM * * * * * * * * * * * * * * * * * * 51401F SRT$(I%)< =SRTS(L%) THEN 5240 5150 5155 5160
Shell-Metzner sort.
Get records for comparison
5170 5180
REM * * * * * * * * * * * * * * * * * * * * * * * Set up temporary data. REC% = L%:GOSUB 2000 :REM get rec L% data & store in temps. T1S = LAST$:T2$ = FIRSTS:T3S = ADDRESSS:T4S = CITYS:T5S = STATES:T6S = ZIPS REC% = l%:GOSUB 2000 :REM read data from l% record REC% = L%:GOSUB 1000 :REM put record I% data in record L%.
5190
REM * * * * * * * * * * * * * * * * * * *
Send temp variables to rec I%.
245
5200
LASTS = T1 $:FIRSTS = T2S: ADDRESS* = T3$:CITY$ = T4$:STATE$ = T5S:ZIPS = T6S REC% - l%:GOSUB 1000 :REM put temp data into record l%. KKS - SRT$(I%):SRT$(I%) - SRT$(L%):SRT$(L%) - KKS
5210 5215 5220 5230 5240 5250 5260 5270 5280
l % - l% - M % IF l% > 0 THEN 5080 J % -J % + 1 IF J% > K% THEN 5020 GOTO 5070 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * RETURN
Done with sort.
20 D IM SRT$(2000): REM Διαστάσεις για το μέγιστο αριθμό εγγραφών 50 R EM . . · * » . * « · * · * * * · . « » » . · » Παρουσίαση επιλογών ταξινόμησης 70 PR IN T "Πώς θέλετε να γ ίνει η ταξινόμηση;" 90 PRINT " 1. ΕΠΩΝΥΜΟ" 100 PRINT ” 2. ΟΝΟΜΑ" 110 PRINT " 3. ΔΙΕΥΘΥΝΣΗ" 120 PRINT " 4. ΠΟΛΗ" 130 PRINT " 5. ΠΟΛΙΤΕΙΑ" 135 PRINT " 6. ΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ" 150 IN P U T "Δώστε Π ΡΩ ΤΕΥΟΥΣΑ τάξη (l-6 )";M A JO R % 170 IN PU T "Δώστε Δ ΕΥΤΕΡΕΥΟ ΥΣΑ τάξη (0-6)";MINOR% 180 F LD $ (0 )= " " :R EM μηδενισμός της fld$(0) 190 PR IN T 'Ταξινόμηση..." 20θ PR IN T "Παρακαλώ περιμένετε, θ’ ακούσετε το 0όμβο όταν τελειώσω" 210 R E M ................. Σχηματισμός του ευρετήριου ταξινόμησης (SRTS) 230 GOSUB 2000 :R EM ανάγνωση της εγγραφής υπ’ αρ. rec% 270 R EM » * « * » » . * . Σημείωσε πόσες εγγραφές υπάρχουν στο αρχείο δεδομένων 290 GOSUB 5000 :R EM Ταξινόμηση των εγγραφών 300 REM » * · « » · · * * Οι εγγραφές ταξινομήθηκαν, επιστροφή στο Κύριο Μενού 320 BE EP:PR IN T "Τέλος ταξινόμησης..." 1000 REM * * * * * * * * * * * * * * * * Γ ράψιμο της εγγραφής REC% στο MAIL.DAT 2000 REM · · · · * * · * * * * * * 5000 R EM 5090 REM
Ανάγνωση της εγγραφής REC% από το MAIL.DAT
· · · · · · · · · · · · · * · · ................. Ταξινόμηση Σελ-Μέτσνερ · . · · . · · · · · · . · . · * · * · . » Ανάγνωση εγγραφών για σύγκριση
5150 REM ........................Τοποθέτηση προσωρινών δεδομένων 5155 REC% = L% :G O S UB 2000 :R EM ανάγνωση των δεδομένων της εγγραφής L% και αποθήκευση σε προσωρινές μεταβλητές 5170 REC% = I % :GOSUΒ 2000 :R EM ανάγνωση των δεδομένων της εγγραφής I% 5180 REC% = L% :G O S U B 1000 :R EM τοποθέτηση των δεδομένων της εγγραφής I% στην εγγραφή L%
246
5190 R EM « « · · » « « « Αποστολή των προσωρινών μεταβλητών στην εγγραφή Γ „ 5210 REC% = I% :G O SU B 1000 :R EM τοποθέτηση προσωρινών δεδομένων στην εγγρα φή 1% 5270 R E M
................................
Τ έλος τα ξινό μ η ση ς
MEDIT.BAS To M E D IT .B A S είνα ι το πρόγραμμα διορθώ σεων του συστήματος -μας. Στη ρίζεται σ το πρόγραμμα E D IT .B A S του σ υστήματος SA LES. Για να το δημ ιουργήσ ετε π λ η κ τρ ολογή σ τε L O A D “ E D IT και συνε νώ στε (με M E R G E ) τις ρουτίνες Μ Ο Ρ Ε Ν , M W R IT E και M R E A D . Ο ι απαιτούμενες αλλαγές υποδεικνύονται με παχύτερα σ το ιχεία εκτύ πω σης. Μ όλις τελειώ σ ετε την π λ η κ τρ ο λό γη σ η , αποθηκεύστε το πρ ό γραμμα χρ η σ ιμ οποιώ ντα ς τη διαταγή SA V E “M ED IT. 10 20 30 40
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MEDIT.BAS REM * * * * * * * * * * * * * * * * * * * * * * * * * Program to allow editing OPEN "MAIL.DAT",SO FIELD #1, 15 AS F1S.15 AS F2$,20 AS F3S.15 AS F4S.5 AS F5S.10 AS F6$
50 REM * * * * * * * * * * * * * * * * * * * * * * Ask user which record to edit. 60 CLS 70 INPUT " Edit which record (B to browse, 0 to escape) ";REC$ 80 IF R E C $ -"B " OR R E C $ -"b " THEN GOSUB 3000:GOTO 70 90 REC%-VAL(REC$) 100 IF R E C % -0 THEN 380 110 GOSUB 2000 :REM Read record # REC% 120 130 140 150 160 170 180 184 188 190 200
REM * * * * * * * * * * * * * * * * * * * * * * * Display record's contents. CLS PRINT "Record # ";REC%:PRINT PR IN T " 1. Last name ";LAST$ PRINT " 2. First N am · “ ;FIRST$ PRINT " 3. Address ";ADDRESS$ PRINT " 4. City ';CITYS PRINT " 5. State ";STATE$ PRINT " 6. Zip code ";ZIP$ PRINT INPUT " Edit which field (1-8. 0 to escape, D to delete)";FLD$
210 220 230 240 250
IF FLDS - "D " OR FLDS- "d " THEN GOSUB 4000:GOTO 50 FLD% - VAL(FLDS) IF F L D % -0 THEN GOSUB lOOOtGOTO 50 :REM Save and Repeat. PRINT:PRINT ON FLD% GOTO 270.300,320,340,360,374
260 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *Get new data.
247
270 280 290 300 310 320 330 340 350 360 370 374 378
LINE INPUT " Enter last name ";LAST$ IF L A S T S -"0 " THEN BEEP:PRINT " Not allowed":GOTO 190 GOTO 130 INPUT " Enter First name ';FIRSTS GOTO 130 INPUT " Enter Address ";ADDRESS$ GOTO 130 INPUT " Enter City ”;CITYS GOTO 130 INPUT " Enter State -STATES GOTO 130 INPUT " Enter Zip Code ";ZIPS GOTO 130
380 REM * * * * * * * * * * * * * * * * * * 390 CLOSE 400 CHAIN "MAIL
Close file and return to Main Menu.
1000 1010 1020 1030 1040 1050 1060 1070 1080
REM f t · · * · * * * * * * * * * · · · * LSET F1$s LASTS LSET F2S = FIRSTS LSET F3S - ADDRESSS LSET F4S-CITYS LSET F5$ = STATES LSET F6S = ZIPS PUT #1,REC% RETURN
Write record REC% to MAIL.DAT
2000 2010 2020 2030 2040 2050 2060 2070 2080
REM * * * * * * * * * * * * * * * * * * GET #1. REC% LASTS-F1S FIRSTS-F2S ADDRESSS -F 3S CITYS-F4S STATES-F5S ZIPS - F6S RETURN
Read record REC% from MAIL.DAT
3000 3010 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 4000 4010 4020 4030
REM * * * * * * * * * * * * * * * * * * * * * * * * Subroutine to 'browse'. FMTS = "####. \ \ \ \ \ V' CLS PRINT "Rec. #" FOR REC% - 1 TO 2000 GOSUB 2000 REM read record rec®A IF LEFTS(LASTS,1)- "0 " THEN 3100 PRINT USING FMT$;REC%,LASTS,FIRSTS.ADDRESSS IF REC%/20 = INT(REC%/20) THEN PRINTINPUT "Press return ";DV$ NEXT REC% PRINT:PRINT RETURN REM * * * * * * * * * * * * * * * * * * * * * * * Mark record for deletion. LASTS = " * “ + LASTS PRINTPRINT " Deleting record ";REC% GOSUB 1000 :REM Write record REC%
248
4040 FOR χο/ο = 1 TO 2000:NEXT X°/o 4050 RETURN 20 REM * ........................................................
Πρόγραμμα που επιτρέπει διορθώσεις
50 R E M ..................* ............................Ερώτηση στο χρήστη ποια εγγραφή Οα διορθώσει 70 IN P U T "Π οια εγγραφή 0u διορθώσετε (Β για φυλλομέτρηση. 0 για έξο6ο)"·^ΕΟ$ I ΙΟ GOSUB 2000 :R EM Ανάγνωση εγγραφή; υπ- up REC% 120 REM ................................. Παρουσίαση περιεχομένων εγγραφή; 140 PR IN T Έ γγραφή υπ- ap.";R EC % :PR IN T 150 P R IN T " I. Επώνυμο ";LAST$ 160 PR IN T " 2. Ό νομα ;FIRST$ 170 P R IN T " 3. Διεύθυνση ";ADDRESS$ 180 PR IN T " 4. Π όλη ";CITV$ 184 PRINT " 5. Π ολιτεία ";STATE$ 188 PR IN T " 6. Ταχυδρ. κώδικας";ΖΙΡ$ 2(K) IN PU T "Π οιο πεδίο διορθώνετε: (1-6. 0 για έςοδο. D για απαλοιφή)":ΡΙ.Ο$ 230 IF F L D % = 0 T H E N GOSUB IOOO:GO TO 50 :R EM Σώσιμο και επανάληψη 260 REM ................... Εισαγωγή νέων δεδομένων 270 L IN E IN PU T "Δώστε Enti>vupo";LAST$ 280 IF LASTS="0" T H E N BEEP:PR1NT "Απαράδεκτη τιμ ή":Ο Ο Τ Ο 190 300 IN PU T "Δώστε όνομα";Π Η$Τ$ 320 IN PU T "Δώστε 6u»evvati";ADDRESS$ 340 IN PU T "Δώστε πόλη';α Τ Υ $ 360 IN PU T "Δώστε πολιτεία";$ΤΑΤΕ$ 374 INPUT "Δώστε ταχυδρ. κώδικα";ΖΙΡ$ 380 REM
. « » « . . » · · . · ·
Κ λείσ ιμο του αρχείου και επιστροφή στο κύριο μενού
1000 REM · · · * · · * · · * * * * * * · 2000 REM
......................
Γράψιμο της εγγραφής REC% στο M A IL .D A T
Ανάγνωση της εγγραφής REC% από το M A IL .D A T
3000 R EM Υπορουτίνα "Φυλλομέτρησης" 3030 PR IN T Έ γ γ ρ .# ” 3050 GOSUB 2000 :R EM Ανάγνωση εγγραφής #rec% 3080 IF R EC % /20=IN T(R E C% /20) TH E N PR IN T :IN P U T "Πατήστε R E T U R N ";D V J 4000 REM ........................................... Σημάδεμαεγγραφών 4020 P R IN T :P R IN T "Απαλειφόμενη εγγραφ ή "^Ε Ο % 4030 GOSUB 1000:REM Γ ράψιμο εγγραφής REC%
LABELS. BAS Τ ο πρόγραμμα LA B E L S είνα ι πα ρόμοιο με το πρόγραμμα α ναζή τη σ ης πολλαπλώ ν π εδ ίω ν το υ προγράμμ ατος S A LES. Γ ια να το φ τιάξετε, φορτώ στε το α ν τίσ το ιχο πρόγραμμα με L O A D “ R E P O R T ή L O A D
249
για απαλοιφή
“S E A R C H , ανάλογα πώς το είχα τε ονομάδει στο Κ εφ άλαιο 12. Π ριν συνενώ σετε τη ν M W R IT E πρέπει να σβ ήσ ετε από το υ πάρχον πρ ό γραμμα τη ν αν τίσ το ιχη υπορουτίνα, με τη διαταγή D E L E T E 20002070. Κ ι’ αυτό για τί εδώ πρέπει να προστεθούν επιπ λέον γραμμές για τη ν ανάγνω ση των δεδομένω ν των πεδίων στον πίνακα FLD $. Φυσικά, θα πρέπει να συνενώ σετε (με M E R G E ) και τη ν ρουτίνα Μ Ο Ρ Ε Ν . 10 20 30 40 50 60 70
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LABELS.BAS REM * * * * * * * * * * * * * * * * * * Multiple-field search and print labels. OPEN "MAIL.DAT",80 FIELD #1, 15 AS F1$,15 AS F2S.20 AS F3S.15 AS F4$,5 AS F5S.10 AS F6S REM * * * * * * * * * * * * * * * * * * * * * * * * Dimension data for tables. DIM SEARCH$(6),FLDNAM$(6),FLDS(6) FLDNAM$(1) - "Last Name":FLDNAM$(2) = "F irst Name":FLDNAM$(3) = " Address" 80 FLDNAM$(4) = "Clty":FLDNAM$(5) = "S tate":FLDNAM$(6) = "Z ip code" 90 REM * * * * * * * * * * * * * * * * * * * * * * * * * 100 FOR X% = 1 TO 6:SEARCH$(X%) = "":N EXT X% 120 NO.PARAM% = 0:ALL% = 0:ANY% = 0:EVERY°/o = 0
Set all parameters to 0.
130 140 150 160 170 180 190 194 200 210 220 230 240 250 260
REM * * * * * * * * * * * * * * * * * Display options and choices. CLS PRINT TAB(10);"1. Last Name : ";SEARCH$(1) PRINT TAB(10);"2. First Name : ";SEARCH$(2) PRINT TAB(10);"3. Address : ";SEARCH$(3) PRINT TAB(10);"4. City : ";SEARCH$(4) PRINT TAB(10);"5. State : ";SEARCH$(5) PRINT TAB(10);n6. Zip Code : *;SEARCH$(6) PRINT TAB(10);"7. Begin Search" PRINT TAB(10);"8. Print All Data " PRINT TA8(10);"9. Return to Main Menu " PRINT INPUT " Enter choice (1-9) from above ";CHOICE% IF CHOICE%9 THEN BEEP:GOTO 140 IF CHOICE%>6 THEN 350
270 280 290 320 330
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * Get search value. PRINTPRINT INPUT " Enter Value to Search For ";SEARCH$(CHOICE%) NO.PARAM% - NO.PARAM% + 1 GOTO 140 :REM re-display menu with choices.
340 REM * * * * * * * * * * * * * * * * * * * Done entering search parameters. 350 IF C H O IC E% -8 THEN EVERY% - -1:G OTO 530 360 IF C H O IC E% -9 THEN CLOSE:CHAIN "MAIL" 370 380 390 400 410
250
REM If more than one search parameter selected, ask about logic. IF NO.PARAM% Μηδενισμός όλων των παραμέτρων
130 R E M .......................................... Παρουσίαση και πραγματοποίηση επιλογών 150 PR IN T ΤΑΒ(10);"1. Επώνυμο: ;S EARCH$(1) 160 PR IN T ΤΑΒ(10);"2. Ό νομα: ;SEARCH$(2) ;S EARCH$(3) 170 PR IN T ΤΑΒ(10);"3. Διεύθυνση: 180 PR IN T ΤΑΒ(10);"4. Πόλη: ;S EARCH$(4) 190 PR IN T ΤΑΒ(10);"5. Π ολιτεία: ;SEARCH$(5) 194 PR IN T ΤΑΒ(10);"6. Ταχυδρ. κώδικας:";SEARCH$(6) 200 PR IN T ΤΑΒ(10);"7. Έναρξη αναζήτησης" 210 PR IN T ΤΑΒ(10);"8. Εκτύπωση όλων των δεδομένων" 220 PR IN T Τ Α Β ( 10) ;"9. Επιστροφή στο κύριο μενού" 240 IN P U T ” Δώστε την επιλογή σας (1-9) από τα παραπάνω";(ΓΗΟΙΟΕ% 270 REM . . . . . . . . . . . . . . . . . . . . . . . . . Εισαγωγή τιμών αναζήτησης 290 IN P U T "Δώστε τιμή αvαζήτησης";S EAR C H $(C HO IC E% ) 330 G OTO 140:R EM Εμφάνιση ξανά του μενού με τις επιλογές του χρήστη 340 R EM
Τέλος εισαγωγής παραμέτρων αναζήτησης
370 REM Αν επιλέχθηκε πάνω από μια επιλογή αναζήτησης, ρώτα για τη λογική 450 PR IN T " Πώς θέλετε να γίνει η αναζήτηση;" 470 PR IN T " I . Εγγραφές με Ο Λ Ε Ι τις παραμέτρους" 480 PR IN T " 2. Εγγραφές με Ο Π Ο ΙΑ Δ Η Π Ο Τ Ε παράμετρο" 500 IN PU T "Δώστε την επιλογή σας (1-2) από τα napan0vo)";PARAM% 520 R E M ................... Ερώτηση για εκτυπωτή 540 LP % = 0 :R EM Η μεταβλητή LP% είναι ψευδής
252
550 IN P U T "Π ηγαίνει η αναφορά στο ν εκτυπω τή (Υ Ν)";Υ Ν$ 570 REM * · * ............................................................................ Έναρςη αναζήτησης 580 REM · · Η υπορουτίνα 6000 στέλνει τις εγγραφές που επιλέγονται στην αναφορά 610 GOSUB 2000 :R EM Ανάγνωση εγγραφής υπ' up. R% 620 IF L E F T $ (F L D $ (I).l) = "0" T H E N 760 :R EM Τέλος αρχείου 630 IF L E F T $ (F L D $ (I).I) = "*" T H EN 730 :REM Σημαδεμένη για απαλοιφή 640 IF EV E R Y % T H EN GOSUB 6000:REM Η εγγραφή στέλνεται στην αναφορά 660 R E M ............................................Βρόχος που διατρέχει τις παραμέτρους αναζήτησης 740 REM ...................... Τέλος 750 REM Εκτύπωση συνόλων και επιστροφή στο μενού αναζήτησης 790 IF N OT LP% T H EN IN PU T Πατήστε R ETURN ":NO TH IN G$ 8(X) G OTO 1CK) :REM Μηδενισμός όλων των παραμέτρων αναζήτησης 2000 REM · * * * * * * * * * * * *
Ανάγνωση της εγγραφής REC% από το MAIL.DAT
6000 REM * * * * * * * * * * * * * * * * * * * * * * * Εκτύπωση ταχυδρομικής ετικέτας 6010 REM * * * * * * * * * * * * * * * Απομάκρυνση των κενών μπροστά από το όνομα
Η υπορουτίνα 6000 τυπώνει τις τα χυδρομ ικές ετικέτες. Μ αι και η B A SIC συμπληρώ νει όλα τα πεδία με κενά σ τη ν αρ χή τους, όταν τα τα ξινομεί στο α ρ χείο δεδομένων, σ υμπεριλάβαμε τις γραμμές 6020 και 6050 που αφ α ιρούν τα κενά μπροστά από το (μικρό) όνομα και την πό λη. Έ τ σ ι, το όνομα “Joe Sm ith” δεν Οα τυπωθεί σ τη ν ετικέτα σαν “Joe Sm ith” . Αν πάντω ς δεν χρ ειά ζεσ τε το σ ύστημά σας να έχει τη δυνατότητα α ν α ζήτη σ ης, ακολουθεί ένα απλούσ τερο πρόγραμμα, το οποίο απλώ ς τυπώνει ταχυδρομ ικές ετικέτες. 10 20 30 40
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LABELS.BAS REM * * * * * * * * * * * * * * * * * * * * Simplified label printing program. OPEN "R",#1,"MAIL.DAT",80 FIELD #1. 15 AS F1$,15 AS F2S.20 AS F3$,15 AS F4$,5 AS F5S.10 AS F6$
50 60 70 80 90
CLS L P % -0 :REM Set line printer code to "false". INPUT " Send labels to printer (Y/N) ";YN$ IF Y N $ -" Y " OR Y N $ -" y " THEN LP % « - 1 CLS
100 FOR R E C % -1 TO 10000 110 GOSUB 2000: REM Read in record # REC%. 120 IF LEFT$(LAST$,1)-"0" THEN 160 :REM End of File. 130 GOSUB 6000: REM Print the label. 140 NEXT REC% 150 REM * * * * * * * * * * * * * * * * * * 160 CLOSE 170 CHAIN "MAIL"
Close file and return to main menu.
2000 REM * * * * * * * * * * * * * * * * * *
Read record REC% from MAIL.DAT
253
αναζήτησης
2010 2020 2030 2040 2050 2060 2070 2080
GET #1, REC% LASTS-F1$ FIRSTS-F2$ ADDRESSS -F 3S CITYS-F4S STATES-F5S ZIPS -F 6S RETURN
6000 REM * * * * * * * * * * * * * * * * * * * * * * * * * * Print mailing label. 6010 REM * * * * * * * * * * * * * * * * * * * Trim trailing blanks off first name. 6020 WHILE RIGHTS(FIRST$,1)-" ":FIRST$ - LEFTS(FIRSTS,LEN(FIRST$) - 1): WEND 6030 PRINT FIRSTS;" LASTS 6040 PRINT ADDRESSS 6050 WHILE RIGHT$(CITY$,1) - " ":C ITY $- LEFT$0 THEN REC% * DEL%(NO.DEL%):NO.DEL% = NO.DEL% - 1:OW% = -1 110 CLS 120 PRINT " Record Number ";REC% 130 PRINT " Enter 0 as Author to exit" 140 PRINT 150 LINE INPUT " Enter Author ".AUTHORS 160 IF AUTHORS - "0 " THEN 260
262
170 180 190 200 204
LINE INPUT LINE INPUT LINE INPUT LINE INPUT LINE INPUT
" ' " " "
Enter Enter Enter Enter Enter
Title ";TITLES Publication -PUBS Date (MM/DD/YY) ";DAT$ Pages ";PAGESS Keywords -KEYWORDS
210 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * Save new data. 220 GOSUB 1000 :REM write record number rec%. 225 REM If not overwriting a delete, increment last rec #. 230 IF NOT OW% THEN LAST.REC% = LAST.REC% + 1 235 OW % - 0 :REM * * * * * * * * * * * reset overwrite flag (OW%) to false. 240 GOTO 104 250 260 270 280 290
REM * * * * * * * * * * * * * * * Add bottom record & return to main menu. TITLES = "-PUBS = "-DATS = -PAGES* = "-KEYWORDS = "" GOSUB 1000 :REM Write record. CLOSE 1 CHAIN "LIBRARY
1000 1010 1020 1030 1040 1050 1080 1070 1080
REM * · * · · · * * · * · · * * * LSET F1S = AUTHORS LSET F2S = TITLES LSET F3S = PUBS LSET F4S = DATS LSET F5S = PAGESS LSET F6S = KEYWORDS PUT #1,REC% RETURN
2000 2010 2020 2030 2040 2050 2080 2070 2080
REM * * * * * * * * * * * * * * GET#1,REC% AUTHORS = F1S TITLES = F2S PUBS = F3S DATS = F4S PAGESS = F5S KEYWORDS = F8S RETURN
20 REM
Write record # RECH to LIBRARY.DAT
Read record # REC% from LIBRARY.DAT
........................................................... ...
Προσθήκη νέων εγγραφών
50 REM . . . . . . . . . . . . . . . . . . . . . . . Βρόχος που διατρέχει τις εγγραφές 70 GOSUB 20(Χ) :R EM ανάγνωση της εγγραφής υπ1αρ. rec% 74 REM . . . . . . . . Σημείωση των απαλειφόμενων εγγραφών στον πίνακα D EL% 100 REM ................ Εισαγωγή των δεδομένων των νέων εγγραφών 120 PR IN T "Αριθμός Ε γγραφ ής"^ΕΟ % 130 PR IN T "Δώστε 0 σαν συγγραφέα για να βγείτε" 150 LIN E IN P U T "Δώστε Συγγραφέα";Α υΤΗΟΚ$ 170 LIN E IN PU T "Δώστε Τ ίτλ ο ";Τ ΙΤ ίΕ $ 180 LIN E IN PU T "Δώστε Έκδοση";ΡυΒ$
263
210 REM ................... Σώσιμο νέων δεδομένων 220 GOSUB 1000 :R EM γράψιμο εγγραφής υπ' αρ. rec% 225 REM Αν δεν σβήνεται μια εγγραφή, αυξάνει κατά ένα ο αριθμός της τελευταίας εγ γραφής 235 O W % = 0 :R E M · · · Επαναφορά της σημαίας επανεγγραφής (O W % ) στο ψευδές 250 REM · · * ♦ Προσθήκη της τελευταίας εγγραφής και επιστροφή στο κύριο μενού 270 GOSUB 1000: REM Γράψιμο εγγραφής 1000 REM * * * * * * * * * * * * * 2000 REM * * * * * · · · * * ·
Γράψιμο της εγγραφής REC% στο LIBR AR Y.DA T
Ανάγνωση της εγγραφής REC% από το LIBR AR Y.DA T
LSORT.BAS Να τώρα το πρόγραμμα τα ξινόμ ησ ης (S O R T) του σ υστήματος LI B R A R Y . Π ρόκειται και πάλι για τα ξινόμ ησ η οριζόμενη από τον χρ ή στη. 10 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LSORT.BAS 25 DIM SRT$(2000) :REM dimension for max # of records. 30 OPEN "R",#1,"LIBRARY.DAT'*, 125 40 FIELD #1,20 AS F1$,20 AS F2$,20 AS F3S.10 AS F4$,5 AS F5$,S0 AS F6S 50 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * Present sort options. 60 CLS 70 PRINT " How do you want to sort? " 80 PRINT 90 P R IN T " 1. AU TH OR " 100 PRINT " 2. TITLE " 110 PRINT " 3. PUBLICATION" 120 PRINT " 4. DATE" 130 PRINT " 5. PAGES" 134 PRINT " 6. KEYWORDS" 140 PRINT 150 INPUT " Enter MAJOR order (1-6) ";MAJOR% 160 PRINT 170 INPUT " Enter MINOR order (0-6) ";MINOR% 180 185 190 200
F L D $ (0 )-"" :REM Set fld$(0) to null. CLS PRINT " Sorting...................." PRINT "Please wait. . . I'll beep when I'm done"
210 REM * * * * * * * * * * * * * * * * * * * * * * Set up sorting index (SRT$). 220 FOR REC% - 1 TO 10000 230 GOSUB 2000 :REM read record # rec% 240 IF LEFT$(AUTHOR$, 1) - "0 " THEN 280 250 SRT$(REC%) - FLD$(MAJOR%) + FLD$(MINOR%) 260 NEXT REC%
264
270 REM Note how many records in the data file. 280 NO.OF.RECORDSH - RECH - 1 290 GOSUB 5000 : REM Sort the records. 300 320 330 340
REM * * * * * * * * * * * * * * * BEEP;PRINT "Done sorting. . . CLOSE 1 CHAIN "LIBRARY
1000 1010 1020 1030 1040 1050 1000 1070 1080
REI LSET F 1S - AUTHORS LSET F2S« TITLES LSET F3S« PUBS LSET F4S * DATS LSET F5$ * PAGESS LSET F6S » KEYWORDS PUT #1,RECH RETURN
Records are sorted, return to main menu.
Write record RECH to MAIL.DAT
2000 REM * * * * * * * * * * * * * * * Read record RECH from LIBRARY.DAT 2010 GET #1, RECH 2020 AUTHORS-F1S 2025 FLDS K % THEN 5020 GOTO 5070 REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * Done with sort. RETURN
25 D IM SRT5(2000):REM Διαστάσεις για το μέγιστο αριθμό εγγραφών 50 R EM Παρουσίαση επιλογών ταξινόμησης 70 PR IN T "Πώς θέλετε να γ ίν ει η ταξινόμηση;" 90 PR IN T " 1. ΣΥ ΓΓΡ Α Φ Ε Α Σ” 100 P R IN T " 2. Τ ΙΤ Λ Ο Σ" 110 P R IN T " 3. ΕΚΔΟΣΗ" 120 PR IN T " 4. Η Μ Ε Ρ Ο Μ Η Ν ΙΑ " 130 P R IN T " 5. ΣΕΛΙΔΕΣ" 140 PR IN T " 6. Λ Ε Ξ ΕΙΣ -Κ ΛΕ ΙΔΙΑ" 150 IN P U T "Δώστε Π ΡΩ ΤΕΥΟΥΣΑ τάξη (l-6 )";M A JO R % 170 IN P U T "Δώστε Δ ΕΥΤΕΡΕΥΟ ΥΣΑ τάξη (l-6 )";M IN O R % 180 F LD $ (0 )= " ":R E M Μηδενισμός της fld$(0) 190 P R IN T 'Τ αξινόμηση..." 200 PR IN T "Παρακαλώ περιμένετε, θ’ ακούσετε το βόμβο όταν τελειώσω" 210 R EM · . * . . · « · « · · · · * Σχηματισμός του ευρετηρίου ταξινόμησης (SRTS) 230 GOSUB 2000;REM Ανάγνωση της εγγραφής υπ’ αρ. rec% 270 R EM * * « * * » · » » Σημείωσε πόσες εγγραφές υπάρχουν στο αρχείο δεδομένων 290 G OSUB 5000:REM Ταξινόμηση των εγγραφών 300 REM . . . . . . . . . . Ο ι εγγραφές ταξινομήθηκαν, επιστροφή στο κύριο μενού 320 B E E P :P R IN T 'Τ έλος ταξινόμησης..." 1000 REM * * * * * * * * * * * * *
Γράψιμο της εγγραφής REC% στο LIBRARY.DAT
2000 REM * · * · · * · * * * * Α νάγνωση της εγγραφής REC% από το LIBRARY.DAT 2053 REM ............................................. Αναστροφή των δύο ψηφίων της ημερομηνίας 5000 R EM .............................................. Ταξινόμηση Σελ-Μέτσνερ 5090 REM * ...........................* ...................................Ανάγνωση εγγραφών για σύγκριση 5150 REM . . . . . . . . . . . . . . . . . . . . Τοποθέτηση προσωρινών δεδομένων 5155 R E C % = L % : GOSUB 2000: R EM Ανάγνωση των δεδομένων της εγγραφής L% και αποθήκευσή τους σε προσωρινές μεταβλητές 5170 REC% = I%:GOSUB 2000: REM Ανάγνωση των δεδομένων της εγγραφής 1%
266
5180 στην 5190 5210
REC% = L% :G O S U B 1000:REM Τοποθέτηση των δεδομένων της εγγραφής Γ „ εγγραφή L% R EM Αποστολή των προσωρινών μεταβλητών στην εγγραφή 1% REC% = l%:GOSUB 1000:REM Τοποθέτηση προσωρινών μεταβλητών στην εγγραφή 1% 5270 R EM ..................... Τέλος ταξινόμησης
LEDIT.BAS Τ ο πρόγραμμα L E D IT δίνει τη δυνατότητα για διορθώ σεις, απ α λ οι φή εγγρα φώ ν και φ υλλομ έτρησ η του προγράμματος L IB R A R Y .D A T . 10 20 24 30 40
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LEDIT.BAS REM * * * * * * * * * * * * * * * * * * * * * * * * Program to allow editing. PRINT:PRINT OPEN “R",#1 ."LIBRARY.DAT", 125 FIELD #1,20 AS F1$,20 AS F2$,20 AS F3S.10 AS F4$,5 AS F5$,50 AS F8S
50 REM * * * * * * * * * * * * * * * * * * * * * * Ask user which record to edit. 60 CLS 70 INPUT " Edit which record (B to browse, 0 to escape) ";REC$ 80 IF REC$ - "B " OR R E C $ -"b " THEN GOSUB 3000:GOTO 70 90 REC%-VAL(REC$) 100 IF R E C % -0 THEN 380 110 GOSUB 2000 :REM Read record # REC% 120 130 140 150 160 170 180 184 188 190 200 210 220 230 240 250
REM * * * * * * * * * * * * * * * * * * * * * * * Display record's contents. CLS PRINT "Record # ";REC%:PRINT PRINT " 1. Author AUTHORS PRINT " 2. Title -TITLES ' PRINT " 3. Publlctlon “;PUBS PRINT " 4. Date ";DAT$ PRINT " 5. Pages ;PAGESS PRINT " 6. Keywords ";KEYWORDS PRINT INPUT " Edit which field (1-6, 0 to escape. D to delete) ";FLD$ IF FLDS■ "D " OR F L D S -"d " THEN GOSUB 4000:GOTO 50 FLD% - VAL(FLDS) IF FLD-0 THEN GOSUB lOOOrGOTO 50 :REM Save and Repeat. PRINTPRINT ON FLD% GOTO 270,300.320.340,360,374
260 270 280 290 300 310
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Get new data. LINE INPUT " Enter Author :";AUTHORS IF AUTHORS ■ "0 " THEN BEEP:PRINT " Not allowed":GOTO 190 GOTO 130 LINE INPUT " Enter Title : ";TITLES GOTO 130
267
320 330 340 350 360 370 374 378
LINE INPUT " Enter Publication : ";PUB$ GOTO 130 LINE «INPUT " Enter Date : ";DATS GOTO 130 LINE #INPUT " Enter Pages : ;PAGESS GOTO 130 LINE #INPUT " Enter Keywords : ";KEYWORD$ GOTO 130
380 REM * * * * * * * * * * * * * * * * * * 390 CLOSE 400 CHAIN "LIBRARY
Close (ile and return to main menu.
1000 1010 1020 1030 1040 1050 1060 1070 1080
REM * * * * * * * * * * * * * * * LSET F1S = AUTHORS LSET F2S = TITLES LSET F3S-PUBS LSET F4S-DATS LSET F 5S - PAGESS LSET F6S - KEYWORDS PUT #1.REC% RETURN
W rit· record # RECH to LIBRARY.DAT
2000 2010 2020 2030 2040 2050 2060 2070 2080
REM * * * * * * * * * * * * * * * GET#1,REC AUTHORS-F1S TITLES -F2S PUBS-F3S DATS - F4$ PAGESS - F5S KEYWORDS-F6S RETURN
Read record # REC% from LIBRARY.DAT
3000 3010 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110
REM * * * * * * * * * * * * * * * * * * * * * * * * Subroutine to 'browse'. FMTS -"# ## #. \ \ \ \ \ \" CLS PRINT "Rec. #" FOR R E C % - 1 TO 2000 GOSUB 2000 :REM read record rec% IF LEFTS(AUTHORS,1) - "0 " THEN 3100 PRINT USING FMTS;REC%, AUTHORS,TITLES,PUBS IF REC%/18 - INT(REC%/18) THEN INPUT "Press return ";DV$ NEXT REC% PRINT:PRINT RETURN
4000 4010 4020 4030 4040 4050
REM * * * * * * * * * * * * * * * * * * * * * * * AUTHORS = " * " + AUTHORS PRINT:PRINT " Deleting record ";REC% GOSUB 1000 :REM Write record REC% FOR X % - 1 TO 2000:NEXT X% RETURN
268
Mark record for deletion.
Π ρόγραμμα που επιτρέπει διορθώ σεις
20 REM
50 R E M ......................................... Ερώτησηστο χρήστη ποιαεγγραφή Οαδιορθώσει 70 IN P U T "Π οια εγγραφή διορθώνετε;(Β για φυλλομέτρηση, 0 για έξοδο) ” ;REC$ 110 G OSUB 2000 :R EM Ανάγνωση εγγραφής υπ’ αρ. REC% R E M ............................................................... Παρουσίαση περιεχομένων εγγραφής PR IN T "Εγγραφή υπ' ap .";R EC % :PR IN T P R IN T ’ 1. Συγγραφέας ";AUTHOR$ ";TITLE$ P R IN T ’’ 2. Τ ίτλος ";PUB$ P R IN T ’ 3. Έκδοση ";DAT$ i P R IN T ’ 4. Ημερομηνία ”;PAGE$ P R IN T ’ 5. Σελίδες 6. Λέξεις-κλειδιά ";KEYWORD$ P R IN T ’ 200 IN PU T "Π ο ιο πεδίο διορθώνετε; (1-6, 0 για έξοδο, D για α π α λοιφ ή)";Ρ ίϋ$ 230 IF F L D % = 0 T H E N GOSUB 1000:GOTO 50:R EM Σώσιμο και επανάληψη 260 R EM ......................... Εισαγωγή νέων δεδομένων 270 LIN E IN P U T "Δώστε ουτγραφέα:” ;Α υΤΗ Ο Κ $ 280 IF AU TH O R $=”0" TH E N BE EP:PR IN T "Απαράδεκτη τιμ ή":Ο Ο Τ Ο 190 300 L IN E IN P U T "Δώστε τ ίτλ ο :";Τ ΙΤ ίΕ $ 320 L IN E IN P U T "Δώστε έκδοση: ";PUB$ 340 L IN E # IN P U T "Δώστε ημερομηνία: ”;D AT$ 360 LIN E # IN P U T "Δώστε σελ(δες:";ΡΑβΕ$ 374 LIN E # IN P U T "Δώστε λέξεις-κλειδιά:";ΚΕΥννθΗΙ>$ 380 REM
. . . . . . . . . . . .
1000 REM * * * * * * * * * 2000 R EM
. . . . .
Κ λείσ ιμο του αρχείου και επιστροφή στο κύριο μενού
Γράψιμο της εγγραφής υπ' αρ. REC% στο LIBR AR Y.D A T
Ανάγνωση της εγγραφής υπ' αρ. REC% από το L IB R A R Y .D A T
3000 R EM Υπορουτίνα «φυλλομέτρησης» 3030 PR IN T "Εγγρ. # " 3050 GOSUB 2000 :R EM Ανάγνωση εγγραφής rec% 3080 IF R EC % /18=IN T(R E C% /18) TH E N IN PU T "Πατήστε R ETU R N ” ;DV$ 4000 REM ....................................... Σημάδεμαεγγραφώνγια απαλοιφή 4020 PR IN T :P R IN T "Απαλειφόμενη εγγραφ ή "^Ε Ο % 4030 GOSUB 1000: REM Γράψιμο εγγραφής RE(^%________________________________
LSEARCH. BAS Αυτό είναι το πρόγραμμα α να ζή τη σ η ς πολλα πλώ ν πεδίω ν για το σύ σ τημ α L IB R A R Y . Τ ρ οποπ οιή θ η κ α ν οι γραμμές 690 και 700, ώστε η α να ζήτη σ η να γίνετα ι ενδοα λφ αριθμ ητικά χρ η σ ιμ οποιώ ντας τη συνάρ τη σ η IN STR .
269
10 20 30 40
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LSEARCH.BAS REM * * * * * * * * * * * * * * * * * * * * * Multiple-field search and report. OPEN "R",#1 ."LIBRARY.DAT", 125 FIELD #1,20 AS F1$,20 AS F2$,20 AS F3$,10 AS F4S.5 AS F5$,50 AS F6$
50 60 70 80
REM * * * * * * * * * * * * * * * * * * * * * * * * Dimension data lor tables. DIM SEARCH$(6),FLDNAM$(6).FLD$(6) FLDNAM$(1) - "Author":FLDNAM$(2)- "Tttle":FLDNAM$(3) - "P ublication" FLDNAM$(4) - "Date":FLDNAM$6 THEN 350 270 200 290 320 330
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * Get search value. PRINT:PRINT INPUT " Enter Value to Search For ";SEARCH$(CHOICE%) NO.PARAM% - NO.PARAM% + 1 GOTO 140 :REM re-display menu with choices.
340 REM * * * * * * * * * * * * * * * * * * * Done entering search parameters. 350 IF CHOICER - 8 THEN EVERY% - - 1:GOTO 530 360 IF C HOICER- 9 THEN CLOSE:CHAIN "LIBRARY 370 380 390 400 410 420 430 440 450 460 470 480 490 500
270
REM If more than one search parameter selected, ask about logic. IF NO.PARAM% = I8 THEN PRINT:1NPUT "Πατήατε RETURN";NO$: LF% =0
Η μεταβλητή LF% στη γραμμή 6190 μετράει πόσ ες γραμμές έχουν τυπωθεί σ τη ν οθόνη ή τον εκτυπωτή. Αυξάνεται κατά επτά κάθε φορά
273
που εμ φανίζονται σ τη ν αναφ ορά τα δεδομένα μ ιας εγγρ α φ ή ς, για τί κάθε εγγρα φ ή απ αιτεί επτά τυπωμένες γραμμές (πέντε για τα δεδομένα συν δύο λευκές γραμμές).
274
ΠΑΡΑ
ΠΕΡΙΛΗΨΗ ΤΟΥ ΛΕΞΙΛΟΓΙΟ ΤΗΣ BASIC
•Δ
Διαταγή #
Ο ρ ισ μ ός Υ ποδηλώ νει τον αριθμό ενός καναλιού: P U T # 1 , R E C % . Ε π ίσ η ς, όταν χρ η σ ιμ οποιείτα ι σ τις φ όρμες U S IN G , υποδηλώ νει ένα ψ ηφίο: P R IN T U S IN G “ # # # , # # # . # # ”Χ.
*
Π ολ λα πλ ασ ιάζει δύο αριθμούς: P R IN T 14*33.
+
Π ροσ θέτει δύο αριθμούς: P R IN T Χ + Υ . Ε πίσης, σ υνενώ νει αλφ αριθμη τικά: A $ = “ H i” + “th e re ” .
-
Α φ αιρ εί δύο αριθμούς: P R IN T 83-17.
/
Δ ια ιρεί δύο αριθμούς: P R IN T 15/3. Β άζει πάνω από μία διαταγές σε μια γραμμή, ή πάνω από μία εντολές σ ε μια συνθήκη IF: IF Χ < 10 P R IN T “Y es” : G O T O 999. Αν το X είναι μ ικρότερο από 10, το πρόγραμμα τυπώ νει Yes και περνάει τον έλεγχο στη γραμμή 999. Α λλιώ ς δεν κάνει τίπ οτα α π ’ αυτά. Α ποτρέπει μια επαναφ ορά κ εφ αλ ής (C /R ) στο τέλος μιας εντολ ής PR IN T: P R IN T “H ello” . Χ ρ η σ ιμ οποιείτα ι με τη ν διαταγή IN PU T για να σ ημ άνει το τέλος ενός π ρ οτρεπ τικού σήματος: IN P U T “Δώ στε τη ν επιλ ογή σ ας (1-5) “C H O IC E .
<
Σημ α ίνει μεγαλύτερο από: IF Χ > Υ T H E N ...
Α
Υ ποδηλώ νει ότι το πρόγραμμα που σώ ζεται πρέπει να αποθηκευτεί σε A SC II: SA V E “M A IL .B A S ” , A.
AB S
Δ ίνει τη ν απόλυτη τιμή μ ιας μ εταβλητής [X = A B S(Y )].
277
AND
Σημαίνει ότι για να είναι αλ η θ ή ς μια σ υνθήκη IF δύο όροι πρέπει να είνα ι τα υτόχρονα α λ ηθ είς ( I F Χ > 1 0 A N D Υ < 100T H E N ...)·
A SC
Ε π ισ τρέφ ει τον κω δικό A SC II ενός δεδομένου χα ρακτήρα. Η P R IN T A SC (“ *”) δ ίνει 42. Αν υ πάρ χει πάνω από ένας χα ρ α κτή ρ α ς σ ’ ένα αλ φ αρ ιθμη τικό, επισ τρ έφ ει τη ν τιμή A SC II του πρώτου χα ρακτήρα.
ΑΤΝ
Δίνει το τόξο εφ απ τομένης ενός αριθμού εκφ ρασμένου σε α κ τίνια [Χ =Α Τ Ν (Υ )].
AUTO
Α ριθμεί αυτόματα τις γραμμές καθώς δημ ιουργείται το πρόγραμμα (η A U T O 10, 20 αρ χίζει να αριθμεί τις γραμμές α π ’ τη γραμμή 10 και το θήμα αύ ξη σ ης είνα ι 20).
CHR$
Ε μφανίζει το χα ρ α κτή ρ α που α ν τισ το ιχεί σ ’ έναν αριθμό A SC II. Η P R IN T C H R $(42) τυπώ νει έναν ασ τερίσ κο. Χ ρη σ ιμ οποιείτα ι επ ίσ η ς και με μη εκτυπώ σιμους χα ρακτήρες. Έ τ σ ι, η L P R IN T C H R $(12) πρ οχω ρά ει το χα ρ τί σ τον εκτυπωτή (προώ θηση σελίδας). Η P R IN T C H R $(7) κάνει το κουδούνι να χτυπ ήσ ει.
CLOSE
Τ ερμ ατίζει τη σύνδεση ανάμεσα σ τη R A M και σ ’ ένα αν ο ιχτό αρ χείο δεδομένων. Η C L O S E # 1 κ λ είνει το κανάλι υπ’ αριθμ όν ένα. Η C L O S E χω ρ ίς αριθμό καναλιού κλ είνει όλα τα α ν ο ιχτά α ρ χεία δεδομένων. Ε π ίσ η ς, περνάει όλα τα δεδομένα από την πρ οσ ω ρινή μνήμη σ το αρ χείο δεδομένων.
COS
Δίνει το σ υνημ ίτονο ενός αριθμού εκφ ρασμένου σε α κ τίνια [X = C O S(Y )].
CV D
Μ ετατρέπει τα α λ φ αρ ιθ μη τικά δεδομένα από την προσ ω ρινή μνήμη δεδομένω ν τυχαία ς πρ οσ π έλα σ ης σ ε αριθμό διπ λή ς α κρίβεια ς [Z # = C V D (F 4 $ )]. Χ ρ ησ ιμ οποιείτα ι με αρ χεία δεδομένων τυχαία ς προσ πέλα σ ης.
278
Μ ετατρέπει τα α λ φ αρ ιθμη τικά δεδομένα της πρ οσ ω ρ ινής μνήμης ενός αρχείου δεδομένων τυχαία ς πρ οσ π έλα σ ης σε ακέραιο αριθμό [Q TY % = CV I(F3$)]. Χ ρ ησ ιμ οποιείτα ι με α ρ χεία δεδομένων τυχαία ς πρ οσ π έλα σ ης. Χ ρ ησ ιμ οποιείτα ι με α ρ χεία δεδομένων τυχαίας προσ π έλα σ ης. Μ ετατρέπει αλφ αριθμη τικά δεδομένα της πρ οσ ω ρ ινής μ νήμ ης ενός αρχείου δεδομένων τυχαία ς πρ οσ π έλα σ ης σε αριθμό α π λή ς α κ ρ ίβεια ς [A M O U N T = CVS (F4$)]. Σ βήνει τις γραμμές ενός προγράμματος α ρ χίζοντα ς και τελειώ νοντας στα σ ημ εία που καθορίζουμε (η D E L E T E 10-100 θα σ β ήσ ει τις γραμμές 10 ω ς και 100 του προγράμματος που είναι τη σ τιγμ ή εκείνη στη R A M ). Κ ρατάει χώ ρ ο αποθήκευσ ης για έναν πίνακα δεδομένων. Η D IM ΝΜ$ (100) κρατάει χώ ρο για 100 μ εταβλητές με όνομα Ν Μ $ και δείκτες από 1 ω ς 100 [Ν Μ $(1), ΝΜ $(2), ΝΜ $(3)... ΝΜ $(100)]. Τ ρ οποπ οιεί μια γραμμή του προγράμματος που είναι σ τη R A M . Τα πλ ήκ τρ α του δεξιόσ τροφ ου (—*) και του αρισ τερ όσ τρ οφ ου («—) βέλους σ το π λ η κ τρ ολόγιο, μετακινούν το δρομέα κάτω α π ’ τη γραμμή. Τ ο π λ ήκ τρ ο INS επιτρέπει παρεμβολή χα ρακτήρω ν, το D E L σ β ήνει χ α ρ ακτήρ ες από τη γραμμή (E D IT 120). Χ ρ ησ ιμ οποιείτα ι πρ οα ιρ ετικά με τις IF και T H E N . Υ ποδηλώ νει τι θα γίνει, αν η συνθήκη δεν είναι αληθής: IF Χ < 1 0 T H E N G O T O 999 EL S E G O T O 10 Γ ίνεται αληθής, όταν φτάσουμε στο τέλος ενός α ρχείου δεδομένων [IF E O F (l) T H E N G O T O 999]. Στο παράδειγμα αυτό, όταν φτάσουμε στο τέλος του αρχείου, ο έλεγ χο ς περνάει στη γραμμή 999.
279
F IE L D
Ο ρ ίζει τη δομή τη ς π ρ οσ ω ρ ινής μ νήμ ης ενός α ρχείου δεδομένω ν τυ χαία ς προσ π έλα σ ης. Η FIE L D # 1 ,2 0 AS F l$ , 10 AS F2$ ορ ίζει δύο πεδία για κάθε εγγρα φ ή ενός α ρχείου δεδομένων τυ χαία ς π ρ οσ π έλα σ ης, από τα οποία το πρώ το έχει εύρος 20 χα ρ ακτήρ ες και το δεύτερο 10 χα ρακτήρες.
F ILES
Ε μφανίζει τα ονόματα των αρ χείω ν που είναι αποθηκευμένα σ το δίσκο.
FO R
Α ρ χίζει ένα βρ όχο που ξεκινάει από κάποια τιμ ή, σταματάει σ ε κά ποια άλλη και αυξάνει ι κατά 1 τη μεταβλητή - δείκτη. Η διαταγή F O R Χ = 1 Τ Ο 10 δ ημ ιουργεί ένα β ρ όχο που θα επα ναληφ θεί 10 φ ορές, αυξάνοντας κατά ένα την X σ ε κάθε πέρασμα του βρόχου. Α παιτεί τη διαταγή N EX T.
FRE
Δ είχνει πόσ η μνήμη είνα ι αυτή τη στιγμ ή διαθέσιμη σ τη R A M [P R IN T F R E (X )].
GOSUB
IF
Σ τέλνει τον έλεγχο σε μια υπορουτίνα σ τον α ν τίσ το ιχο αριθμό γραμμής: G O S U B 2000. Η υπορουτίνα πρέπει να περιλαμ βάνει μια διαταγή RETURN. Π α ίρνει μια απόφ ασ η σ ’ ένα πρόγραμμα: IF X c lO T H E N ...
IN PU T
Τ οποθετεί σ τη ν οθόνη ένα πρ οτρεπ τικό σήμα και περιμένει το χρ ή σ τη να δώ σει την απ άντησ ή του. Α ποθηκεύει τη ν απάντησ η σ ε μια μ εταβλητή. Π .χ.: IN P U T «Θέλετε η αναφ ορά να πάει σ τον εκτυπωτή; (Υ/Ν)», ΥΝ$. Τ ο μήνυμα ανάμεσα σ τα εισ αγω γικά εμφανίζεται σ την οθόνη. Η απάντησ η του χρ ή σ τη αποθηκεύεται σ τη ΥΝ$.
IN P U T #
Δ ιαβάζει μια εγγρα φ ή από ένα σ ειρ ιακό α ρχείο δεδομένων και προχω ρά ει τον δ είκτη σ τη ν επόμενη εγγρα φ ή . Ο αριθμός που ακολουθεί
280
υποδηλώ νει τον αριθμό του καναλιού: IN PU T # 1 , Ν Μ $, A D $, C ITY $, STA TES, ZIPS. IN STR
IN T
Β ρίσκει αν ένα α λ φ αρ ιθμη τικό περικλείετα ι μέσα σ ’ ένα άλλο. Δίνει τη θέση που αρ χίζει η ταύτισ η, αν υ πάρχει ταύτιση. Α λλιώ ς, επισ τρέφ ει τιμή μηδέν [SPO T% = IN STR (1,Α $,Β $)]. Δ ίνει το ακέραιο μέρος ενός πραγματικού αριθμού. Η P R IN T ΙΝ Τ (12.2) δίνει 12.
KILL
Σ βήνει το κατονομαζόμενο αρ χείο από το δίσ κο (K IL L “M A IL .B A S ” ).
LEFTS
Ε π ισ τρέφ ει τους πρώ τους από αρισ τερά χα ρ ακτήρ ες ενός αλφ αριθμητικού. Η P R IN T LEFTS (“Z e p p o ” , 3) επισ τρ έφ ει “Z e p ” , δηλαδή τους 3 πρώ τους από αρ ισ τερ ά χα ρακτήρες.
LEN
Ε π ισ τρέφ ει το μ ήκος ενός αλφ αριθμη τικού. Η P R IN T L E N (“Z ep p o ” ) επισ τρ έφ ει την τιμή 5.
L IN E IN PU T Δ έχεται δεδομένα από τη ν οθόνη, στα οποία επιτρέπ ει να περ ιέχοντα ι κόμματα. LIST
Π α ρουσ ιάζει σ τη ν οθόνη το πρόγραμμα που βρίσ κετα ι εκείνη τη στιγμ ή στη R A M .
LLIST
Τυπώ νει στον εκτυπωτή το πρόγραμμα που βρίσ κετα ι εκείνη τη σ τιγμ ή στη R A M .
LOA D
Φ ορτώ νει ένα ύπαρ χον πρόγραμμα B A SIC από το δίσ κο στη R A M .
LOG
Δίνει το φ υσ ικό λογάριθμο ενός αριθμού (P R IN T LOG (X)).
L P R IN T
Στέλνει δεδομένα σ τον εκτυπωτή για να τυπωθούν: L P R IN T “ H ello” .
LSET
Χ ρ ησ ιμ οποιείτα ι με α ρ χεία δεδομένων τυχαίας
281
πρ οσ π έλα σ ης. Τ οποθετεί τα δεδομένα σ την προσ ω ρινή μνήμη του αρ χείου ευθειασμένα από τ’ αριστερά. Χ ρ ησ ιμ οποιείτα ι κυρίω ς με α λ φ αρ ιθ μη τικά δεδομένα που περ ιέχουν χα ρ ακτήρ ες (L S E T F l$ = C O D E S ). M ERGE
Συνενώ νει ένα πρόγραμμα ή μια υπορουτίνα από το δίσ κο, σ το πρόγραμμα που είνα ι τη σ τιγμ ή εκείνη στη R A M . Αν υ πάρχουν γραμμές με τους ίδιους αριθμούς, τις σβ ήνει. Τ ο αρ χείο που σ υνενώ νεται πρέπει προηγουμένω ς να έχει σωθεί με τη ν επιλ ογή ,Α (A S C II).
M ID $
Δίνει το μεσαίο κομμάτι ενός αλφ αριθμη τικού, όταν π ρ οσ διορ ισ τού ν σ η μ είο ένα ρ ξης και μήκος. Η P R IN T M ID $ (“A B C D E F G ” ,3,2) δίνει “C D ” (δύο χα ρ ακτήρ ες α ρ χίζοντα ς από τον τρίτο).
M KD$
Μ ετατρέπει αριθμούς διπ λή ς ακ ρ ίβεια ς σε α λ φ αρ ιθ μη τικά για τοπ οθέτησ η σ τη ν π ροσ ω ρινή μνήμη του αρ χείου [R S E T M K D $ (Z # )j. Χ ρ ησ ιμ οποιείτα ι με α ρ χεία δεδομένω ν τυ χαία ς πρ οσ π έλα σ ης.
M KI$
Μ ετατρέπει ακέραιους αριθμούς σε αλφαριθμητικά για τοποθέτησ η σ τη ν πρ οσ ω ρινή μνήμη του α ρχείου (R S E T Μ ΚΙ$ (Q T Y % # )). Χ ρ ησ ιμ οποιείτα ι με α ρ χεία δεδομένω ν τυχαία ς προσ πέλα σ ης.
MKS$
Μ ετατρέπει αριθμούς απ λή ς ακ ρ ίβεια ς σε α λ φ αρ ιθ μη τικά για τοποθέτησ η σ τη ν προσ ω ρινή μνήμη του αρχείου (R S E T MKS$ (A M O U N T # )). Χ ρ η σ ιμ οποιείτα ι με α ρ χεία δεδομένων τυχαία ς προσ πέλα σ ης.
NAME
Μ ετονομάζει ένα α ρ χείο του δίσκου (R E N A M E πα λιό όνομα AS νέο όνομα).
N EW
282
Σβήνει το πρόγραμμα και όλα τα δεδομένα που β ρ ίσ κοντα ι εκείνη τη σ τιγμ ή στη RA M .
NEX T
ON
OPEN
Χ ρ ησ ιμ οποιείτα ι στους β ρόχους F O R -N E X T . Σημαδεύει το τέλος του βρόχου. Π ερνάει τον έλεγ χο σ το κα τάλ λη λο μέρος του προγράμματος βάσει κάποιου αριθμού που δίνεται (συνήθω ς από ένα μενού): O N C H O IC E G O T O 100, 200, 300. Α ν C H O IC E = 1, ο έλεγ χο ς περνάει σ τη γραμμή 100, αν C H O IC E = 2 σ τη γραμμή 200 κτλ. Α νοίγει ένα αρ χείο δεδομένων. Η O P E N “ R ” , # 1 , “ M A IL .D A T ” , ανοίγει ένα α ρ χείο δεδομένω ν τυ χαία ς πρ οσ π έλα σ ης μέσω του καναλιού υπ’ αρ. ένα κα ι με όνομα αρχείου το M A IL .D A T .
OR
Γ ια να αληθεύει μια εντολή IF πρέπει να είναι α λ ηθ ής είτε η μία σ υνθήκη είτε η άλ λη (IF Χ > 10 O R Υ < 100T H E N ...).
P R IN T
Τυπώ νει αλφ αρ ιθμη τικά, όπω ς δίνονται (P R IN T “H ello”). Ε π ίσ η ς τ η ν τιμ ή μιας μ εταβλητής (P R IN T X) ή το αποτέλεσμα μιας πρά ξη ς (P R IN T 10*10).
P R IN T #
Σ τέλνει τα δεδομένα σ τη ν έξοδο μέσω του καναλιού που προσ διορ ίζεται. Η P R IN T # 1, “H ello” σ τέλ νει σ τη ν έξοδο τη λέξη H ello μέσω του καναλιού # 1, προφ ανώ ς σε ένα αν ο ιχτό αρ χείο δεδομένων.
RETURN
Χ ρ η σ ιμ οποιείτα ι σε υπορουτίνες. Ό τα ν συναντηθεί, σ τέλνει τον έλεγχο πίσ ω στη γραμμή που ακολουθεί τη διαταγή G O SU B ή σ τη ν πρώ τη άνω και κάτω τελεία (:) τ η ς γραμμής GOSUB.
R IG H T S
Δίνει τους πρώ τους από τα δεξιά χα ρακτήρες ενός αλφ αριθμητικού. Η P R IN T R IG H T S (“ 12/31/83” ,2) δίνει “83” .
R SE T
Τ οποθετεί τα δεδομένα σ τη ν π ρ οσ ω ρινή μνήμη
283
του α ρχείου δεδομένων, έτσ ι που να ευθειάζονται από τα δεξιά. Χ ρ ησ ιμ οποιείτα ι για τη ν αποθήκευση αριθμ ητικώ ν δεδομένω ν σ ε α ρ χεία τυχαία ς προσ π έλα σ ης. [R S E T F3$ = C V I(Q T Y % )]. SA V E
Σώζει το πρόγραμμα που β ρ ίσ κετα ι σ τη R A M σε αρ χείο του δίσκου, π.χ. S A V E “M A IL . Π ροσ θέτει τη ν προέκτασ η . B A S σ το όνομα του αρχείου.
SIN
Δ ίνει το ημ ίτονο ενός αριθμού [Y =S IN (X )].
SQ R
Δ ίνει τη ν τετραγω νική ρίζα ενός αριθμού: Η P R IN T S Q R (81) επ ισ τρ έφ ει το 9.
STEP
Α λλάζει το βήμα του βρόχου F O R ...N E X T . Γ ια παράδειγμα, ο βρ όχος F O R Χ = 1 Τ Ο 100 STEP 10 θα κάνει 10 περάσματα, αυξάνοντας το X κατά 10 κάθε φ ορά (10, 20, 30, 40, κτλ.).
STO P
Α ναγκάζει το πρόγραμμα να σ ταμ ατήσ ει τη ν εκτέλεσ ή του. Εμ φα νίζει το μήνυμα «Διακοπή στο ΧΧΧ Χ» (αριθμός γραμμής).
STR$
Μ ετατρέπει έναν αριθμό σε α λφ αριθμη τικό. Η Χ$ = STRS (123) δ ίνει στη Χ$ τη ν τιμή “ 123” .
SW AP
Ενα λλάσ σ ει τις τιμ ές δύο μεταβλητώ ν (SW A P Χ ,Υ ).
SYSTEM
TA B
THEN
284
Β γαίνει α π ’ τη B A SIC επισ τρ έφ οντα ς στο λειτουρ γικό σύστημα. Χ ρη σ ιμ οποιείτα ι με τη διαταγή P R IN T . Μ εταθέτει πρ ος τα δεξιά τη ν εκτύπωση σ τη ν οθόνη [P R IN T Τ Α Β (25) “M ain M enu” ]. Χ ρ ησ ιμ οποιείτα ι με το IF. Κ αθορίζει τι θα γίνει αν η σ υνθήκη είνα ι αληθής: IF Χ < 1 0 T H E N G O T O 999.
U SIN G
VAL
Δ ηλώ νει ότι τα δεδομένα πρέπει να τυπωθούν χρ η σ ιμ οποιώ ντα ς μια προκαθορισ μένη φόρμα (P R IN T U SIN G “ # # # , # # # . # # ” A M O U N T ). Ε π ισ τρέφ ει τη ν τιμ ή ενός αλφ αριθμη τικού. Αν το αλ φ αρ ιθ μ η τικό αρ χ ίζει με γράμμα, επισ τρ έφ ει μηδέν. Η P R IN T V A L (“ 123 A S t.”) επισ τρ έφ ει τον αριθμό 123.
W END
Τερμ ατίζει ένα β ρ όχο W H IL E .
W H IL E
Δ η μιουργεί έναν βρ όχο που σ υνεχίζετα ι όσο είνα ι αλ η θ ή ς κά ποια σ υνθήκη. Η W H IL E L E N (Α $) < 10 θα σ υνεχίσ ει το β ρόχο ό σ ο το μ ήκος του Α$ θα είνα ι μ ικρότερο από 10. Α παιτεί τη διαταγή W EN D .
W R IT E #
XOR
\
Γ ράφ ει μια εγγρ α φ ή σ ’ ένα σ ειρ ιακό α ρ χείο δεδομένων μέσω του α ντίσ τοιχου καναλιού: W R IT E # 1 , Ν Μ $, A D $, CITYS, STA TES, ZIPS. Σ υνάρτησ η α π ο κ λ εισ τικ ή ς διάζευξης, κατά την οποία για να ικ α νοποιείτα ι μία συνθήκη IF πρέπει να είνα ι αλ η θ ή ς είτε ο ένας όρος είτε ο άλλος, αλ λά ό χ ι και οι δύο. (IF Χ > 1 0 X O R Υ