Επιχειρήματα μέσα από τα σχολικά βιβλία υπέρ της χρήσης πίνακα στο Γ

Ξεκίνησε από bagelis, 29 Μαΐου 2010, 01:20:01 ΜΜ

« προηγούμενο - επόμενο »

alkisg

Στη C99: void diadikasia(int A[], int N)
ή ισοδύναμα στην κλασσική C: void diadikasia(int *A, int N)
Στην ψευδογλώσσα: Δεδομένα //Α, Ν//

...δε βλέπω διαφορά... και στα δύο είναι ευθύνη του προγραμματιστή του αλγορίθμου να αποφασίσει τι μέγεθος έχει τελικά ο πίνακας που του δώσανε σαν δεδομένο, Ν, 3*Ν ή οτιδήποτε άλλο.

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

Η διαφορά είναι με το (2) είναι η εξής:
Στο (2), το οποίο υλοποιεί η κλασσική Pascal (και υποθέτω και η ΓΛΩΣΣΑ), δεν μπορούμε να δηλώσουμε μια
  procedure Taksinomhse(N: integer; A: array[1..N] of integer)
κι έτσι μειώνεται κατά πολύ η δυνατότητα επαναχρησιμοποίησης των υποπρογραμμάτων.

Στο (4), το οποίο υλοποιεί π.χ. η Fortran (και νομίζω ότι προς τα εκεί κλίνει και η ψευδογλώσσα), μπορούμε να δηλώσουμε πίνακα με f(Ν) στοιχεία, όπου το Ν είναι παράμετρος, κι έτσι μπορούμε να γράφουμε γενικά υποπρογράμματα (χωρίς σταθερές τιμές) χωρίς να χάνεται κάτι από τις στατικές ιδιότητες της δομής.

pgrontas

Νομίζω ότι η συζήτηση για το μέγεθος του πίνακα - πλήθος στοιχείων είναι το λιγότερο σημαντικό και εξυπηρετεί περισσότερο τους τύπους παρά την ουσία. Θεωρώ πιο ισχυρό κριτήριο για την χρήση ή όχι πίνακα πρέπει να αποτελεί η επεξεργασία που γίνεται στις τιμές τις οποίες πρέπει να αποφασίσουμε αν θα βάλουμε ή όχι σε πίνακα.

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

Η γνώμη μου είναι ότι ένας τέτοιος κανόνας βελτιώνει περισσότερο την κρίση των μαθητών από το να κάθονται να ξεψειρίζουν την εκφώνηση για ανώτατα όρια . Επιπλέον είναι γενικός δηλαδή ανεξάρτητος από υλοποίηση και γλώσσα προγραμματισμού, στατικότητα ή δυναμικότητα.

Νομίζω ότι δεν θα διαφωνήσει κανείς ότι αν ο μαθητής εφαρμόσει σωστά τον παραπάνω κανόνα, καταλαβαίνει τι κάνει και μπορεί να διακρίνει πότε πρέπει να χρησιμοποιεί πίνακα ή όχι. Προφανώς αυτό το κριτήριο και κανένα άλλο, δεν πρέπει να συνεπάγεται την απώλεια όλων των μονάδων σε περίπτωση που δεν χρειάζεται πίνακας και παρόλα αυτά χρησιμοποιηθεί. Το παραπάνω μπορεί να φαίνεται προφανές, αλλά νομίζω ότι αυτό ήταν που οδήγησε στην παρεξήγηση και όχι το 'επίμαχο' θέμα.

Γιατί λοιπόν να μην διδάσκουμε αυτόν τον κανόνα στα παιδιά, που άλλωστε είναι σαφώς διατυπωμένος στο βιβλίο  και καθόμαστε και παιδευόμαστε με το αν είναι γνωστό ή όχι το πλήθος των στοιχείων;

ΥΓ: Νομίζω πάντως ότι είμαστε εκτός τόπου (λάθος thread) και χρόνου (καιρός  για καμιά βουτιά)
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

evry

Νομίζω ότι το (4) που λέει ο Άλκης είναι αυτό ακριβώς που συμβαίνει στην ψευδογλώσσα του βιβλίου.
Αυτό θα έπρεπε να λέει και στην αντίστοιχη σελίδα του βιβλίου και να μην μιλάει για δυναμική εκχώρηση μνήμης και μεταγλώττιση σε κεφάλαιο της ψευδογλώσσας.
  Δηλαδή ότι
Παράθεση
το μέγεθός τους αποφασίζεται κατά την έναρξη της εκτέλεσης του αλγορίθμου ή του υποπρογράμματος (όχι κατά τη διάρκεια - κατά την έναρξη, π.χ. αν πρόκειται για υποπρόγραμμμα, κατά τη δημιουργία της στοίβας των τοπικών μεταβλητών).
Λογικά και ο Γιώργος αυτό θα εννοούσε αλλά παρασύρθηκε από το βιβλίο και το έγραψε έτσι
Το πρόβλημα στην ψευδογλώσσα είναι: Σε ποιο σημείο του αλγορίθμου καθορίζεται το μέγεθος του πίνακα? Προφανώς στην αρχή, πριν ξεκινήσει η εκτέλεση. Που φαίνεται όμως αυτό? Η απάντηση είναι πουθενά. Σιωπηρά δεχόμασταν ότι το μέγεθος του πίνακα είναι Ν ή 100 από μια ματιά που ρίχναμε στον κώδικα. Τέτοια όμως δήλωση δεν υπάρχει στην ψευδογλώσσα.
   Νομίζω πως θα έπρεπε οι πίνακες να δηλώνονται στα δεδομένα κάπως έτσι
Δεδομένα // Α[Ν], Ν //

Αυτό θα είχε λύσει πολλά προβλήματα
Το σημαντικό είναι πως το Διάβασε είναι μια εντολή ενώ τα Δεδομένα είναι μια δήλωση και αυτά τα 2 έχουν μεγάλη διαφορά μεταξύ τους. Ίσως σε κάποιες περιπτώσεις να ταυτίζονται αλλά γενικά δεν είναι το ίδιο.

Φυσικά υπάρχει και το άλλο θέμα που λέει ο Παναγιώτης ότι πρέπει ο μαθητής να ξέρει πότε θα χρησιμοποιήσει πίνακα και πότε όχι. Δεν είναι δυνατόν να λύνει κάθε πρόβλημα με το σκεπτικό "θεωρώ ένα άνω όριο και παίρνω πίνακα".
Υπάρχουν περιπτώσεις όπου η ροή δεδομένων είναι συνεχής (π.χ. άμεσοι (online) αλγόριθμοι) οπότε δεν μπορεί να γίνει αυτό, πέρα από τους διδακτικούς στόχους του βιβλίου στους οποίους είναι αντίθετο το παραπάνω σκεπτικό.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Νίκος Αδαμόπουλος

#213
Παράθεση από: gpapargi στις 26 Ιουλ 2010, 03:30:28 ΜΜ
Όχι Νικ, αυτό είναι που προσπαθώ να πω τόσο καιρό. Το σενάριο 3 δεν παίζει γιατί υπάρχει μια πολύ σημαντική διαφορά με τη C. Στη C όταν δηλώνεται το μέγεθος του πίνακα κατά την εκτέλεση συμβαίνει κάτι πολύ συγκεκριμένο στη μνήμη του υπολογιστή: δεσμεύεται χώρος για τον πίνακα ο οποίος στη συνέχεια δεν μπορεί να αλλάξει. Αλλά στην ψευδογλώσσα αυτό δε συμβαίνει....

Μα εσύ ανέφερες την 3η περίπτωσή σου ως 1 από τις 3 πιθανές (που τώρα έγιναν 4) για να αντιστοιχούν στη ψευδογλώσσα... Εγώ απλώς πρόσθεσα ότι αν ίσχυε η 3 τότε δεν θα είχε πρόβλημα η λύση με πίνακα! Π.χ. :

Αλγόριθμος αγώνες
Διάβασε Ν
! Εδώ υποτίθεται ότι θα υπήρχε η δήλωση πίνακα αν μιλάγαμε π.χ. για τη C,
! δηλαδή αν ίσχυε η περίπτωση 3 που αναφέρεις
! μόνο που επειδή μιλάμε για αλγόριθμο δεν φαίνεται αυτή η δήλωση...
! Γιατί αναφέρεις την Δεδομένα; ....
! Σε αυτή την περίπτωση δεν θα βάζαμε Δεδομένα, Διάβασε θα βάζαμε!
! Και μετά το διάβασμα, το Ν δεν πρόκειται να άλλαζε στο επίμαχο θέμα.
...
Για ι από 1 μέχρι Ν
  ...


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

Τέτοια δήλωση δεν υπάρχει στους αλγορίθμους... γιατί απλά είναι αλγόριθμοι, δεν είναι προγράμματα. Όταν φτάναμε στο στάδιο του προγραμματισμού (που όμως δεν φτάσαμε γιατί το ζητούμενο ήταν ο αλγόριθμος και κανείς δεν είπε ότι ο ζητούμενος αλγόριθμος ντε και καλά θα υλοποιηθεί στο τέλος ως  πρόγραμμα για να εκτελεστεί από Η/Υ - αλγορίθμους εκτελούν και οι άνθρωποι με το μυαλό ή με μολύβι και χαρτί ή με μηχανές turing που έχουν θεωρητικά ταινία άπειρου μήκους ή κλπ...) τότε πιθανώς να έπρεπε να δηλώσουμε το ακριβές μέγεθος του πίνακα. Ε σε εκείνο το στάδιο θα υπήρχε και το παραθυράκι της δήλωσης ενός άνω ορίου για τον πίνακα που να αρκεί για τους σχολικούς αγώνες (αυθαίρετο ίσως για κάποιους, όχι όμως για κάποιους άλλους). Το σημαντικότερο τελικά όντως είναι αυτό που αναφέρει παραπάνω ο Παναγιώτης.

Όσο για την περίπτωση 4 (!!!), κάτι τέτοιο ήθελα κι εγώ να αναφέρω στα:

https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29814#msg29814

και πιο πίσω στα:

https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29625#msg29625

https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29311#msg29311

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

Νίκος Αδαμόπουλος

Σχετικά με το παράδειγμα που αναφέρθηκε στο

Παράθεση από: evry στις 11 Ιουλ 2010, 11:39:51 ΠΜ
Θα σου πω ένα αντίστοιχο παράδειγμα για να καταλάβεις τι εννοώ. Αρκετοί συνάδελφοι (όχι μόνο στο στέκι) θεώρησαν ότι ένα πολύ καλό επιχείρημα για τη χρήση πίνακα στο συγκεκριμένο θέμα ήταν το παράδειγμα του βιβλίου όπου υπολογίζεται η δύναμη με χρήση δυναμικού προγραμματισμού. (δεν θυμάμαι σελίδα). Το επιχείρημα ήταν ότι το πλήθος του στοιχείων του πίνακα ήταν άγνωστο. Αυτό το στήριξαν στο γεγονός ότι στο συγκεκριμένο παράδειγμα ο πίνακας γέμιζε με μια Όσο. Έτσι έκαναν το συνειρμό:
  ΌΣΟ...ΕΠΑΝΑΛΑΒΕ ===> ΑΓΝΩΣΤΟ ΠΛΗΘΟΣ ΣΤΟΙΧΕΙΩΝ
Ο συνειρμός τους είναι παρόμοιος με αυτόν που έκανε η μαθήτρια που αναφέρεις.
Κανείς δεν έκανε τον κόπο όμως να κοιτάξει τι έκανε ο αλγόριθμος, γιατί αν κοίταγαν θα έβλεπαν ότι το μέγεθος του πίνακα είναι εξαρχής καθορισμένο και ίσο με [log(b)]+1. To b δινόταν στα Δεδομένα άρα ήταν προκαθορισμένο και όχι άγνωστο.

και είχε αναλύσει ο Γιώργος στο:
https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29686#msg29686

...εγώ δεν μπαίνω στη λογική του προαναφερόμενου συμπεράσματος, ότι: ΟΣΟ ==> Άγνωστο πλήθος ...
... όμως το συμπέρασμα ότι το μέγεθος του πίνακα ήταν γνωστό ήδη κατά το στάδιο του προγραμματισμού προκύπτει μόνο αν ερμηνεύσουμε τη (δηλωτική) εντολή Δεδομένα ως "δοσμένα από την άσκηση". Βέβαια θα μπορούσε να δοθεί ως ερμηνεία ο όρος "Δεδομένα" από το:  Δεδομένα --> Επεξεργασία --> Πληροφορίες. Έτσι η εντολή Δεδομένα θα μπορούσε να συμπεριλαμβάνει τα "δοσμένα από την άσκηση" αλλά και αυτά που εισάγει ο χρήστης με την εντολή Διάβασε....

Θυμίζω την άποψη του Κοίλια για τα Δεδομένα: https://alkisg.mysch.gr/steki/index.php?topic=2937.msg30202#msg30202

Πού λέει το σχολικό βιβλίο ότι κάτι τέτοιο δεν ισχύει;

Αντίθετα, αν υιοθετήσουμε για το παρακάτω παράδειγμα την άποψη ότι τα a και b θα πρέπει να είναι ήδη γνωστά κατά τη φάση του προγραμματισμού τότε αυτό σημαίνει ότι ο προγραμματιστής θα καταλήξει να έχει φτιάξει ένα πρόγραμμα που θα υπολογίζει πάντα μια συγκεκριμένη δύναμη π.χ. το 5 εις την 12, και αν χρειαστεί ο υπολογισμός άλλης δύναμης τότε θα πρέπει να τον φωνάζουν ώστε να το τροποποιεί, να το ξαναμεταγλωττίζει, κλπ. Σίγουρα οι συγγραφείς του βιβλίου είχαν στο μυαλό τους ένα τέτοιο άχρηστο πρόγραμμα;;;

Παράθεση από: bagelis στις 02 Ιουν 2010, 04:16:44 ΜΜ
Αλγόριθμος Δύναμη2
Δεδομένα // a, b //
power[1] ← a
i ← 1
pow ← 1
Όσο pow < b επανάλαβε
i ← i+1
pow ← 2* pow
power ← power[i-1] * power[i-1]
Τέλος_επανάληψης

evry

Παράθεση
Θυμίζω την άποψη του Κοίλια για τα Δεδομένα: https://alkisg.mysch.gr/steki/index.php?topic=2937.msg30202#msg30202
Οι εντολές Δεδομένα και Διάβασε είναι ισοδύναμες?!!!!!!
Δεν μου φαίνεται και πολύ σωστό αυτό. Μήπως εννοεί ότι είναι ισοδύναμες κάτω από συγκεκριμένες προϋποθέσεις? Γιατί αν είναι έτσι όπως το λέει τότε με το σκεπτικό αυτό στην άσκηση με τους αθλητές δεν χρειάζεται να τους διαβάσω. Απλά θα έγραφα
Δεδομένα //  Ν, Όνομα[Ν], Επίδοση[Ν] //

και θα ξεμπέρδευα. Προφανώς ο σκοπός της δήλωσης Δεδομένα είναι να επικεντρωθεί ο μαθητής στην ουσία του αλγορίθμου και όχι στην είσοδο ή στην έξοδο όταν αυτές είναι τετριμμένες. Τι γίνεται όμως όταν η είσοδος ή η έξοδος είναι μέρος του αλγορίθμου? Τι εννοώ.
   Μπορούν να γίνουν τα παρακάτω τμήματα αλγορίθμου με τη δηλώση Δεδομένα?

Για j από 1 μέχρι 100
    Διάβασε Ν
    Για ι από 1 μέχρι Ν
        Διάβασε Α[ι][j]
    Τέλος_Επανάληψης
Τέλος_Επανάληψης

ή
Διάβασε Ν
Για j από 1 μέχρι 10
    Διάβασε Ν
    Αν Ν > 0 Τότε   Μ<--Ν
Τέλος_Επανάληψης


Το τελευταίο τμήμα κώδικα είναι ισοδύναμο με

Δεδομένα Ν, Μ

?
Νομίζω λοιπόν ότι μπορούμε να βρούμε αρκετά παραδείγματα που δείχνουν ακριβώς αυτό. Ότι δηλαδή χρησιμοποιούμε τα Δεδομένα μόνο όταν η εισαγωγή δεδομένων δεν έχει ουσιαστικό αντίκτυπο στον αλγόριθμο που σχεδιάζουμε. Δηλαδή όταν μας λένε ότι κάτι είναι δοσμένο ή δίνεται. Όχι όταν προκύπτει από εντολή του αλγορίθμου.


Παράθεση από: Νίκος Αδαμόπουλος στις 26 Ιουλ 2010, 07:53:48 ΜΜ
Αντίθετα, αν υιοθετήσουμε για το παρακάτω παράδειγμα την άποψη ότι τα a και b θα πρέπει να είναι ήδη γνωστά κατά τη φάση του προγραμματισμού τότε αυτό σημαίνει ότι ο προγραμματιστής θα καταλήξει να έχει φτιάξει ένα πρόγραμμα που θα υπολογίζει πάντα μια συγκεκριμένη δύναμη π.χ. το 5 εις την 12, και αν χρειαστεί ο υπολογισμός άλλης δύναμης τότε θα πρέπει να τον φωνάζουν ώστε να το τροποποιεί, να το ξαναμεταγλωττίζει, κλπ. Σίγουρα οι συγγραφείς του βιβλίου είχαν στο μυαλό τους ένα τέτοιο άχρηστο πρόγραμμα;;;

Τα a,b είναι γνωστά όχι σταθερά. Μπορείς κάθε φορά να καλείς τον αλγόριθμο και τα α, β παίζουν τον ρόλο παραμέτρων.
Έχει διαφορά. Δηλαδή όταν καλείς τη συνάρτηση Τ_Ρ(4) καλείς κάθε φορά άλλον αλγόριθμο? Τα Δεδομένα παίζουν τον ρόλο των παραμέτρων στα υποπρογράμματα. Αν κάποιος σου έλεγε να φτιάξεις έναν αλγόριθμο που να υπολογίζει την τετραγωνική ρίζα δεν θα έγραφες το παρακάτω?

Αλγόριθμος Τ_Ρ
Δεδομένα   // χ //
......
Αποτέλεσματα //τρ //

και στη συνέχεια θα έδινες το αντίστοιχο πρόγραμμα όπου το χ είναι η παράμετρος εισόδου.

Είπα και πριν ότι αυτό με τον προγραμματισμό δεν έχει νόημα στην ψευδογλώσσα. Η σωστή ερμηνεία είναι "πριν την εκτέλεση" όπως ακριβώς το περιέγραψε ο Άλκης.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

evry

Πάντως από τη στιγμή που πρόκειται για πανελλαδικό μάθημα μάλλον θα έπρεπε κάποια πράγματα να αποσαφηνιστούν και ένα από αυτά είναι ο ρόλος των εντολών Δεδομένα //  //   και Αποτελέσματα // //.
Πότε δηλαδή μπορεί ένας μαθητής να τα χρησιμοποιεί και πότε όχι. Δηλαδή αν λέει η εκφώνηση να διαβάζει έναν πίνακα 2 διαστάσεων τότε ο μαθητής μπορεί να χρησιμοποιήσει  Δεδομένα // // ;
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gpapargi

Παράθεση από: alkisg στις 26 Ιουλ 2010, 05:11:20 ΜΜ
Εγώ θα πρόσθετα και μια τέταρτη περίπτωση, 4) Τους θεωρεί στατικές δομές και το μέγεθός τους αποφασίζεται κατά την έναρξη της εκτέλεσης του αλγορίθμου ή του υποπρογράμματος (όχι κατά τη διάρκεια - κατά την έναρξη, π.χ. αν πρόκειται για υποπρόγραμμμα, κατά τη δημιουργία της στοίβας των τοπικών μεταβλητών).

Άλκη νομίζω ότι αυτό που λες 4 είναι αυτό που λέω εγώ 3. Ορίζεται μια φορά στην αρχή και μετά δεν αλλάζει. Είναι στατική δομή και το μέγεθος καθορίζεται κατά την εκτέλεση.

Το πρόβλημα με αυτή την προσέγγιση είναι (όπως έγραψα και πριν και λέει και ο Ευριπίδης) ότι στις γλώσσες αυτές συμβαίνει κάτι πολύ συγκεκριμένο στη μνήμη. Δεσμεύεται χώρος (και μάλιστα συνεχόμενος) και δεν μπορεί να αλλάξει στη συνέχεια το μέγεθος του πίνακα.

Το πρόβλημα στην ψευδογλώσσα είναι ότι δεν υπάρχει τέτοιος μηχανισμός. Το Δεδομένα //ν// δεν λέει τίποτα. Μπορεί το μέγεθος του πίνακα να είναι οσοδήποτε.

Παράθεση από: alkisg στις 26 Ιουλ 2010, 05:11:20 ΜΜ
Στη C99: void diadikasia(int A[], int N)
ή ισοδύναμα στην κλασσική C: void diadikasia(int *A, int N)
Στην ψευδογλώσσα: Δεδομένα //Α, Ν//

...δε βλέπω διαφορά... και στα δύο είναι ευθύνη του προγραμματιστή του αλγορίθμου να αποφασίσει τι μέγεθος έχει τελικά ο πίνακας που του δώσανε σαν δεδομένο, Ν, 3*Ν ή οτιδήποτε άλλο.

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

Νίκος Αδαμόπουλος

Παράθεση από: evry στις 26 Ιουλ 2010, 08:34:55 ΜΜ
Οι εντολές Δεδομένα και Διάβασε είναι ισοδύναμες?!!!!!!
Δεν μου φαίνεται και πολύ σωστό αυτό. Μήπως εννοεί ότι είναι ισοδύναμες κάτω από συγκεκριμένες προϋποθέσεις?
...
Νομίζω λοιπόν ότι μπορούμε να βρούμε αρκετά παραδείγματα που δείχνουν ακριβώς αυτό. Ότι δηλαδή χρησιμοποιούμε τα Δεδομένα μόνο όταν η εισαγωγή δεδομένων δεν έχει ουσιαστικό αντίκτυπο στον αλγόριθμο που σχεδιάζουμε. Δηλαδή όταν μας λένε ότι κάτι είναι δοσμένο ή δίνεται. Όχι όταν προκύπτει από εντολή του αλγορίθμου.
To "ισοδύναμα" δεν σημαίνει ότι βάζουμε το ένα στη θέση του άλλου ασχέτως του τι ζητάει η άσκηση! Φαντάζομαι έχει να κάνει με το ότι επιτελούν το ίδιο σκοπό... Π.χ. το:

Για ι από 1 μέχρι 10
  <εντολές>
Τέλος_επανάληψης

μετατρέπεται ισοδύναμα στο:

ι<-1
Όσο ι<=10 επανάλαβε
  <εντολές>
  ι<-ι+1
Τέλος_επανάληψης

Αν όμως η άσκηση θέλει να γίνει κάτι με την Για δεν θα πας να βάλεις Όσο επειδή είναι ισοδύναμες.

Πράγματι ισχύει αυτό που λες στο τέλος... Το ίδιο όμως λέει και Κοίλιας... Στο https://alkisg.mysch.gr/steki/index.php?topic=2937.msg30202#msg30202 (στις 2 τελευταίες "πράσινες" παραγράφους λέει τα ίδια). Ειδικά η τελευταία λέει:

Σημ. Αν και η χρήση της μιας ή της άλλης μεθόδου αφήνεται γενικά στην ευχέρεια του συντάκτη του αλγορίθμου, ο σπουδαστής πρέπει να είναι προσεκτικός στην περίπτωση εξετάσεων προς αποφυγή βαθμολογικών απωλειών. Έτσι αν η εκφώνηση ενός θέματος λέει "Να γραφεί αλγόριθμος ο οποίος να διαβάζει ....", τότε πρέπει να χρησιμοποιηθεί η εντολή Διάβασε. Αντίθετα αν η εκφώνηση λέει "Δίδεται ένας πίνακας Α. Να γραφεί αλγόριθμος ο οποίος ...", τότε πρέπει να χρησιμοποιηθεί η εντολή Δεδομένα."

Δεν αμφισβητήθηκαν όλα αυτά... Δεν υπάρχει λόγος να γυρίζουμε αρκετά χρόνια πίσω ....

Αυτό που λέω είναι το εξής:

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

Ή να το πω με άλλα λόγια....

Παράθεση από: evry στις 26 Ιουλ 2010, 08:34:55 ΜΜ
Τα a,b είναι γνωστά όχι σταθερά. Μπορείς κάθε φορά να καλείς τον αλγόριθμο και τα α, β παίζουν τον ρόλο παραμέτρων.
Έχει διαφορά. Δηλαδή όταν καλείς τη συνάρτηση Τ_Ρ(4) καλείς κάθε φορά άλλον αλγόριθμο? Τα Δεδομένα παίζουν τον ρόλο των παραμέτρων στα υποπρογράμματα. Αν κάποιος σου έλεγε να φτιάξεις έναν αλγόριθμο που να υπολογίζει την τετραγωνική ρίζα δεν θα έγραφες το παρακάτω?

Αλγόριθμος Τ_Ρ
Δεδομένα   // χ //
......
Αποτέλεσματα //τρ //

και στη συνέχεια θα έδινες το αντίστοιχο πρόγραμμα όπου το χ είναι η παράμετρος εισόδου.

Είπα και πριν ότι αυτό με τον προγραμματισμό δεν έχει νόημα στην ψευδογλώσσα. Η σωστή ερμηνεία είναι "πριν την εκτέλεση" όπως ακριβώς το περιέγραψε ο Άλκης.

(ο Άλκης είπε "κατά την έναρξη της εκτέλεσης του αλγορίθμου ή του υποπρογράμματος " - αν δέχεσαι αυτή την εκδοχή αυτή τότε δέχεσαι πίνακες στο θέμα 3 με την προσέγγιση που έδειξα στο https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29814#msg29814 οπότε έχεις ήδη περάσει στην απέναντι όχθη!!!)

Για να καταλάβω όμως τι εννοείς λέγοντας "Τα a,b είναι γνωστά όχι σταθερά",  θα ήθελα να δω πώς θα υλοποιούσες σε ΓΛΩΣΣΑ τον αλγόριθμο αυτό του υπολογισμού της δύναμης (βιβλίο σελ. 90), χωρίς να βάλεις σταθερές για τα α και b, αλλά όμως χρησιμοποιώντας και πίνακα που θα ξέρεις το απαιτούμενο μέγεθός του κατά τη φάση του προγραμματισμού, και μάλιστα όχι βάζοντας ένα "αυθαίρετο" άνω όριο στο μέγεθος αυτό ........;;;;  :D


Αλγόριθμος Δύναμη2
Δεδομένα // a, b //
power[1] ← a
i ← 1
pow ← 1
Όσο pow < b επανάλαβε
i ← i+1
pow ← 2* pow
power ← power[i-1] * power[i-1]
Τέλος_επανάληψης

evry

Παράθεση από: Νίκος Αδαμόπουλος στις 27 Ιουλ 2010, 01:15:27 ΜΜ
Πράγματι ισχύει αυτό που λες στο τέλος... Το ίδιο όμως λέει και Κοίλιας... Στο https://alkisg.mysch.gr/steki/index.php?topic=2937.msg30202#msg30202 (στις 2 τελευταίες "πράσινες" παραγράφους λέει τα ίδια). Δεν αμφισβητήθηκαν όλα αυτά... Δεν υπάρχει λόγος να γυρίζουμε αρκετά χρόνια πίσω ....
Κάτσε γιατί με μπέρδεψες. Πριν ανέφερες ότι τα δύο αυτά είναι ισοδύναμα και τώρα λες ότι δεν είναι? Μα και εγώ αυτό λέω, ότι τα Δεδομένα-Διάβασε δεν είναι ισοδύναμα. Δεν μπορείς να χρησιμοποιείς Δεδομένα αντί για Διάβασε, εκτός από ελάχιστες περιπτώσεις. Αυτό λοιπόν το ξεκαθαρίσαμε.

Παράθεση
Όταν λέμε "δίνεται πίνακας Α μεγέθους Ν", και αφού έχει φτιαχτεί ο αλγόριθμος με χρήση της Δεδομένα, αν θελήσουμε να περάσουμε στο στάδιο του προγραμματισμού (που κακώς μας έχει τραβήξει την προσοχή πολύ τώρα τελευταία!) τι πρέπει να κάνουμε; Να διαβάσουμε τα Ν και Α ή να τα θεωρήσουμε σταθερά;
Δεν θα κάνεις τίποτα γιατί πολύ απλά και τα 2 είναι λάθος. Ο αλγόριθμος που περιγράφεις δεν μπορεί να γίνει στην ΓΛΩΣΣΑ του σχολικού βιβλίου με τη μορφή αυτή. Ούτε μπορείς να "μετατρέψεις" το 'Δεδομένα' σε Διάβασε ούτε μπορείς να θέσεις μια αυθαίρετη τιμή στο Ν. Ουσιαστικά αναγκάζεσαι να δώσεις ένα στιγμιότυπο του αλγορίθμου

Παράθεση
(ο Άλκης είπε "κατά την έναρξη της εκτέλεσης του αλγορίθμου ή του υποπρογράμματος " - αν δέχεσαι αυτή την εκδοχή αυτή τότε δέχεσαι πίνακες στο θέμα 3 με την προσέγγιση που έδειξα στο https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29814#msg29814 οπότε έχεις ήδη περάσει στην απέναντι όχθη!!!)
Όταν λέμε κατά την έναρξη της εκτέλεσης σημαίνει ότι το μέγεθος του πίνακα έχει καθοριστεί εκείνη τη στιγμή. Αυτό συμβαίνει στο θέμα 3? Προφανώς όχι, αφού προηγουμένως έχουν εκτελεστεί και άλλες εντολές και το μέγεθος του πίνακα δεν είναι ακόμη γνωστό.
Αυτό που λέω είναι ότι "το μέγεθος του πίνακα πρέπει να έχει καθοριστεί ακριβώς πριν την εκτέλεση της πρώτης εντολής του αλγορίθμου". Νομίζω τώρα να είναι κατανοητό.

Επίσης η προσέγγισή σου δεν είναι σωστή σύμφωνα με την ΓΛΩΣΣΑ του σχολικού βιβλίου. Δεν μπορείς να γράψεις το παρακάτω

Παράθεση
ΠΡΟΓΡΑΜΜΑ μπλαμπλα
ΜΕΤΑΒΛΗΤΕΣ
   ΑΚΕΡΑΙΕΣ: Ν
ΑΡΧΗ
   ΔΙΑΒΑΣΕ Ν
   ΚΑΛΕΣΕ αβγ(Ν)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ αβγ(Ν)
ΜΕΤΑΒΛΗΤΕΣ
   ΑΚΕΡΑΙΕΣ: Α[Ν], Ν, i
ΑΡΧΗ
   ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν
       ΔΙΑΒΑΣΕ Α[ i ]
       ....
   ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

διότι έρχεται σε πλήρη αντίθεση με το σχολικό βιβλίο που λέει ότι το μέγεθος του πίνακα πρέπει να είναι γνωστό κατά τη μεταγλώττιση. Στο παράδειγμα που δίνεις το μέγεθος του πίνακα ορίζεται κατά την εκτέλεση άρα δεν μπορεί να γίνει σε ΓΛΩΣΣΑ.

Παράθεση
Για να καταλάβω όμως τι εννοείς λέγοντας "Τα a,b είναι γνωστά όχι σταθερά",  θα ήθελα να δω πώς θα υλοποιούσες σε ΓΛΩΣΣΑ τον αλγόριθμο αυτό του υπολογισμού της δύναμης (βιβλίο σελ. 90), χωρίς να βάλεις σταθερές για τα α και b, αλλά όμως χρησιμοποιώντας και πίνακα που θα ξέρεις το απαιτούμενο μέγεθός του κατά τη φάση του προγραμματισμού, και μάλιστα όχι βάζοντας ένα "αυθαίρετο" άνω όριο στο μέγεθος αυτό ........;;;;  :D
Μα δεν είπα ότι θα το υλοποιούσα σε ΓΛΩΣΣΑ γιατί πολύ απλά δεν μπορεί να υλοποιηθεί σε ΓΛΩΣΣΑ για τους λόγους που ανέφερα προηγουμένως.
Επίσης δεν χρειάζεται να πας πολύ μακριά και να μπλέξεις με το συγκεκριμένο παράδειγμα. Για να καταλάβεις τι εννοώ: Τον αλγόριθμο της αναζήτησης όπως περιγράφεται στο βιβλίο μπορείς να τον κάνεις σε ΓΛΩΣΣΑ?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Vangelis

Προσωπικά υποστηρίζω ότι σύμφωνα με το πνεύμα του βιβλίου το Δεδομένα είναι  ισοδύναμο μα εντολή(ες) ανάθεσης και όχι με εντολή Διάβασε.  Συνεπώς  Δεδομένα //Ν// σημαίνει ότι το Ν είναι γνωστό (στον αλγόριθμο και όχι στο χρήστη)  και συνεπώς σταθερό.   Παρόμοια δηλαδή με τον τρόπο που χρησιμοποιούσε η γλώσσα BASIC  τα DATA. 

alkisg

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

Γι' αυτό και έφερνα τα παράδειγματα με τα υποπρογράμματα πιο πάνω. Στη C, στο Delphi κτλ είναι αποδεκτό να περνιούνται πίνακες χωρίς να δηλώνεται το μέγεθός τους, το ίδιο νόημα πιστεύω ότι έχει και στην ψευδογλώσσα. Συμφωνώ μεν με τον evry ότι θα ήταν καλύτερο να δηλώνεται και το μέγεθός τους, αλλά δεν είναι και κάτι ασυνήθιστο το ότι δεν δηλώνεται, είναι ευθύνη του προγραμματιστή να μη βγει out of bounds...

  procedure MiaDiadikasia(var A: array of Variant; N: Integer)
ισοδυναμεί με
  Δεδομένα //Α, Ν//
  Αποτελέσματα //Α//

evry

Ακριβώς!! Τα Δεδομένα και τα Αποτελέσματα σε έναν αλγόριθμο είναι το αντίστοιχο των παραμέτρων εισόδου και εξόδου σε ένα πρόγραμμα αντίστοιχα. 

Απλά το πρόβλημα εδώ είναι ότι η ΓΛΩΣΣΑ του βιβλίου δεν επιτρέπει πίνακα-παράμετρο με  μέγεθος Ν. Πρέπει πάντα το μέγεθος να είναι καθορισμένο ως σταθερά, κάτι που δεν συμβαίνει σε άλλες γλώσσες.
   Τώρα αυτό με το πέρασμα του μεγέθους νομίζω ότι είναι το πιο λογικό. Δηλαδή πως θα ξέρει το υποπρόγραμμα (αν υποθέσουμε ότι είναι πλήρως ανεξάρτητο από το πρόγραμμα) μέχρι που μπορεί να διαβάσει? Θα πρέπει να έχει αυτή την πληροφορία hard-coded το οποίο δεν μου φαίνεται καλό (περιορίζει τις δυνατότες του υποπρογράμματος).
   Οι μόνες περιπτώσεις που έχω στο μυαλό μου με πέρασμα πίνακα χωρίς το μέγεθός του είναι στα strings όπου ξέρουμε ότι ο τελευταίος χαρακτήρας είναι το '/0'. Σε άλλη περίπτωση θα πρέπει να ξέρουμε το μέγεθος αν θέλουμε το υποπρόγραμμα να είναι πιστή μεταφορά του αλγορίθμου που περιέχει δήλωση
   Δεδομένα // Α[Ν] //     

Άλκη δεν ξέρω αν εννοείς κάτι άλλο με αυτό που λες για το μέγεθος ότι δεν είναι κάτι ασυνήθιστο ή εγώ δεν κατάλαβα καλά.
Υπάρχουν και περιπτώσεις που πράγματι δεν χρειάζεται το μέγεθος, π.χ στη C νομίζω ότι με την sizeof(array)/sizeof(type) μπορείς να βρεις το πλήθος των στοιχείων του πίνακα
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Νίκος Αδαμόπουλος

#223
Είναι γεγονός ότι αν ένας τρίτος παρατηρητής προσπαθούσε να βγάλει άκρη από τα διάφορα μηνύματα θα έλεγε ότι παίζουμε σπασμένο τηλέφωνο...! Και από την αρχή αλλά μέχρι και τώρα, διαβάζοντας όλα τα μηνύματα και προσπαθώντας να ερμηνεύσω για ποιο λόγο υπάρχει αυτή η δυσκολία κατανόησης από όλες τις πλευρές, τελικά καταλαβαίνω ότι αυτό οφείλεται στον διαφορετικό τρόπο που ο καθένας ερμηνεύει κάποια πράγματα...

Έτσι, π.χ. εγώ δεν αισθάνομαι ότι μεταβάλω καθόλου την άποψή μου για την εντολή Δεδομένα, όπως λέει ο Ευριπίδης. Καταλήγω όμως στο συμπέρασμα ότι ο καθένας μας δίνει διαφορετική ερμηνεία για αυτήν. Μάλλον όλες οι υπόλοιπες διαφωνίες μας πηγάζουν ακριβώς από αυτό! Και λίγο πιο πριν ο Βαγγέλης πρόσθεσε ακόμα μία διαφορετική εκδοχή για τη λειτουργία της, αυτήν της εκχώρησης τιμών! Μάλιστα, φέρνοντας τώρα στο μυαλό μου αυτό που είχε γράψει (με κάπως άγαρμπο τρόπο) ο Γιώργος παλιότερα, ότι αυτά είναι πράγματα που ο καθένας τα καταλαβαίνει μέσα σε 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...

(συνεχίζεται λόγω μεγέθους)

Νίκος Αδαμόπουλος

#224
(συνέχεια από το προηγούμενο)

Παραμένει όμως το ερώτημα, τι θα γίνει με την αναφορά στην πολύπαθη σελίδα 56 του βιβλίου:

Με τον όρο στατική δομή δεδομένων εννοείται ότι το ακριβές μέγεθος της απαιτούμενης κύριας μνήμης καθορίζεται κατά τη στιγμή του προγραμματισμού τους, και κατά συνέπεια κατά τη στιγμή της μετάφρασής τους και όχι κατά τη στιγμή της εκτέλεσης τους προγράμματος.

Ξεχνάμε όμως ότι άλλο αλγόριθμος, άλλο πρόγραμμα. Άλλη είναι η φάση της δημιουργίας του κώδικα του αλγορίθμου και άλλη η φάση της δημιουργίας του κώδικα του προγράμματος. Στην σελ. 117 κεφάλαιο 6 «Εισαγωγή στον Προγραμματισμό», κεφάλαιο στο οποίο ο μαθητής πλέον ξεκινά και μπαίνει στην έννοια του προγραμματισμού, ενώ από το κεφάλαιο 7 στην ΓΛΩΣΣΑ, αναφέρει:

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


Το ότι ο αλγόριθμος της σελ. 90 δεν μπορεί να γραφτεί σε ΓΛΩΣΣΑ παρά μόνο αν στα a και b εκχωρηθούν σταθερές τιμές, εμένα δεν μου λέει τίποτα αυτό, αφού μπορεί να υλοποιηθεί σε άλλες γλώσσες προγραμματισμού. Αυτό αφορά το 3ο από τα παραπάνω στάδια. Άλλωστε, ήδη καταλήξαμε ότι δεν γίνεται να μετατραπούν όλοι οι αλγόριθμοι του βιβλίου στην ΓΛΩΣΣΑ του βιβλίου! Έτσι, ο συγκεκριμένος περιορισμός για το μέγεθος του πίνακα αφορά τη ΓΛΩΣΣΑ και όχι την ψευδογλώσσα. Δεν αφορά ούτε καν όλες τις γλώσσες προγραμματισμού. Όταν κάποιος γράφει σε ψευδογλώσσα δεν βρίσκεται ακόμα στο στάδιο του προγραμματισμού. Όταν (και αν) θελήσει να κωδικοποιήσει τον αλγόριθμο σε συγκεκριμένη γλώσσα προγραμματισμού τότε όντως θα δει τι του προσφέρει και τι όχι η εκάστοτε γλώσσα και τότε θα αποφασίσει τι θα κάνει.

Επομένως όταν ένα θέμα ζητάει να γραφτεί αλγόριθμος, δεν θα έπρεπε να μας απασχολεί το αν αυτός μπορεί να μετατραπεί σε ΓΛΩΣΣΑ, άρα ούτε και οι δεσμεύσεις και οι περιορισμοί της ΓΛΩΣΣΑΣ. Αυτός είναι και ο σκοπός της αλγοριθμικής: να μας απαλλάξει από τις λεπτομέρειες των γλωσσών και τις προγραμματιστικές τεχνικές υλοποίησης των αλγορίθμων και να προάγει την ανάπτυξη της αλγοριθμικής σκέψης των μαθητών. Όπως είχαμε αναφέρει και στην ημερίδα της Αθήνας: Ναι στην αλγοριθμική! Όχι στον προγραμματισμό!

Υ.Γ. 1

Διαπιστώνω πάντως ότι υπάρχει μία σύγχυση και διαφωνία στην ερμηνεία του καθενός μας πάνω σε σειρά ζητημάτων: α) τι σημαίνει «δίνεται πίνακας Α μεγέθους Ν» (θα είναι γνωστό από την αρχή και το Ν και ο πίνακας Α; Μόνο το Ν; ...), β) τι σημαίνει «θα είναι γνωστό από την αρχή» (όταν θα γράφεται ο κώδικας; όταν ξεκινήσει η εκτέλεση; ...), γ) τι νόημα έχει να μιλάμε για στατικότητα σε αλγορίθμους από τη στιγμή που δεν είναι σίγουρο ή/και υποχρεωτικό ότι ο αλγόριθμος θα εκτελεστεί από Η/Υ;

Υ.Γ. 2

Επίσης, θα έλεγα ότι η αναφορά στη σελίδα 56 του βιβλίου, αποτελεί μάλλον μια ιστορική αναφορά περί της αντίληψης της στατικότητας, που μπορεί να ίσχυε παλιά (βλ. pascal) αλλά που δεν μπορούμε να δεχτούμε σήμερα.

Ως ανάλογο, θα ανέφερα την πρόταση του βιβλίου ότι στην εντολή Για όταν το βήμα είναι 0 έχουμε άπειρες επαναλήψεις! Οι εμπλεκόμενοι σε βάθος με το μάθημα ήδη θεωρούν αστείο αυτόν τον ισχυρισμό (για την περίπτωση που η αρχική τιμή του μετρητή είναι μεγαλύτερη της τελικής τιμής), και αν κάποια ΚΕΕ στο μέλλον έκανε χρήση αυτού του σημείου για να βγάλει θέμα, τι θα λέγαμε τότε; Ότι το λέει το βιβλίο; Πάλι χαμός δεν θα γινόταν;

Υ.Γ. 3

Το τσουνάμι των μηνυμάτων από τους συναδέλφους δηλαδή δεν απασχολεί κανέναν; Είναι τυχαίο; Δεν νομίζω!

Υ.Γ. 4

Αφού το ζήτημα της στατικότητας των πινάκων στους αλγορίθμους θεωρήθηκε  πλέον ζήτημα κεφαλαιώδους σημασίας για το μάθημά μας, τότε γιατί όσοι υποστηρίζετε σθεναρά την συγκεκριμένη άποψη δεν δώσατε την ανάλογη προσοχή κατά τη διδασκαλία του μαθήματός σας, ώστε να το τονίσετε στους μαθητές σας, και να μην πάνε ακόμα και οι καλύτεροι από αυτούς να κάνουν χρήση πίνακα στο θέμα 3, όπως έχετε παραδεχτεί;

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

Υ.Γ. 5

Η άποψη ότι αν δεχτούμε τα παραπάνω τότε όλα θα λύνονται με πίνακες, παρόλο που δεν την θεωρώ ως πιθανή κατάληξη, ωστόσο δεν καταλαβαίνω γιατί θα πρέπει να εμπλέκεται και να αναφέρεται μαζί τα παραπάνω. Ακόμα κι αν προέκυπτε, δεν θα έπρεπε να ξεκινήσουμε ανάποδα και να αλλάξουμε όλο το οικοδόμημα της αλγοριθμικής ώστε να το αντιμετωπίσουμε. Θα έπρεπε να βρούμε άλλες λύσεις. Π.χ. να το επισημαίνει η εκφώνηση της άσκησης, αν δεν βρεθεί κάτι άλλο πιο κομψό!

Υ.Γ. 6

Όλα τα παραπάνω δεν καλύπτουν το σύνολο των επιχειρημάτων μου περί χρήσης πίνακα στο θέμα 3, μένω όμως για την ώρα σε αυτά επειδή αποτελούν μία ενιαία ενότητα επιχειρημάτων.