Πέμπτη 3 Δεκεμβρίου 2015

Επίδειξη της Ομάδας (αντικείμενο στην Μ2000)

Παραθέτω το κώδικα έχει επεξηγήσεις (θέλει την αναθεώρηση 101)

\ Τίτλος: Ομάδα
\ Περιγραφή: Μια ομάδα μπορεί να περιλαμβάνει μεταβλητές, πίνακες, τμήματα, συναρτήσεις, κλάσεις και άλλες ομάδες.
\ Μια ομάδα έχει πάντα φυσική παρουσία, δεν χρειάζεται να κατασκευαστεί
\ Όμως αν θέλουμε κατασκευάζουμε με την έννοια ότι επιστρέφουμε μια ομάδα από συνάρτηση
\ Το αναγνωριστικό Κλάση δημιουργεί μια Συνάρτηση με το όνομα της κλάσης
\ Η ιδιομορφία αυτής της συνάρτησης είναι ότι αν θέλουμε μπορεί να συμπεριλαμβάνει ένα τμήμα
\ με το όνομα της κλάσης ως κατασκευαστής, δηλαδή να δέχεται τις τιμές που θα δώσουμε στη συνάρτηση
\ και να κάνει αλλαγές αφού δημιουργηθεί ότι έχουμε αλλά πριν δοθεί ως ομάδα για επιστροφή
\ Δεν χρειάζεται να μεριμνήσουμε για την καταστροφή της! Γίνεται αυτόματα!


\ Δυο είναι τα χαρακτηριστικά των ομάδων:
\ Οι συναρτήσεις και τα τμήματα βλέπουν τα αναγνωριστικά στο ίδιο επίπεδο.
\ Αν έχουμε μια ομάδα σε μια ομάδα τότε οι συναρτήσεις μέσα στη φωλιασμένη ομάδα δεν βλέπουν τα αναγνωριστικά της εξωτερικής. Το ανάποδο όμως γίνεται, μόνο για τα αναγνωριστικά της ομάδας όχι των τμημάτων/συναρτήσεων εσωτερικά.
\ Τα τμήματα και οι συναρτήσεις δημιουργούν μεταβλητές όταν τρέχουν μόνο, έτσι από μια εξωτερική ομάδα δεν έχουμε πρόσβαση σε μεταβλητές εντός τμήματος, παρά μόνο να το τρέξουμε. Παραστατικά οι ομάδες βλέπουν στο βάθος, στη λίστα των περιεχομένων τους,  ενώ τα τμήματα στην επιφάνεια, στη λίστα που περιέχονται!
\ Οι ορισμοί των τμημάτων είναι φυσικά όρια ενώ των ομάδων δεν είναι. Δηλαδή το τμήμα μπορούμε να το αλλάξουμε αλλά όλο μαζί δίνοντας με το ίδιο όνομα νέο ορισμό. Στην ομάδα ότι υπάρχει ως όνομα μένει! Μπορούμε να προσθέσουμε ότι θέλουμε, να αλλάξουμε τις διαστάσεις πινάκων αλλά δεν μπορούμε μια ομάδα στην ομάδα να την σβήσουμε αφού έχει όνομα, άρα δεν σβήνει.
\ Πότε σβήνουν οι ομάδες;
\ Οι ομάδες σβήνουν, διαγράφονται, όταν διαγράφονται αυτοί που τις κρατούν.
\ Μπορεί μια ομάδα να την κρατάνε δυο ή περισσότερα αναγνωριστικά;
\ Γίνεται με την έννοια της αναφοράς, αλλά μια αναφορά δεν μπορεί να πάρει νέα αναφορά!
\ Υπάρχουν δείκτες όμως;
\ Όχι δεν υπάρχουν δείκτες που θα "κρατούσαν" σε ζωή μια ομάδα εκτός τμήματος
\ Και πώς γίνεται να μείνει μια ομάδα εκτός τμήματος και πώς γίνεται να επιστραφεί από συνάρτηση;
\ Μια ομάδα γίνεται να αντιγραφεί, σε ένα νέο όνομα, στον επεξεργαστή εκφράσεων ως ομάδα χωρίς όνομα!
\ Επίσης μπορούμε ομάδες χωρίς όνομα να έχουμε σε στοιχεία πινάκων
\ Αντί να έχουμε δείκτες να δείχνουν αντικείμενα και να πρέπει να τους διαχειριστούμε γιατί
\ αλλιώς δεν θα διαγραφούν, έχουμε υποστηρικτές (holders) που κρατούν το αντικείμενο και
\ δεν μοιράζονται τον ιδιωτικό τους δείκτη!
\ Στη Μ2000 δεν μπορούμε να φτιάξουμε αναφορά σε στοιχείο πίνακα. Όμως μπορούμε να φτιάξουμε
\ αναφορά στον πίνακα!


' Στο παράδειγμα δημιουργούμε την ομάδα άλφα άμεσα.
' Αν βάλει κανείς την εντολή Λίστα θα δει ότι υπάρχει η άλφα.γ για παράδειγμα.
' Και αυτό γιατί "δεν υπάρχουν σύνορα" στις ομάδες.
' Στην ομάδα αυτή δημιουργούμε την ομάδα βητα από την κλάση βητα1
' Μπορούσαμε να γράψουμε απ΄ευθείας Ομάδα βήτα  { } και να καταργήσουμε τη κλάση
' Θέλουμε όμως να κάνουμε και άλλα βήτα μέσα σε έναν πίνακα.
' Στον ορισμό δεν μπορούμε να εκτελέσουμε κώδικα (απλές τιμές περνάμε)
' Οπότε έχουμε ένα τμήμα που αλλάζει την διάσταση του πίνακα Α()
' Συνάμα του δίνει τη κλάση βήτα1 για να γεμίσει τον πίνακα (σε αυτή τη περίπτωση οι συναρτήσεις και τα τμήματα ως ορισμοί γράφονται σε μια λίστα στο πίνακα, αλλά μπορούμε να έχουμε πίνακες με ανακατεμένες κλάσεις, όπως θέλουμε εμείς)
' Δείτε όμως ότι η βήτα1 έχει μια συνάρτηση παραγοντικό. Μπορούμε να το καλέσουμε και αυτό να καλέσει τον εαυτό του. Και αυτό θα γίνει με διάφορους τρόπους:
' Θα γίνει από την άλφα με κλήση της βγάλε_παραγοντικό() που έμμεσα καλεί το βήτα.βγάλε_παραγοντικό()
' Θα γίνει από το ανώνυμο στοιχείο 3 του πίνακα αλφα.α(3) με χρήση της  άλφα.α(3).παραγοντικό()
' (το ανώνυμο στοιχείο έχει όμως θέση στο πίνακα, για όσο είναι σε αυτή τη θέση, διότι οι πίνακες είναι δυναμικοί)
' Θα γίνει από έναν άλλο πίνακα Α() στο τμήμα στο οποίο βγάλαμε ένα αντίγραφο του Αλφα
' Άρα στο Α(3) του πίνακα θα είναι και το Α(3).α(3).παραγοντικό() αλλά ως αντίγραφο, όχι το ίδιο το ίδιο το άλφα!
' Τέλος δοκιμάζουμε τις αναφορές με κλήση σε τμήμα Δείξεμου1 και Δείξεμου2
' Για να περάσω στοιχείο πίνακα πρέπει να δώσω τον πίνακα χωριστά με το δείκτη στο πίνακα
' Όμως δείτε τώρα: Η Παραγοντικό τρέχει με αναδρομή μέσα σε ένα τμήμα ενώ βρίσκεται σε πίνακα που βρίσκεται ή σε μια ομάδα ή σε ένα άλλο πίνακα σε μια ομάδα!
' Δείτε και τον υπολογισμό με το γ


Ομάδα αλφα {
      κλάση βητα1 {
            γ=2
            δ=3
            Συνάρτηση Παραγοντικό {
            Διάβασε π
            <=+2*
            Αν π<2 Τότε { =1 } Αλλιώς  =.Παραγοντικό(π-1)*π
            }
       }
      βητα1 βητα
      γ=100
      Πίνακας α()
      Τμήμα ΦτιάξεΠίνακα {
            Πίνακας .α(20)=.βητα1()
      }
      Πίνακας κ(5)=100
      Συνάρτηση κάποια {
            =*100
      }
      Συνάρτηση βγάλε_παραγοντικό {
             Διάβασε α
            =.βήτα.παραγοντικό(α)
      }
}
Τύπωσε αλφα.βγάλε_παραγοντικό(10)
αλφα.ΦτιάξεΠίνακα
' κάθε στοιχείο στο άλφα.α() έχει την παραγοντικό()
Τύπωσε άλφα.α(3).παραγοντικό(10) ' 3628800


Πίνακας Α(100)
Α(3)=άλφα
Τύπωσε Α(3).βγάλε_παραγοντικό(10) ' 3628800
Τύπωσε Α(3).α(3).παραγοντικό(10), Α(3).α(3).γ '3628800, 5242877


Τμήμα Δείξειμου1 {
      Διάβασε &άλλο_άλφα
      Τύπωσε άλλο_άλφα.α(3).παραγοντικό(10), άλλο_άλφα.α(3).γ ' 3628800, 5242877
}


Δείξειμου1 &άλφα
\\ προσέξτε εδώ το γ έχει άλλη τιμή γιατί την έχουμε αλλάξει με αυτό Α(3).α(3).παραγοντικό(10)
Τμήμα Δείξεμου2 {
      Διάβασε &άλλο_άλφα(), ι
      Τύπωσε άλλο_άλφα(ι).α(3).παραγοντικό(10), άλλο_άλφα(ι).α(3).γ ' 3628800, 5368709117
}


Δείξεμου2 &Α(), 3
Τύπωσε Α(3).α(3).γ ' 5368709117


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

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

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