ΟΚ, το έχουμε συζητήσει καμιά 10ριά φορές, κι εγώ έχω πει τη γνώμη μου, αλλά επειδή σκέφτομαι να προσθέσω στο Διερμηνευτή δυνατότητα αυτόματης μετατροπής κώδικα σε διάγραμμα θα ήθελα να δω ποια είναι η επικρατέστερη άποψη.
ΔΙΑΒΑΣΕ α, τ, β
ΓΙΑ ι ΑΠΟ α ΜΕΧΡΙ τ ΜΕ_ΒΗΜΑ β
ΓΡΑΨΕ ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Πώς θα το κάνατε αυτό σε διάγραμμα; Ή, για να μην παιδευόμαστε με ζωγραφιές, πώς θα το μετατρέπατε σε ΟΣΟ; (οπότε το διάγραμμα βγαίνει εύκολα).
Ιδέα #1:
ΔΙΑΒΑΣΕ α, τ, β
ι <- α
ΟΣΟ ι (<= Η >=) τ ΕΠΑΝΑΛΑΒΕ
ΓΡΑΨΕ ι
ι <- ι + β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Δηλαδή και επειδή το <= ή >= εξαρτάται από την τιμή του βήματος, τα γράφουμε παράνομα στη γραμμή της ΟΣΟ (ή στο διάγραμμα σε έναν μόνο ρόμβο) για να μην κάνουμε πολύπλοκο τον κώδικα.
Ιδέα #2:
ΔΙΑΒΑΣΕ α, τ, β
ι <- α
ΑΝ β = 0 ΤΟΤΕ
!Κάποιο είδος λάθους, δεν επιτρέπεται τιμή = 0
ΑΛΛΙΩΣ_ΑΝ β > 0 ΤΟΤΕ
ΟΣΟ ι <= τ ΕΠΑΝΑΛΑΒΕ
ΓΡΑΨΕ ι
ι <- ι + β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ
ΟΣΟ ι >= τ ΕΠΑΝΑΛΑΒΕ
ΓΡΑΨΕ ι
ι <- ι + β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΑΝ
Αυτή είναι πιο σωστή έκδοση, φαίνεται ότι υπάρχει μία ΑΝ πριν την ΟΣΟ, η οποία επιλέγει τον κατάλληλο τελεστή (<= ή >=). Όμως γίνεται πολύπλοκο. Αλλά από την άλλη
είναι πολύπλοκη η εσωτερική εκτέλεση της ΓΙΑ, επομένως ίσως πρέπει να αντικατοπτρίζεται αυτή η πολυπλοκότητα στο διάγραμμα;
Δεύτερη ερώτηση: όποιο από τα 2 παραπάνω διαγράμματα (ή αυτά που θα προτείνετε εσείς) κι αν διαλέξουμε, το χρησιμοποιούμε όταν τελικά ξέρουμε από πριν το πρόσημο του βήματος; Ή απλοποιούμε επίτηδες το διάγραμμα, κουτσουρεύοντας τη λειτουργία της ΟΣΟ για να μην "φοβηθούν" οι μαθητές;
Τρίτη ερώτηση: το βιβλίο
συμβουλεύει ότι δεν πρέπει να μεταβάλλονται η αρχική τιμή, η τελική τιμή και το βήμα στο εσωτερικό μιας εντολής ΓΙΑ. Αν όμως τελικά το κάνει αυτό κάποιος; Ή, αν καλεί συνάρτηση, π.χ. ΓΙΑ χ ΑΠΟ 1 ΜΕΧΡΙ ΜέγιστοςΤουΠίνακα(Α); Θα καλείται η συνάρτηση πολλές φορές, όπως επιβάλλει η παραπάνω μετατροπή του ΓΙΑ σε ΟΣΟ; Ή θα πρέπει να του βγει μήνυμα λάθους; Π.χ. στις πανελλαδικές, θα κόβατε μόρια;
Ο Διερμηνευτής αυτή τη στιγμή υλοποιεί την παρακάτω μετατροπή της ΓΙΑ σε ΟΣΟ:
Ιδέα #3:
ΔΙΑΒΑΣΕ α, τ, β
ι <- α
μη_μεταβαλλόμενη_τελική_τιμή <- τ
μη_μεταβαλλόμενο_βήμα <- β
ΑΝ μη_μεταβαλλόμενο_βήμα = 0 ΤΟΤΕ
!Κάποιο είδος λάθους, δεν επιτρέπεται τιμή = 0
ΑΛΛΙΩΣ_ΑΝ μη_μεταβαλλόμενο_βήμα > 0 ΤΟΤΕ
ΟΣΟ ι <= μη_μεταβαλλόμενη_τελική_τιμή ΕΠΑΝΑΛΑΒΕ
ΓΡΑΨΕ ι
ι <- ι + μη_μεταβαλλόμενο_βήμα
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ
ΟΣΟ ι >= μη_μεταβαλλόμενη_τελική_τιμή ΕΠΑΝΑΛΑΒΕ
ΓΡΑΨΕ ι
ι <- ι + μη_μεταβαλλόμενο_βήμα
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΑΝ
Δηλαδή αποθηκεύει τις τιμές των β, τ σε κρυφές μεταβλητές ώστε ακόμα κι αν ο μαθητής αλλάζει τις τιμές τους (ή καλεί συνάρτηση) η εκτέλεση της ΓΙΑ να συνεχίζεται χωρίς να λαμβάνει υπόψη της τις αλλαγές. Φυσικά αυτό προσθέτει ακόμα μεγαλύτερη πολυπλοκότητα (η οποία συνήθως
υπάρχει στη ΓΙΑ όπως αυτή υλοποιείται από Pascal, Basic κτλ, απλά δεν είναι εμφανής).
Εγώ κλίνω προς την 1η ιδέα για να μην "τρομάζουν" οι μαθητές, αν και πιο σωστή μου φαίνεται η 3η.
Επίσης προτείνω η μετατροπή να απλουστεύεται εάν γνωρίζουμε από πριν το πρόσημο του β (δηλαδή να μην γράφουμε πάντα το <= Η >=).
Τέλος, αν οι περισσότεροι συμφωνήσουν ότι η ιδέα #3 παραείναι πολύπλοκη, τότε νομίζω ότι ο Διερμηνευτής θα πρέπει να αλλάξει συμπεριφορά και ή (α) να "χτυπάει" σφάλμα ή (β) να υλοποιεί την ιδέα #1, επιτρέποντας πιθανώς άπειρες επαναλήψεις (εάν π.χ. μεταβάλλεται η τελική_τιμή).
Τι λέτε;