ΓΡΑΨΕ, ΔΙΑΒΑΣΕ σε συνάρτηση (ασάφεια διδακτικού πακέτο

Ξεκίνησε από sstergou, 11 Φεβ 2010, 07:37:53 ΜΜ

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

Σε μία συνάρτηση

Δεν επιτρέπεται η χρησιμοποίηση των εντολών, ΓΡΑΨΕ, ΔΙΑΒΑΣΕ ούτε και η κλήση διαδικασίας.
Επιτρέπονται όλα τα παραπάνω. Η χρήση εντολών εισόδου-εξόδου όμως δεν είναι ενδεδειγμένη.

gthal

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

evry


   Δεν έχουμε κανένα σοβαρό παιδαγωγικό/διδακτικό και φυσικά επιστημονικό επιχείρημα να απαγορεύσουμε τα Διάβασε/Γράψε από τις Συναρτήσεις. Ναι είναι κακή πρακτική αλλά όχι λάθος. Μην φτάσουμε στο άλλο άκρο. Απλά αποτρέπουμε τους μαθητές να τα χρησιμοποιούν.  Είναι κακή πρακτική αλλά μέχρι εκεί.
Δεν μπορεί να βάζουμε κανόνες του στυλ αυτό γίνεται με συναρτήσεις και αυτό με διαδικασίες. Γιατί να γίνεται έτσι? Επειδή το λέει το βιβλίο ή επειδή το λέμε εμείς? Και στο κάτω κάτω ποιον διδακτικό σκοπό του μαθήματος εξυπηρετούν αυτοί οι κανόνες? Να μάθει ο μαθητής να χρησιμοποιεί κατασκευάσματα τα οποία δεν του προσφέρουν τίποτα σε γνωστικό επίπεδο, μόνο και μόνο για να μπορούμε να βάζουμε σαφή θέματα?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gthal

ΠΡΟΓΡΑΜΜΑ καλό_κακό_ή_απαγορεύεται
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: χ, ψ
ΑΡΧΗ
  χ <- ΔιάβασεΤιμήΣτοΔιάστημα (3, 5) 
  ψ <- ΔιάβασεΤιμήΣτοΔιάστημα (-5, 5) 
  ΓΡΑΨΕ (χ + ψ)/2
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ ΔιάβασεΤιμήΣτοΔιάστημα (α, β): ΠΡΑΓΜΑΤΙΚΗ
! Διαβάζει μια τιμή που είναι στο διάστημα [α,β]
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: α, β, χ
ΑΡΧΗ
  ΓΡΑΨΕ 'Δώσε έναν αριθμό στο διάστημα [', α, β, ']'
  ΔΙΑΒΑΣΕ χ
  ΟΣΟ χ < α Η χ > β ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ 'Αυτό δεν είναι στο διάστημα [', α, β, ']. Ξαναδώσε.'
    ΔΙΑΒΑΣΕ χ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΔιάβασεΤιμήΣτοΔιάστημα <- χ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


Θα μπορούσε κάποιος να μου εξηγήσει:
1. γιατί το παραπάνω να απαγορεύεται ;
2. ακόμα κι αν δεν απαγορεύεται, γιατί είναι ΚΑΚΗ πρακτική; (γιατί ούτε αυτό το καταλαβαίνω)
3. γιατί δεν είναι ίσως και ΚΑΛΗ πρακτική, αφού :
      α) απαλλάσσει το κυρίως πρόγραμμα από τη "σκοτούρα" του ελέγχου εγκυρότητας και εμφάνισης μηνυμάτων
          λάθους
      β) ελαττώνει τις γραμμές του κώδικα (ας μην αναφέρουμε ότι το κυρίως πρόγραμμα θα μπορούσε να είναι
          μόνο μία γραμμή και χωρίς μεταβλητές χ και ψ, γιατί τότε θα μπορούσε να αμφισβητηθεί η αναγνωσιμότητά
          του)
Φιλικά,
Γιώργος Θαλασσινός

andreas_p

Δεν είναι λάθος, αλλά αυτό ΔΕΝ είναι συνάρτηση. Η συνάρτηση εξ' ορισμού δέχεται τιμές , τις επεξεργάζεται, κάνει υπολογισμούς και επιστρέφει ΜΙΑ τιμή στο κυρίως πρόγραμμα.

Το παραπάνω είναι απλά μία διαδικασία.

! κύριο πρόγραμμα
    α <- 3
    β <- 5
   ΚΑΛΕΣΕ  ΔιάβασεΤιμήΣτοΔιάστημα(α,β,χ)
! υποπρόγραμμα
  ΔΙΑΔΙΚΑΣΙΑ  ΔιάβασεΤιμήΣτοΔιάστημα(κ,λ,τιμή)
  ΜΕΤΑΒΛΗΤΕΣ
       ΠΡΑΓΜΑΤΙΚΕΣ  : κ,λ, τιμή
  ΑΡΧΗ
         ΓΡΑΨΕ 'Δώσε έναν αριθμό στο διάστημα [', κ, λ, ']' 
         ΔΙΑΒΑΣΕ τιμή 
          ΟΣΟ τιμή < κ Η  τιμή > λ ΕΠΑΝΑΛΑΒΕ   
                ΓΡΑΨΕ 'Αυτό δεν είναι στο διάστημα [', κ, λ, ']. Ξαναδώσε.'   
                ΔΙΑΒΑΣΕ τιμή
           ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

pgrontas

Την rand() δεν θα την έλεγα συνάρτηση, με την μαθηματική έννοια. Η τιμή της εξαρτάται από την προηγούμενη τιμή που έδωσε ή/ και από μια κατάσταση που μπορεί να είναι εκτός αλγορίθμου. Γι'αυτό και στις αντικειμενοστρεφείς γλώσσες συνήθως αναπαρίσταται από αντικείμενο. Το μόνο χαρακτηριστικό της που θυμίζει συνάρτηση είναι ότι επιστρέφει τιμή με το όνομα της.
Γενικότερα τώρα, μόνο σε περίπτωση που οι συναρτήσεις διαφέρουν σημαντικά από τις διαδικασίες μπορεί να δικαιολογηθούν και παιδαγωγικά αλλά και στις ερωτήσεις των παιδιών τα δύο είδη υποπρογραμμάτων. Αλλιώς η καλύτερη λύση είναι ένας τύπος υποπρογράμματος, όπως ειπώθηκε και στην ημερίδα. Αλλά αυτό ξεφεύγει.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

evry

Κατ'αρχήν συμφωνώ απόλυτα με τον gthal.

Αντρέα αναφέρεσαι στον ορισμό της συνάρτησης όπως ορίζεται στα μαθηματικά. Για παράδειγμα τα υποπρογράμματα στη C τα λέμε συναρτήσεις, και όμως μπορείς να κάνεις τα πάντα. Υπάρχουν συναρτήσεις που διαβάζουν χαρακτήρες όπως η getch() ή άλλες που επιστρέφουν ακόμα και πίνακα.
    Επίσης αυτό το "επιστρέφει μια τιμή" που είναι βαθιά χαραγμένο στο DNA μας από το σχολείο δεν σημαίνει ότι επιστρέφει μόνο έναν αριθμό. Σημαίνει ότι με τις συγκεκριμένες παραμέτρους μπορούμε να έχουμε μόνο ένα αποτέλεσμα, το οποίο στην πληροφορική μεταφράζεται σαν καθοριστικότητα ή αν θέλετε διαφορετικά ντετερμινισμός.
   Το αποτέλεσμα αυτό μπορεί να είναι ότι θέλουμε. Για παράδειγμα μπορεί να είναι ένας μιγαδικός, που έχει δύο τιμές x,y. Αν έχουμε συναρτήσεις μεταξύ αντικειμένων στον n-διάστατο χώρο τότε το αποτέλεσμα θα είναι ένας πίνακας n στοιχείων, όπως για παράδειγμα ένα διάνυσμα από βάρη σε λέξεις-κλειδιά που αντιπροσωπεύει μια ιστοσελίδα στο διαδίκτυο. Και αυτό συνάρτηση είναι γιατί βγάζει ένα αποτέλεσμα, μια τιμή απλά αυτή η τιμή δεν είναι ένας αριθμός, είναι ο τρόπος αναπαράστασης μιας οντότητας.

Παράθεση από: andreas_p στις 13 Φεβ 2010, 08:06:22 ΠΜ
Δεν είναι λάθος, αλλά αυτό ΔΕΝ είναι συνάρτηση. Η συνάρτηση εξ' ορισμού δέχεται τιμές , τις επεξεργάζεται, κάνει υπολογισμούς και επιστρέφει ΜΙΑ τιμή στο κυρίως πρόγραμμα.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gthal

Παράθεση από: andreas_p στις 13 Φεβ 2010, 08:06:22 ΠΜ
Δεν είναι λάθος, αλλά αυτό ΔΕΝ είναι συνάρτηση. Η συνάρτηση εξ' ορισμού δέχεται τιμές , τις επεξεργάζεται, κάνει υπολογισμούς και επιστρέφει ΜΙΑ τιμή στο κυρίως πρόγραμμα.
Ανδρέα, δεν είναι μαθηματική συνάρτηση αλλά είναι συνάρτηση, αφού τη γράφω σαν συνάρτηση, την καλώ σαν συνάρτηση και λειτουργεί.
Τροποποιώ τον ορισμό σου : Η συνάρτηση εξ' ορισμού δέχεται τιμές , τις επεξεργάζεται, κάνει υπολογισμούς και επιστρέφει μια τιμή στο κυρίως πρόγραμμα.
Γιατί πρέπει να καθορίσουμε το τι θα κάνει μια συνάρτηση στο εσωτερικό της;

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

Εσύ βλέπεις αυστηρά τους δύο κανόνες/ορισμούς ενώ εγώ παίζω πιο ευέλικτα μεταξύ τους και το θέμα είναι ότι στην προκειμένη περίπτωση έχω όφελος. Δες τα κύρια προγράμματά μας:
γράφω 1 γραμμή εκεί που εσύ γράφεις 3 !
για να κάνω όλη τη δουλειά μπορώ να γράψω μία γραμμή:
εμφάνισε (ΔιάβασεΤιμήΣτοΔιάστημα(3,5)+ ΔιάβασεΤιμήΣτοΔιάστημα(-5,5))/2
κι εσύ πρέπει να γράψεις 7  !!   (εμ, μέχρι να παρκάρεις και να ξεπαρκάρεις, εγώ έχω φτάσει κι έχω γυρίσει   :))
Δεν το παρουσιάζω ως ιδανικό, έτσι; Όμως με πειράζει να απαγορευθεί η ελευθερία της επιλογής μου επειδή... πώς να το πώ ... "δεν είναι πρέπον"

Και να γιατί είχα όφελος:
θα προσπαθήσω πάλι να το περιγράψω με μια εικόνα (πω πω, τι έχω πάθει σήμερα ;  βλέπω οπτασίες   :D  θά 'ναι από τα χθεσινά ποτά    :laugh: )
Φαντάζομαι τη συνάρτηση και τη διαδικασία σαν δύο βαρέλια-αντιδραστήρες (κάτι τέτοιο τέλος πάντων) με ένα άνοιγμα από πάνω, ως είσοδο.  Τα βαρέλια είναι ολόιδια και μέσα τους (κατά τη δική μου γνώμη πάντα) κάνουν τις ίδιες ακριβώς επεξεργασίες/λειτουργίες (οι οποίες δεν με ενδιαφέρουν - black box).
Όμως έχουν μια μικρή διαφορά : το βαρέλι της συνάρτησης είναι προσαρμοσμένο ώστε να μπορώ εύκολα να πάρω το προϊόν. Έχει ένα βρυσάκι κάπου χαμηλά. (γιατί αυτό το βαρέλι είναι προσανατολισμένο να παράγει ένα προϊόν)
Το άλλο βαρέλι δεν είναι προσανατολισμένο να παράγει προϊόν γιαυτό δεν έχει βρυσάκι. Αλλά αν θέλω μπορώ να πάρω παραπροϊόντα από την επεξεργασία σκύβοντας πάνω από το άνοιγμα και τσιμπώντας τα ένα-ένα.
Την όποια δουλειά μπορεί να μου την κάνουν εξίσου καλά και τα δύο βαρέλια. Θα διαλέξω βαρέλι ανάλογα με το τι προϊόντα θέλω να πάρω:
ένα προϊόν? Είμαι τυχερός, θα το πάρω εύκολα με το βαρέλι-συνάρτηση
κανένα προϊόν? Σούπερ! βαρέλι-διαδικασία
πολλά προϊόντα? χμμ ελαφρά πιο κουραστικό αλλά θα τα πάρω. Βαρέλι-διαδικασία.

Ε, λοιπόν, στο προηγούμενο προγραμματάκι αφού είχα να πάρω ένα προϊόν, διάλεξα το βολικότερο βαρέλι, αυτό με το βρυσάκι. Εσύ, μένοντας πιστός σε δεν-ξέρω-ποιον-όρκο διάλεξες αυτό που δεν βολεύει.

Τεσπα, έγραψα πάρα πολλά, συγγνώμη (αν ήμουν αναγνώστης θα προσπερνούσα πάραυτα όλο αυτό το κατεβατό  :()
Αν είναι να δεχτούμε για διδακτικούς λόγους ότι οι συναρτήσεις είναι αυστηρά και μόνο μαθηματικές συναρτήσεις, είμαι έτοιμος να ασπαστώ και την απαγόρευση ΔΙΑΒΑΣΕ/ΓΡΑΨΕ και την απαγόρευση κλήσης οποιουδήποτε υποπρογράμματος από συνάρτηση. (θα θρηνώ όμως μυστικά αυτή την ήττα του τμηματικού προγραμματισμού  :'(  :D)

Α, ήθελα ακόμα να πω ότι στο προηγούμενο πρόγραμμα που έδωσα, τις απαντήσεις "ΔΕΝ" τις περίμενα. (ΔΕΝ είναι σωστό, ΔΕΝ γίνεται, ΔΕΝ επιτρέπεται). Αυτό που θέλω είναι τα ΓΙΑΤΙ - και στα τρία ερωτήματα, παρακαλώ:
Παράθεση από: gthal στις 13 Φεβ 2010, 04:09:20 ΠΜ
1. γιατί το παραπάνω να απαγορεύεται ;
2. ακόμα κι αν δεν απαγορεύεται, γιατί είναι ΚΑΚΗ πρακτική; (γιατί ούτε αυτό το καταλαβαίνω)
3. γιατί δεν είναι ίσως και ΚΑΛΗ πρακτική
Φιλικά,
Γιώργος Θαλασσινός

sstergou

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

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

Κώδικας: ΓΛΩΣΣΑ
Διαδικασία Φυσαλίδα(Πιν, ΕξΕπαναλήψεις, Τύπος)
...
Τέλος_Διαδικασίας

Συνάρτηση ΝΜεγαλύτερο(Πιν, Ν):Πραγματική
Μεταβλητές
  Πραγματικές : Πιν[100]
  Ακέραιες : Ν
Αρχή
  Κάλεσε Φυσαλίδα(Πιν, Ν, 'Φθίνουσα')
  ΝΜεγαλύτερο <- Πιν[Ν]
Τέλος_Συνάρτησης

ntzios kostas

Γιατί να το απαγορεύουμε; Απλά ο πίνακας μετά την ολοκληρωση της συνάρτησης δεν θα είναι ταξινομημένος.  :) :)

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

pgrontas

Στο συγκεκριμένο θέμα νομίζω ότι όλα είναι θέμα ορισμού και στόχων.

Θέλουμε να έχουμε μηχανισμούς στα προγράμματα που να προσομοιάζουν μαθηματικές συναρτήσεις; Υπάρχουν παιδαγωγικά ωφέλη σε αυτό; Αν θέλουμε αυστηρά κάτι τέτοιο πρέπει να απαγορέψουμε  ΔΙΑΒΑΣΕ, ΓΡΑΨΕ, Κλήση διαδικασίας.
Αν θέλουμε χαλαρά κάτι τέτοιο, και θέλουμε να εκμεταλλευτούμε και την δυνατότητα για επιστροφή με το όνομα μπορούμε απλά να αποθαρρύνουμε την χρήση τους.
Εγώ ακόμα δεν έχω αποφασίσει τελεσίδικα, γι' αυτό και την χαρακτήρισα αρχικά την μητέρα των ασαφειών.
Πάντως  το κριτήριο δεν πρέπει να είναι επειδή έτσι δουλεύει η C πχ. ή επειδή θέλουμε να εμφανίζουμε μηνύματα για debugging :)


Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gthal

Παράθεση από: pgrontas στις 13 Φεβ 2010, 06:59:43 ΜΜ
Πάντως  το κριτήριο δεν πρέπει να είναι επειδή έτσι δουλεύει η C πχ. ή επειδή θέλουμε να εμφανίζουμε μηνύματα για debugging :)
Εντάξει, εδώ θα συμφωνήσω μαζί σου.
Πάντως, να θυμόμαστε ότι θέλουμε να αναδείξουμε τον τμηματικό προγραμματισμό και όχι να τον ευνουχίσουμε.
Φιλικά,
Γιώργος Θαλασσινός

tom

Παράθεση από: ntzios kostas στις 12 Φεβ 2010, 09:04:12 ΠΜ
Νομίζω και εγώ ότι το σχολικό έχει στο "μυαλό" του τη συνάρτηση όπως αυτή ορίζεται στα μαθηματικά. Και δεν είμαι αντίθετος σε αυτο. Διαφορετικά θα προτιμούσα να είχαμε ένα άλλο όνομα για αυτήν, ας πούμε υποπρόγραμμα και να χρησιμοποιείται όπως γίνεται στη C.

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

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

Συμφωνώ! Τα είπα και πριν κάποιες μέρες... Και για μένα είναι ξεκάθαρο σε αυτό το θέμα τι επιτρέπεται και τι όχι, σύμφωνα με το σχολικό βιβλίο.  Ενδιαφέρουσες οι απόψεις των συναδέλφων αλλά θα έπρεπε να κατατεθούν σε ένα θέμα με τίτλο "Προτάσεις βελτίωσης των υποπρογραμμάτων στο νέο διδακτικό πακέτο"  :)
Θωμάς Σκυλογιάννης

- Ζήσε σα να' ταν να πεθάνεις αύριο. Μάθε σα να' ταν να ζεις για πάντα.
                                                                                     Μαχάτμα Γκάντι