Σάββατο, 8 Απριλίου 2017

Παράδειγμα με τη χρήση Κάθε() και Πίνακα


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


Μια εξήγηση για την Ένωσε και τι είναι η Α σε σχέση με τη Α()
Στο μικρό παράδειγμα αλλάζουμε την Α να δείνχει σε έναν νέο πίνακα (5,6,7,8)  (αυτός λέγεται αυτόματος πίνακας). Το Α() συνεχίζει να δείχνει στο προηγούμενο! Μπορούμε την Α να την κάνουμε να δείχνει πάλι το προηγούμενο πίνακα. Αυτό συμβαίνει γιατί η Α είναι "αναφορά σε πίνακα" και μπορεί να αλλάξει αναφορά! (πράγμα που δεν μπορεί το Α()). Το Α() μπορεί όμως να πάρει άλλο πίνακα. Επειδή όμως η Α είναι αναφορά στο Α() θα δείχνει το νέο πίνακα!
Το Α()= πίνακας κάνει αντιγραφή του πίνακα στο Α(), και τα στοιχεία και οι τυχόν διαστάσεις του θα αντιγραφούν, ενώ το Α= πίνακας κάνει το Α αναφορά στο πίνακα. Το αντικείμενο στο Α() δεν αλλάζει με την αντιγραφή, απλά αλλάζουν τα στοιχεία του, και έτσι το Α που δείχνει το αντικείμενο στο Α() θα δείξει τα νέα στοιχεία.


Α=(1,2,3,4,5)
Τύπωσε Α
Ένωσε Α στο Α()
Τύπωσε Α()
Α=(5,6,7,8)
Τύπωσε Α
Τύπωσε Α() \\ ο Α() δείνχει το παλιό Α
Α=Α()
Τύπωσε Α
Α()=(10,20,30,40)
Τύπωσε Α()
Τύπωσε Α \\ δείχνει ότι έχει ο Α()


Μια εξήγηση για τον επαναλήπτη (που δημιουργεί η Κάθε())
Η Κάθε παίρνει αντικείμενο πίνακα, κατάσταση ή σωρό και δέχεται έως δυο ορίσματα, την αρχή και το τέλος. Πχ. Β=Κάθε(Α,-1,1) σημαίνει ότι θα μας φέρει κάθε στοιχείο του Α από το τέλος στην αρχή. Μπορούμε να το γράψουμε και έτσι Β=Κάθε(Α Τέλος Έως Αρχή) χωρίς το πρώτο κόμμα δέχεται νούμερα ή το Τέλος και το Αρχή με το Έως ενδιάμεσα.
Η Κάθε() παράγει ένα αντικείμενο με αναφορά στο αντικείμενο που δείχνουμε και κρατάει στοιχεία για την αρχή και το τέλος καθώς και το δρομέα, αυτό δηλαδή που αλλάζει. Έτσι μπορούμε να έχουμε για το ίδιο αντικείμενο πολλαπλούς επαναλήπτες, και ο καθένας θα έχει το δικό του δρομέα. Αν δώσουμε εντολή Τύπωσε με αντικείμενο επαναλήπτη τότε η τύπωσε θα "παίξει" όλη την επανάληψη από αρχή έως τέλος, όπως ορίσαμε και θα βάζει κάθε στοιχείο σε νέα στήλη. Αν το στοιχείο είναι αντικείμενο βάζει στήλη με κενό αλφαριθμητικό, δηλαδή αφήνει μια στήλη. Οι πίνακες, οι καταστάσεις και οι σωροί είναι αντικείμενα που μπορούν να έχουν αριθμούς, αλφαριθμητικά ή αντικείμενα, και όχι υποχρεωτικά ένα είδος. Αν χρησιμοποιήσουμε την Τύπος$() σε έναν επαναλήπτη θα μας επιστρέψει το τύπο του αναφερόμενου αντικείμενου (mArray, Inventory, mStiva). Τα ονόματα αυτά είναι τα πραγματικά ονόματα των αντικειμένων εσωτερικά στον διερμηνευτή. Τα αντικείμενα αυτά η Μ2000 μπορεί να τα εξάγει όταν καλεί για παράδειγμα την javascript και να τα χειριζόμαστε και από αυτήν. Αυτό συμβαίνει λόγω της τεχνολογίας com που δίνει στα αντικείμενα δυο interface, δηλαδή δυο τρόπους να τα χειριστούμε, και ο ένας είναι αυτός που δηλώνει τι μεθόδους και ιδιότητες έχει το αντικείμενο ..ζωντανά, δηλαδή ενώ υπάρχει το αντικείμενο, κατά την εκτέλεση. Και η Μ2000 μπορεί να χειριστεί αντικείμενα που παράγονται κατά την εκτέλεση (τα ορίζει βάσει της registry των Windows) και τα χειρίζεται μέσω του interface IDispatch που δέχεται ονόματα μεθόδων και ιδιοτήτων για τις κλήσεις/χρήσεις του).



Παράδειγμα Απλή Προπαίδεια


\\ Απλή προπαίδεια!
Φόρμα 80,50
Τύπωσε "Με την χρήση πίνακα"
Α=(1,2,3,4,5,6,7,8,9)
Β=κάθε(Α)
Γ=Κάθε(Α)
Ενώ Β {
      Τύπωσε μορφή$("Πίνακας για το {0}",Πίνακας(Β))
      Ενώ Γ {
            \\ το κόμμα στο τέλος της Τύπωσε μετακινεί το δρομέα στην επόμενη στήλη
            Τύπωσε Πίνακας(Β)*Πίνακας(Γ),
      }
      Τύπωσε Πίνακας(Β)*10
}
Τύπωσε "Με την χρήση μεταβλητών μόνο"
Για ι=1 έως 9 {
      Τύπωσε μορφή$("Πίνακας για το {0}",ι)
      Για κ=1 έως 9 {
            Τύπωσε ι*κ,
      }
      Τύπωσε ι*10
}

Τύπωσε "Η χρήση του πίνακα έχει νόημα περισσότερο όταν έχουμε ένα υποσύνολο στοιχείων"
Α=(1,5,8)
Β=Κάθε(Α)
Ενώ Β {
      Τύπωσε μορφή$("Πίνακας για το {0}", Πίνακας(Β))
      Για ι=1 έως 9 {
            Τύπωσε ι*Πίνακας(Β),
      }
      Τύπωσε ι*Πίνακας(Β)
}
Τύπωσε "Χωρίς τη χρήση της Κάθε() - του επαναλήπτη"
\\ Με την ένωση, το Α() είναι αναφορά του Α, και έτσι διαβάζουμε  πιο γρήγορα!
\\ Διαφορετικά θα είχαμε το Πίνακας(Α,ι) στη θέση του Α(ι)
\\ όμως δεν μπορούμε να δώσουμε νέα αναφορά στο Α()
\\ εδώ δεν μας ενδιαφέρει αυτό. Μια είναι αρκετή.
\\ Θα μπορούσαμε σε μια Για Αυτό {  } να έχουμε το παρακάτω κώδικα
\\ και να τον καλούμε όσες φορές θέλαμε γιατί κάθε φορά το Α() θα είναι προσωρινό
\\ άρα κάθε φορά η Ένωσε θα βρίσκει ότι το Α() δεν υπάρχει και θα το φτιάχνει
Ένωσε Α στο Α()
Για ι=0 έως 2 {
      Τύπωσε μορφή$("Πίνακας για το {0}",Α(ι))
      Για κ=1 έως 9 {
            Τύπωσε Α(ι)*κ,
      }
      Τύπωσε Α(ι)*10
}