Είναι γεγονός ότι αν ένας τρίτος παρατηρητής προσπαθούσε να βγάλει άκρη από τα διάφορα μηνύματα θα έλεγε ότι παίζουμε σπασμένο τηλέφωνο...! Και από την αρχή αλλά μέχρι και τώρα, διαβάζοντας όλα τα μηνύματα και προσπαθώντας να ερμηνεύσω για ποιο λόγο υπάρχει αυτή η δυσκολία κατανόησης από όλες τις πλευρές, τελικά καταλαβαίνω ότι αυτό οφείλεται στον διαφορετικό τρόπο που ο καθένας ερμηνεύει κάποια πράγματα...
Έτσι, π.χ. εγώ δεν αισθάνομαι ότι μεταβάλω καθόλου την άποψή μου για την εντολή Δεδομένα, όπως λέει ο Ευριπίδης. Καταλήγω όμως στο συμπέρασμα ότι ο καθένας μας δίνει διαφορετική ερμηνεία για αυτήν. Μάλλον όλες οι υπόλοιπες διαφωνίες μας πηγάζουν ακριβώς από αυτό! Και λίγο πιο πριν ο Βαγγέλης πρόσθεσε ακόμα μία διαφορετική εκδοχή για τη λειτουργία της, αυτήν της εκχώρησης τιμών! Μάλιστα, φέρνοντας τώρα στο μυαλό μου αυτό που είχε γράψει (με κάπως άγαρμπο τρόπο) ο Γιώργος παλιότερα, ότι αυτά είναι πράγματα που ο καθένας τα καταλαβαίνει μέσα σε 5 λεπτά και ας ασχοληθούμε με άλλα σημαντικότερα, φαίνεται τώρα λοιπόν πόσο άδικο είχε!
Προσπαθούμε να βρούμε τη σημασία της εντολής Δεδομένα, αναφέρουμε διάφορες εκδοχές τις οποίες όμως δεν τεκμηριώνουμε! Ο Βαγγέλης επικαλείται το πνεύμα του βιβλίου αλλά δεν εξηγεί πού φαίνεται αυτό. Εννοώ σε ποια σελίδα ή σε ποιο παράδειγμα. Για αυτό εγώ ανέφερα το κείμενο του Κοίλια που σαν ένας από τους συγγραφείς του βιβλίου λογικά θα είναι πιο κοντά στο πνεύμα του βιβλίου (βλ.
http://dide.ilei.sch.gr/keplinet/education/docs/syn_syrou2003_pseydoglossa.pdf ). Στο κείμενο αυτό η εντολή Δεδομένα συσχετίζεται με τη
Διάβασε και γίνεται λόγος και για χρήση της στο
πέρασμα παραμέτρων κατά την κλήση αλγορίθμου από αλγόριθμο (αυτό όμως δεν παρουσιάζεται στο σχολικό βιβλίο οπότε ας το αφήσουμε για την ώρα). Μην βλέπουμε το κείμενο αποσπασματικά. Ας το μελετήσουμε πρώτα και μετά ας αποφανθούμε. Το να μιλάμε για ισοδυναμίες εντολών δεν προσθέτει αλλά και δεν αφαιρεί τίποτα στην κουβέντα. Ας εστιάσουμε στο κεντρικό μας ζήτημα. Θα έλεγα, ας προσθέσουμε και την
εκχώρηση τιμών που προτείνει ο Βαγγέλης, όχι όμως να το περιορίσουμε μόνο σε κάτι τέτοιο. Ας μην πάμε εμείς να αλλάξουμε το πνεύμα του βιβλίου!
Στη συνέχεια θα προσπαθήσω να υποστηρίξω κάποιες ιδέες και να αναλύσω περισσότερο αυτά που έθιγα σε προηγούμενα μηνύματά μου.
Η αναφορά μου στον αλγόριθμο της σελ. 90 έγινε μόνο και μόνο επειδή είχε εντοπιστεί από συναδέλφους ως παράδειγμα του βιβλίου όπου το απαιτούμενο μέγεθος (ή το μέγιστο μέγεθος) του πίνακα δεν μπορεί να εκτιμηθεί κατά τη φάση της συγγραφής του κώδικα, παρά μονάχα κατά τη φάση της εκτέλεσης των εντολών.
Αλγόριθμος Δύναμη2
Δεδομένα // a, b //
power[1] ← a
i ← 1
pow ← 1
Όσο pow < b επανάλαβε
i ← i+1
pow ← 2* pow
power[ i ] ← power[i-1] * power[i-1]
Τέλος_επανάληψης
....
Ο Γιώργος στη συνέχεια ανέλυσε και εξήγησε ότι το απαιτούμενο μέγεθος του πίνακα ήταν συνάρτηση του b (αυτό που ανέφερε κι ο Ευριπίδης παραπάνω), κι αφού το b δίνεται ως δεδομένο (εντολή Δεδομένα) τότε το μέγεθος του πίνακα μπορεί να καθοριστεί κατά το στάδιο της συγγραφής του κώδικα. Το ίδιο έκανε και για άλλους αλγορίθμους... όμως εδώ ακριβώς υπάρχει κατά τη γνώμη μου το λογικό λάθος που έκανε ο Γιώργος: Όπου έβλεπε Δεδομένα // α, β, γ // θεωρούσε ότι τα α, β και γ θα είναι γνωστά κατά τη φάση της συγγραφής του κώδικα! Αυτό όμως, όπως εξηγώ παρακάτω, θεωρώ ότι ήταν λανθασμένη υπόθεση (ας την ονομάσω Παρερμηνεία 1).
Ας θυμηθούμε όμως τον αλγόριθμο πολλαπλασιασμού αλά ρωσικά:
Αλγόριθμος πολλαπλασιασμός
Δεδομένα // Μ1, Μ2 //
Τα Μ1 και Μ2 πότε θα αποφασίσουμε τι τιμή θα έχουν; Πριν από την εκτέλεση του αλγορίθμου με σταθερές τιμές; Τότε τι αξία θα είχε ο αλγόριθμος αφού θα έβγαζε πάντα το ίδιο αποτέλεσμα; Τι εξυπηρετεί κάτι τέτοιο; Κερδίζουμε ή χάνουμε από μια τέτοια ερμηνεία; Το να μιλάμε για στιγμιότυπο αλγορίθμου εμένα μου δείχνει αποφυγή να δούμε την αλήθεια.
Το βιβλίο δεν χρησιμοποιεί την εντολή Δεδομένα ως εντολή δήλωσης των μεταβλητών και των δομών του αλγορίθμου, που αυτό όντως γίνεται στη φάση του προγραμματισμού. Ίσως να προκύπτει μια τέτοια παρερμηνεία από το γεγονός ότι η εντολή αυτή μπαίνει στην αρχή, κάτω από τη λέξη Αλγόριθμος. Απλά δηλώνει ότι σε εκείνο το σημείο υπάρχει είσοδος στον αλγόριθμο (στην αρχή της εκτέλεσης του αλγορίθμου, ή στην αρχή εκτέλεσης του υποπρογράμματος αν η υλοποίηση του αλγορίθμου θα καταλήξει σε υποπρόγραμμα, όπως αναφέρει ο Άλκης – όχι όμως στο στάδιο συγγραφής του κώδικα!). Με ποιον τρόπο επιτυγχάνεται αυτή η είσοδος; Όπως αναφέρει νομίζω ο Ευριπίδης, στην ψευδογλώσσα δεν μας ενδιαφέρει εκτός κι αν αυτό ακριβώς αποτελεί ζητούμενο της άσκησης. Πρόσθετη είσοδος βέβαια μπορεί να υπάρχει και στη συνέχεια της εκτέλεσης του αλγορίθμου, με εντολές εισόδου, εκχώρησης, κλήση υποπρογραμμάτων, κλπ, αλλά η εντολή Δεδομένα δείχνει την είσοδο που θα έχουμε στο ξεκίνημα.
Αν παρόλα αυτά επιζητάμε απάντηση στο πώς τελικά μπορεί ή πώς θέλουμε να επιτευχθεί αυτή η είσοδος που υπονοεί η Δεδομένα, τότε πολύ απλά θα πρέπει να το κωδικοποιήσουμε σε γλώσσα προγραμματισμού. Και ας υιοθετήσουμε όλες τις πιθανές εκδοχές που έχουν αναφερθεί: α)
με Διάβασε, όπως αναφέρει ο Κοίλιας, β)
μέσω παραμέτρων αν βρισκόμαστε σε υποπρόγραμμα, όπως αναφέρει ο Κοίλιας και ο Άλκης, γ)
με σταθερές τιμές, μέσω εντολής εκχώρησης όπως αναφέρει ο Βαγγέλης, ή μέσω δήλωσης σταθερών. Τέλος, με συνδυασμούς των παραπάνω. Έχουμε άλλο τίποτα πιθανό να προτείνουμε;
Π.χ. :
Αλγόριθμος μπλαμπλα
Δεδομένα // α, β, γ//
Πιθανή μετατροπή σε ΓΛΩΣΣΑ:
ΔΙΑΔΙΚΑΣΙΑ μπλαμπλα(β)
...
ΑΡΧΗ
Διάβασε α
γ<- 10
...
Από όλα τα παραπάνω εγώ δέχομαι και τα 3, ανάλογα με την περίπτωση, πιο σπάνια βέβαια το γ) και σίγουρα όχι μόνο το γ). Γιατί να μην ισχύει κάτι τέτοιο; Υπάρχει κάποιο σημείο στο βιβλίο που να αναφέρει κάτι άλλο; Αν ναι, θα ήθελα να μου πείτε σε ποια σελίδα ώστε να το εξετάσουμε.
Οπότε, για το παράδειγμα της σελ. 90, δεν μπορούμε να θεωρήσουμε ότι η εντολή Δεδομένα // a, b // δείχνει ότι τα a και b θα είναι ήδη γνωστά από την αρχή, δηλαδή κατά τη συγγραφή του κώδικα. Αν ήταν έτσι τότε, όπως τόνισα σε προηγούμενο μήνυμα, ο αλγόριθμος θα υπολόγιζε μια συγκεκριμένη δύναμη μονάχα, π.χ. το 5 εις την 12. Το πιο λογικό θα ήταν είτε τα a και b να διαβάζονταν, είτε να έρχονταν μέσω παραμέτρων αν η υλοποίηση γινόταν ως υποπρόγραμμα. Όπως είπα, αν θέλουμε να δούμε πώς τελικά θα επιτευχθεί αυτή η είσοδος (ή πώς θέλουμε να επιτευχθεί) τότε πολύ απλά θα πρέπει να το κωδικοποιήσουμε σε γλώσσα προγραμματισμού. Κάτι τέτοιο προφανώς και δεν μπορεί να υλοποιηθεί στη ΓΛΩΣΣΑ του βιβλίου, αφού το μέγεθος του πίνακα θα καθοριζόταν μετά τον καθορισμό του b. Eκτός κι αν στo b έμπαινε σταθερή τιμή μέσω δήλωσης σταθερών, το οποίο όμως θα οδηγούσε σε άχρηστο αλγόριθμο. Όμως δεν υπάρχει πρόβλημα αφού μπορεί π.χ. να υλοποιηθεί μια χαρά σε C! Γιατί μας προβληματίζει κάτι τέτοιο;
Μια συνεπακόλουθη παρερμηνεία (έστω Παρερμηνεία 2) που έχει επικρατήσει είναι ότι αν η άσκηση λέει «δίνεται Ν το πλήθος των μαθητών μιας τάξης», και επειδή βάζουμε στον αλγόριθμο Δεδομένα // Ν //, θεωρείται ότι η τιμή του Ν θα είναι ντε και καλά γνωστή στη φάση της δημιουργίας του κώδικα. Από πού όμως προκύπτει κάτι τέτοιο; Πώς το τεκμηριώνουμε; Δηλαδή όταν στον αλγόριθμο πολλαπλασιασμού αλά ρωσικά λέμε «δίνονται δύο ακέραιοι Μ1 και Μ2», αυτό θα σημαίνει ότι πρέπει να ξέρουμε τις τιμές τους όταν θα γράφουμε τον κώδικα; Πάλι δεν θα καταλήγαμε σε άχρηστο αλγόριθμο;
Εφαρμόζοντας τα παραπάνω στο επίμαχο θέμα 3 μπορούμε να πούμε τα εξής:
α) Σύμφωνα με την Παρερμηνεία 2, αν το θέμα έλεγε «δίνεται ο αριθμός Ν των μαθητών» δεν σημαίνει κατ’ ανάγκη ότι το Ν θα είναι γνωστό πριν την εκτέλεση (μπορεί να είναι, μπορεί και όχι όμως!). Σίγουρα πάντως θα βάζαμε Δεδομένα // Ν//.
β) Αφού το θέμα λέει «να διαβάζεται ο αριθμός Ν των μαθητών», οπότε μπαίνει η εντολή Διάβασε Ν, τότε σίγουρα το Ν δεν θα είναι γνωστό πριν την εκτέλεση. ΟΚ!
γ) Αν για το β) δεν μπορούμε να κάνουμε χρήση πίνακα τότε ούτε για το α) είναι σίγουρο ότι μπορούμε (παρόλα αυτά υπάρχει η λανθασμένη πεποίθηση ότι για το α) θα μπορούμε γιατί το Ν θα είναι γνωστό από την αρχή, λόγω της εντολής Δεδομένα - Παρερμηνεία 1).
δ) Από τη στιγμή που το παράδειγμα της σελ. 90 κάνει χρήση πίνακα παρόλο που το μέγεθός του (συνάρτηση του b) θα καθοριστεί όταν καθοριστεί και το b, δηλαδή στη φάση της εκτέλεσης όπως εξήγησα παραπάνω, τότε δεν θα έπρεπε να μας προβληματίζει η χρήση πίνακα είτε για το α) είτε για το β) (που αφορά στο επίμαχο θέμα). Όπως δεν υπάρχει πρόβλημα με τον αλγόριθμο της σελ. 90 που δεν υλοποιείται σε ΓΛΩΣΣΑ αλλά υλοποιείται σε C, έτσι δεν υπάρχει πρόβλημα και με τη χρήση πινάκων στο θέμα 3...
(συνεχίζεται λόγω μεγέθους)