Τρίτη 16 Φεβρουαρίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 6ο

3. Πίνακες   (αναθεώρηση 13/12/19)

Στη τελευταία αναθεώρηση του κειμένου αυτού, γίνεται αναφορά στις διαστάσεις πίνακα, όπως συμβαίνει στις νεότερες εκδόσεις της γλώσσας. Ισχύουν ό,τι είχε γραφεί πριν και επιπλέον ότι μπορούμε να δίνουμε ανά διάσταση ξεχωριστή βάση, ακόμα και αρνητική. Εδώ δίνουμε όρια για τη πρώτη διάσταση τα 2 και 4, δηλαδή τρεις τιμές τις 2,3 και 4.

Στη Για Επόμενο μπορούμε να παραλείψουμε τη μεταβλητή. Αν δεν το κάνουμε, τότε ελέγχει ο διερμηνευτής αν έχουμε βάλε τη σωστή μεταβλητή!

Πίνακας Α(2 έως 4, -10 έως -1)=500
Τύπωσε Α(2,-10)
\\ Α(2,-10)=1,2,3,4,5,6,7,8,9,10  \\ δουλεύει και έτσι αλλά το πρώτο πρέπει να είναι αριθμός
\\ ενώ με := δέχεται οτιδήποτε ως πρώτη τιμή. Οι άλλες τιμές μπορεί να είναι οτιδήποτε
Α(2,-10):=1,2,3,4,5,6,7,8,9,10
\\ δίνει τα 1...10
Για ι=-10 έως -1 : Τύπωσε Α(2,ι),: Επόμενο
Τύπωσε 


Οι πίνακες όπως και οι αυτόματοι πίνακες (πχ το (1,2,3,4) είναι αυτόματος πίνακας ή tuple) έχουν ειδικές συναρτήσεις με το # στην αρχή του ονόματος και μπαίνουν αθροιστικά (η μια μετά την άλλη). Αυτόματος πίνακας είναι αυτός που φτιάχνεται χωρίς την εντολή ορισμού, απευθείας με κώδικα, όπως το (1,) (πίνακας ενός στοιχείου) ή το (,) πίνακας μηδενικού στοιχείου.
Δες την βοήθεια, ή το μικρό εγχειρίδιο για τις συναρτήσεις αυτές!



3.1 Διαστάσεις πίνακα
Οι πίνακες είναι χρήσιμοι για να βάζουμε στοιχεία που θέλουμε να τα προσπελάσουμε με αριθμό, ή όπως το λέμε με δείκτη. Ένας πίνακας δέκα στοιχείων μπορεί να έχει τα στοιχεία με ένα δείκτη από 0 έως 9 ή με δυο δείκτες από 0 έως 1 ο πρώτος και από 0 έως 4 ο δεύτερος. Η βάση πινάκων αλλάζει (δες 3.1.1.)
Θα μπορούσαμε σε ένα πίνακα ενός και μόνο στοιχείου να αντιστοιχίσουμε δέκα δείκτες, απλά ο κάθε ένας θα είναι από 0 ...έως 0. Π.χ. ένας πίνακας δέκα διαστάσεων είναι αυτός:

Πίνακας Α(1,1,1,1,1,1,1,1,1,1)=100
Τύπωσε Α(0,0,0,0,0,0,0,0,0,0) \\ Τυπώνει 100

 

Στο παραπάνω πίνακα έχουμε ένα μόνο στοιχείο! Κανείς δείκτης δεν μπορεί να φθάσει το 1. Το όριο δηλαδή δηλώνει ποσότητα ενώ ο δείκτης δηλώνει θέση με πρώτη το 0. Άρα αν έχουμε ένα πίνακα 3 στοιχείων:

Πίνακας Α(3)=5
Τύπωσε Α(0), Α(1), Α(2) \\ 5    5    5
Τύπωσε Έγκυρο(Α(10)) \\ 0
\\ Η Τύπωσε τυπώνει πίνακες αριθμητικούς άμεσα
Τύπωσε Α()


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

Αν δεν το κάνουμε έχουμε επιστροφή τύπου "Empty". Εσωτερικά οι πίνακες έχουν τιμές Variant, που σημαίνει ότι μπορεί να είναι οτιδήποτε. Το όνομα όμως του πίνακα λέει στον εκτιμητή παραστάσεων ότι ζητάμε συγκεκριμένη τιμή, έτσι αν με κάποιο τρόπο σε έναν αριθμητικό πίνακα περάσουμε αλφαριθμητικό (γίνεται και θα δούμε πώς αλλά και το σημαντικότερο, το γιατί), τότε ζητώντας την αριθμητική τιμή θα μας δώσει την μετατροπή σε αριθμό, χωρίς να πειράξει την αλφαριθμητική τιμή.

Πίνακας Κ(20)
Τύπωσε Τύπος$(Κ(0))

Τυπώνει Empty.

3.1.2 Βάση Πινάκων
Η εντολή Βάση (χρησιμοποιείται και στις βάσεις δεδομένων με όρισμα αλφαριθμητικό), αλλάζει την βάση πινάκων μεταξύ του 0 και του 1
Η αλλαγή γίνεται μέχρι να χρησιμοποιηθεί ξανά. Μπορούμε να έχουμε πίνακες στη μία ή στην άλλη βάση. Μπορούμε επιλεκτικά να ορίσουμε βάση σε έναν πίνακα:
Βάση 1
Πίνακας Α(10)=1
Τύπωσε Α(10)
Βάση 0
Πίνακας Β(10)=1
Τύπωσε Β(0), Α(10)
\\ επιλεκτικά
Πίνακας Βάση 1, Γ(10)=1
Πίνακας Δ(10)=1
Τύπωσε Δ(0), Γ(10), Έγκυρο(Γ(0)) \\ δίνει 0 - όχι έγκυρο
Τύπωσε Διάσταση(Γ(),0) \\ δίνει 1
Τύπωσε Διάσταση(Δ(),0) \\ δίνει 0
\\ Μπορούμε να αλλάξουμε βάση σε πίνακα
\\ Χωρίς να σβήσουμε τα στοιχεία
Πίνακας Βάση 0,Γ(10)
Τύπωσε Γ(0)



      Πίνακας Α(2 έως 4, -10 έως -1)=500
      Διαστάσεις=Διάσταση(Α())
      Αν Διαστάσεις>0 Τότε
            Τύπωσε "Διάσταση","", "Τιμές", "Βάση"
            Για ι=1 έως Διαστάσεις
                  Τύπωσε ι, ") ",Διάσταση(Α(), ι), Διάσταση(Α(), ι, 0)
            Επόμενο
      Τέλος Αν



3.1.2 Αυτόματοι πίνακες σε μεταβλητή
Μια λίστα σε παρενθέσεις και τουλάχιστον ένα κόμμα παράγει πίνακα. Μπορούμε να τον γράψουμε σε μια μεταβλητή ή σε έναν πίνακα.
α=(1,2,3,4,5)
Πίνακας β()
β()=(1,2,(5,6,7),4)
α++
Τύπωσε α, β()
\\ το τρίτο στοιχείο του β() δεν εμφανίζεται - η τΤύπωσε βάζει ένα διάστημα, γιατί είναι πίνακας
\\ Τώρα εμφανίζονται τα 5,6,7
Τύπωσε β(2)
\\ Εμφανίζει το 5
Τύπωσε β(2)(0)


Οι μεταβλητές κρατούν αναφορά σε πίνακα εξ ορισμού. Ακόμα και αν ο πίνακας δεν είχε όνομα όπως εδώ με τη λίστα, κρατούν μια αναφορά.

ν=λάμδα Χ=1->{=Χ:Χ++}
\\ γεμίζουμε τον πίνακα με 20 αριθμούς από 1 έως 20
Πίνακας Άλφα(20)<<ν()
\\ εμφανίζουμε τον πίνακα
Τύπωσε Άλφα()
Ένωσε Άλφα() στο Βήτα()
\\ στα στοιχεία μπορούμε να χρησιμοποιούμε τελεστές όπως +=, ++, κ.α.
Βήτα(0)+=100
Τύπωσε Βήτα()
Κ=Βήτα()
\\ Παίρνουμε μια αναφορά του Άλφα()
\\ Και εδώ μπορούμε να χρησιμοποιούμε τελεστές, αλλά για όλα τα στοιχεία
Κ+=5
Τύπωσε Κ
Τύπωσε Άλφα()
\\ Μπορούμε να δούμε στοιχείο μέσω του Κ
Τύπωσε Πίνακας(Κ,0)
\\ Για να αλλάξουμε στοιχείο πρέπει να έχουμε όνομα με παρενθέσεις!
\\ Έστω δεν υπήρχαν τα Άλφα() και Βήτα()
Ένωσε Κ στο Μ()
Μ(0)+=200
Τύπωσε Πίνακας(Κ,0)
Τύπωσε Διάσταση(Κ) \\ δίνει 1
Τύπωσε Διάσταση(Κ,0) \\ δίνει 0, είναι η βάση πινάκων (0 ή 1)
Τύπωσε Μήκος(Κ) \\ δίνει το μήκος ανεξάρτητα διαστάσεων σε αριθμό στοιχείων
Τύπωσε Διάσταση(Κ,1) \\ δίνει τον αριθμό στοιχείων στην διάσταση 1
Πίνακας Άλλος()
Άλλος()=Κ \\ εδώ βγαίνει αντίγραφο
Κ*=0 \\ μηδενίζω τα στοιχεία, μηδένισαν και για Άλφα() και Βήτα()
Τύπωσε Άλλος()
Τύπωσε Άλφα()



3.2 Ποικιλία τύπων στον ίδιο πίνακα
Ένας πίνακας είναι μια σειρά στοιχείων με δείκτη (ή δείκτες), και μπορούν να φέρουν διάφορες τιμές, οι οποίες μετατρέπονται βάσει του ονόματος που έχουμε:
Δείτε την χρήση το ":=", είναι η πολλαπλή καταχώρηση διάφορων βασικών τύπων.
Πίνακας Α$(5)
Α$(0):=10,30,"Γιώργος","Καναλλάκι", 1000
Τύπωσε Α$(0), Α$(1), Α$(2), Α$(3), Α$(4)


Δείτε τώρα πως θα ενώσω τον πίνακα αυτόν με έναν άλλο, χωρίς να του δώσω νέα στοιχεία, απλά θα είναι άλλου τύπου για να μπορώ στον ίδιο πίνακα να αλλάζω τιμές βάσει τύπου!
Ένωσε Α$() στο Α()
Α(0)++
Τύπωσε Α(0)*Α(1) \\ 11*30
Τύπωσε Α$(0), Α$(1)

Να τι έγινε: Ο διερμηνευτής έφτιαξε τον Α() και του έδωσε τα ίδια στοιχεία με το Α$(), δεν τα αντέγραψε, απλά έκανε τον Α() να δείχνει στον ίδιο πίνακα με τον Α$().  Αυτό λέγεται ότι:
 "ο Α() έχει αναφορά στον Α$()"
Ουσιαστικά ο δεύτερος πίνακας είναι διεπαφή (interface) που λέει ότι το αντικείμενο πίνακας (είναι πράγματι ένα αντικείμενο στη Μ2000), θα διαβάζεται σαν να έχει στοιχεία αριθμούς. Μάλιστα αν στο 2 που έχει το Γιώργος βάλουμε το 145 τότε θα έχει το 145 και σαν γράμματα!


Υπάρχει και η πολλαπλή καταχώρηση ίδιου-όμοιου- τύπου, η οποία ζητάει κάθε μέλος στον ίδιο τύπο σίγουρα:
Πίνακας Α$(5)
Α$(0)="10","30","Γιώργος","Καναλλάκι", "1000"
Τύπωσε Α$(0), Α$(1), Α$(2), Α$(3), Α$(4)


Μπορούμε να χρησιμοποιήσουμε λίστα () που δημιουργεία αυτόματο πίνακα χωρίς όνομα:
Μ=("10","30","Γιώργος","Πρέβεζα", "1000")
Τύπωσε Πίνακας$(Μ,3)
Ένωσε Μ στο ΜΜ$()
ΜΜ$(2)="Αθήνα"
Τύπωσε ΜΜ$(2)
Τύπωσε Μ

Οι τιμές 10, 30 και 1000 θα τυπωθούν σαν αριθμοί. Η τύπωσε δεν χειρίζεται αυτόματα αλφαριθμητικούς πίνακες, δηλαδή με όνομα που έχει $.

3.3 Δυναμικοί Πίνακες
Οι πίνακες στη Μ2000 είναι δυναμικοί. Αυτό σημαίνει ότι μπορούν να αλλάξουν αριθμό στοιχείων, να αφαιρέσουμε ή να προσθέσουμε. Αν έχουμε συνδέσει έναν πίνακα (δες 3.2) η όποια αλλαγή οποιουδήποτε συνδεδεμένου είναι αλλαγή για όλους. Η αλλαγή αν δεν γίνει με υπόδειξη για αρχική τιμή τότε δεν πειράζει τις τιμές των στοιχείων που μένουν μετά την αλλαγή. Αν προσθέσουμε στοιχεία χωρίς αρχική τιμή τότε προσθέτουμε κενά στα υπάρχοντα στοιχεία.
Επίσης μπορούν να αλλαχτούν και οι διαστάσεις!
Μπορούμε να μαθαίνουμε τις διαστάσεις του πίνακα αφού έχει δημιουργηθεί.

\\ Πίνακες!
Πίνακας Α(10)=3,Β(2,3,4)=5
\\ Αλλαγή διαστάσεων, χωρίς αλλαγή στοιχείων:
Πίνακας Α(2,5),Β(24)
Τύπωσε Α(1,4), Β(23)
Α(1,4)++
Β(23)+=10
Τύπωσε Α(1,4), Β(23)
\\ πάλι αλλαγή
Πίνακας Α(10), Β(2,3,4)
\\ τώρα το  Α(9) είναι ίδιο με το Α(1,4)
\\ και το Β(23) είναι ίδιο με το Β(1,2,3)
Τύπωσε Α(9), Β(1,2,3)
Α=Διάσταση(Α())
Β=Διάσταση(Β())
Αν Α>0 Τότε {
      Τύπωσε "Διάστασεις του Α():";Α;" :";
      Για Ι=1 έως Α {
            Τύπωσε Διάσταση(Α(),Ι)
      }
}
\\ πιο προχωρημένος κώδικας βάζει το x ανάμεσα στις διαστάσεις!
Αν Β>0 Τότε {
      Τύπωσε "Διάστασεις του Β():";Β;" :";
      Για ι=1 έως Β {
            Τύπωσε Διάσταση(Β(),Ι);
            Αν ι<Β τότε Τύπωσε "x";
      }
      Τύπωσε
}


3.4 Αντιγραφή Πίνακα
Οι πίνακες στην Μ2000 αντιγράφονται. Δείτε όμως κάτι, για να κάνουμε αντιγραφή πρέπει να ξέρει ο Διερμηνευτής ότι έχουμε ορίσει έστω και μηδενικό πίνακα (όπως εδώ τον Β()). Ενώ στην ένωση δεν ήθελε ορισμό. Αυτό συμβαίνει γιατί δεν μπορεί να ενώσει ο διερμηνευτής έναν πίνακα που ήδη υπάρχει! Αλλά μπορεί να αντιγράψει έναν πίνακα σε έναν πίνακα που ήδη υπάρχει. Η αντιγραφή με το σύμβολο της εκχώρησης "=" κάνει τον Β() αντίγραφο του Α(). Αν ο Α() είχε αντικείμενα τότε και αυτά θα αντιγραφούν, και αν αυτά είχαν πίνακες θα αντιγραφούν και αυτοί. Η λειτουργία της αντιγραφής παράγει δηλαδή και αντικείμενα αν υπάρχουν στον πίνακα στο δεξί μέρος.

Πίνακας Α(30)=10, Β()
Β()=Α()
Τύπωσε Β(0)


Υπάρχει τρόπος να γίνει "αντιγραφή" σε χρόνο Α, να αλλαχτούν οι τιμές στο πίνακα και σε χρόνο Β να βγει το αντίγραφο με τις νέες τιμές. Στο σωρό τιμών μπαίνει αναφορά στον πίνακα. Δες 3.10


3.5 Γενικός πίνακας
Δεν έχουμε μεγάλες διαφορές, απλά αντί για την λέξη πίνακας γράφουμε τη λέξη Γενική/Γενικό/Γενικές Εδώ ορίζουμε πίνακες και μεταβλητές μαζί. Αν υπάρχει γενικός πίνακας δεν γίνεται αλλαγή διαστάσεων αλλά φτιάχνεται νέος πίνακας. Έτσι αν το τμήμα που τον έφτιαξε τερματίσει τότε ο παλιός γενικός θα υπάρχει χωρίς να έχουν αλλάξει τα στοιχεία του.
Για να αλλάξουμε διάσταση σε έναν γενικό δεν μπορούμε να το κάνουμε με τις εντολές Γενική/Γενικό/Γενικές γιατί θα δημιουργηθεί νέος πίνακας, αλλά με την Θέσε Πίνακας. Η εντολή Θέσε στέλνει την γραμμή μέχρι το τέλος της στον μεταφραστή γραμμής και αυτός εκτελεί σε επίπεδο 0, δηλαδή σαν να είναι εκτός τμημάτων, άρα η Θέσε Πίνακας κ(50) είναι εντολή για τον κ(50) που είναι γενικός άρα επιπέδου 0, και τον βλέπει ο διερμηνευτείς και τον αλλάζει. Μετά τη θέσε στην ίδια γραμμή δεν βάζουμε σημειώσεις (ο μεταφραστής γραμμής δεν δέχεται σημειώσεις).

Γενική κ(20)=100
Τμήμα ΔεςΜε {
      Γενική κ(30)=10, λ()
      λ()=κ()
      Τύπωσε λ(25) \10
      Θέσε Πίνακας κ(50)
      \\ οι γενικοί πίνακες δεν θέλουν <=
      κ(40)=1000
      Τύπωσε κ(40), κ(4) \\ 1000   10
}
ΔεςΜε
Τύπωσε κ(4) \\ 100


(Μπορούμε να βγάλουμε μια αναφορά στο γενικό πίνακα να αλλάξουμε διάσταση στην αναφορά και θα αλλάξει και ο γενικός)
Βάση 0
Γενικό Α(10)=1
Τύπωσε Α(1)
\\ εδώ είναι η ένωση
Ένωσε Α() στο Δ()
Πίνακας Δ(100)=1
Τύπωσε Α(99)


3.5.1 Τοπικός πίνακας
Γενικά όλοι οι πίνακες αν δεν δηλωθούν γενικοί είναι τοπικοί. Όμως μπορούμε να ορίσουμε τοπικούς που θα σκιάσουν άλλους τοπικούς και γενικούς (οι τοπικοί έρχονται πρώτα στην χρήση). Το  μπλοκ εντολών Για Αυτό { } σβήνει ότι νέο δημιουργούμε, οπότε η τοπική θα χαθεί μετά το μπλοκ. Ομοίως οι ρουτίνες τύπου Ρουτίνα όμομα() / Τέλος Ρουτίνας καθαρίζουν ότι νέο οριστεί. Στο παράδειγμα δεν χρειάζεται Έξοδος ή Τέλος πριν την λέξη Ρουτίνα γιατί και αυτή κάνει έξοδο όταν φθάσει η ροή εκτέλεσης στη γραμμή αυτή.

Πίνακας Α(30)=100
Για Αυτό {
      Τοπική Α(5)=10
      Τύπωσε Α(3)
      Αλφα()
}
Αλφα()
Τύπωσε Α(29)


Ρουτίνα Αλφα()
      Τοπική Α(5)=50
      Τύπωσε Α(3)
Τέλος Ρουτίνας


3.6 Προσωρινός Πίνακας
Έχουμε δει ότι στις Για Αυτό {} και Για αντικείμενο {} έχουμε την δυνατότητα να φτιάχνουμε προσωρινές μεταβλητές/τμήματα/συναρτήσεις, εφόσον δεν έχουν οριστεί έξω από αυτές τις δομές:

Σημ 1 : Πίνακας Α(5)=1000
Για Αυτό {
      Πίνακας Α(5)
      Α(0)=1,4,2,7,9
      Για ι=0 έως 4 : Τύπωσε 3**Α(ι) : Επόμενο ι
}
Τύπωσε Έγκυρο(Α(3)) \\ 0 όχι ή -1 ναι αν βγάλουμε τη σημείωση

Αυτό ισχύει και για τους πίνακες. Δείτε όμως στο 3.5.1. πως ορίζουμε τοπικό Πίνακα.

3.7 Επιστροφή πολλαπλών τιμών σε πίνακα από συνάρτηση
Μπορούμε να δώσουμε σε μια συνάρτηση έναν αριθμό τιμών και έτσι να μας επιστρέψει πίνακα (η πρώτη τιμή πρέπει να είναι ο τύπος της συνάρτησης)

Συνάρτηση ΧΥΖ {
      Διαβασε Κ
      =1*κ,2*κ,3*κ,4*κ
}
Πίνακας Α()
Α()=ΧΥΖ(5)
Για ι=0 έως 3 {
      Τύπωσε Α(ι)
}


Και εδώ πρέπει να έχουμε ορίσει έστω μηδενικό πίνακα Α()

3.8 Μηδενικός Πίνακας
Ορίζοντας ένα πίνακα μηδενικό σβήνουμε το αντικείμενό του, δηλαδή τον καθαρίζουμε άμεσα! Στη συνάρτηση διάσταση επιστρέφει το 0 (καμία διάσταση)

Πίνακας Α$(30)="οκ", Α%(30)=5.4
Τύπωσε Α$(20), Α%(20)
Πίνακας Α$(), Α%()
Τύπωσε διάσταση(Α$()), Διάσταση(Α%())


3.9 Αλλαγή όλων των τιμών Πινάκων μεταξύ τους!
Κλασική περίπτωση χρήσης τρίτου στοιχείου!

Πίνακας Α(10)=5,Β(5)=4
Για Αυτό {
      Πίνακας Γ()
      Γ()=Α()
      Α()=Β()
      Β()=Γ()
}
Λίστα  \\ μας δείνχει ότι ο Γ() δεν υπάρχει!
Τύπωσε Διάσταση(Α(),1), Διάσταση(Β(),1) \\ 5  10


Θα μπορούσαμε να αλλάξουμε μόνο αναφορές (με τις μεταβλητές ως πίνακες μόνο). Οι πίνακες δεν έχουν αλλάξει στοιχεία αλλά αλλάζουν τα Α και Β αναφορά στο πίνακα! Αν φτιάξουμε αναφορά τύπου &Μ() τότε αυτή δεν μπορεί να αλλάξει.

Πίνακας Α(10)=5,Β(5)=4
Α=Α()
Β=Β()
Τύπωσε Πίνακας(Α, 0), Πίνακας(Β,0)
Τύπωσε Α(0), Β(0)
Άλλαξε Α, Β
Τύπωσε Πίνακας(Α, 0), Πίνακας(Β,0)
Τύπωσε Α(0), Β(0)




3.10 Πίνακας και σωρός
Στο σωρό ένας πίνακας μπαίνει ως αναφορά στο αντικείμενο "mArray", το πραγματικό αντικείμενο του πίνακα. Όμως βγαίνει με αντιγραφή! Δηλαδή όταν αποφασίσουμε να τον σηκώσουμε από τον σωρό θα πάρουμε ένα αντίγραφο και η αναφορά θα διαγραφεί και εδώ ισχύει ότι αν η αναφορά είναι η τελευταία, θα διαγραφεί και ο πίνακας!

Πίνακας Α(10)=100
Βάλε Α()
Α(3)=10
Διάβασε Β()
Τύπωσε Β(0),Β(3)


αν δώσουμε αυτές τις εντολές αμέσως μετά τότε η αλλαγή στο Β(3) δεν θα είναι αλλαγή για το Α(3)
Β(3)=10000
Τύπωσε Α(3)


Όπως βλέπουμε η αλλαγή του στοιχείου 3 άλλαξε τον πίνακα. Α(). Η βάλε δεν έβαλε αντίγραφο του Α() αλλά αναφορά, και η Διάβασε πήρε την αναφορά και έφτιαξε αντίγραφο.

3.10 Πέρασμα με αναφορά πίνακα
Υπάρχει το πέρασμα με αναφορά και αυτή η αναφορά έχει να κάνει με την ένωση των πινάκων. Δεν μπορεί ένα όνομα να ενωθεί δεύτερη φορά με άλλο όνομα. Μπορούν πολλά ονόματα να είναι ενωμένα σε ένα πίνακα. Αν αντιγράψουμε έναν πίνακα σε ένα από αυτά τότε η αντιγραφή θα φανεί παντού.
Το σύμβολο της αναφοράς είναι το & και στην ουσία δεν περνάει κανένα αντικείμενο, μόνο ένα όνομα.(μια ισχνή αναφορά), Για να έχουμε κανονική αναφορά, δηλαδή ένα όνομα που θα δείχνει σε ένα άλλο, τότε πρέπει να κάνουμε την ισχνή (ένα όνομα) σε πραγματική (μια ένωση σε άλλο όνομα). Και αυτό κάνει η Διάβασε με τον όνομα του πίνακα με το σύμβολο &.

Πίνακας Α(10)=100
Βάλε &Α()
Α(3)=10
Διάβασε &Β()
Τύπωσε Β(0),Β(3)
Β(3)=10000
Τύπωσε Α(3)


Τώρα το Α(3) έχει αλλάξει γιατί ουσιαστικά ο Α() και ο Β() είναι ένας πίνακας!

(Σε επόμενο τεύχος θα δούμε τους τρόπους περάσματος, εδώ αναφέρθηκε για τους πίνακες ο τρόπος τις αναφοράς, και αναφέρθηκε και η ισχνή αναφορά, αλλά δεν εξηγήθηκε σε βάθος, και δεν φάνηκε ακόμα η χρησιμότητά της)


3.11 Πίνακες σε Πίνακα (έκδοση 8.1)
Η Μ2000 μπορεί να χειρίζεται Jagged Πίνακες, δηλαδή πίνακες που περιέχουν πίνακες, διαφορετικούς ανά στοιχείο! Σε περίπτωση αντιγραφής πίνακα με αναφορές σε πίνακες δεν έχουμε deep copy, όπως στις ομάδες και στους απλούς πίνακες. Αυτό συμβαίνει γιατί θα έπρεπε να ανιχνεύονται όλα τα στοιχεία για πίνακες και αυτό απαιτεί χρόνο. Οπότε για αυτή τη διαδικασία καλύτερα τον έλεγχο να τον έχει ο χρήστης. Ακόμα και η β(ι)=β(ι) παράγει πίνακα (αντίγραφο) αν το β(ι) είναι πίνακας. Όταν κάνουμε την αντιγραφή Β()=Α() τότε βγαίνει ένας νέος πίνακας με ότι έχει το Α() αλλά στις θέσεις 0 και 1 έχει αναφορές σε πίνακες. Με την ανάγνωση των στοιχείων και την αντιγραφή στον εαυτό τους, δημιουργούνται όπου υπάρχουν αναφορές αντίγραφα. Ουσιαστικά οι πίνακες μέσα σε πίνακες. δεν έχουν όνομα.

Συνάρτηση Πίνακας_2D { Πίνακας α(Αριθμός, Αριθμός) : =α()}
Συνάρτηση Πίνακας_1D {=0,1,2,3,4,5,6,7,8,9}
Πίνακας α(5)
α(0)=Πίνακας_2D(5,5)
α(1)=Πίνακας_1D()
α(0)(2,2)=α(1)(5)*10
Τύπωσε α(1)(5), α(0)(2,2)


Πίνακας β(5)


Σημ 1 : Για ι=0 έως 4 : β(ι)=α(ι) : Επόμενο ι
\\ αντιγραφή πίνακα, αλλά με αναφορές σε κοινούς πίνακες μεταξύ α() και β()
β()=α()
\\ αποκατάσταση αναφορών. το β(ι)=β(ι) αν είναι πίνακας δεξιά βγαίνει νέος και αλλάζει την αναφορά στο αντίστοιχο το α()
Για ι=0 έως 4 : β(ι)=β(ι) : Επόμενο ι


β(0)(2,2)=1000
Τύπωσε β(0)(2,2), α(0)(2,2)


3.12 Κατάσταση (λίστα ειδών)
Η κατάσταση είναι αντικείμενο που δεν έχει αντιγραφή, όπως ο πίνακας, και την χειριζόμαστε και ως  πίνακα στοιχείων. Μπορεί να πάρει οποιαδήποτε στοιχεία, και μάλιστα έχει πολλαπλές εμφανίσεις ανάλογα με το τι έχει σε κάθε στοιχείο. Εδώ θα δούμε με στοιχεία πίνακες:

Συνάρτηση Πίνακας_2D { Πίνακας α(Αριθμός, Αριθμός) : =α()}
Συνάρτηση Πίνακας_1D {=0,1,2,3,4,5,6,7,8,9}
Κατάσταση α=0:=Πίνακας_2D(5,5), 1:=Πίνακας_1D(),2,3:=100,4
α(0)(2,2)=α(1)(5)*10
Τύπωσε α(1)(5), α(0)(2,2)
Πίνακας β(5)
Για ι=0 έως 1 {
      β(ι)= α(ι)()
}
Για ι=2 έως 4 {
      β(ι)=α(ι)
}
β(0)(2,2)=1000
Τύπωσε β(0)(2,2), α(0)(2,2)
Τύπωσε β(1)(3), β(2), β(3), β(4)
\\ η επιστροφή στη κατάσταση γίνεται με ειδική εντολή
Επιστροφή α, 4:=400
\\ όχι όμως για πίνακες σε αυτήν:
α(1)(5)+=100
Τύπωσε β(4), α(4), α(1)(5), β(1)(5) ' 4, 400, 105, 5
\\ τα νούμερα στη κατάταξη είναι κλειδιά


(για την Κατάσταση θα γραφτεί ειδικό κεφάλαιο).




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

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

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