Κυριακή, 29 Ιουλίου 2018

Αναθεώρηση 31 Έκδοση 9.3

Rosettacode.org tasks for M2000: 152

1. Σε αυτήν την αναθεώρηση διορθώθηκαν μερικές "κακοτεχνίες", της 9.3 (δεν υπήρχαν πριν). Επανήλθε η σωστή λειτουργία των Μέλος$() ή Member$() και Μέλους.Τύπος$() ή Member,type$() όταν έχουμε γενική ομάδα (global group), καθώς και το Μακρύς ή Long στη δήλωση μέλους μιας ομάδας (group)

global group alfa {
      Long x=10
      k=lambda->0
      a=(,)
      dim a%(10)
}
for i=1 to group.count(alfa)
      Print member$(alfa, i), member.type$(alfa, i)
next i

2. Διορθώθηκε ο χρωματισμός κειμένου όταν το όνομα μιας συνάρτησης ή ενός τμήματος ξεκίναγε από e ή ε (επειδή το έχουν και οι αριθμοί, ο χρωματιστής...μπερδεύονταν) με συνέπεια το μπλοκ που ακολουθεί να εμφανίζεται ως εντολές (ενώ από λάθος εμφανίζονταν ως κείμενο). Σε εκδόσεις πριν την 9.3 δεν υπήρχε πρόβλημα. Το παρακάτω στην προηγούμενη αναθεώρηση δεν θα χωματίζονταν ως εντολές το μπλοκ μετά το E.

\\ πρόγραμμα εύρεσης του e ανάλογα με το τύπο που εισάγουμε 
Module E {
      Function e (n){
            \\ max 28 for decimal
           n=n/28: For i=27 to 1 :n=1+n/i: next i
           =n
      }
      Print e(1@);
      Print " Decimal"
      Print e(1);
      Print " Double"
      Print e(1~);
      Print " Float"
}
E


3. Προσθήκη στην Τιμή() ή Val().
Με αυτήν την προσθήκη μπορούμε να γνωρίζουμε πόσοι χαρακτήρες δίνουν τον αριθμό που γυρίζει. σε μια τρίτη παράμετρο που περνάει με αναφορά (δεν χρειάζεται το &, αλλά αν μπει δεν πειράζει). Αν γυρίσει -1 τότε σημαίνει ότι δεν βρήκε κανένα χαρακτήρα που να δείχνει αριθμό.
Η Τιμή("α") θα γυρίσει 0, αλλά το α δεν είναι αριθμός. Έστω μ μια μεταβλητή, το Τιμή("α",μ) θα γυρίσει το 0 και στο μ το -1. Το -1 επιλέχθηκε γιατί στο Τιμή("", μ) το 0 θα ήταν το ίδιο όσο το μήκος του αλφαριθμητικού και δεν μας βολεύει για τις παρακάτω συναρτήσεις (έχουν μπει στην βοήθεια για να μπορεί κανείς να τις αντιγράφει). Θυμίζω εδώ ότι τα Αληθές και Ψευδές δεν είναι τύπου Λογικός, αλλά στην μετατροπή γίνονται όπως πρέπει. Επίσης οι συγκρίσεις δίνουν πάντα τύπο λογικό, οπότε αν θέλουμε να δώσουμε την Ψευδές ως τύπος λογικός, και όχι το 0, τότε η Τιμή(0->Λογικός) τον επιστρέφει ως τύπο λογικό με τιμή FALSE.

Οι συναρτήσεις Αριθμός() και ΑκέραιοςΑριθμός() δίνουν λογικό τύπο. Το μόνο ενδιαφέρον για να πάρουμε το 0 ως FALSE είναι στην Τύπωσε, όπου μας δίνει τα Αληθές και Ψευδές αντί των -1 και 0, όταν βλέπει τύπο λογικό. Μάλιστα η Τύπωσε εμφανίζει τα Αληθές/True και Ψευδές/False αν έχουμε επιλέξει τον διακόπτη "+sbl" (ShowBooLean=sbl), με την διακόπτες "+sbl" στην κονσόλα, ή την Θέσε διακόπτες "+sbl" σε τμήμα/συνάρτηση. Μπορούμε να δούμε τη θέση του διακόπτη με την Monitor ή Έλεγχος στη κονσόλα (ή με τη χρήση της Set ή Θέσε, από τμήμα ή συνάρτηση, επειδή αυτή η τελευταία στέλνει την γραμμή ως έχει στον μεταφραστή εντολών της κονσόλας, που διαφέρει κάπως, και αυτός γνωρίζει τις Monitor και Switches).


με ελληνικές εντολές
Συνάρτηση Αριθμός(α$) {
      Κάνε β
      =Τιμή(Ψευδές->Λογικός)
      Δες {
            Αν ΕινΓρ Τότε {
                  z=Τιμή(α$,γράμμα$, β)
            } Αλλιώς.Αν ΕινΑρ Τότε {
                  z=Τιμή(α$,αριθμός, β)
            } Αλλιώς z=Τιμή(α$,"", β)
            =β>Μήκος(α$)
      }
}
Συνάρτηση ΑκέραιοςΑριθμός(α$) {
      Κάνε β
      =Τιμή(Ψευδές->Λογικός)
      Δες {
            z=Τιμή(α$,"Ακ", β)
            =β>Μήκος(α$)
      }
}
Τύπωσε ΑκέραιοςΑριθμός("1221213123213")=Αληθές
Τύπωσε ΑκέραιοςΑριθμός("1221213.123213")=Ψευδές
Τύπωσε Αριθμός("123131232131231231.23123123")=Αληθές
Τύπωσε Αριθμός("-123131232131231231.23123123e112")=Αληθές
Τύπωσε Αριθμός("-123131232131231231.23123123e112", ",")=Ψευδές
Τύπωσε Αριθμός("-123131232131231231.23123123e112", 1036)=Ψευδές
Τύπωσε Αριθμός("-123131232131231231.23123123e112", 1033)=Αληθές
Τύπωσε Τιμή("233.44sec", 1033)=233.44
α$="233.44sec"
β=0
Τύπωσε Τιμή(α$, 1033, β)=233.44
Αν β>0 Τότε Τύπωσε Mid$(α$, β)="sec"
\\ οποιοδήποτε αλφαριθμητικό με μήκος >1 για χαρακτήρα δεκαδικών εξαιρεί τα δεκαδικά.
Τύπωσε Τιμή(α$, "??", β)=233
Αν β>0 Τότε Τύπωσε Mid$(α$, β)=".44sec"



με αγγλικές εντολές:

Function IsNumeric(a$) {
      def m
      =val(false->boolean)
      Try {
            if islet then {
                  z=val(a$,letter$, m)
            } else.if isnum then {
                  z=val(a$,number, m)
            } else z=val(a$,"", m)
            =m>len(a$)
      }
}
Function IsIntegerNumeric(a$) {
      def m
      =val(false->boolean)
      Try {
            z=val(a$,"Int", m)
            =m>len(a$)
      }
}
Print IsIntegerNumeric("1221213123213")=true
Print IsIntegerNumeric("1221213.123213")=false
Print isNumeric("123131232131231231.23123123")=true
Print isNumeric("-123131232131231231.23123123e112")=true
Print isNumeric("-123131232131231231.23123123e112", ",")=false
Print isNumeric("-123131232131231231.23123123e112", 1036)=false
Print isNumeric("-123131232131231231.23123123e112", 1033)=true
Print val("233.44sec", 1033)=233.44
a$="233.44sec"
m=0
Print val(a$, 1033, m)=233.44
if m>0 then Print Mid$(a$, m)="sec"
\\ any string for decimal point with len >1 cut decimals
Print val(a$, "??", m)=233
if m>0 then Print Mid$(a$, m)=".44sec"