Πέμπτη, 19 Οκτωβρίου 2017

Πολλαπλή Εξαγωγή από Συνάρτηση


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

Επιπλέον υπάρχει ένα παράδειγμα που δείχνει πως με μια λάμδα συνάρτηση μπορούμε να εμφανίζουμε έναν πίνακα να έχει βάση το 100 (να ξεκινάει το πρώτο στοιχείο από το 100).



\\ πολλαπλή εξαγωγή από συνάρτηση με τέσσερις τρόπους:
Συνάρτηση ΠολλαπλήΕξαγωγή (Α,Β,Γ,Δ) {
      =Δ,Γ,Β,Α \\ επιστροφή πίνακα μονοδιάστατου
}
Τύπωσε ΠολλαπλήΕξαγωγή(1,2,3,4) \\ άμεση εμφάνιση 4 3 2 1

Συνάρτηση ΠολλαπλήΕξαγωγή2 (Α,Β,Γ,Δ) {
      \\ το Δ μπαίνει στη κορυφή του σωρού, στη θέση 1
      Άδειασε  \\ τυχόν άλλα ορίσματα
      Βάλε Α,Β,Γ,Δ
      =[] \\ επιστροφή σωρού (ειδική στοίβα)
}

Συνάρτηση ΠολλαπλήΕξαγωγή2_1 {
      \\ και αυτό δουλεύει αλλά γυρνάει ότι έχει ο σωρός, όχι μόνο αριθμούς.
      =[] \\ επιστροφή σωρού (ειδική στοίβα)
}
Τύπωσε ΠολλαπλήΕξαγωγή2(1,2,3,4) \\ άμεση εμφάνιση 4 3 2 1
Τύπωσε ΠολλαπλήΕξαγωγή2_1(1,2,"οκ",4) \\ άμεση εμφάνιση 1 2 οκ 4

Συνάρτηση ΠολλαπλήΕξαγωγή3 (Α,Β,Γ,Δ) {
      \\ η κατάσταση ουρά, επιτρέπει διπλά κλειδιά,
      \\ και εξασφαλίζει ότι κάθε νέο θα μπει στο τέλος της.
      \\ Η επιτυχής αναζήτηση κλειδιού δείχνει πάντα το τελευταίο που εισάχθηκε
      \\ αλλά δεν επιτρέπει την εντολή Αφαίρεση,
      \\ αντί αυτού έχει την εντολή Πέτα (σε διαμόρφωση για το αντικείμενο)
      \\ η οποία περνάει μόνο από το τέλος όσα κλειδιά θέλουμε.
      \\ μια κατάσταση μπορεί να έχει κλειδιά, ή κλειδιά και τιμές, ή και τα δύο
      \\ όταν δεν υπάρχει τιμή σε ένα κλειδί, τότε το κλειδί είναι τιμή
      \\ τα νούμερα των Α,Β,Γ,Δ γίνονται κλειδιά εδώ και τιμές
      Κατάσταση Ουρά Αλφα =Δ, Γ, Β, Α
      =Αλφα
}
Τύπωσε ΠολλαπλήΕξαγωγή3(1,2,3,4) \\ άμεση εμφάνιση 4 3 2 1

\\ όπου θέλουμε βάζουμε το Έξοδος
\\ για να παρακολουθούμε την εκτέλεση
Σημ 1: Έξοδος

\\ με χρήση δείκτη σε πίνακα
\\ η σειρά θα αλλάξει σε 4,3,20, 1
Ν1=ΠολλαπλήΕξαγωγή(1,20,3,4)
Τύπωσε Πίνακας(Ν1,2) \\ βάση 0, άρα το 2 είναι το 3ο στοιχείο
Σ1=ΠολλαπλήΕξαγωγή2(1,20,3,4)
Τύπωσε ΤιμήΣωρού(Σ1,3) \\ βάση 1 άρα το 3 είναι το 3ο στοιχείο
Κ1=ΠολλαπλήΕξαγωγή3(1,20,3,4)
\\ το ! χρησιμοποιείται για να δίνουμε τον αριθμό σειράς, αλλιώς δίνουμε το κλειδί.
Τύπωσε Κ1(2!) \\ βάση 0, άρα το 2 είναι το 3ο στοιχείο
\\ Μπορούμε να διαβάσουμε το κλειδί με το Εκφρ$(Κ1, 2), και να το επιστρέψουμε ως αριθμό.
Τύπωσε Τιμή(Εκφρ$(Κ1,2))
\\ Δουλεύει σε δυο βήματα, το πρώτο κάνει αναζήτηση, και το δεύτερο γυρνάει το ζητούμενο
\\ εδώ το κλειδί είναι το 20 και είναι και τιμή ταυτόχρονα.
Αν Υπάρχει(Κ1, 20) Τότε Τύπωσε Εκφρ(Κ1), Εκφρ$(Κ1)

\\ η εντολή Επιστροφή δουλεύει για αντικείμενα πίνακες, σωρούς και καταστάσεις.
\\ στους πίνακες το κλειδί είναι η θέση (υπολογίζεται η βάση αν είναι 0 ή 1) ως μονοδιάστατος πίνακας

Επιστροφή Κ1, 20:="Μόνο λέξη"
\\ δουλεύει και με τα Κ1() και Κ1$()
\\ αλλά το Κ1(20) δίνει 0 γιατί τώρα η τιμή είναι αλφαριθμητικό που δεν έχει αριθμό
Τύπωσε Κ1(20), Κ1$(20)
\\ Κλειδί μπορούμε να δώσουμε και με μεταβλητή:
Α=20
Επιστροφή Κ1, Α:="100"
\\ αυτόματα αναγνώρισε ότι το 100 είναι αριθμός οπότε δίνει και τον αριθμό και το αλφαριθμητικό:
Τύπωσε Κ1(20), Κ1$(20)
Λίστα
\\ Οι λάμδα συναρτήσεις μπορούν να έχουν κλεισίματα, μεταβλητές τοπικές σε αυτές,
\\ αλλά οι Καταστάσεις, οι Σωροί, είναι δείκτες, με συνέπεια να μπορούμε να τους πάρουμε
\\ και να κάνουμε αλλαγές. Ομοίως το ίδιο μπορούμε να κάνουμε με δείκτες σε πίνακες.
Συνάρτηση ΠολλαπλήΕξαγωγή4 {
      Αν κενό τότε Λάθος "Ο σωρός είναι άδειος"
      Α=Σωρός \\ άδειος
      Β=[] \\ αδειάζει τον τρέχον στο Β
      Β1=Κάθε(Β)
      Ενώ Β1 { Σωρός Α { Βάλε ΤιμήΣωρού(Β1)}}

      =λάμδα Α -> {
            Αν όχι κενό Τότε {
                  Διάβασε Που
                  =ΤιμήΣωρού(Α, Που)
            } Αλλιώς =Α
      }
}
Μ=ΠολλαπλήΕξαγωγή4(1,20,3,4)
Τύπωσε Μ() \ 4 3 20 1
Τύπωσε Μ(3)
\\ επειδή το Μ() γυρίζει δείκτη, μπορούμε να αλλάξουμε στοιχείο του σωρού
Επιστροφή Μ(), 3:=1000
\\ το οποίο θα φανεί με τη χρήση της λάμδα, ότι άλλαξε εντός της λάμδα:
Τύπωσε Μ(3)
Συνάρτηση ΠολλαπλήΕξαγωγή5 {
      Αν Μέγεθος.Σωρού<2 τότε Λάθος "Πρόβλημα στο σωρό"
      Διάβασε ΒάσηΠινακα%
      Πίνακας Βάση 0, Α(Μέγεθος.Σωρού)
      Για Χ=0 έως Μέγεθος.Σωρού-1 {
            Φέρε Μέγεθος.Σωρού
            Διάβασε Α(Χ)
      }
      =λάμδα Α(), ΒάσηΠινακα% -> {
            Αν όχι κενό Τότε {
                  Διάβασε Που%
                  =Α(Που%-ΒάσηΠίνακα%)
            } Αλλιώς =Α()
      }
}

\\ Πώς θα φτιάξουμε πίνακα με βάση διαφορετική το 0 ή το 1
\\ κανονικά μόνο 0 και 1 δέχεται η Μ2000
\\ επειδή εξωτερικά μια λάμδα συνάρτηση μοιάζει με πίνακας
\\ και αφού μπορούμε να κλείσουμε έναν πίνακα μέσα της,
\\ θα κάνουμε μια λάμδα να φαίνεται σαν πίνακας!
\\ δίνουμε εδώ την βάση (100) και τέσσερα στοιχεία,
\\ που θα τα βάλουμε ανάποδα όπως στα προηγούμενα παραδείγματα!
\\ Μπορούμε να βάλουμε όσα θέλουμε αλλά τουλάχιστον ένα!
\\ έτσι θα πρέπει να βάλουμε την βάση και μετά ένα αριθμό.

Μ=ΠολλαπλήΕξαγωγή5(100, 1,20,3,4)
Τύπωσε Μ()
\\ η Μ() είναι μια λάμδα που φαίνεται ως πίνακας
\\ με βάση το 100
Τύπωσε Μ(102) \\ βάση 100 για τον πίνακα
Για Ι=100 εως 103 {
      Τύπωσε Μ(Ι)
}
Ν=Μ()
ΜΜ=Κάθε(Ν Τέλος Έως Αρχή)
Ενώ ΜΜ {
      Τύπωσε Πίνακας(ΜΜ),
}
ΜΜ=Κάθε(Ν,1, -1)
Τύπωσε
Ενώ ΜΜ {
      Τύπωσε Πίνακας(ΜΜ),
}
Τύπωσε
Δες {
      \\ αυτό δεν γίνεται γιατί η Μ() είναι συνάρτηση
      \\ δεν μπορεί να είναι σε αριστερή έκφραση σε εκχώρηση!
      Μ(102)=100
}
\\ μπορούμε να αλλάξουμε τιμή με χρήση του δείκτη
\\ αλλά εδώ δουλεύει με βάση το 0 άρα το 2 είναι το 3ο στοιχείο
Επιστροφή Ν, 2:=1234
Τύπωσε Μ()

\\θα δοκιμάσουμε να περάσουμε την λάμδα, σαν μεταβλητή, με αντιγραφή στο τμήμα δοκιμή1
Τμήμα δοκιμή1 {
      Διάβασε Τι
      Τύπωσε "Μέσα στη Δοκιμή"
      Τύπωσε Τι() \\ 4 3 1234 1
      Τυπωσε Τι(101) \\ 3
      Ν=Τι()
      \\ το Ν() είναι αναφορά του Ν, του δείκτη στο πίνακα
      \\ και ο σκοπός είναι να πάρουμε τις δυνατότητες που έχουν οι πίνακες με παρενθέσεις
      Ένωσε Ν στο Ν()
      \\ όπως το +=
      Ν(2)+=5000
      \\ στο Ν το Ν+=5000 αλλάζει όλα τα στοιχεία.

}
\\ το Μ θα περάσε με τιμή, αλλά ο δείκτης στο πίνακα παραμένει μέσα!
δοκιμή1 Μ
Τύπωσε Μ() \\ 4 3 6234 1



Για την ΠολλαπλήΕξαγωγή5:

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