σελ 90 σχολικό βιβλίο (όπως πολύ εύστοχα εντόπισε ο συνάδελφος): Υλοποιεί αλγόριθμο χρημιμοποιώντας πίνακα με άγνωστο αρχικά πλήθος στοιχείων.
Αλγόριθμος Δύναμη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]
Τέλος_επανάληψης
Σελ 32 Τετράδιο Μαθητή Αραιοί Πίνακες είναι προφανές ότι το μέγεθος του πίνακα που δημιουργείται καθορίζεται κατά τη στιγμή της εκτέλεσης. Δεν γνωρίζεις από πριν τον αριθμό των μη μηδενικών στοιχείων του δισδιάστατου πίνακα.
Αντί να αποθηκεύσουμε αυτόν το δισδιάστατο πίνακα 4x5, θα θεωρήσουμε ένα μο-
νοδιάστατο πίνακα όπου θα τοποθετήσουμε μόνο τα μη μηδενικά στοιχεία, για τα ο-
ποία όμως χρειαζόμαστε τα στοιχεία των αντίστοιχων γραμμών και στηλών. Έτσι κα-
ταλήγουμε κάθε μη μηδενικό στοιχείο να αντιπροσωπεύεται από μία τριάδα στοι-
χείων, δηλαδή <γραμμή,στήλη,τιμή>. Για το λόγο αυτό δημιουργούμε ένα μονοδιά-
στατο πίνακα 18 θέσεων για τα 6 μη μηδενικά στοιχεία του αρχικού πίνακα.
Θα προσπαθήσω να αναλύσω τα 2 παραδείγματα που αναφέρονται μέσα στο πακέτο (αυτό με την ύψωση σε δύναμη και αυτό με τους αραιούς) ως προς τη δήλωση Δεδομένα και το μέγεθος των πινάκων.
Καταρχήν γράφω πως κατά τη γνώμη μου λειτουργεί η δήλωση Δεδομένα.
Το Δεδομένα //χ// σημαίνει το πιο απλό που θα μπορούσε με βάση την έννοια της λέξης «δεδομένα»: ότι το χ είναι δεδομένο και ξέρουμε την τιμή του. Αυτό μας επιτρέπει να δηλώσουμε το μέγεθος του πίνακα όπως χρειαστεί αν εξαρτάται αποκλειστικά από το χ. Δεν είναι σωστό να προχωρήσουμε σε άλλη παραδοχή πέρα από αυτή που περιγράφω και είναι απολύτως προφανής. Το να προσπαθήσουμε να το συσχετίσουμε με τον τμηματικό είναι νομίζω αυθαίρετο. Παρόλα αυτά δεν νομίζω ότι δημιουργεί ασυνέπεια.
Στο παράδειγμα με τους αραιούς (τετράδιο μαθητή σελίδα 32-33) λέει καθαρά ότι το πλήθος των μη μηδενικών στοιχείων είναι n. Αυτό σημαίνει ότι θέλουμε μονοδιάστατο πίνακα 3n θέσεων. Προσέξτε πως δηλώνεται αυτό:
Δεδομένα //sparse, n//
Το σημαντικό είναι ότι το n περιλαμβάνεται στα δεδομένα δεν είναι το μέγεθος του πίνακα. Το μέγεθος του πίνακα είναι 3n. Το n απλά το γνωρίζουμε και άρα μπορούμε να δηλώσουμε το μέγεθος του κατάλληλου πίνακα (που εδώ είναι 3n).
Στο σημείο αυτό πρέπει να ξεκαθαρίσουμε κάτι: Θα ήταν αρχικά λογικό να σου δίνουν έναν τελείως άγνωστο πίνακα και να σου ζητάνε συμπίεση. Δηλαδή αυτό θα θέλαμε να κάνει μια αληθινή εφαρμογή και όχι να το θεωρεί δεδομένο και άρα να λειτουργεί μόνο για αυτό. Στο σημείο αυτό θέλω να πω ότι έτσι κι αλλιώς δεν έχει νόημα να μιλάμε για συμπίεση στατικής δομής αφού το μέγεθος που καταλαμβάνεις τη μνήμη δε θα αλλάξει. Η συμπίεση είναι για αρχεία. Απλά επειδή θέλει να μας δείξει τον αλγόριθμο συμπίεσης χρησιμοποιεί τη μόνη διαθέσιμη δομή που έχουμε και επιτρέπει ομαδικό χειρισμό των δεδομένων (τον πίνακα).
Προσοχή τώρα στο εξής:
Αν ο πίνακας έχει μέγεθος κάποιο γνωστό αριθμό από την εκφώνηση (πχ μας λέει η εκφώνηση ότι το πλήθος των στοιχείων είναι ακριβώς ή το πολύ 100 και τα περιεχόμενά του είναι δεδομένα, τότε η δήλωση δεδομένα γράφεται
Δεδομένα //Α//
Δεν γράφεται //Δεδομένα Α, 100// γιατί το 100 εννοείται ότι είναι δεδομένο. Ένα τέτοιο χαρακτηριστικό παράδειγμα μπορούμε να δούμε στο τετράδιο μαθητή κεφάλαιο 4 παράδειγμα 1 (σελίδα 37-38). Ο πίνακας με τα τηλέφωνα έχει μέγεθος 1000 και η δήλωση είναι Δεδομένα // THL//
Εννοείται πως αν ο πίνακας είναι αρχικά άδειος και τα στοιχεία του θα τα γεμίσουμε εμείς τότε δεν γράφεται τίποτα στα δεδομένα. Τα περιεχόμενά του είναι άδεια, άρα δεν έχει νόημα το Δεδομένα //Α// και το πλήθος του είναι γνωστό πχ 100 και δεν έχει νόημα σταθερός συγκεκριμένος αριθμός να μπει μέσα στα Δεδομένα.
Αυτό θεωρώ ότι συμβαίνει στο παράδειγμα με την ύψωση σε δύναμη στο βιβλίο μαθητή στη σελίδα 89-90. Τα περιεχόμενα του πίνακα δεν υπάρχουν από πριν και κατασκευάζονται από τον αλγόριθμο. Οπότε δεν έχει νόημα ο πίνακας power να είναι στα δεδομένα. Το μέγεθος του πίνακα θεωρείται γνωστό αριθμός (πχ 100) και δεν δηλώνεται. Το ερώτημα είναι: πόσο μεγάλο χρειάζεται να είναι αυτό το μέγεθος; Πως μεγαλώνει το πλήθος των χρησιμοποιούμενων με βάση τους αριθμούς που δίνονται για ύψωση σε δύναμη α^β;
Δεν έκατσα να το δω πολύ προσεκτικά αλλά βλέποντας το σχήμα στην πρώτη θέση του πίνακα είναι η δύναμη α^0, στην δεύτερη α^1, μετά το α^2, α^4, α^8 και γενικά στη θέση ν του πίνακα μπαίνει το α^(2^(ν-2)). Ατό σημαίνει ότι αγνοώντας κάτι σταθερούς όρους βγαίνει ότι για να υψώσεις στην b θέλεις περίπου (τάξη) λογάριθμο με βάση 2 του b. Πχ για να υψώσεις στην 1000000 θέλεις γύρω στις 20 θέσεις στον πίνακα. Με δεδομένο ότι οι υπολογιστές έχουν και κάποιο όριο στους αριθμούς που υποστηρίζουν με ένα πίνακα 100 θέσεων είσαι ΟΚ και πολλά λέω.
Το συγκεκριμένο παράδειγμα μπορείς να το δεις και διαφορετικά. Δηλαδή να δεχτείς ότι ο αλγόριθμος υπολογίζει μόνο για τα συγκεκριμένα a και b την ύψωση σε δύναμη a^b και ότι αυτό σου δίνει τη δυνατότητα να ξέρεις το μέγεθος του πίνακα που είναι μια λογαριθμική συνάρτηση του b (πιθανόν λίγο ολισθημένη λόγω κάποιων σταθερών). Δηλαδή μια λογική που ισχύει και στο παράδειγμα της συμπίεσης των πινάκων που εκ των πραγμάτων (λόγω του ότι η στατική δομή δεν μπορεί να μειώσει τον αποθηκευτικό της χώρο) μιλάμε για συγκεκριμένους πίνακες μόνο και μόνο για να δείξουμε τον αλγόριθμο.
Εγώ με βάση το βιβλίο και λαμβάνοντας υπόψη την παιδαγωγική σκοπιά του πράγματος θεωρώ ότι δεν είναι δυνατόν σε ένα εκπαιδευτικό πλαίσιο να δεχόμαστε λύσεις σε ψευδογλώσσα που δεν μεταφέρονται ακριβώς σε ΓΛΩΣΣΑ γιατί τότε ο μαθητής θα φτιάξει ένα κώδικα σε ψευδογλώσσα και όταν θα πάει στο εργαστήριο για υλοποίηση θα πρέπει να τον αλλάξει. Άρα δε μεταφέρει αυτό που έγραψε στο χαρτί αλλά κάτι άλλο.
Δε με νοιάζει αν μελλοντικά φτιάξουμε ένα περιβάλλον με δυναμικούς πίνακες. Απλά πιστεύω ότι με βάση το υπάρχον βιβλίο είναι εκτός συζήτησης. Καλώς ή κακώς το βιβλίο ξεκαθαρίζει ότι ασχολείται μόνο με στατικές δομές.
Σε προηγούμενο μήνυμά μου πιστεύω ότι απέδειξα ότι αν δεχτούμε σα λύση το
Διάβασε ν
Για ι από 1 μέχρι ν
Διάβασε α[ι]
Τέλος_επανάληψης
ενώ δεν ξέρουμε το μέγεθος του πίνακα (πχ θέμα Γ) τότε πρέπει να δεχτούμε και το
Διάβασε ν
Για ι από 1 μέχρι ν
Διάβασε α[ι]
Τέλος_επανάληψης
Διάβασε α[ν+1]
Καθώς και το
Διάβασε ν
Για ι από 1 μέχρι ν
Διάβασε α[ι]
Τέλος_επανάληψης
Διάβασε κ
Διάβασε α[ν+κ]
Αλλά και το
ι<-0
Διάβασε χ
Όσο χ <>0 επανάλαβε
ι<-ι+1
Α[ι]<-χ
Διάβασε χ
Τέλος_επανάληψης
βλέπε μήνυμα
https://alkisg.mysch.gr/steki/index.php?topic=2953.msg29448#msg29448Αλλά το τελευταίο σημαίνει δυναμική δομή. Οπότε με βάση το υπάρχον πακέτο δεν γίνεται.
Το πρόβλημα του βιβλίου είναι πως ορίζει τις στατικές δομές στη σελίδα 56. Είναι όμως δυνατόν να οριστεί το μέγεθος κατά την εκτέλεση και η δομή να είναι στατική αφού δεν αλλάζει ο αποθηκευτικός χώρος. Όμως η πρόθεση των συγγραφέων για στατική δομή και όχι δυναμική είναι ξεκάθαρη. Η αποδοχή της λύσης
Διάβασε ν
Για ι από 1 μέχρι ν
Διάβασε α[ι]
Τέλος_επανάληψης
στηριζόμενη στα παραδείγματα του διδακτικού πακέτου, οδηγεί τελικά στη χρήση δυναμικών δομών και για αυτό κατά τη γνώμη μου δεν πρέπει να θεωρηθεί σωστή.