Σάββατο, 21 Οκτωβρίου 2017

Δένδρο και δυαδική αναζήτηση!

Αυτό το πρόγραμμα γράφτηκε πάνω σε παλιότερο. Χρησιμοποιεί, συναρτήσεις, ρουτίνες (με αναδρομή ορισμένες), λάμδα συναρτήσεις. Το βασικό του στοιχείο είναι ότι κάθε Πόλη μπαίνει σε έναν πίνακα με τρεις θέσεις, η θέση 0 έχει δείκτη σε πίνακα, η θέση 1 έχει το όνομα της πόλης, και η θέση 2 έχει δείκτη πίνακα.Ενδέχεται ο δείκτης να δείχνει έναν πίνακα χωρίς στοιχεία, (μηδενικό πίνακα).
Στη αρχή βάζουμε πόλεις με την ρουτίνα Βάλε_Ένα()  - προσοχή στις ρουτίνες τα ονόματα τα δείνουμε όπως τα γράφουμε (το ελέγχουμε με το F3 όταν επιλέξουμε το όνομα της ρουτίνας και το πατάμε για να μας πάει στο επόμενο ίδιο)
Η Βάλε_Ένα() στρώνει την δομή χωρίς να λογαριάζει ισορροπία στο δένδρο (όπως έρχονται). Η συνάρτηση ΥπάρχειΣτηΔομή κάνει αναζήτηση στη δομή και δίνει αληθές αν βρεθεί η πόλη.
Δυο ρουτίνες η Τύπωσε_Όλα() και η Τύπωσε_Όλα_Αλλιώς() εμφανίζουν τις πόλεις, με αύξουσα και με φθίνουσα σειρά αντίστοιχα.
Η συνάρτηση Δείκτες() δίνει έναν πίνακα με δείκτες σε όλα τα στοιχεία του δένδρου, με αύξουσα σειρά. Ουσιαστικά έχει μια ρουτίνα όπως η Τύπωσε_Όλα αλλά αντί να τυπώνει στην οθόνη, βάζει στο τρέχοντα σωρό της συνάρτησης, κάθε τιμή στο τέλος, ώστε η πρώτη που θα μπει θα βγει πρώτη, και αυτό χρειαζόμαστε για να γεμίσουμε το πίνακα (η Βάλε βάζει στη κορυφή και η Σειρά βάζει στ τέλος του τρέχοντα σωρού, ενώ η Διάβασε διαβάζει πάντα από την κορυφή).
Με τον πίνακα από την Δείκτες() έχουμε απλά έναν πίνακα (με βάση το 1) με δείκτες σε άλλους πίνακες! Μπορούμε να τον περάσουμε σε μια λάμδα ως κλείσιμο και να δίνουμε στην λάμδα μόνο το αριθμό (από 1 έως το μήκος του πίνακα) της πόλης και αυτή θα μας γυρίζει το όνομα.

Μπορούμε να διατρέξουμε το πίνακα με επαναλήπτη (iterator) που φτιάχνουμε με την Κάθε και τον χρησιμοποιούμε στην Ενώ {}.

Μια τελευταία ρουτίνα είναι η δυαδική αναζήτηση, η οποία επιστρέφει 0 αν δεν βρει κάτι ή την θέση του στοιχείου >0 αν το βρει!

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

Έκδοση 2η
Σε αυτήν την έκδοση μπήκε η αλλαγή διακόπτη για τις συγκρίσεις. Δες Βοήθεια Διακόπτες
Επιπλέον επειδή κατά την εκχώρηση τιμής σε ακέραιο γίνεται μετατροπή σε ακέραιο, βάσει της μισής μονάδας, και επειδή το μ1%/2 είναι ίδιο με το μ1%=μ1%/2 συμβαίνει να έχουμε διαίρεση πραγματικών και μετά το 0.5 να δίνει +1, δηλαδή για μ1%=1 το μ1%/=2 κάνει το μ1%=1. Αυτό το θέλουμε μεν αλλά σε πιο μεγάλα νούμερα θέλουμε η δυαδική αναζήτηση να δουλεύει με ακέραια διαίρεση. Έτσι αναγκαστικά πάμε στο μ1%=μ1% δια 2 και κοιτάμε αν το μ1%=0 οπότε το κάνουμε 1. Αυτός ο υπολογισμός μπήκε σε μια δικιά του ρουτίνα, και καλείται μέσα από την ρουτίνα Δυαδική_αναζήτηση().

Φόρμα 80,50
\\ Γράφουμε  τις συναρτήσεις πριν τις χρησιμοποιήσουμε
\\ ενώ οι ρουτίνες γράφονται στο τέλος
Θέσε Διακόπτες "+txt"
\\ τώρα οι συγκρίσεις γίνονται βάσει σειράς χαρακτήρων
\\ και όχι βάσει αριθμού χαρακτήρα
\\ Έτσι η Κέρκυρα ακολουθεί την Καστοριά,
\\ ενώ με "-txt" γίνεται το ανάποδο, επειδή το χαρκωδ("έ")<χαρκωδ("α")
Συνάρτηση ΥπάρχειΣτηΔομή (εδώ, τι$) {
      τοπικές κοιτα$, οκ
      {
            Αν μήκος(εδώ)=0 τότε Έξοδος
            κοιτα$=Πίνακας$(εδω,1)
            δώσε_πίσω=εδώ
            Επίλεξε με Σύγκρινε(τι$, κοιτα$)
            Με 0
                  οκ=αληθές
            Με -1
                  εδω=Πίνακας(εδω,0)
            Με 1
                  εδω=Πίνακας(εδω,2)
            Τέλος Επίλογής
            Αν οκ Τότε εξοδος
            Κυκλικα
      }
      =οκ
}
\\ εδώ η συντάρτηση Δείκτες έχει δική της ρουτίνα
\\ η οποία βάζει στο σωρό της συνάρτησης (κάθε φορά στο τέλος)
\\ τον δείκτη σε πίνακα όπως διατρέχει τη δομή
\\ μετά γυρνάμε από το σωρό του δείκτες σε πίνακα, και τον εξάγουμε.
Συνάρτηση Δείκτες (εδώ) {
      Αδειασε
      Δείκτες_σε_Όλα(εδώ)
      Πίνακας Βάση 1, Δ(Μέγεθος.Σωρού)
      χ=1
      Ενώ Όχι Κενό {
            Διάβασε Δ(χ)
            χ++
      }
      =Δ()
      Ρουτίνα Δείκτες_σε_Όλα(εδώ)
            Αν μήκος(εδώ)=0 τότε Έξοδος Ρουτίνας
            Δείκτες_σε_Όλα(Πίνακας(εδώ,0))
            Σειρά εδώ
            Δείκτες_σε_Όλα(Πίνακας(εδώ,2))
      Τέλος Ρουτίνας
}
Όριο.Αναδρομής 50000
δομή_δένδρου=(,)
Τύπωσε Τύπος$(δομή_δένδρου)
Βάλε_Ένα(δομή_δένδρου,"Πρέβεζα")
Βάλε_Ένα(δομή_δένδρου,"Αθήνα")
Βάλε_Ένα(δομή_δένδρου,"Κέρκυρα")
Βάλε_Ένα(δομή_δένδρου,"Πάργα")
Βάλε_Ένα(δομή_δένδρου,"Καστοριά")
Βάλε_Ένα(δομή_δένδρου,"Χαλκίδα")
Βάλε_Ένα(δομή_δένδρου,"Χανιά")
Βάλε_Ένα(δομή_δένδρου,"Πάτρα")
Βάλε_Ένα(δομή_δένδρου,"Βόλος")
Τύπωσε_Όλα(δομή_δένδρου)
Τύπωσε "........Αλλιώς.........."
Τύπωσε_Όλα_Αλλιώς(δομή_δένδρου)
Χ=Ψευδής
Αν ΥπάρχειΣτηΔομή(δομή_δένδρου,"Πάργα") Τότε Τύπωσε "Ναι υπάρχει η Πάργα"
Αν ΥπάρχειΣτηΔομή(δομή_δένδρου,"Αγρίνιο") Τότε Τύπωσε "Ναι υπάρχει  το Αγρίνιο"
κατι$="Αθήνα"
Αν ΥπάρχειΣτηΔομή(δομή_δένδρου,κατι$) Τότε {
       Τύπωσε "Ναι υπάρχει πόλη:";κατι$
}

Μ=Δείκτες(δομή_δένδρου)
Ν=Κάθε(Μ)
Κάνε Πολη$(Μ)=Πίνακας$(Πίνακας(Μ),1)
ΠοληΑΑ$=λαμδα$ Μ (χ)->Πίνακας$(Πίνακας(Μ, χ),1)

Ενώ Ν {
      Τύπωσε Πόλη$(Ν)
}
Τύπωσε "**************************"
Τύπωσε "Νο 3:";ΠόληΑΑ$(3) '' Νο 3
Τύπωσε "**************************"
Ν=Κάθε(Μ, -1, 1)

Ενώ Ν {
      Τύπωσε Πόλη$(Ν)
}
εκει=0
\\ αν προσθέσουμε ένα στοιχείο δεν αλλάζει τους δείκτες στα πίνακα δεικτών
Βάλε_Ένα(δομή_δένδρου,"Ιωάννινα")

Δυαδική_Αναζήτηση( Μήκος(Μ), "Πάτρα", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Δυαδική_Αναζήτηση( Μήκος(Μ), "Χανιά", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Δυαδική_Αναζήτηση( Μήκος(Μ), "Αθήνα", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Δυαδική_Αναζήτηση( Μήκος(Μ), "Κέρκυρα", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)

\\ τώρα φτιάχνουμε πάλι τους δείκτες
Μ=Δείκτες(δομή_δένδρου)
\\ πρέπει να φτιάξουμε και την λάμδα για να πάρει το νέο "κλείσιμο" του Μ
ΠοληΑΑ$=λαμδα$ Μ (χ)->Πίνακας$(Πίνακας(Μ, χ),1)
\\ μπορούμε να καλούμε μια ρουτίνα για να μειώσουμε το κώδικα!
\\ οι ρουτίνες βλέπουν ότι και το τμήμα/συνάρτηση που περιέχονται
\\ αλλά αν θέλουμε μπορούμε να έχουμε τοπικές μεταβλητές.
ΔεςΑυτό("Πάτρα")
ΔεςΑυτό("Χανιά")
ΔεςΑυτό("Αθήνα")
ΔεςΑυτό("Κέρκυρα")
\\ Τα Ιωάννινα μπήκαν στην 3 θέση
ΔεςΑυτό("Ιωάννινα")
Ν=Κάθε(Μ)
Ενώ Ν {
    ΔεςΑυτό(Πόλη$(Ν))
}
Τέλος
Ρουτίνα Νέομ1()
      μ1%=μ1% δια 2
      Αν μ1%=0 τότε μ1%=1
Τέλος Ρουτίνας
Ρουτίνα Δυαδική_Αναζήτηση(πόσα, τι$, &που)
      Διάβασε Νεο Πόλ$
      που=0
      τοπικες μ, μ1%, μ2%
      μ1%=πόσα/2
      μ+=μ1%
      Νέομ1()
      {
           δες$=Πολ$(μ)
            Σημ 1 : Τύπωσε δες$, τι$, μ, μ1%
            Επιλεξε Με Τάξη(δες$, τι$)
            Με 0
                  που=μ
            Με -1
                  μ+=μ1%
            Με 1
                  μ-=μ1%
            Τέλος Επιλογής
            Νέομ1()
            αν που=μ τότε έξοδος
            αν μ<1 ή μ>πόσα τότε έξοδος
            κυκλικα
      }
Τέλος Ρουτίνας
Ρουτίνα Βάλε_Ένα(εδώ, τι$)
      Αν μήκος(εδώ)=0 τότε Προσθήκη εδώ, ((,),τι$,(,)) : Έξοδος Ρουτίνας
      Αν τι$<Πίνακας$(εδώ,1) Τότε Βάλε_Ένα( Πίνακας(εδώ,0), τι$) : Έξοδος Ρουτίνας
      Βάλε_Ένα(Πίνακας(εδώ,2), τι$)
Τέλος Ρουτίνας
Ρουτίνα Τύπωσε_Όλα(εδώ)
      Αν μήκος(εδώ)=0 τότε Έξοδος Ρουτίνας
      Τύπωσε_Όλα(Πίνακας(εδώ,0))
      Τύπωσε Πίνακας$(εδώ,1)
      Τύπωσε_Όλα(Πίνακας(εδώ,2))
Τέλος Ρουτίνας
Ρουτίνα Τύπωσε_Όλα_Αλλιώς(εδώ)
      Αν μήκος(εδώ)=0 τότε Έξοδος Ρουτίνας
      Τύπωσε_Όλα_Αλλιώς(Πίνακας(εδώ,2))
      Τύπωσε Πίνακας$(εδώ,1)
      Τύπωσε_Όλα_Αλλιώς(Πίνακας(εδώ,0))
Τέλος Ρουτίνας
Ρουτίνα ΔεςΑυτό(Πολη$)
Δυαδική_Αναζήτηση( Μήκος(Μ), Πόλη$, &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Τέλος Ρουτίνας

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

Φόρμα 80,50
\\ Γράφουμε  τις συναρτήσεις πριν τις χρησιμοποιήσουμε
\\ ενώ οι ρουτίνες γράφονται στο τέλος
Συνάρτηση ΥπάρχειΣτηΔομή (εδώ, τι$) {
      τοπικές κοιτα$, οκ
      {
            Αν μήκος(εδώ)=0 τότε Έξοδος
            κοιτα$=Πίνακας$(εδω,1)
            δώσε_πίσω=εδώ
            Επίλεξε με Τάξη(τι$, κοιτα$)
            Με 0
                  οκ=αληθές
            Με -1
                  εδω=Πίνακας(εδω,0)
            Με 1
                  εδω=Πίνακας(εδω,2)
            Τέλος Επίλογής
            Αν οκ Τότε εξοδος
            Κυκλικα
      }
      =οκ
}
\\ εδώ η συντάρτηση Δείκτες έχει δική της ρουτίνα
\\ η οποία βάζει στο σωρό της συνάρτησης (κάθε φορά στο τέλος)
\\ τον δείκτη σε πίνακα όπως διατρέχει τη δομή
\\ μετά γυρνάμε από το σωρό του δείκτες σε πίνακα, και τον εξάγουμε.
Συνάρτηση Δείκτες (εδώ) {
      Αδειασε
      Δείκτες_σε_Όλα(εδώ)
      Πίνακας Βάση 1, Δ(Μέγεθος.Σωρού)
      χ=1
      Ενώ Όχι Κενό {
            Διάβασε Δ(χ)
            χ++
      }
      =Δ()
      Ρουτίνα Δείκτες_σε_Όλα(εδώ)
            Αν μήκος(εδώ)=0 τότε Έξοδος Ρουτίνας
            Δείκτες_σε_Όλα(Πίνακας(εδώ,0))
            Σειρά εδώ
            Δείκτες_σε_Όλα(Πίνακας(εδώ,2))
      Τέλος Ρουτίνας
}
Όριο.Αναδρομής 50000
δομή_δένδρου=(,)
Τύπωσε Τύπος$(δομή_δένδρου)
Βάλε_Ένα(δομή_δένδρου,"Πρέβεζα")
Βάλε_Ένα(δομή_δένδρου,"Αθήνα")
Βάλε_Ένα(δομή_δένδρου,"Κέρκυρα")
Βάλε_Ένα(δομή_δένδρου,"Άρτα")
Βάλε_Ένα(δομή_δένδρου,"Καβάλα")
Βάλε_Ένα(δομή_δένδρου,"Πάργα 20")
Βάλε_Ένα(δομή_δένδρου,"Πάργα 100")
Βάλε_Ένα(δομή_δένδρου,"Καστοριά")
Βάλε_Ένα(δομή_δένδρου,"Χανιά")
Βάλε_Ένα(δομή_δένδρου,"Πάτρα")
Βάλε_Ένα(δομή_δένδρου,"Βόλος")
Τύπωσε_Όλα(δομή_δένδρου)
Τύπωσε "........Αλλιώς.........."
Τύπωσε_Όλα_Αλλιώς(δομή_δένδρου)

Χ=Ψευδής
Αν ΥπάρχειΣτηΔομή(δομή_δένδρου,"Πάργα 20") Τότε Τύπωσε "Ναι υπάρχει η Πάργα 20"
Αν ΥπάρχειΣτηΔομή(δομή_δένδρου,"Αγρίνιο") Τότε Τύπωσε "Ναι υπάρχει  το Αγρίνιο"
κατι$="Αθήνα"
Αν ΥπάρχειΣτηΔομή(δομή_δένδρου,κατι$) Τότε {
       Τύπωσε "Ναι υπάρχει πόλη:";κατι$
}
Μ=Δείκτες(δομή_δένδρου)
Ν=Κάθε(Μ)
Κάνε Πολη$(Μ)=Πίνακας$(Πίνακας(Μ),1)
ΠοληΑΑ$=λαμδα$ Μ (χ)->Πίνακας$(Πίνακας(Μ, χ),1)
Τύπωσε "**************************"
Τύπωσε "Νο 3:";ΠόληΑΑ$(3) '' Νο 3
Τύπωσε "**************************"
Ν=Κάθε(Μ, -1, 1)

Ενώ Ν {
      Τύπωσε Πόλη$(Ν)
}

εκει=0
\\ αν προσθέσουμε ένα στοιχείο δεν αλλάζει τους δείκτες στα πίνακα δεικτών
Βάλε_Ένα(δομή_δένδρου,"Ιωάννινα")
Μ=Δείκτες(δομή_δένδρου)
ΠοληΑΑ$=λαμδα$ Μ (χ)->Πίνακας$(Πίνακας(Μ, χ),1)
Ν=Κάθε(Μ)
Ενώ Ν {
      'Τύπωσε Πόλη$(Ν)
      Τύπωσε ΠόληΑΑ$(Ν^+1)
}
Δυαδική_Αναζήτηση( Μήκος(Μ), "Πάτρα", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Δυαδική_Αναζήτηση( Μήκος(Μ), "Χανιά", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Δυαδική_Αναζήτηση( Μήκος(Μ), "Αθήνα", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Δυαδική_Αναζήτηση( Μήκος(Μ), "Κέρκυρα", &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
\\ τώρα φτιάχνουμε πάλι τους δείκτες
Μ=Δείκτες(δομή_δένδρου)
\\ πρέπει να φτιάξουμε και την λάμδα για να πάρει το νέο "κλείσιμο" του Μ
ΠοληΑΑ$=λαμδα$ Μ (χ)->Πίνακας$(Πίνακας(Μ, χ),1)
\\ μπορούμε να καλούμε μια ρουτίνα για να μειώσουμε το κώδικα!
\\ οι ρουτίνες βλέπουν ότι και το τμήμα/συνάρτηση που περιέχονται
\\ αλλά αν θέλουμε μπορούμε να έχουμε τοπικές μεταβλητές.
ΔεςΑυτό("Πάτρα")
ΔεςΑυτό("Χανιά")
ΔεςΑυτό("Αθήνα")
ΔεςΑυτό("Κέρκυρα")
\\ Τα Ιωάννινα μπήκαν στην 3 θέση
ΔεςΑυτό("Ιωάννινα")
Ν=Κάθε(Μ)
Ενώ Ν {
    ΔεςΑυτό(Πόλη$(Ν))
}
Τέλος
Ρουτίνα Δυαδική_Αναζήτηση(πόσα, τι$, &που)
      Διάβασε Νεο Πόλ$
      που=0
      τοπικες μ, μ1%, μ2%
      μ1%=πόσα/2 ' βάζει συν 1 αν τα ποσά είναι σε μονό αριθμό
      μ+=μ1%
      μ1%/=2
      {
           δες$=Πολ$(μ)
            Σημ 1 : Τύπωσε δες$, τι$, μ, μ1%
            Επιλεξε Με Τάξη(δες$, τι$)
            Με 0
                  που=μ
            Με -1
                  μ+=μ1%
            Με 1
                  μ-=μ1%
            Τέλος Επιλογής
            μ1%=Αν(μ1%<2 -> 1, μ1% δια 2)
            αν που=μ τότε έξοδος
            αν μ<1 ή μ>πόσα τότε έξοδος
            κυκλικα
      }
Τέλος Ρουτίνας
Ρουτίνα Βάλε_Ένα(εδώ, τι$)
      Αν μήκος(εδώ)=0 τότε Προσθήκη εδώ, ((,),τι$,(,)) : Έξοδος Ρουτίνας
      Αν Τάξη(τι$, Πίνακας$(εδώ,1)) =-1Τότε Βάλε_Ένα( Πίνακας(εδώ,0), τι$) : Έξοδος Ρουτίνας
      Βάλε_Ένα(Πίνακας(εδώ,2), τι$)
Τέλος Ρουτίνας
Ρουτίνα Τύπωσε_Όλα(εδώ)
      Αν μήκος(εδώ)=0 τότε Έξοδος Ρουτίνας
      Τύπωσε_Όλα(Πίνακας(εδώ,0))
      Τύπωσε Πίνακας$(εδώ,1)
      Τύπωσε_Όλα(Πίνακας(εδώ,2))
Τέλος Ρουτίνας
Ρουτίνα Τύπωσε_Όλα_Αλλιώς(εδώ)
      Αν μήκος(εδώ)=0 τότε Έξοδος Ρουτίνας
      Τύπωσε_Όλα_Αλλιώς(Πίνακας(εδώ,2))
      Τύπωσε Πίνακας$(εδώ,1)
      Τύπωσε_Όλα_Αλλιώς(Πίνακας(εδώ,0))
Τέλος Ρουτίνας
Ρουτίνα ΔεςΑυτό(Πολη$)
Δυαδική_Αναζήτηση( Μήκος(Μ), Πόλη$, &εκει, ΠόληΑΑ$ )
Αν εκεί>0 τότε Τύπωσε "Θέση ";εκεί, " Όνομα:";ΠόληΑΑ$(εκεί)
Τέλος Ρουτίνας


Προσθήκη:

Στην Μ2000 δεν χρειάζεται να φτιάχνουμε δένδρα! Υπάρχει η δομή Κατάσταση που δέχεται μοναδικά κλειδιά (υπάρχει και η Κατάσταση Ουρά, που δέχεται όμοια κλειδιά).

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

Η αναζήτηση στην δομή γίνεται σε σταθερό χρόνο Ο(1), επειδή βρίσκει άμεσα τη θέση, με πίνακα κατακερματισμού (hash table). (ουσιαστικά ο χρόνος έχει μόνο σχέση με το μήκος του κλειδιού). Αν έχουμε αριθμό ως κλειδί, εσωτερικά θα είναι αλφαριθμητικό. Στη ταξινόμηση αν θέλουμε ζητάμε να γίνει με το κλειδί ως αριθμός οπότε το "10" θα είναι μεγαλύτερο του "3", Τιμή("10")>Τιμή("3"), ενώ αν ήταν ως αλφαριθμητικό το "3">"10".
Με χρήση της Υπάρχει(δείκτης προς κατάσταση, κλειδί - αριθμός ή αλφαριθμητικό) αν βρεθεί το κλειδί ένα εσωτερικό πεδίο γυρίζει σε αυτό που βρέθηκε οπότε τα Εκφρ$(δομή_κατάσταση), Εκφρ( δομή_κατάσταση !) δουλεύουν βάσει αυτού (δεν χρειάζεται να δώσουμε ξανά το κλειδί).

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



\\ Χρήση της κατάσταση ειδών
Κατάσταση δομή_κατάσταση

Βάλε_Ένα(δομή_κατάσταση,"Πρέβεζα")
Βάλε_Ένα(δομή_κατάσταση,"Αθήνα")
Βάλε_Ένα(δομή_κατάσταση,"Κέρκυρα")
Βάλε_Ένα(δομή_κατάσταση,"Πάργα")
Βάλε_Ένα(δομή_κατάσταση,"Καστοριά")
Βάλε_Ένα(δομή_κατάσταση,"Χανιά")
Βάλε_Ένα(δομή_κατάσταση,"Πάτρα")
Βάλε_Ένα(δομή_κατάσταση,"Βόλος")
Ταξινόμηση Αύξουσα δομή_κατάσταση ως Κείμενο
Τύπωσε δομή_κατάσταση
κ=Κάθε(δομή_κατάσταση)
Ενώ κ {
      Τύπωσε κ^, δομή_κατάσταση$(), δομή_κατάσταση$(κ^!)
}
κ=Κάθε(δομή_κατάσταση, -1, 1)
Ενώ κ {
      Τύπωσε κ^, δομή_κατάσταση$(), δομή_κατάσταση$(κ^!)
}

Αν Υπάρχει(δομή_κατάσταση,"Πάργα" ) Τότε {
      Τύπωσε Εκφρ$(δομή_κατάσταση), Εκφρ( δομή_κατάσταση !) \\ Πάρεγα, 4
      ν=Εκφρ( δομή_κατάσταση !)
      \\ το ν είναι αριθμός σειράς , εδώ ζητάμε βάσε αριθμού σειράς
      \\ οι αριθμοι μπορούν να αλλάξουν αν διαγράψουμε κάτι, ή αν κάνουμε ταξινόμηση.
      Τύπωσε δομή_κατάσταση$(ν!)
}

Ρουτίνα Βάλε_Ένα(Εκεί, Τι$)
Αν δεν υπάρχει(Εκεί, Τι$) Τοτε Προσθήκη Εκεί, Τι$
Τελος Ρουτίνας