Σάββατο 12 Δεκεμβρίου 2015

Αναθεώρηση 115 και τα Αυτόματα!

Δυο μικρά bug διορθώθηκαν.
Ένα είχε να κάνει με τον διορθωτή. Εξαφανίζονταν ο δρομέας, Ένα ακόμα μικρό Bug σε μια υποπερίπτωση της ΓΙΑ για τις ομάδες.

Το τελικό τεστ για την ΓΙΑ (την δομή επανάληψης) για βήμα με δεκαδικό
βάζουμε όριο στο aa, βάζουμε βήμα στο x, αν  πάρουμε το k>aa δηλαδή -1 τότε έχουμε λάθος...δηλαδή η τελευταία τιμή του i που μένει στο k τότε θα είναι μεγαλύτερη από το όριο..πράγμα που δεν θέλουμε.
Η ποσότητα που προσθέτουμε  (στην αύξηση) ή αφαιρούμε (στην μείωση) υπολογίζεται από τον τύπο αυτό στην Visual Basic 6,  όπου log είναι ο φυσικός λογάριθμος και exp :
1 / EXP(18 - (Log(st + Abs(sp - p))) / Log(10))

όπου st είναι η απόλυτη τιμή του βήματος, sp είναι το άνω όριο, p η αρχική τιμή. Διαισθητικά το βρήκα. Δηλαδή υπέθεσα ότι το πρόβλημα είναι συνάρτηση και των τριών τιμών αλλά και κάποιας ακρίβειας που έχουν οι πράξεις τις γλώσσας κάτω από την Μ2000. Η ιδέα είναι να βάζεις τους παράγοντες κατά το τι είναι ανάλογο και τι αντιστρόφως ανάλογο! (ή τέλος πάντων κάνεις κάτι που πιστεύεις ότι είναι σωστό το δοκιμάζεις με τρόπο και είσαι..σχεδόν σωστός..δηλαδή δεν έχεις απόδειξη ότι είναι τέλειο)
Να λοιπόν το Δοκίμιο Πρόγραμμα, αν βρει κανείς συνδυασμό που να  μην βγαίνει να με ενημερώσει!
Προσοχή όμως γιατί αν βάλει κανείς πολύ μικρό βήμα...η απόδειξη θα του έρθει τον άλλο αιώνα!

aa=.1
x=.09
a=0
for i=.0012 to aa step x/1000 {
      k=i
      a++
}
print k, aa, k>aa, a
a$=key$
a=0
for i=.0012 to aa step x/100 {
      k=i
      a++
}
print k, aa, k>aa, a
a$=key$
a=0
for i=.0012 to aa step x/10 {
      k=i
      a++
}
print k, aa, k>aa, a


Ας δούμε και το λάθος που διορθώθηκε:

k=10
Ομάδα A {
      Συνάρτηση A {
            Διάβασε a, b
            =2*a^2+b
      }      
}
Ομάδα B {
      Συνάρτηση A {
            Διάβασε a, b
            =3*a**2+5*b
      }
}
Για A, B {
      Τύπωσε .a(10,20) , 220
      Τύπωσε ..a(10,20) , 400
}


Το λάθος ήταν στο κλείσιμο του Για στο Β ο κώδικας είχε ένα 0 που έπρεπε να ήταν -1. Δούλευε με 0 αλλά είχα κάνει αλλαγές και εκεί δεν το είχα αλλάξει! Αυτά συμβαίνουν σε μεγάλα προγράμματα. Για το λόγο αυτό η χρήση αντικειμένων βοηθάει, όταν τα αντικείμενα περιγράφουν αφαιρετικά την λειτουργία. Στην Μ2000 τα αντικείμενα λειτουργούν ως αυτόματα υπό έλεγχο! 

Περί Αυτομάτων!
Η έννοια του αυτόματου όπως την αντιλαμβάνομαι είναι σχηματικά ένα μπλοκ με λειτουργίες και στοιχεία που βρίσκεται σε μια κατάσταση, κατάσταση λειτουργίας, όπως ένας φούρνος μπορεί να ψήνει, ή να είναι σβηστός. Η μετάβαση σε μια νέα κατάσταση είναι συνάρτηση εξωτερικών παραγόντων, όμως η απόκριση έχει να κάνει με την πρότερη κατάσταση. Δεν είναι λοιπόν τα αντικείμενα απλά μια περιγραφή αφαιρετική ενός πράγματος ή ενός αλγόριθμου. Προφανώς αν δει κανείς το λογισμικό του θα μπορεί να λέει ότι αυτό αφαιρετικά δηλώνει μια παρουσία, που τώρα δεν υπάρχει αλλά θα κατασκευαστεί. Αλλά δεν είναι αυτό του ουσιαστικό συμπέρασμα, απλά είναι περιγραφή περί της περιγραφής και όχι της ουσίας. Η ουσία είναι στο αντικείμενο που έχει παρουσία, που έχει μια άλφα κατάσταση και η ενέργειά μας, με επιλογή μεθόδου και χειρισμό ιδιοτήτων σε αυτό θα δώσει μια άλλη κατάσταση!

Ας το δούμε αυτό όμως με ένα μικρό πρόγραμμα σε Μ2000, όπου δια αντιπροσώπου κάνουμε αποστολή ένα αλφαριθμητικό (μπορεί να είναι ένα μήνυμα). Αυτό που κάνουμε είναι να αλλάζουμε την κατάσταση του αυτόματου (Αντιπρόσωπος) και κάθε φορά που στέλνουμε το μήνυμα αυτό θα πηγαίνει αλλού!

Φτιάχνουμε μια κλάση Αντιπρόσωπος και ένα αντικείμενο της κλάσης στη θέση 1 του πίνακα β(). Στη Μ2000 αντικείμενα κάνουμε στέρεα ή πτητικά. Πτητικό είναι αυτό που μπαίνει σε θέση πίνακα, με συνέπεια ο πίνακας να το μεταφέρει όπου πάει! Ενώ στέρεο είναι αυτό που μένει εκεί που το δημιουργούμε (στατικό αν θέλουμε το λέμε, αν και η έκφραση έχει την έννοια ότι αν ξανακαλέσουμε ένα τμήμα θα το βρούμε ενώ κάτι τέτοιο δεν ισχύει, οι στέρεες ομάδες θα διαγραφούν στο πέρας της εκτέλεσης του τμήματος που δημιουργήθηκαν). Ένας άλλος τρόπος να αναφερόμαστε σε αυτές είναι το επώνυμες και ανώνυμες ομάδες. Σε ένα πίνακα η ομάδα είναι ανώνυμη, απλά έχει θέση στο πίνακα. Στη java σε ένα όνομα δηλώνουμε μια στατική κλάση ή δημιουργούμε μια νέα παρουσία. 

Στην Μ2000 η στατική/πτητική/επώνυμη ομάδα έχει ένα αντίγραφο από μια συνάρτηση ειδική που τη λέμε κλάση, και το όνομά της ανήκει στο χώρο ονομάτων του τμήματος. Η πτητική/νέα/ανώνυμη ομάδα είναι  κλειστή σε ένα χώρο όπου για να προσεγγιστεί πρέπει πρόσκαιρα να γίνει στέρεη...να πάρει όνομα. 
Εδώ η γ είναι στέρεη ομάδα ενώ στο β(1) έχουμε μια πτητική. Ο πίνακας β() ξεκίνησε με άδεια στοιχεία, π.χ. με Τύπωσε Τύπος$(β(2))  θα δείτε ότι γράφει Empty (η τιμή γυρνάει από το σύστημα)

Το γ, ο Αντιπρόσωπος. δηλαδή το αυτόματο που αλλάζει κατάσταση έχει ένα πίνακα με ένα στοιχείο για να βάλει ένα αντικείμενο. Ξεκινάει με ένα δικό του και μπορούμε να του δώσουμε άλλα, τα οποία τα περιγράφουμε με διαφορετικές Κλάσεις. Κάθε αντικείμενο από αυτά έχει μια ίδια μέθοδο με τα άλλα που περιγράφεται σε ένα τμήμα με όνομα Αποστολή. Αυτή η κοινή μέθοδος τα κάνει να έχουν κοινή διεπαφή (interface), δηλαδή μια συμβατότητα, λες και είναι με το ίδιο DNA. Η συμβατότητα δεν προδιαγράφεται στην Μ2000, ενώ σε άλλες γλώσσες πρώτα λες τι θα έχει η διεπαφή και μετά κάνεις την υλοποίηση στο όλο αυτό που θες να έχει η διεπαφή! Δεν χρειάζεται γιατί το μοντέλο εδώ είναι να έχουμε ανοικτό το κώδικα. Σε άλλες γλώσσες το θεωρούν προτέρημα να κρύβουν τον κώδικα...με ότι συνεπάγεται αυτό!

Δείτε λοιπόν τι γίνεται. Κάθε φορά δίνουμε στο γ ένα άλλο αντικείμενο. Το προηγούμενο διαγράφεται  και στη θέση του μπαίνει το νέο, δηλαδή στη θέση του μοναδικού στοιχείου του εσωτερικού πίνακα του γ. Έτσι το γ μπορεί να έχει ένα από τρία άλλα αντικείμενα με κοινή διεπαφή, δηλαδή όλα έχουν το τμήμα Αποστολή (μέθοδο μπορούμε να το λέμε).
Όταν καλούμε την συνάρτηση αποστολή του γ, αυτή καλεί την μέθοδο αποστολή του αντικειμένου  (η Κάλεσε καλεί μια συνάρτηση σαν μέθοδο, αλλά αν γυρίσει η συνάρτηση μη μηδενική τιμή τότε έχουμε λάθος, έτσι λειτουργεί με τη κάλεσε ο διερμηνευτής)

Ουσιαστικά το Αυτόματο Αντιπρόσωπος μπορεί να πάρει μια κατάσταση με ένα αντικείμενο και να το χρησιμοποιεί για να εκτελέσει μια εργασία. Σε κάποια άλλη στιγμή θα πάρει ένα άλλο αντικείμενο. Εδώ δεν έχουμε να κάνουμε με μια συνηθισμένη ροή εντολών. Οι επιλογές αυτορύθμισης είναι πολλές. Ουσιαστικά ο κώδικας στα αντικείμενα παίρνει θέση κατ΄επιλογή, και βρίσκεται σε αναμονή. Ενώ με τον μη αντικειμενοστραφή προγραμματισμό η αλλαγή ροής, δηλαδή η επιλογή κώδικα γίνεται την ώρα που απαιτείται. Οπότε στην μια περίπτωση έχουμε σε δυο χρόνους την αλλαγή ροής και στην άλλη άμεσα.  Το αυτόματο λοιπόν μπορεί να φτιαχτεί με κάθε τρόπο αφού σε κάθε περίπτωση αυτό που μετράει είναι η αλλαγή ροής! Όμως με τον τρόπο με τα αντικείμενα έχουμε ένα πλεονέκτημα. Μπορούμε να επεκτείνουμε τη λογική μας χωρίς να ασχοληθούμε με το τι κάνουν "τέλεια" από την αρχή τα αντικείμενα και να τα εμπλουτίσουμε στη πορεία. Επίσης υπάρχει άμεση θέαση του κώδικα σε ενότητες που γίνονται γρήγορα αντιληπτές. Αντί να φτιάχνουμε κομμάτια και μετά να τα συνδέουμε μπορούμε να κάνουμε το ανάποδο, να συνδέσουμε απλά κομμάτια και να τα εμπλουτίσουμε μετά. Εδώ βέβαια θα μπορούσε να σκεφτεί κανείς ότι κάτι τέτοιο μπορεί να γίνει και με διαδικασίες, αλλά όπως είδαμε δεν μπορούν οι διαδικασίες να επιλέγονται σε δυο χρόνους αλλά άμεσα. Το αντικείμενο παίρνει την αλλαγή κατάστασης χωρίς να χρειάζεται να κάνει κάτι με τις μεθόδους του. Όταν χρειαστεί τότε επενεργεί βάσει της αλλαγής. Οι διαδικασίες, στο Διαδικαστικό προγραμματισμό,  βρίσκονται πάνω σε ένα κώδικα με γραμμένη, παγιωμένη, λογική. Για να αλλάξουμε ροή πρέπει ο κώδικας να το προβλέπει. Άρα κάθε εμπλουτισμός χαλάει την αρχική πρόβλεψη.
Στον αντικειμενοστραφή προγραμματισμό ο εμπλουτισμός μπορεί να γίνει με νέο αντικείμενο χωρίς να πειραχτεί ο βασικός κορμός του προγράμματος. 



Κλάση Για_Εκτυπωτή {
      Τμήμα Αποστολή {
            Διάβασε α$
            Τύπωσε "Προς Εκτυπωτή "+α$
      }
}
Κλάση Για_Οθόνη {
      Τμήμα Αποστολή {
            Διάβασε α$
            Τύπωσε "Προς Οθόνη "+α$
      }
}
Κλάση Αντιπρόσωπος {
     Πίνακας α(1)
     Κλάση Για_Κάδο {
           Τμήμα Αποστολή {
                 Διάβασε α$
                 Τύπωσε "Προς Κάδο Ανακύκλωσης "+α$
           }
     }
      Τμήμα Αντιπρόσωπος {
            Αν Ταύτιση("Ο") Τότε {Διάβασε .α(0) } Αλλιώς .α(0)=.Για_Κάδο()
      }
      Συνάρτηση Αποστολή {
      .α(0).Αποστολή
      =0
      }
}
Πίνακας β(4)
β(1)=Αντιπρόσωπος(Για_Οθόνη())
Για β(1) {
      Κάλεσε .Αποστολή("Στη Κατασκευή")
}
γ=Αντιπρόσωπος()
Για γ {
            Κάλεσε .Αποστολή("Κάτι γράφει εδώ!")
            .Αντιπρόσωπος Για_Οθόνη()
            Κάλεσε .Αποστολή("Κάτι γράφει εδώ!")
            .Αντιπρόσωπος Για_Εκτυπωτή()
            Κάλεσε .Αποστολή("Κάτι γράφει εδώ!")
}

Για β(1) {
            Κάλεσε .Αποστολή("Κάτι γράφει εδώ!")
            .Αντιπρόσωπος Για_Οθόνη()
            Κάλεσε .Αποστολή("Κάτι γράφει εδώ!")
            .Αντιπρόσωπος Για_Εκτυπωτή()
            Κάλεσε .Αποστολή("Κάτι γράφει εδώ!")
}


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

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

You can feel free to write any suggestion, or idea on the subject.