Πέμπτη 14 Ιανουαρίου 2016

Παράδειγμα Πίνακα ως Vector (και αναθ. 138)

Έγινε η Αναθεώρηση 138 με μια μικρή διόρθωση στο χρωματισμό κώδικα.

Πίνακας ως Vector (Πίνακας με στοιχεία με  διαφορετικούς τύπους)
Παρακάτω είναι ένα πρόγραμμα όπου χρησιμοποιούμε έναν πίνακα για να βάλουμε αριθμούς, αλφαριθμητικά, ομάδες (κάτι ως Vector σε άλλες γλώσσες). Λογικά μπορούμε να βάλουμε σε πίνακα ότι ομάδα θέλουμε (αντικείμενο της Μ2000). Αλλά δεν είναι αναγκαίο όλα τα στοιχεία να είναι ομάδες.
Πως γίνεται λοιπόν να βάλουμε σε έναν πίνακα έστω Α() με 10 στοιχεία αλφαριθμητικά; Πώς γίνεται σε έναν πίνακα Α$() να βάλουμε αριθμούς και ομάδες (ενώ γράφονται σε πίνακες αριθμών).

Ξεχνάμε για λίγο τα αντικείμενα (ομάδες). Με την Ένωσε δίνουμε με αναφορά τον πίνακα του Α() στο Α$(), ας τον λέμε βοηθό. Στην ουσία ο πίνακας υπάρχει μια φορά, αλλά ο βοηθός Α$() διαβάζει αλφαριθμητικά...ή ότι έχει ο Α() ως αλφαριθμητικό. Μπορούμε να βάλουμε αλφαριθμητικά στον Α() χωρίς την ανάγκη του βοηθού Α$() . Αυτό γίνεται με το ":="
Σε ένα πίνακα μπορούμε να δίνουμε πολλαπλές τιμές με το "=" αλλά στο ίδιο είδος, το ":="
Η εντολή Α(0)="άλφα βήτα", 2000, "Κάτι άλλο" θα δώσει λάθος, επειδή περιμένει ο διερμηνευτής αριθμητική παράσταση.


Πίνακας Α(10)
Ένωσε Α() στο Α$()
Α(0):="άλφα βήτα", 2000, "Κάτι άλλο"
Τύπωσε Α$(0), Α(1), Α$(2)



Με την εντολή Στοκ κάνουμε διάφορες εργασίες και μια από αυτές είναι και η ανάθεση τιμών σε πίνακα. Όμως δείτε εδώ: βάζουμε και μια ομάδα στο τέλος (ως αντίγραφο, όχι με αναφορά). Π.χ. αλλάζω τη ζ στην ομάδα Αλφα αλλά δεν αλλάζει η ζ στην ανώνυμη ομάδα Α(4).

Η ομάδα Άλφα  έχει ουσιαστικά "εγκαταστήσει" τα Α.χ,  Α.ψ και Α.ζ και στην Μ2000 δεν σβήνονται από το "σκοπό" εδώ το τμήμα, αν ο σκοπός δεν παρέλθει (όταν δηλαδή τερματίσει το τμήμα).  Αλλά στο πίνακα Α και στο στοιχείο 4 δηλαδή στο Α(4) έχουμε ένα ανώνυμο τμήμα (δεν έχει εγκατασταθεί κάπου, βρίσκεται κλειστό στο στοιχείο). Μπορούμε να το σβήσουμε με μια κίνηση! Βάζοντας ένα άλλο αριθμό ή μια άλλη ομάδα! Στο παράδειγμα παίρνουμε ένα αντίγραφο στο Α(5) και σβήνουμε το Α(4) με μια τιμή 0. Ελέγχουμε το τύπο του Α(4), είναι Double και ελέγχουμε αν υπάρχει στοιχείο ζ στο Α(4) με την Έγκυρο(), και μας δίνει 0 (ψευδές), δεν υπάρχει.
Αυξάνουμε την τιμή του ζ στο Α(5) και αντιγράφουμε το Α(5) στο Α(4).

Ουσιαστικά η Μ2000 δεν έχει δείκτες σε αντικείμενα, ούτε μετράει τις αναφορές σε αυτά! Δεν χρειάζεται! Αυτό που έχει είναι πίνακες που τους χειρίζεται ως εικονική μνήμη. Η Στοκ δουλεύει και για πολυδιάστατους πίνακες και τους χειρίζεται ως μονοδιάστατους. Κερδίζουμε με τη χρήση της γιατί στις αντιγραφές στοιχείων υπολογίζεται αυτόματα το επόμενο στοιχείο βάσει του "επιπλέον", του offset.
Στο τρίτο μέρος του παραδείγματος, κάνουμε αλλαγή μεγέθους στο πίνακα Α() διατηρώντας τα στοιχεία που είχε. Η αλλαγή έγινε και για το Α$() (ουσιαστικά και τα δυο δείχνουν τον ίδιο πίνακα).
Εδώ λοιπόν κάνω αντιγραφή από βάση 0 σε βάση 10 για 6 στοιχεία (από 0 έως και 5 στο 10 έως και 15). Η Στοκ μπορεί να αντιγράψει κατά ένα στοιχείο πάνω ή κάτω (όχι εκτός ορίων), με τρόπο ώστε να μη χάσει στοιχεία. Στοκ Α(0) για 6, Α(1)  και μετά στο Για βάλτε Για ι=5 έωςθα έχουμε το ίδιο αποτέλεσμα! Η δεύτερη Στοκ με το Σε  βάζει τιμές σε μεταβλητές. Οπότε αν θέλουμε δεν χρησιμοποιούμε την Ένωσε Α() στο Α$() αν και δεν έχει κόστος και βοηθάει αν θέλουμε να διαβάζουμε με μια Για { }.
Εδώ έχω χρησιμοποιήσει την Ομάδα Άλφα με απευθείας ορισμό ομάδας: Διαφορετικά θα έκανα:
Κλάση Αλφα_ { χ=10, ψ, ζ=3}
Αλφα=Αλφα_()
Τύπωσε Αλφα.ζ

Στην ουσία ο ορισμός της κλάσης δίνει συνάρτηση και μας ενδιαφέρει η κλάση όταν θέλουμε να τροποποιούμε το αντικείμενο πριν το δώσουμε κάπου. Όμως ορίζουμε ουσιαστικά αντικείμενα με αντιγραφή. Με την Ένωσε μπορούμε να έχουμε αναφορές σε αντικείμενα αλλά στην ουσία έχουμε ένα νέο αντικείμενο (ομάδα) που οι μεταβλητές της είναι αναφορές στην προηγούμενη ομάδα.  Οι αναφορές γίνονται με όνομα άρα δεν μπορούν να γίνουν για "κλειστό" αντικείμενο (σε έναν πίνακα δηλαδή).



Ομάδα Αλφα { χ=10, ψ, ζ=3}
Πίνακας Α(10)
Ένωσε Α() στο Α$()
Στοκ Α(0) από "άλφα βήτα", 2000, "Κάτι άλλο", Αλφα.χ, Αλφα
Άλφα.ζ=1000
Τύπωσε Α$(0), Α(1), Α$(2), Α(3), Α(4).ζ


Τύπωσε Τύπος$(Α(4)) ' Group
Α(5)=Α(4) ' αντιγραφή
Α(4)=0 ' σβήσαμε το αντικείμεο από το Α(4)
Τύπωσε Τύπος$(Α(4)), Έγκυρο(Α(4).ζ) ' Double   0
Α(5).ζ++
Α(4)=Α(5)
Τύπωσε Α(4).ζ ' τυπώνει 4


Α(4).ψ=1000
Πίνακας Α(30)
Στοκ Α(0) για 6, Α(10)
Στοκ Α(10) σε Α1$, Α2, Α3$, Α4
Τύπωσε Α1$, Α2, Α3$, Α4
Για ι=14 έως 15 {
      Για Α(ι) {
            Τύπωσε .χ,,
      }
}




Στο 2ο μέρος έχω ένα μικρό θέμα με το πώς ένα αντικείμενο γνωρίζουμε ότι είναι μοναδικό!
Αφού κάνουμε αντιγραφές στα αντικείμενα, τότε πως ξέρουμε αν υπάρχει πρωτότυπο;
Αυτό το λύνει η τοπική στη κλάση! Μάλιστα καλούμε ένα τμήμα και περνάμε με αναφορά το αντικείμενο και μας δείχνει άμεσα ποιο είναι γνήσιο!

Η ανάθεση τυχαίας τιμής πρέπει να γίνει μετά τον ορισμό. Εδώ η Α είναι κανονικό "στατικό" αντικείμενο. Σε ένα κλειστό αντικείμενο (σε πίνακα) η α1 αλλάζει μόνο πρόσκαιρα (μέσα σε ένα Για { } όπου το αντικείμενο παίρνει ένα όνομα (εμείς το βλέπουμε ως Αυτό). Κάθε φορά που θα ανοίγει το αντικείμενο, η α1 θα παίρνει την αρχική τιμή!

Όταν κάνουμε αντιγραφές δημιουργούμε ουσιαστικά ένα κλειστό αντικείμενο, και η τιμή της α1 δεν δίνεται από την τρέχουσα αλλά από εκείνη που καταγράφηκε την πρώτη φορά που ορίστηκε.
Έχω δώσει και μια λύση πως γίνεται να φαίνεται έγκυρο ένα αντικείμενο, αλλά δείτε όμως ότι πρέπει να πάρουμε την τιμή του Α.α1 δεν γίνεται διαφορετικά! Στο τμήμα Δοκίμασέ_με η κάτι.α1 δεν υπάρχει και για τις τρεις περιπτώσεις. Αυτό συμβαίνει γιατί δεν υπάρχει στη λίστα των μεταβλητών που περνούν με αναφορά. Η συνάρτηση ΔεςΜε() βλέπει τις μεταβλητές γιατί όταν τρέχει σαν Κάτι.ΔεςΜε() αλλάζει όνομα χώρου και πάει σε αυτό του αντικειμένου. Αυτό συμβαίνει γιατί κατά τη δημιουργία αναφορών στα τμήματα και συναρτήσεις ενός αντικειμένου δίνονται όλες οι πληροφορίες. Να γιατί δεν μπορούμε να δώσουμε ως αναφορά στοιχείο πίνακα αν δεν το ανοίξουμε πρώτα.


Κλάση Α_ {
      Τοπική α1=0 ' αρχική τιμή
      χ=1234, ψ
      Συνάρτηση ΔεςΜε {
            Αν Έγκυρο(.α1) τότε {
                  =.α1
            } Αλλιώς {
                  =0
            }
      }
}
\\ φτιάχνω το Α
Α=Α_()
\\ Δίνω στη τοπική α1 μια τιμή
Α.α1=Τυχαίος(1,10000)
Τύπωσε Α.ΔεςΜε()
\\ Αντιγράφω το Α στο Β
Β=Α
\\ Δεν έχει αντιγραφεί η "τοπική"
Τύπωσε Β.ΔεςΜε()
\\ Β.α1 = Α.α1  'έτσι το κάνουμε να φαίνεται γνήσιο
Τύπωσε Β.ΔεςΜε()
Πίνακας Α(1)
Α(0)=Α
\\ Αντιγράφω το Α ως κλειστό αντικείμενο στο Α(0)
\\ Δεν έχει αντιγραφει η "τοπική"
Τύπωσε Α(0).ΔεςΜε()


Τμήμα Δοκίμασέ_με {
      Διάβασε &κάτι
      Τύπωσε κάτι.χ, κάτι.ΔεςΜε(), Έγκυρο(κάτι.α1)
}
Δοκίμασέ_με \\ οκ είναι γνήσιο
Δοκίμασέ_με \\ 0 δεν είναι γνήσιο
Για Α(0) {
      \\ .α1=Α.α1    ' έτσι το κάνουμε να φαίνεται γνήσιο
       Δοκίμασέ_με &Αυτό \\ δεν είναι γνήσιο
}


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

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

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