====== Πίνακας ascii - Διατεταγμένα σύνολα ======
* Στην νέα Άσκηση θα δούμε
* Τον πίνακα χαρακτήρων ascii
* Διατεταγμένα σύνολα στην pascal
* Συναρτήσεις που χρησιμοποιούν διατεταγμένα σύνολα
* **ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ** : Θα δημιουργήσουμε το νέο έργο **ascii_table**
* Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι **ascii_table**
* **ΕΙΣΑΓΩΓΗ - Διάταξη χαρακτήρων**
* Διατεταγμένα σύνολα είναι τα σύνολα που τα στοιχεία τους έχουν μία σειρά, δηλαδή έχουν **προηγούμενο** και **επόμενο**. Για παράδειγμα ο χαρακτήρας **'D'** έχει **προηγούμενο** τον χαρακτήρα **'C'**.
- Η συνάρτηση **pred** όταν καλείται, υπολογίζει και επιστρέφει τον προηγούμενο. Αν της περάσουμε χαρακτήρα θα μας επιστρέψει τον **προηγούμενο χαρακτήρα**. Εισάγετε τον παρακάτω κώδικα :writeln('Ο προηγούμενος του D είναι ο ', pred('D'));
- Μεταγλωττίστε και εκτελέστε. Μας εμφάνισε τον προηγούμενο του **'D'** τον χαρακτήρα **'C'**
- Αντίστοιχα η συνάρτηση **succ** όταν καλείται, υπολογίζει και επιστρέφει τον επόμενο. Εισάγετε τον παρακάτω κώδικα :writeln('Ο επόμενος του D είναι ο ', succ('D'));
- Μεταγλωττίστε και εκτελέστε. Μας εμφάνισε τον επόμενο του **'D'** τον χαρακτήρα **'E'**.
- Δοκιμάστε να βάλετε το **'Δ'** στην θέση του **'D'**. Παρόλο που το **'Δ'** **ανήκει σε διατεταγμένο σύνολο** χαρακτήρων και έχει προηγούμενο και επόμενο, εάν στο ΛΣ χρησιμοποιούμε κωδικοποίηση **utf8** τότε η **pred** και η **succ** που είναι παλιές συναρτήσεις δεν την γνωρίζουν και δεν λειτουργούν.
Οι χαρακτήρες παλιά αποθηκευόντουσαν σε **1 byte** (έως **256** χαρακτήρες) με πρώτα τους αγγλικούς και στην συνέχεια τους χαρακτήρες μιας άλλης γλώσσας π.χ. [[http://en.wikipedia.org/wiki/ISO/IEC_8859-7|κωδικοποίηση iso8859-7]] για τα ελληνικά. Κάθε γλώσσα είχε την δικιά της κωδικοποίηση. Αυτό δεν ήταν βολικό και αποφασίστηκε να αποθηκεύονται σε **2 byte** (έως **65536** χαρακτήρες) ώστε να υπάρχει **μία κωδικοποίηση για όλες τις γλώσσες.** Αυτή ονομάστηκε **[[http://unicode-table.com|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) και όχι χαρακτήρες.
* Αφού καταλάβαμε τι συμβαίνει μπορούμε να διαγράψουμε τον παραπάνω κώδικα για να μην μας σταματάει κάθε φορά με την **readln**.
- **ΠΡΟΣΘΗΚΗ 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 και θα την τροποποιήσετε ανάλογα.
* **ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ**
-