ΑΕΠΠ-ΓΛΩΣΣΑ


Εδώ υπάρχουν προχωρημένα προγράμματα σε ΓΛΩΣΣΑ (τρέχουν στον διερμηνευτή της ΓΛΩΣΣΑΣ) 
Προγράμματα σε ΑΕΠΠ  (κάνε κλικ στο σύνδεσμο)

Προσθήκη της λύσης μου για ένα πρόγραμμα αδόμητου προγραμματισμού σε δομημένο με επεξηγήσεις. Αναδημοσίευση από εδώ
Στις Πανελλήνιες 2018 θέμα Β2, έπρεπε το αδόμητο πρόγραμμα να γίνει δομημένο, και έδινε πολλές μονάδες (10).
Ας πούμε ότι αυτά ήταν τα βήματα και οι απαιτούμενες εντολές (το αντιγράφω όπως το πήρα από το θέμα εδώ https://alkisg.mysch.gr/steki/index.php?topic=7452.0)

Β1: (Ε1): Διάβασε Σ
Β2: (Ε2): Διάβασε Α
Β3: (Ε3): Αν Α = 0, τότε πήγαινε στο Β6 (Ε3#1), αλλιώς πήγαινε στο Β4 (Ε3#2)
Β4: (Ε4): Σ <- Σ + Α
Β5: (Ε5): Πήγαινε στο Β2
Β6: (Ε6): Εμφάνισε Σ



Η λύση είναι αυτή (κατά τη γνώμη μου κακώς θεωρήθηκε πιο σωστή με τη χρήση της ΟΣΟ, και κακώς έκοψαν δυο μονάδες από τη κόρη του Alkisg)

Β1: Διαβασε Σ  (Ε1)
Επανέλαβε
Β2: Διαβασε Α   (Ε2)
Β3: Αν Α=0 Τότε (Ε3#2)
Αλλιώς
Β4: Σ <- Σ + Α   (Ε4)
Τέλος_Αν
Β5:Μέχρις_Ότου Α=0 (Ε3#1 και Ε5)
Β6:Εμφάνισε Σ (Ε6)

Όλο το "κόλπο" είναι στο βήμα 5. Διότι το 5 στον αδόμητο έχει ένα GOTO ενώ στο δομημένο πρέπει να είναι μέρος δομής επανάληψης. Εδώ όντως είναι δομή επανάληψης. Ποια όμως είναι η δομή; Η δομή ξεκινάει από το Β2 και γυρνάει στο Β5.  Στο Ε3 υπάρχουν δυο κλάδοι, ο Ε3#1 και ο Ε3#2. Ο Ε3#2 υλοποιείται χωρίς να βάλουμε το Όχι με χρήση της Αλλιώς. Απλά δεν βάζουμε κάτι μεταξύ του Τότε και του Αλλιώς.

Η Β5 παίζει το ρόλο της Ε3#1, Υποχρεωτικά όπως και η Ε3#2 θα έχει τον έλεγχο της συνθήκης, διότι δεν έχουμε GOTO (χωρίς συνθήκη άλμα).  Και πράγματι τον έχει με την Μέχρις_Ότου Α=0. Έτσι για να παίξει η εντολή Ε3#1 ξεκινάμε από το Β3 ελέγχουμε την Α=0 και αν την βρούμε τότε ελέγχουμε πάλι στο Β5 αν το Α=0 και πάμε στην Β6. Αυτός ο διπλός έλεγχος είναι απαραίτητος όταν δεν υπάρχει η GOTO. Διότι όταν το Α είναι διάφορο του 0 τότε ο πρώτος έλεγχος θα μας πάει στο Σ<-Σ+Α και ο δεύτερος θα μας επαναφέρει στο επόμενο Διάβασε Α (θα κάνει το GOTO), δηλαδή το B5 θα γίνει το Ε5.

Άρα τα βήματα Β1 μέχρι Β6 είναι όπως πρέπει, και οι εντολές Ε1 μέχρι Ε6 είναι στην ίδια σειρά. Η διαφορά είναι ότι στο Β5 έχουμε μια εντολή που παίζει ρόλο για Ε3#1 και Ε#5.

Τα Επανέλαβε/Αλλιώς/Τέλος_Αν δεν είναι από μόνες τους Εντολές. Δεν είναι βήματα, είναι μέρη δομών, και για το λόγο αυτό δεν τα βάζω με νούμερα για βήματα. Επίσης επειδή το Ε3 έχει διπλή "υπόσταση", αναγκαστικά παίρνει σε κάθε περίπτωση και τον έλεγχο της συνθήκης.





Παρακάτω θα προσθέσω το πως μπορεί η Μ2000 να υποστηρίξει το βιβλίο, στη θέση της ΓΛΩΣΣΑΣ.

(Με τα αντικείμενα που έχει η Μ2000 μπορεί να στηρίξει το μάθημα στον αντικειμενοστραφή προγραμματισμό, εκεί που η ΓΛΩΣΣΑ και ο διερμηνευτής της δεν μπορούν να λειτουργήσουν, για τα αντικείμενα δείτε το δωρεάν βιβλίο: Αντικειμενοστραφής Προγραμματισμός στη Μ2000).

\\ Εύρεση 3+6+9+..+999
α=999
β=3
κ=0

Τύπωσε "Με επανάληψη"
Για ι=3 Έως 999 Ανά 3
      κ+=ι
Επόμενο
Τύπωσε κ

Τύπωσε "Χωρίς επανάληψη"  ' 999/3=333 ... 333*334/2*3
Τύπωσε α*(α/β+1)/2=κ ' Αληθής



Πολλαπλασιασμός αλά Ρωσικά με ολισθήσεις, χρήση του δυαδικού και για εύρεση μονού, και δυαδικής πρόσθεσης (χωρίς υπερχείλιση, γίνεται αποκοπή των 32bit)

Εμφανίζει ενδιάμεσα μερικά αποτελέσματα σε δεκαεξαδικό. Κάνει χρήση προσήμων.

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

\\ Πολλαπλασιασμός αλά Ρωσικά
α=Τυχαίος(-100,90)
β=Τυχαίος(-35,40)
Τύπωσε α*β
γ=0
σ=Σημ(α)*Σημ(β)
Αν σ<>0 Τότε
      α=Απολ(α)
      β=Απολ(β)
      Επαναλαβε
           Δεκαεξ α, β,
            Αν ΔΥΑΔΙΚΟ.ΚΑΙ(β,1)=1 Τότε γ=ΔΥΑΔΙΚΟ.ΠΡΟΣΘΕΣΗ(γ,α) : Δεκαεξ α Αλλιως Τύπωσε
            α= ΔΥΑΔΙΚΟ.ΟΛΙΣΘΗΣΗ(α,1) \\  <<
            β= ΔΥΑΔΙΚΟ.ΟΛΙΣΘΗΣΗ(β,-1) \\ >>
      μέχρι β=0
Τέλος Αν
Τύπωσε "Αποτέλεσμα:";γ*σ



Η Μ2000 έχει μια δομή δεδομένων που ταιριάζει με αυτή του βιβλίου στο κεφάλαιο:
 3.2 | Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα
Όπου αναφέρει τις βασικές λειτουργίες

  • Εισαγωγή
  • Διαγραφή
  • Αναζήτηση
  • Ταξινόμηση
  • Αντιγραφή
  • Συγχώνευση 
  • Διαχωρισμός

Στη Μ2000 μπορούμε να φτιάξουμε τη δομή Σωρός, η οποία είναι μια λίστα στην οποία μπορούμε να προσθέτουμε, να αφαιρούμε και να μετακινούμε εύκολα στοιχεία.
Η αναζήτηση είναι σειριακή  (άρα στη χειρότερη τα διαβάζουμε όλα), αλλά μπορούμε να επιλέξουμε αν θα ψάξουμε από την αρχή ή από το τέλος πχ το κ=κάθε(α, -1, 1) θα κάνει την αναζήτηση να ψάχνει από το τέλος προς την αρχή.

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

Η Βάλε βάζει στη κορυφή, η Σειρά στο τέλος, η Διάβασε παίρνει τη κορυφή και τη βάζει σε μεταβλητή,  η ΤιμήΣωρού() διαβάζει χωρίς να βγάζει, η ΤιμήΣωρού$() διαβάζει αλφαριθμητικά. Η Πέτα πετάει τιμές από το σωρό, πχ Πέτα 5 θα πετάξει 5 από την κορυφή.

Με τη Βάλε έχουμε LIFO ενώ με την Σειρά έχουμε FIFO. Η Άδειασε αδειάζει το σωρό. Η Κενό επιστρέφει Αληθές αν ο σωρός είναι κενός. Μπορούμε στην α να διαβάσουμε το μήκος με την Μήκος(α), όπου αν μας δώσει 0 τότε σημαίνει πως έχουμε άδειο σωρό.

Η Σωρός()  δίνει ένα νέο, από έναν άλλο, ή από πολλούς άλλους σωρούς, ή από έναν αλλά όχι ολόκληρο αλλά μέρος αυτού

Η Τύπωσε α τυπώνει τα στοιχεία του σωρού χωρίς να τα πειράζει. (χρησιμοποιεί εσωτερικό επαναλήπτη και γεμίζει όσες στήλες χρειάζεται). Η Φέρε μετακινεί στην κορυφή και η ΦέρεΠίσω μετακινεί από την κορυφή. Πχ θέλουμε να αλλάξουμε το τέταρτο με το πέμπτο. Φέρε 4 φέρνει το 4ο ως πρώτο και το ΦέρεΠισω 5 κάνει το πρώτο πέμπτη. Μπορούμε να δώσουμε και δεύτερη παράμετρο το πόσα στοιχεία θα μεταφερθούν και με πρόσημο (το - αλλάζει τη φορά των στοιχείων κατά τη μετακίνηση).

Τα αντικείμενα σωρός στη Μ2000 μπορούν να βρίσκονται ως τιμές (με δείκτη) σε οποιοδήποτε αντικείμενο όπως Σωρός, Κατάσταση, Πίνακας. Πχ αν το Α(3) έχει αντικείμενο σωρό τότε το Κ=Α(3) δίνει στο Κ τον ίδιο δείκτη στο Α(3). Τα αντικείμενα αυτά διαγράφονται όταν δεν υπάρχει δείκτης να τα δείχνει! (με τη διαγραφή του τελευταίου δείκτη, έχουν μετρητή εσωτερικά).


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

\\ ταξινόμηση
Σωρος α {
      \\ [] σηκώνει τα στοιχία, το Πίνακας() τα βάζει σε πίνακα, το #Ταξινόμηση() δίνει νέο πίνακα
      \\ το ! βάζει το πίνακα ως στοιχεία πάλι στο σωρό
      Σειρά !Πίνακας([])#Ταξινόμηση()
}
Τύπωσε α
\\ Αντιγραφή όλο
β=Σωρός(α)
Τύπωσε β
Τύπωσε α είναι β ' λάθος
\\ Αντιγραφή τα δυο πρώτα στοιχεία σε νέο
γ=Σωρός(α,2) ' τα δυο πρώτα
Τυπωσε γ
\\ Αντιγραφή τα δυο τελευταία (αλλά αντίστροφα) σε νέο
δ=Σωρός(α,-2) ' τα δυο τελευταία αντιγραφή με αντιστροφή
Σωρός δ {ΦέρεΠίσω 2,2} ' αντιστροφή χωρίς αντιγραφή
Τύπωσε δ
\\ Αντιγραφή δυο σωρών μαζί σε νέο
ζ=Σωρός(γ,δ) ' αντιγραφή σε νέο σωρό των γ και δ
Τύπωσε ζ
\\  Συγχώνευση του δ στο γ
Σωρός γ {
      Σειρά !δ ' στο 4 30 βάζει το 200 1000
}
Τύπωσε γ
Τύπωσε Μήκος(δ)=0 ' αληθές γιατί πήγαν στο γ
\\ διαχωρισμός (με ΑΝΩ αν θα πάρουμε τα στοιχεία μέχρι το νούμερο , ή Κάτω αν θα πάρουμε από το νούμερο μέχρι το τέλος)
\\ νέος δείκτης
δ=Σωρός Κάτω γ, 3
Τύπωσε γ ' 4 30
Τυπωσε δ ' 200 1000
\\ διαχωρισμός και φόρτωση σε υπάρχον δείκτη σε σωρό
Σωρός δ {
      Σειρά ! Σωρός Κάτω γ, 2
}
Τύπωσε γ ' 4
Τύπωσε δ ' 200 1000 30


Ταξινόμηση Φυσαλίδας (3.7)
Η ΓΛΩΣΣΑ έχει πίνακες με βάση το 1, έτσι για 5 στοιχεία θα έχουμε δείκτες από το 1 έως το 5. Πολλές γλώσσες έχουν πίνακες από το 0. Η Μ2000 εξ ορισμού έχει πίνακες με βάση το 0, όμως μπορούμε να δηλώσουμε βάση σε μια εντολή Πίνακας, ή σε κάθε διάσταση αντί για το μέγεθός της  να δώσουμε περιοχή τιμών πχ το Πίνακας α(-5 έως 5) θα έχει 11 στοιχεία σε δείκτες -5,-4,-3,-2,-1,0,1,2,3,4,5

Παρακάτω είναι δυο προγράμματα. Ένα πιο κοντά στη ΓΛΩΣΣΑ, και ένα δεύτερο πιο κοντά στη Μ2000, πιο περιγραφικό το οποίο δουλεύει για οποιοδήποτε βάση, εδώ είναι το 5 για παράδειγμα!



\\ Ταξινόμηση Φυσαλίδας
Πίνακας Βάση 1, α(5)
Για τελικό_στοιχείο=1 έως 5
      α(τελικό_στοιχείο)=τελικό_στοιχείο
Επόμενο
Για τελικό_στοιχείο=2 έως 5
      Για νο_στοιχείου=5 έως τελικό_στοιχείο ανά -1
            Αν α(νο_στοιχείου-1)>α(νο_στοιχείου)Τότε
                  Άλλαξε α(νο_στοιχείου-1), α(νο_στοιχείου)
            Τέλος Αν
      Επόμενο
Επόμενο
Για τελικό_στοιχείο=1 έως 5
      Τύπωσε α(τελικό_στοιχείο),
Επόμενο τελικό_στοιχείο
\\ αλλαγή γραμμής
Τύπωσε


\\ Πιο  Μ2000 τρόπος
\\ πιο σωστός, με μεταβλητές που περιγράφουν τι είναι
\\ για οποιαδήποτε βάση, εδώ από 5 ώς 9
Πίνακας α(5 έως 9) ' κενός
α(5)=5,4,3,2,1

\\ δείκτες στοιχείων: μέγιστου και ελάχιστου

μέγιστο_στοιχείο=Διάσταση(α(),1,1)
ελάχιστο_στοιχείο=Διάσταση(α(),1,0)

\\ δεν χρειάζεται το ανά -1, γιατί όταν το αρχικό είναι μεγαλύτερο από το τελικό
\\ η Μ2000 βάζει αυτόματα το βήμα στο -1, το έχουμε όμως για να φαίνεται!
\\ επίσης το πρόσημο στο βήμα παίζει ρόλο μόνο αν το αρχικό είναι ίσο με το τελικό
\\ για να αποφασίσει ο διερμηνευτής πως θα αφήσει τη μεταβλητή μετά την έξοδο από τη ΓΙΑ
\\ δουλεύει εφόσον το μέγιστο_στοιχείο>ελάχιστο_στοιχείο

Αν μέγιστο_στοιχείο<=ελάχιστο_στοιχείο Τότε Λάθος "δεν υπάρχουν τουλάχιστον δυο στοιχεία"
Για τελικό_στοιχείο=ελάχιστο_στοιχείο+1 έως μέγιστο_στοιχείο
      Για νο_στοιχείου=μέγιστο_στοιχείο έως τελικό_στοιχείο ανά -1
            Αν α(νο_στοιχείου-1)>α(νο_στοιχείου)Τότε
                  Άλλαξε α(νο_στοιχείου-1), α(νο_στοιχείου)
            Τέλος Αν
      Επόμενο
Επόμενο
Τύπωσε α()





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

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

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