Κυριακή, 2 Δεκεμβρίου 2018

Έκδοση 9.6

Συνέχισα την εργασία πάνω στην δομή Αν.
Μπήκε η δομή με την Τέλος Αν χωρίς μπλοκ. Με το παλιό σύστημα (και πιο γρήγορο) μπορεί κανείς να κάνει άλματα με την ΠΡΟΣ (GOTO), αλλά μέσα από τα μπλοκ {} δεν μπορεί να δώσει εντολές όπως Συνέχισε ή Έξοδος. Βέβαια υπήρχαν εκδοχές της Αν χωρίς μπλοκ, με εντολές σε μια γραμμή. Απλά τώρα μπήκε κάτι πιο νέο (θυμίζει περισσότερο την BASIC). Όλες οι δομές λειτουργούν μαζί. (ουσιαστικά ο διερμηνευτής αποφασίζει πιο Αν είναι άμεσα, γιατί ο ίδιος κώδικας εκτελεί όλες τις παραλλαγές). Όταν χρησιμοποιούμε την Αν συνθήκη Τότε ή Αν συνθήκη Αλλιώς χωρίς να έχουμε κάτι μετά (εκτός από σημειώσεις) τότε ο διερμηνευτής ξέρει ότι είναι ένα Αν με Τέλος Αν και το σημειώνει σε ένα σωρό τιμών (ο ίδιος που χρησιμοποιείται για τις ρουτίνες). Αν μετά το Τότε ή το Αλλιώς ακολουθεί μπλοκ ή εντολές τότε ξέρει ότι είναι το παλιό, το οποίο δεν χρησιμοποιεί σωρό αλλά μια σημαία και μια μεταβλητή.Η σημαία προκύπτει από την συνθήκη και η μεταβλητή έχει έναν αριθμό 0 ή 1 ή 2 ανάλογα, για να δηλώσει με το 1 ότι είμαστε στο Αν και με το 2 ότι είμαστε μετά από ένα Αλλιώς.Αν το οποίο απορρίπτεται οπωσδήποτε (γιατί κάτι προηγουμένως έχει εκτελέσει, έχει βγάλει θετική τη συνθήκη). Όταν έχουμε φωλιασμένα Αν με μπλοκ, τότε το κάθε μπλοκ έχει τις δικές δυο μεταβλητές και έτσι δεν χρειάζεται σωρός. Δεν συμβαίνει αυτό με την Αν Τέλος Αν. Εδώ δεν έχουμε κλήση μπλοκ, όλα γίνονται σε ένα ακόμα και αν καλέσουμε ρουτίνα (οι ρουτίνες είναι εσωτερικά στοιχεία των Τμημάτων και Συναρτήσεων και για το λόγω αυτό έχουν θέαση των μεταβλητών αυτών, αν και φτιάχνουν και τοπικές μεταβλητές). Μπλοκ ανοίγουμε με { }. Τα μπλοκ έχουν μια ιδιαίτερη λειτουργία για να "πηδάνε" σε άλλο σημείο κώδικα εκτός μπλοκ. Ουσιαστικά είτε καλέσουμε ρουτίνα είτε κάνουμε άλμα προς κάποια ετικέτα, το μπλοκ θα διακοπεί, και θα γίνει έλεγχος αν στο τρέχον μπλοκ υπάρχει η ετικέτα/ρουτίνα, εφόσον δεν έχει ζητηθεί ξανά, διαφορετικά θα την πάρει από μια λίστα (όπου καταχωρούνται στη πρώτη ζήτηση). Μετά θα φορτωθεί ο κώδικας από το σημείο που δηλώνει η ρουτίνα ή η ετικέτα. Αν δεν βρεθεί στο τρέχον μπλοκ τότε  ο διερμηνευτής πάει στο αμέσως προηγούμενο μέχρι το Τμήμα η Συνάρτηση που τρέχει ο κώδικας. Ειδικά για τις ρουτίνες μπορεί να πάει και πιο πάνω, στο κείμενο που πρώτη φορά βρήκε το τμήμα ή συνάρτηση και να τρέξει τη ρουτίνα σαν να ήταν μέρος του τμήματος ή συνάρτησης, και στην επιστροφή γυρνάει ακριβώς στο κώδικα που έτρεχε πριν. Ένα τμήμα από μόνο του είναι ένα μπλοκ, οπότε επειδή ξεκινάμε με τμήματα πάντα υπάρχει το "κορυφαίο" μπλοκ.



\\ Παράδειγμα της νέας δομής Αν
Ι=10
Κ=20
Δ=5
Αν Ι>Κ Τότε Τύπωσε Ι Αλλιώς.Αν Ι>Δ Τότε Τύπωσε Δ Αλλιώς Τύπωσε Κ 'δίνει το 5

Ι=10
Κ=20
Δ=50
Αν Ι>Κ Τότε Τύπωσε Ι Αλλιώς.Αν Ι>Δ Τότε Τύπωσε Δ Αλλιώς Τύπωσε Κ ' δίνει το 20

Ι=100
Κ=20
Δ=50
Αν Ι>Κ Τότε Τύπωσε Ι Αλλιώς.Αν Ι>Δ Τότε Τύπωσε Δ Αλλιώς Τύπωσε Κ ' δίνει το 100

\\ άλλες μορφές ανάπτυξης

Αν Ι>Κ Τότε Τύπωσε Ι Αλλιώς.Αν Ι>Δ Τότε Τύπωσε Δ Αλλιώς Τύπωσε Κ ' δίνει το 100

\\ Συνεχόμενη χωρίς Αν βάζουμε εντολές ανάμεσα
Αν Ι>Κ Τότε Τύπωσε Ι
Αλλιώς.Αν Ι>Δ Τότε Τύπωσε Δ
Αλλιώς Τύπωσε Κ ' δίνει το 100

\\ Σπαστή με το Τέλος Αν στο τέλος.
\\ Μπορούμε να βάλουμε και άλλα Αν ανάμεσα με ή χωρίς μπλοκ
\\ Μπορούμε να χρησιμοποιήσουμε το έξοδος ή το συνέχισε (Αν βρίσκεται σε μπλοκ)
\\ Μπορούμε να χρησιμοποιήσουμε ΠΡΟΣ (GOTO) μόνο εντός ορίων (να μην βγούμε πέρα από το τέλος Αν)
Αν Ι>Κ Τότε
      Τύπωσε Ι
Αλλιώς.Αν Ι>Δ Τότε
      Τύπωσε Δ
Αλλιώς
      Τύπωσε Κ ' δίνει το 100
Τέλος Αν

\\ αυτή είναι η γενική και πιο γρήγορη μορφή.
\\ Αν χρησιμοποιήσουμε το έξοδος ή το συνέχισε τότε θα πιάσουν για τα τρέχοντα μπλοκ
\\ μπορούμε να χρησιμοποιούμε την ΠΡΟΣ (GOTO) και εκτός ορίων.
Αν Ι>Κ Τότε {
      Τύπωσε Ι
} Αλλιώς.Αν Ι>Δ Τότε {
      Τύπωσε Δ
} Αλλιώς{
      Τύπωσε Κ ' δίνει το 100
}

\\ Χρήση πολλαπλών Αν σε μια γραμμή

Αν Ι>Κ Τότε Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ" Αλλιώς Τύπωσε "από το τελευταίο Αν"
Ι-! ' αλλαγή προσήμου
\\ δεν θα τυπώσει κάτι γιατί στο πρώτο Αν δεν υπάρχει η αλλιώς.
Αν Ι>Κ Τότε Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ" Αλλιώς Τύπωσε "από το τελευταίο Αν"  ' δεν τυπώνει τίποτα

\\ τώρα με τη χρήση μπλοκ  δώσαμε και στο εξωτερικό Αν την Αλλιώς
Αν Ι>Κ Τότε {Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ" Αλλιώς Τύπωσε "από το τελευταίο Αν" } Αλλιώς Τύπωσε "Κάτι τύπωσα"

\\ θα μπορούσε να γραφτεί και έτσι
Αν Ι>Κ Τότε {
      Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ" Αλλιώς Τύπωσε "από το τελευταίο Αν"
} Αλλιώς Τύπωσε "Κάτι τύπωσα"

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

Αν Ι>Κ Τότε
      Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ" Αλλιώς Τύπωσε "από το τελευταίο Αν"
Αλλιώς
      Τύπωσε "Κάτι τύπωσα"
Τέλος Αν

\\ ή έτσι
Αν Ι>Κ Τότε
      Αν Ι>Δ Τότε
            Τύπωσε "Ι>Κ και Ι>Δ"
      Αλλιώς
            Τύπωσε "από το τελευταίο Αν"
      Τέλος Αν
Αλλιώς
      Τύπωσε "Κάτι τύπωσα"
Τέλος Αν

\\ ή έτσι
Αν Ι>Κ Τότε
      Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ"
      Αλλιώς Τύπωσε "από το τελευταίο Αν"    ' χωρίς την Τέλος Αν
Αλλιώς
      Τύπωσε "Κάτι τύπωσα"
Τέλος Αν

Ι=Κ+1
Δ=Ι+1
Αν Ι>Κ Τότε : Αν Ι>Δ Τότε Τύπωσε "Ι>Κ και Ι>Δ"  Αλλιώς Τύπωσε "από το τελευταίο Αν"  ' τυπώνει μετά την αλλιώς



Επιπλέον από την έκδοση 9.6 οι αριθμοί τύπου Double (Διπλός) δεν στρογγυλεύονται στο 13ο δεκαδικό, (τώρα ο διερμηνευτής αφήνει και το δέκατο τέταρτο). Αυτό φαίνεται στην Έλεγχος όπου ο διακόπτης RDB (round double) είναι με -. Μπορούμε να επαναφέρουμε τη στρογγυλοποίηση με το Διακόπτες "+RDB" αλλά μόνο για το τρέχον διερμηνευτή (μπορούμε να έχουμε ανοίξει πολλά προγράμματα και το καθένα να τρέχει με τη δική του ρύθμιση). Επειδή ο διερμηνευτής, η εφαρμογή, έχει γίνει χωρίς στρογγύλευμα στον επεξεργαστή κινητής υποδιαστολής θεώρησα να έχω αυτή την επιλογή για στρογγύλεμα μόνιμα σε παλαιότερες εκδόσεις. Υπάρχει ο τελεστής == που κάνει πάντα σύγκριση όταν έχει διπλούς (double) με στρογγύλεμα στο 13ο δεκαδικό, ενώ ο τελεστής = δεν κάνει στρογγύλεμα. Στις διαιρέσεις πάντα γίνεται στρογγύλεμα στο έλεγχο αν η τιμή του διαιρέτη είναι μηδενική ή κοντά στο μηδέν, και αν όχι τότε γίνεται η διαίρεση (χωρίς στρογγύλεμα).

Μπορούμε να χρησιμοποιούμε τους Decimal  (Αριθμός) ή τους Currency (Λογιστικός) όπου ο μεν πρώτος έχει 28 ψηφία με την υποδιαστολή να πηγαίνει οπουδήποτε και ο δεύτερος έχει 15 ακέραια και 4 δεκαδικά. (ουσιαστικά εσωτερικά είναι ένας ακέραιος, όπου το 1 γράφεται ως 10000).
Ο 100@ είναι Decimal ενώ ο 100# είναι Currency
Η Μ2000 χρησιμοποιεί ακέραιους 16 και 32 bit, 100% είναι 16bit ενώ το 100& είναι σε 32bit. Επίσης έχει τους λογικούς και τους απλούς. Οι απλοί είναι από -3.4028235E+38 έως -1.401298E-45, μικρής ακρίβειας αλλά πιο γρήγοροι.
Η ύψωση σε δύναμη δίνει πάντα διπλό. Εδώ ορίζουμε την k ως Single, και την x ό,τι πάρει από την παράσταση δεξιά από το ίσον (εδώ της καταχώρησης). Όταν βάζουμε τιμή στην k τότε θα γίνει μετατροπή στο τύπο της. Προσοχή στους απλούς/διπλούς δεν έχουμε υπερχείλιση, μπορούμε να πάρουμε ό,τι να είναι αν δώσουμε κάτι εκτός. Στους Decimal, Currency, Long, Integer έχουμε έλεγχο υπερχείλισης (θα πάρουμε λάθος).

def single k=100
x=k^2
print type$(x)="Double"
k=k^2
print type$(k)="Single"

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/decimal-data-type
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/currency-data-type

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/single-data-type

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου