ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΚΛΗΣΗ ΚΑΤΑ ΑΝΑΦΟΡΑ ΚΑΙ ΚΑΤΑ ΑΞΙΑ

Ξεκίνησε από Kinik, 03 Μαρ 2006, 11:00:07 ΠΜ

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

gpapargi

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

Αν περάσουμε σταθερές στη διαδικασία θα πρέπει να εξηγήσουμε στους μαθητές ότι υπάρχει μια κάπως διαφορετική αντιμετώπιση όταν περνάμε σταθερά και όταν περνάμε μεταβλητή. Είναι αυτό που μεταξύ μας λέμε ότι στις σταθερές έχουμε call by value  και στις μεταβλητές έχουμε call by value result.

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

Αν δεχτούμε το πέρασμα σταθερών σε διαδικασίες νομίζω πως αυτή θα είναι μια απαραίτητη άσκηση αφού θα δείχνει το πώς ακριβώς παίζεται το παιχνίδι.

Τη ΓΡΑΨΕ την αντιμετώπισα λίγο διαφορετικά από διαδικασία (σαν μια εντολή με δική της σύνταξη) αφού έτσι κι αλλιώς δεν καλείται όπως όλες οι διαδικασίες  με ΚΑΛΕΣΕ ΓΡΑΨΕ (μήνυμα). Στο θέμα των παραστάσεων δεν το θεωρώ τόσο σημαντικό γιατί δεν με αναγκάζει να δώσω εξηγήσεις πάνω σε άλλα πράγματα. Στο θέμα των σταθερών σε διαδικασία όμως το πράγμα συνοδεύεται από νέες εξηγήσεις.

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

Για να είμαι ειλικρινής, μέσα μου διατηρώ κάποια επιφύλαξη για το αν συνειδητά βάλανε σταθερά στη διαδικασία ή αν τους ξέφυγε σε αυτό το σημείο. Η εντύπωση που μου έχουν δώσει δεν είναι ότι ασχολήθηκαν με όλες τις λεπτομέρειες (λογικό). Μόνο αν κάνεις υλοποίηση έρχεσαι αντιμέτωπος με όλες τις λεπτομέρειες. Θυμάμαι μια φορά μίλησα και εγώ με κάποιον συγγραφέα και τον ρώτησα κάτι για τη ΓΛΩΣΣΑ (νομίζω για προτεραιότητα μεταξύ ‘Α’ και ‘α’). Και μου απάντησε «Δεν ξέρω. Ρώτα κάποιον από αυτούς που κάνανε υλοποίηση». Δηλαδή αυτοί σε όρισαν ως τον πλέον ειδικό στη ΓΛΩΣΣΑ και λέγε εσύ ότι θέλεις  ;D

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

alkisg

#16
Εγώ έχω την εντύπωση πως όταν οι συγγραφείς έγραφαν το κεφάλαιο 10 είχαν στο νου τους περισσότερο την Basic. Η Basic υποστηρίζει "ασαφείς" κλήσεις, δηλαδή οι μεταβλητές περνιούνται αυτόματα με αναφορά, ενώ οι σταθερές και οι εκφράσεις αυτόματα με τιμή. Και αν κάποιος θέλει να περάσει μια μεταβλητή σε μια διαδικασία με τιμή, τότε κάνει την μεταβλητή έκφραση είτε βάζοντάς τη μέσα σε παρενθέσεις (α) είτε προσθέτοντας μηδέν κτλ.
Με αυτόν τον τρόπο γλυτώνεις τον κόπο των δηλώσεων var της Pascal, ή in, out, byval, byref κτλ άλλων γλωσσών.

Δυστυχώς η εξήγηση του περάσματος παραμέτρων "με αναφορά" είναι πιο δύσκολη απ' ότι "με αντιγραφή", γιατί στην πρώτη ουσιαστικά θα πρέπει να μιλήσεις για pointers. Υποθέτω ότι γι' αυτό περιγράψανε τον μηχανισμό με αντιγραφή: "...όταν εκτελεστεί η εντολή ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ, οι μεταβλητές της διαδικασίας δίνουν τις τιμές που περιέχουν στις αντίστοιχες μεταβλητές που περιλαμβάνονται στην κλήση της διαδικασίας...". Με μια γραμμή εξηγείται ο μηχανισμός.

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

Δυστυχώς τα παραδείγματα με υποπρογράμματα είναι λίγα και απλά, οπότε δε βρήκα άλλο αντιπαράδειγμα εκτός από τους πύργους του Ανόι (σελ. 106 τετραδίου μαθητή): [glossa]ΚΑΛΕΣΕ Μετακίνησε(Ν-1, ΣτύλοςΑ, ΣτύλοςΓ, ΣτύλοςΒ)[/glossa] Ο συγγραφέας σε εκείνο το σημείο θεώρησε προφανές ότι μπορεί να καλέσει μια διαδικασία χρησιμοποιώντας είτε σταθερά (οι στύλοι είναι δηλωμένοι ως ΣΤΑΘΕΡΕΣ) είτε έκφραση (το Ν-1). Γιατί να μην το θεωρήσουμε κι εμείς προφανές;

Εξάλλου το βιβλίο στη σελίδα 209 αναφέρει ότι "...από τη στιγμή που θα έχει δημιουργηθεί (ένα υποπρόγραμμα), η χρήση του δεν διαφέρει από τη χρήση των ενσωματωμένων συναρτήσεων που παρέχει η γλώσσα προγραμματισμού, όπως για τον υπολογισμό του ημίτονου ή του συνημίτονου ή την εντολή με την οποία εκτελεί μία συγκεκριμένη διαδικασία, για παράδειγμα γράφει στην οθόνη (εντολή ΓΡΑΨΕ)". Αφού η χρήση τους δε διαφέρει, και επιτρέπεται να πούμε ΓΡΑΨΕ "Μήνυμα", γιατί να μην μπορούμε να πούμε και ΕΜΦΑΝΙΣΕ("Μήνυμα");

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

Όσο για την πονηρή άσκηση που ανάφερες... να το πω ευγενικά... γι' αυτόν που θα βάλει τέτοια άσκηση δεδομένης της ασάφειας... χμ... κάτι με γιαούρτια και ντομάτες μου έρχεται!  ;D

gpapargi

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

Το βιβλίο το κάνει. ʼρα μπορούμε να το κάνουμε και εμείς και είμαστε καλυμμένοι. Αν μας πουν οτιδήποτε μπορούμε να επικαλεστούμε το βιβλίο.

Τα υπόλοιπα δε μου φαίνονται τόσο ισχυρά. Έχουμε παραδείγματα που το βιβλίο κάνει και λάθη, έχει και ασάφειες, έχει και αντιφάσεις. Δε μου έχουν δώσει την αίσθηση ότι όλα όσα γράφουν είναι απόλυτα ζυγισμένα. Συχνά στέκονται στη γενική ιδέα και δεν καλύπτουν τα πάντα. ʼλλωστε αν δεχτούμε το πέρασμα σταθερών, τότε το απόσπασμα της 10.5.3 που ανέφερα ανήκει σε αυτή την κατηγορία.  Ανθρώπινα είναι όλα. Το βιβλίο είναι εκπαιδευτικό και δεν είναι πάντα σωστό να πνιγούμε στην αυστηρότητα. Για κόψιμο βαθμών… ούτε λόγος να γίνεται. Εδώ δεν κόβουμε σε περιττή χρήση πινάκων και περιττή ταξινόμηση.

Στο θέμα της πονηρής άσκησης με προβληματίζουν τα εξής:

Αν δεχτούμε το πέρασμα σταθερών τότε η πονηρή άσκηση εξηγεί ακριβώς αυτό το σημείο. Παρόλα αυτά δε μου κάθεται όμορφα αυτή η άσκηση. Τη θεωρώ και εγώ τραβηγμένη σε σημείο ντομάτας. Κι όμως εξηγεί ακριβώς το κρίσιμο σημείο. Ψάχνοντας μέσα μου συνειδητοποίησα ότι αυτό που με χαλάει (εμένα προσωπικά) είναι ότι δεν είμαι απόλυτα σίγουρος για το πέρασμα σταθερών. Και δε θέλω να θίξω ένα δύσκολο ζήτημα όταν δεν είμαι απόλυτα σίγουρος. Υπάρχει κίνδυνος να εξηγήσω δύσκολα πράγματα που τελικά δεν ισχύουν. Αν όμως είμαι 100% σίγουρος δε βλέπω λόγο να μην κάνω τη σχετική κουβέντα (δε μιλάω για εξετάσεις). Θίγει ακριβώς το κρίσιμο σημείο. Με τέτοιες οριακές ασκήσεις δείχνουμε πως δουλεύουν τα πράγματα. Αν δεν το κάνω αισθάνομαι σα να σηκώνω το χαλί και να κρύβω από κάτω κάποια ένοχα μυστικά. Εγώ θέλω να ρίχνω άπλετο φως στα σκοτεινά σημεία. Θα ήθελα ένα καλό λόγο για να διδάξω το πέρασμα σταθερών αλλά όχι τη συγκεκριμένη άσκηση. Γιατί να το αποφύγω; Αν και γενικά σε κατάλαβα, η τελευταία σου παράγραφος με μπέρδεψε. Κάνεις και λόγο για κάποια ασάφεια. Κατά τη γνώμη σου υπάρχει τελικά ή όχι;

nekis

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

gpapargi

Με προβλημάτισε πολύ το συγκεκριμένο θέμα. Ακολουθεί το latest version των απόψεών μου (μέχρι να αλλάξει πάλι)  ;D

Αν δεχτούμε το πέρασμα σταθερών σε διαδικασίες θα πρέπει να δεχτούμε ότι υπάρχουν 2 είδη παραμέτρων στις διαδικασίες (οι call by value και οι call by value result). Και θα πρέπει να εξηγήσουμε τη διαφορά τους παρά το ότι εμείς τις χειριζόμαστε με τον ίδιο τρόπο (χωρίς δείκτες, var).

Επίσης (κατά τη γνώμη μου) δεν πρέπει να αναφέρουμε τους όρους «call by reference», «call by value» και «call by value result» αφού αυτοί είναι όροι για να συνεννοηθούμε μεταξύ μας και δεν αφορούν τους μαθητές.

Στις συναρτήσεις αυτό το θέμα δεν τίθεται αφού το βιβλίο επιβάλει να επιστρέφονται δεδομένα μόνο μέσω της τιμής επιστροφής της συνάρτησης.

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

Φαίνεται να καταλήγω στα εξής:

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

Από την άλλη μεριά στο βιβλίο υπάρχει η φράση:

"...όταν εκτελεστεί η εντολή ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ, οι μεταβλητές της διαδικασίας δίνουν τις τιμές που περιέχουν στις αντίστοιχες μεταβλητές που περιλαμβάνονται στην κλήση της διαδικασίας..."

Για μένα εννοεί ότι «ΟΛΕΣ οι μεταβλητές της διαδικασίας δίνουν τις τιμές που περιέχουν στις αντίστοιχες μεταβλητές που περιλαμβάνονται στην κλήση της διαδικασίας...»

Αυτό το «ΟΛΕΣ» μας είχε κάνει να διαφωνήσουμε ξανά Άλκη πέρυσι στο θέμα 1Β4. Είναι κάτι που το θεωρώ μέσα στον μαθηματικό τρόπο ερμηνείας μιας πρότασης γραμμένης στα ελληνικά. Από κει και πέρα για να μπορούν όλες οι μεταβλητές της διαδικασίας να δώσουν τις τιμές τους στις αντίστοιχες μεταβλητές του προγράμματος θα πρέπει οι αντίστοιχες μεταβλητές του προγράμματος να έχουν το ίδιο πλήθος με αυτές της διαδικασίας. Αλλιώς δεν θα μπορούν όλες οι μεταβλητές της διαδικασίας να δώσουν τιμές, παρά μόνο αυτές που αντιστοιχούν σε μεταβλητές (και όχι σε σταθερές). Αυτό για μένα απορρίπτει τη χρήση σταθερών.

Ξέρω ότι μάλλον δε συμφωνείς με την ερμηνεία μου. Θέλω όμως να είναι σαφές το πως το ερμηνεύω. Ουσιαστικά είναι συνεπές με αυτό που έλεγα πέρυσι στο 1Β4.

Για μένα λοιπόν υπάρχει αντίφαση στο διδακτικό πακέτο. Έχουμε 2 σημεία που λένε διαφορετικά πράγματα.

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

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

alkisg

Γιώργο σαν συμπέρασμα συμφωνούμε, δηλαδή κι εγώ στους μαθητές μου θα έλεγα να μη χρησιμοποιούνε εκφράσεις κατά την κλήση διαδικασιών, όχι όμως επειδή θεωρώ ότι είναι αμφιλεγόμενο, αλλά επειδή είναι πιθανό να βρεθεί κάποιος που να το θεωρήσει λάθος. Από την άλλη θα ήθελα να προτείνω στους συναδέλφους να μη θεωρούν λάθος ούτε καν εξεζητημένα παραδείγματα όπως
ΚΑΛΕΣΕ Εμφάνισε(Μέγιστος(2, 3))
όπου
ΔΙΑΔΙΚΑΣΙΑ Εμφάνισε(α) !Εμφανίζει έναν ακέραιο
ΣΥΝΑΡΤΗΣΗ Μέγιστος(α, β): ΑΚΕΡΑΙΑ !Επιστρέφει τον μεγαλύτερο από τους α, β

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

Σελ. 186: Ο δείκτης (ενός πίνακα) είναι μία μεταβλητή που μπορεί να έχει οποιοδήποτε δεκτό όνομα...
Αν το παρατραβήξουμε: ΟΛΟΙ οι δείκτες είναι μεταβλητές, και άρα στην ταξινόμηση φυσαλίδας απαγορεύεται να πούμε Α[ι-1], θα πρέπει να θέσουμε κ = ι-1 και να πούμε Α[κ].
Στην ανακεφαλαίωση της σελίδας 200 αναφέρει ότι ο δείκτης μπορεί να είναι μεταβλητή ή σταθερά (δηλαδή και πάλι όχι έκφραση, πάλι απαγορεύεται το ι-1)!

Σελ. 174: Χαρακτηριστικό της επανάληψης αυτής (της ΟΣΟ) είναι ότι ο αριθμός των επαναλήψεων δεν είναι γνωστός, ούτε μπορεί να υπολογιστεί πριν από την εκτέλεση του προγράμματος.
Αν το παρατραβήξουμε: απαγορεύεται να χρησιμοποιούμε ΟΣΟ για γνωστό αριθμό επαναλήψεων.

Σελ. 188: Η ανάγνωση, η επεξεργασία και η εκτύπωση των στοιχείων των πινάκων γίνονται πάντοτε από βρόχους...
Αν το παρατραβήξουμε: ΟΛΩΝ των στοιχείων, δηλαδή δεν επιτρέπεται
ελάχιστος = Α[1]
θα πρέπει να πούμε
για ι από 1 μέχρι 1
  ελάχιστος = Α[ι]
τέλος_επανάληψης

Σελ. 155: Σε μια εντολή εκχώρησης η μεταβλητή και η έκφραση πρέπει να είναι του ιδίου τύπου.
Αν το παρατραβήξουμε: Δεν επιτρέπεται το πραγματικός_αριθμός = ακέραιος_αριθμός

κτλ κτλ, υπάρχουν πολλές τέτοιες φράσεις που αν θέλουμε μπορούμε να τις παρεξηγήσουμε...
Μου φαίνεται πρέπει να ανοίξουμε και ένα topic για να συζητήσουμε το πώς πρέπει να διαβάζουμε το βιβλίο! :) :) :)

Καλό ΣΚ,
Άλκης

gpapargi

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

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

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

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


alkisg

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

Μικρή ερωτησούλα: υπάρχει λόγος που αναφέρεσαι συνέχεια σε "σταθερές" και δεν το γενικεύεις με το "εκφράσεις";

gpapargi

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

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

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

Καταλαβαίνω ότι αυτό θέτει και θέμα εντολής καταχώρησης πριν την κλήση αναδρομικών διαδικασιών.

Για να είμαι ειλικρινής, για να είμαι σίγουρος ότι επιτρέπεται η χρήση σταθερών στις διαδικασίες θα ήθελα να δω μερικά παραδείγματα στο βιβλίο που να καλούν διαδικασίες (όχι συναρτήσεις) με σταθερές ή με έκφραση. Θα προτιμούσα να μην είναι αναδρομικές οι διαδικασίες γιατί η αναδρομή αλλάζει τα δεδομένα της κουβέντας. Η αναδρομή είναι ένα δύσκολο θέμα και γι αυτό είναι εκτός ύλης. Προσωπικά πιστεύω ότι δε θα μπει ποτέ στην ύλη ή θα αργήσει πάρα πολύ. Αν ήταν μέσα στην ύλη θα άλλαζε δραματικά τα δεδομένα της κουβέντας. Όταν το μάθημα έχει τέτοιο επίπεδο που να επιτρέπει την κουβέντα αναδρομής, τότε δε θα είχα κανένα πρόβλημα να μιλήσω για δείκτες, για call by value, για call by reference και για call by value result. Αν ήταν η αναδρομή μέσα στην ύλη πιστεύω ότι ίσως τελικά χρησιμοποιούσαμε την υλοποίηση της C που δίνει και ανεξαρτησία στα υποπρογράμματα και στο θέμα των πινάκων. Οι ενστασεις μου στηρίζονται στο ότι με χρήση σταθερών ξεφεύγει το επίπεδο του μαθήματος (αν βέβαια εξηγούμε ότι κάνουμε).

Αν έχεις επαφή με τους συγγραφείς θα έλεγα να τους θέσεις το ερώτημα. Αν πουνε ναι στη χρήση σταθερών τότε εγώ είμαι καλυμμένος. Προσωπικά έθεσα πιο παλιά κάποιο ερώτημα σε κάποιο συγγραφέα και δε μου απάντησε (πέρυσι μου είχε απαντήσει). Οπότε δεν ήθελα να γίνω κουραστικός. Αν όμως εσύ έχεις επαφή θα έλεγα να το κάνεις. Καλό θα ήταν να απαντήσουν περισσότεροι από ένας. Θα πρέπει όμως να τους πεις ότι αν κάνουμε κάτι τέτοιο τότε είμαστε υποχρεωμένοι να  μιλήσουμε για 2 διαφορετικά είδη παραμέτρων στις διαδικασίες χωρίς όμως εμείς να τα αντιμετωπίζουμε με διαφορετικό τρόπο. Δε θα είχα πρόβλημα αν βάζαμε ένα var. Αλλά ο ενιαίος χειρισμός διαφορετικών ειδών παραμέτρων είναι νομίζω αντιπαιδαγωγικός και πηγή σύγχισης για το μαθητή.
Μου φαίνεται κάπως ασυνεπές οι συγγραφείς να τονίζουν ότι δεν πρέπει να στεκόμαστε σε λεπτομέρειες υλοποίησης γιατί ξεφεύγει από το σκοπό του μαθήματος και ταυτόχρονα να μας αναγκάζουν εμμέσως να εξηγούμε τέτοια πράγματα.


KillBill

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

function f(x:integer):integer;
begin
x:=x*2;
result:=0;
end;

procedure p(x:integer);
begin
x:=x*2;
end;

program Project1;
var
  a, b, c:integer;
begin
a:=5;
p(a);
writeln(a);

b:=8;
c:=f(b);
writeln(b);
end.

Θα πάρω 5 και 8.
Δεν θα κάτσω να συζητήσω περί call by value και call by reference ή όπως αλλιώς λέγοντε, αλλά θα μείνω μόνο στο εξής απλό  συμπέρασμα που και κάποιος μαθητής ακόμα μπορεί να καταλάβει από τον παραπάνω κώδικα: Ότι συμπεριφορά έχουν οι παράμετροι στη  διαδικασία την ίδια συμπεριφορά έχουν και στην συνάρτηση. Το ίδιο συμβαίνει και με οποιαδήποτε άλλη γλώσσα προγραμματισμού  εκτός από την ΓΛΩΣΣΑ!

Δεν έχω καταλάβει γιατί στην ΓΛΩΣΣΑ να έχουμε θεωρήσει διαφορετική συμπεριφορά των παραμέτρων στην διαδικασία και διαφορετική  στη συνάρτηση. Υπάρχει κάπου γραμμένο στο βιβλίο αυτό; ή είναι κάτι που συμφωνήθηκε στο forum? Το βιβλίο εντάξει δεν λέει  τίποτα. Όμως σύμφωνα με τις ασκήσεις 9 και 10 στο τετράδιο του μαθητή σελίδα 112 (βλέποντας τις σωστές απαντήσεις στο  παράρτημα του βιβλίου) βλέπουμε ότι στη διαδικασία αν αλλαχτεί η τιμή της τυπικής παραμέτρου αλλάζει και αυτή της  πραγματικής. Άρα αυτή είναι συμπεριφορά των παραμέτρων. ʼρα αυτή θα πρέπει να είναι και στη συνάρτηση.
Αφού σε όλες τις γλώσσες προγραμματισμού του κόσμου είτε έχεις διαδικασία είτε συνάρτηση η συμπεριφορά των
παραμέτρων είναι κοινή και στα δύο όταν το πέρασμα γίνεται απλά με το όνομα της μεταβλητής (άλλες το θεωρούν by reference  άλλες by value άλλες δεν ξέρω εγώ τι αλλά τέλος παντων είναι κοινή η συμπεριφορά όπως στο παράδειγμά μου στην Pascal πιο  πάνω), γιατί εμείς να το διαφοροποιούμε;

Ευχαριστώ

evry


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

KillBill

@every:
Αφού σε όλες τις γλώσσες προγραμματισμού αν περάσω by reference μια παράμετρο σε μια ΣΥΝΑΡΤΗΣΗ τότε πχ στην C (παρόμοια και σε ΟΛΕΣ τις άλλες γλώσσες προγραμματισμού του κόσμου) θα έχω δύο επιστραφόμενες τιμές. Μία  με την return (με το όνομα της συνάρτησης δηλαδή) και μία από την παράμετρο που την περάσαμε by reference. Που το παράξενο δηλαδή, και γιατί ξενίζει τόσο αν η συνάρτηση επιστρέψει με αυτόν τον τρόπο 2 τιμές; Αφού αυτό ισχύει σε όλες τις γλώσσες.
Ναι ξέρω θα μου πείτε μα το βιβλίο λέει ότι επιστρέφει μια τιμή. Ε ναι ρε παιδιά μία επιστρέφει, ΜΕ ΤΟ ΟΝΟΜΑ ΤΗΣ όμως. Είναι δυνατό να επιστρέψει 2 με το όνομά της;

Το πιο λογικό είναι να υιοθετήσουμε ότι γίνεται σε ΟΛΕΣ τις γλώσσες προγραμματισμού του κόσμου. Δεν είναι δυνατόν να λέμε στα παιδιά ότι άλλη η συμπεριφορά των παραμέτρων στη διαδικασία και άλλη στη συνάρτηση. Η συμπεριφορά πρέπει να είναι κοινή! Γιατί; Γιατί έτσι γίνεται σε όλες τις γλώσσες του κόσμου! Τόσο απλά!

evry


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

Επίσης η έννοια του by reference δεν υπάρχει στο βιβλίο και ο τρόπος μεταβίβασης παραμέτρων δεν έχει καμία σχέση με την κλήση κατά αναφορά. Το είχαμε φέρει το θέμα κάποια στιγμή στο φόρουμ μαζί με άλλους συναδέλφους, πρόκειται για την κλήση call by value-result ή call by copy-restore. Αυτή η κλήση σε πόσες γλώσσες προγραμματισμού τη συναντάς? Και όμως υπάρχει στο βιβλίο και πρέπει να τη διδάξεις στα παιδιά.
     Τα παιδιά δεν τα ενδιαφέρει τι συμβαίνει στις διάφορες γλώσσες προγραμματισμού αλλά τι συμβαίνει στο συγκεκριμένο μάθημα. Επίσης ο σκοπός του μαθήματος δεν είναι να κάνει τα παιδιά προγραμματιστές, απλά να τους δείξει την αλγοριθμική σκέψη.
Η C για την οποία λες δεν έχει διαδικασίες έχει μόνο συναρτήσεις ή για την ακρίβεια έχει βαφτίσει συναρτήσεις όλα τα υποπρογράμματα.

Επίσης η C ΔΕΝ ΕΧΕΙ CALL BY REFERENCE (όπως και η Java), όλες οι παράμετροι περνάνε by value. Η C++ έχει By reference και η Pascal.

Επίσης δεν μας ενδιαφέρει τι γίνεται σε όλες τις γλώσσες του κόσμου, γιατί οι περισσότερες γλώσσες του κόσμου είναι για προγραμματιστές και δεν είναι σχεδιασμένες για μαθητές. 

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

Φιλικά
evry και όχι every
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr