Πίνακας ascii - Διατεταγμένα σύνολα
Οι χαρακτήρες παλιά αποθηκευόντουσαν σε
1 byte (έως
256 χαρακτήρες) με πρώτα τους αγγλικούς και στην συνέχεια τους χαρακτήρες μιας άλλης γλώσσας π.χ.
κωδικοποίηση iso8859-7 για τα ελληνικά. Κάθε γλώσσα είχε την δικιά της κωδικοποίηση. Αυτό δεν ήταν βολικό και αποφασίστηκε να αποθηκεύονται σε
2 byte (έως
65536 χαρακτήρες) ώστε να υπάρχει
μία κωδικοποίηση για όλες τις γλώσσες. Αυτή ονομάστηκε
unicode ή UTF8. Οι συναρτήσεις
succ, pred δεν αναγνωρίζουν χαρακτήρες
2 byte. Οι αγγλικοί χαρακτήρες παρέμειναν
στο 1ο από τα 2 byte του UTF8 και πολλές φορές τα ΛΣ χρησιμοποιούν
1 μόνο byte όταν γράφουμε αγγλικά, για βελτιστοποίηση χώρου. Έτσι όταν χρησιμοποιούμε
UTF-8 στο ΛΣ οι συναρτήσεις
succ, pred αναγνωρίζουν μόνο
αγγλικούς χαρακτήρες.
Για τον ίδιο λόγο όταν μετά από κλήση της readln, ο χρήστης πληκτρολογεί γράμματα που δεν είναι αγγλικά, αν κάνει λάθος και προσπαθήσει να σβήσει, τότε για κάθε γράμμα, η pascal περιμένει να πατήσει 2 φορές backspace για να το διαγράψει. Αυτό γιατί τα ελληνικά είναι σε κωδικοποίηση utf8, 2 byte ανά χαρακτήρα. Αν δεν υπάρχει χώρος αριστερά δεν μπορεί να γίνει η διαγραφή και έτσι, άλλο βλέπουμε στην οθόνη, άλλο αποθηκεύει η pascal
Δοκιμάστε τον παρακάτω κώδικα με
write όχι writeln
write('Γράψε στα ελληνικά και πάτα συνέχεια το backspace για να σβήσεις');
readln(keimeno);
Για τον ίδιο λόγο όταν εμφανίζουμε μεγάλο κείμενο στα ελληνικά στην pascal στο τερματικό, μπορεί να πάει στην από κάτω γραμμή πολύ νωρίς. Μετράει λανθασμένα byte (που είναι επί 2) και όχι χαρακτήρες.
ΠΡΟΣΘΗΚΗ 1 - Διάταξη ακεραίων
Εκτός από τους χαρακτήρες, σειρά έχουν και οι ακέραιοι αριθμοί. Αφήστε μια γραμμή και εισάγετε τον παρακάτω κώδικα :
writeln('Ο προηγούμενος του 5 είναι ο ', pred(5));
writeln('Ο επόμενος του 5 είναι ο ', succ(5));
Μεταγλωττίστε και εκτελέστε. Μας εμφάνισε τον προηγούμενο και τον επόμενο του ακεραίου αριθμού 5
Για να δοκιμάσουμε έναν άλλο αριθμό. Βάλτε στην θέση του 5 τον αριθμό 5.5. Προσπαθήστε να μεταγλωττίσετε.
Μας εμφανίζει το μήνυμα Ordinal Expression expected δηλαδή αναμενόταν διατεταγμένη έκφραση. Οι συναρτήσεις pred και succ περιμένουν ορίσματα που έχουν διάταξη που έχουν συγκεκριμένο (διακριτό) προηγούμενο και επόμενο όπως οι ακέραιοι αριθμοί (integer). Όντως ο αριθμός 5.5 ανήκει στους πραγματικούς που είναι συνεχές σύνολο χωρίς συγκεκριμένο (διακριτό) προηγούμενο και επόμενο. Ποιος είναι ο προηγούμενος του 5.5. Είναι ο 5.4, είναι ο 5.49 είναι ο 5.499; Δεν μπορούμε να βρούμε έναν μόνο συγκεκριμένο προηγούμενο ή επόμενο.
Οι πραγματικοί real δεν είναι διατεταγμένο σύνολο. Αλλάξτε πάλι τον αριθμό 5.5 σε 5.
ΠΡΟΣΘΗΚΗ 2 - Θέση μέσα στο σύνολο
Τα στοιχεία ενός συνόλου έχουν συγκεκριμένη θέση μέσα στο σύνολο. Πάμε να δούμε ποια θέση έχει ο χαρακτήρας
'D'. Αφήστε μια γραμμή και εισάγετε τον παρακάτω κώδικα :
writeln('Ο χαρακτήρας D είναι στην θέση ', ord('D'));
Ομοίως και οι
ακέραιοι αριθμοί έχουν μια θέση, την
προφανή. Εισάγετε τον παρακάτω κώδικα :
writeln('Ο αριθμός 5 είναι στην θέση ', ord(5));
Εκτός από τον αριθμό 5 υπάρχει και ο χαρακτήρας
'5' που είναι κάτι εντελώς διαφορετικό και ανήκει μέσα στο σύνολο των χαρακτήρων. Εισάγετε τον παρακάτω κώδικα :
writeln('Ο χαρακτήρας 5 είναι στην θέση ', ord('5'));
Οι ακεραίοι αριθμοί στην pascal έχουν έναν μέγιστο που είναι αποθηκευμένος στην σταθερά MaxInt. Εισάγετε τον παρακάτω κώδικα :
writeln('Ο μέγιστος ακέραιος είναι ο ', MaxInt, 'που βρίσκεται στην θέση ', ord(MaxInt));
Υπάρχουν όμως και άλλα διατεταγμένα σύνολα εκτός από τους ακεραίους και τους χαρακτήρες. Για παράδειγμα
οι λογικές τιμές Αλήθεια και Ψέμα. Αφήστε μια γραμμή και εισάγετε τον παρακάτω κώδικα :
writeln('Η λογική τιμή true είναι στην θέση ', ord(true));
writeln('Η λογική τιμή false είναι στην θέση ', ord(false));
ΠΡΟΣΘΗΚΗ 3 - Συνάρτηση ως όρισμα σε συνάρτηση
Είδαμε ότι οι συναρτήσεις
pred και
succ επιστρέφουν έναν χαρακτήρα στην writeln και εκείνη τον εμφανίζει. Με την ίδια λογική μία συνάρτηση
pred μπορεί να επιστρέφει έναν χαρακτήρα σε μία άλλη συνάρτηση
pred. Αφήστε μία γραμμή και τον παρακάτω κώδικα :
writeln('Ο πρo-προηγούμενος του D είναι ο ', pred( pred('D') ) );
Εμφανίστε τον μεθεπόμενο του 'D'
Εμφανίστε τον προ-προ-προηγούμενο του 'D'
Εμφανίστε τον επόμενο του προηγούμενου του 'D'
ΠΡΟΣΘΗΚΗ 4 - Χαρακτήρας στην θέση
Η συνάρτηση
chr μας εμφανίζει τον χαρακτήρα που βρίσκεται σε μια θέση. Αφήστε μια γραμμή και εισάγετε τον παρακάτω κώδικα :
writeln('Ο χαρακτήρας στην θέση 70 είναι ο ', chr(70));
ΠΡΟΣΘΗΚΗ 5 - Εμφάνιση όλων των χαρακτήρων
Πάμε να εμφανίσουμε
όλους τους χαρακτήρες στις θέσεις από
0 έως 255. Χρησιμοποιήστε όποια δομή επανάληψης θέλετε. Στην οθόνη θα πρέπει να εμφανίζονται γραμμές
Στην θέση .. βρίσκεται ο χαρακτήρας .. ..
Στην θέση 80 βρίσκεται ο χαρακτήρας P
Στην θέση 81 βρίσκεται ο χαρακτήρας Q
Στην θέση 82 βρίσκεται ο χαρακτήρας R
..
* ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ
Αντί να εμφανίζουμε τον προηγούμενο, επόμενο κτλ του χαρακτήρα D, ζητήστε από τον χρήστη να σας δώσει κάποιον χαρακτήρα για να εμφανίσετε όλα όσα εμφανίζατε για το D.
Βάλτε όλο τον κώδικα μέσα σε μια επανάληψη η οποία θα τερματίζει όταν ο χρήστης σας δώσει έναν χαρακτήρα εξόδου π.χ. το q.
Φτιάξτε μία διαδικασία diabase_oria η οποία θα διαβάζει από ποια θέση μέχρι ποια θέση να εμφανιστεί ο πίνακας ascii. Θα επιστρέφει τις τιμές 2 μεταβλητών στο κυρίως πρόγραμμα.
Τις τιμές αυτών των 2 μεταβλητών θα τις περάσετε σε μία διαδικασία emfanise_ascii που δεν θα εμφανίζει όλο τον πίνακα ascii αλλά μόνο από μία θέση έως μία άλλη θέση. Στην διαδικασία emfanise_ascii θα μεταφέρετε την επανάληψη που είχατε κάνει για να εμφανίζετε όλος ο πίνακας από 0..255 και θα την τροποποιήσετε ανάλογα.
-