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

Προχωρημένες Ταξινομήσεις και άλλα θέματα!

Το παρακάτω μπορεί να προσαρμοστεί (να αφαιρεθούν στοιχεία)
Είναι ένα παράδειγμα σχετικών ζητημάτων με κεντρική ιδέα την ταξινόμηση ονομάτων σε σωρό τιμών. Μάλιστα για να το κάνουμε πιο ωραίο, κάνουμε συγκρίσεις σε κεφαλαία για να ταξινομήσουμε τα ονόματα ανεξάρτητα αν έχουν τόνους ή όχι. Επίσης δείχνω δυο ενδιαφέροντα θέματα. Ένα είναι το πως περνάω στη συνάρτηση ταξινόμησης τη συνάρτηση σύγκρισης, και έτσι πετυχαίνω να έχω αύξουσα ή φθίνουσα ταξινόμηση (το σωστότερο βέβαια θα ήταν να είχα δυο φορές τον κώδικα, για να αποφεύγω μια παράμετρο επιπλέον).
Το άλλο ζήτημα έχει να κάνει με το πως μια ρουτίνα που δεν μπορεί να τρέξει σε άλλο τμήμα μπορώ να την "πακετάρω" και να την στείλω σε ένα τμήμα ενός αντικειμένου και να τρέξει σαν να έτρεχε στο "σπίτι" της. Δηλαδή θέλω να ταξινομήσω το σωρό ενός τμήματος σε ένα αντικείμενο (ο σωρός έχει προσωρινή χρήση, θα διαγραφεί όταν τερματίσει το τμήμα). Για να το κάνω αυτό πρέπει ή να έχω κάτι γενικό (δεν το ονομάζω εδώ, για να μην μπερδευτεί και άλλο η κατάσταση) ή να κάνω όπως στο πρόγραμμα, να στείλω ένα τμήμα του κώδικα του τμήματος να τρέξει στο επιθυμητό τμήμα. Η συνάρτηση Οκν$() έχει δυο χρήσεις, μια να μετατρέπει μια ψεύτικη συνάρτηση (ψεύτικη γιατί αν την καλέσουμε αλλιώς θα βγει λάθος, αφού τα ονόματα μέσα είναι γνωστά στο τμήμα και όχι στη συνάρτηση, το όνομά της δεν θα χρησιμοποιηθεί, όταν θα τρέξει θα έχει το όνομα του τμήματος).
Η άλλη είναι να μπορούμε να στέλνουμε διαφορετική συνάρτηση σε τμήματα και να παίρνουμε αποτελέσματα, δηλαδή να έχουμε κάτι παραπάνω από ένα πέρασμα με αναφορά!
Και οι δύο θα φανούν στο παράδειγμα:

\\ Παράδειγμα 1ο
Β=5
Πίνακας Α(20)=1
Α(1+Β)=1200
\\ αποθηκεύουμε μια συνάρτηση σε ένα αλφαριθμητικό
α$=οκν$(Α(1+Β))
Τύπωσε "Μέρος 1ο"
Τυπωσε Συνάρτηση(α$)
Ενωσε ισχνή α$ στη Σ()
Β=3
Α(1+Β)=1100


Τύπωσε Σ()
\\ Παράδειγμα 2ο
Τμήμα ΑΛΦΑ {
      Διάβασε &ΑΑ()
      \\ το ΑΑ() είναι συνάρτηση και όχι πίνακας
      Για ι=1 έως 5 {
            Τύπωσε ΑΑ(ι)
      }
}
Τύπωσε "Μέρος 2ο"
Γ=1000
Α(5)=20
\\ η Αριθμός διαβάζει από το σωρό
Αλφα οκν$(Α(Αριθμός)*Γ)
\\ Αν θέλουμε μπορούμε να μεταβιβάσουμε συνάρτηση περισσότερων γραμμών
Σούμα=0
Πίνακας Καταγραφή()
Μετρητής=0
Συνάρτηση Ψεύτικη {
      Διάβασε Νέο Μ ' για να μην μπλέξει με υπάρχουσα Μ του τμήματος
      Σούμα++
      Πίνακας Καταγραφή(Μετρητής+1)
      Βάλε Α(Μ)*Γ
      Πάνω  \\ διπλασιάζω την κορυφή
      Διάβασε Καταγραφή(Μετρητής)
      Μετρητής++
      =Αριθμός \\ τώρα δίνω το αντίγραφο
}
Τύπωσε "Μέρος 3ο - εμφάνιση μέσα στη Άλφα"
Αλφα οκν$(&Ψεύτικη())
Τύπωσε "Μέρος 3ο - διάβασμα μετά την έξοδο από την Άλφα"
Για ι=0 έως Μετρητής-1 {
      Τύπωσε Καταγραφή(ι)
}



Και εδώ είναι η Προχωρημένη Ταξινόμηση:

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


\\ Παραδείγματα με το σωρό!
Διάβασε Α1, Α2, Α3
Τύπωσε Α1, Α2, Α3 ' 3 2 1  διάβασμα LIFO
Τύπωσε Κενό ' είναι άδειος ο σωρός


Σειρά 1,2,3
Διάβασε Α1, Α2, Α3
Τύπωσε Α1, Α2, Α3 ' 1 2 3  διάβασμα FIFO, το πρώτο που θα μπει θα διαβαστεί
Τύπωσε Κενό ' είναι άδειος ο σωρός


Βάλε 2 : Σειρά 3 : Βάλε 1
Διάβασε Α1, Α2, Α3
Τύπωσε Α1, Α2, Α3 ' 1,2,3  
\\ Μετακίνηση στοιχείων
\\ δεν μπορούμε να σηκώνουμε κάτι από οπουδήποτε, μόνο από την κορυφή ή θέση 1
\\ μπορούμε να μετακινήσουμε όμως
Σειρά Α1, Α2, Α3
Φέρε 3 ' πάει το 3 στη κορυφή άρα 3,1,2
Φέρε 3 ' πάει το 2 στη κορυφή άρα 2,3,1
ΦέρεΠίσω 2 ' πάει τη κορυφή στο 2 άρα 3,2,1
Σωρός
Άδειασε  \\ αδειάζει το σωρό
\\ Αντιγραφή στοιχείων
Σειρά 1,2,3
Πάνω 2 ' βγάζει αντίγραφο του στοιχείου 2 στη κορυφή  2,1,2,3
Πάνω 2 ' ομοίως  άρα 1,2,1,2,3
Άδειασε  \\ αδειάζει το σωρό
\\ παράδειγμα αντιγραφή Ν στοιχείων κάποιες φορές στη κορυφή
Σειρά "αλφα",1,2,3
Ν=4
φορές=5
Για ι=1 Εώς Ν*φορές : Πάνω Ν : Επόμενο ι
Σωρος
Πέτα Ν*Φορές-1 \\ πετάει Ν*Φορές στοιχεία
Τύπωσε Κενό \\ δίνει 0.. όχι αληθές δηλαδή
Βάλε 1
Τύπωσε Μέγεθος.Σωρού, ΤιμήΣωρού(1), ΣωρούΤύπος$(1) \\ Number
Βάλε "οκ"
Πίνακας Α(10)=3
Βάλε Α()
Συνάρτηση Οκνηρή {
            Ταξινόμηση_Λέξεων(1,Μέγεθος.Σωρού, &Αύξουσα())
}
Ομάδα Αλφα {
      α1=1, α2=3
      Τμήμα ΚάνεΚάτι {.α1++ : .α2+=10}
      Τμήμα ΠάρεΤιμές { Διάβασε .α1, .α2 }
      Συνάρτηση Σούμα {=.α1+.α2}
      Τμήμα Τελευταίο {
            Διάβασε &Ταξινόμησε()
            Σωρός Νέος {
                  Σειρά "Ζ","Χ","Β","Α"
                  Κάλεσε Ταξινόμησε()
                  Σωρός
            }
      }
}
Βάλε Αλφα
Τύπωσε Ταύτιση("ΟΠΓΑ") \\ Α για αριθμό, Γ για γράμματα, Π για πίνακα, Ο για ομάδα
Πάνω 1 \\ διπλασιάζει την ομάδα
\\ Εργασίες με ομάδες (αντικείμενα της Μ2000)
Διάβασε Βήτα, Γάμμα
Βήτα.ΚάνεΚάτι
Τύπωσε Βήτα.Σούμα(), Γάμμα.Σούμα()
Γάμμα=Βήτα
Τύπωσε Βήτα.Σούμα(), Γάμμα.Σούμα()
Βήτα.ΚάνεΚάτι
Τύπωσε Βήτα.Σούμα(), Γάμμα.Σούμα()
Βήτα.Τελευταίο Οκν$(&Οκνηρη())
Τέλος ' η εντολή σε τμήμα κάνει έξοδο, προσοχή το Θέσε Τέλος τερματίζει το περιβάλλον
Ρουτίνα Ταξινόμηση_Λέξεων(αρχικό, τελικό, &κοιτα())
      Τοπικές πράγμα$, κεφ_π$, ι=αρχικό, όριο=τελικό+1
      Αν όριο >2 Τότε Φέρε (όριο+ι) Δια 2
      Διάβασε πράγμα$
      όριο--
      κεφ_π$=κεφ$(πράγμα$)
      Ενώ ι<όριο {
            Αν κοίτα(κεφ_π$,κεφ$(ΤιμήΣωρού$(ι))) Τότε {
                  όριο--
                  Αν ι>1 Τότε Φέρε ι
                  ΦέρεΠίσω όριο
            }  Αλλιώς ι++
      }
      Αν ι>όριο Τότε ι=όριο
      Βάλε πράγμα$ : ΦέρεΠίσω ι
      Αν ι>αρχικό Τότε Ταξινόμηση_Λέξεων(αρχικό,ι-1, &κοιτα())
      Αν τελικό>ι Τότε Ταξινόμηση_Λέξεων(ι,τελικό, &κοιτα())
Τέλος Ρουτίνας


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

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



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

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

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