Μετατροπές σε υποπρογράμματα

Ξεκίνησε από Νίκος Αδαμόπουλος, 05 Μαΐου 2009, 07:24:07 ΜΜ

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

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

(περιμένοντας στο VBI για να περάσει η ώρα:)

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

Για να το δυσκολέψουμε λίγο τώρα, το παρακάτω είναι ένα πρόγραμμα από πανελλήνιες (Θέμα 2 - Επαναληπτικές 2006) που άλλαξα λιγάκι. Έχουμε και λέμε (ελπίζω να μην έχω κάνει κάποιο λάθος):
α) Να ξαναγράψετε το πρόγραμμα, ώστε να επιτελεί την ίδια λειτουργία χρησιμοποιώντας διαδικασία στη θέση της συνάρτησης και συνάρτηση στη θέση της διαδικασίας. (Παραλλαγή: Πώς θα γινόταν η μετατροπή της διαδικασίας σε συνάρτηση αν αντί της εντολής  λ<-κ+2*μ  υπήρχε η εντολή  λ<-κ+2*μ+λ ).
β) Να ξαναγράψετε το πρόγραμμα που δόθηκε αρχικά, ώστε να επιτελεί την ίδια λειτουργία χωρίς τη χρήση υποπρογραμμάτων.

ΠΡΟΓΡΑΜΜΑ Κλήση_Υποπρογραμμάτων
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: α, β, χ
ΑΡΧΗ
  α <- 1
  β <- 2
  χ <- 2
  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΝ χ mod 2 =0 ΤΟΤΕ
      ΚΑΛΕΣΕ Διαδ1(α, χ, β)
    ΑΛΛΙΩΣ
      χ <- χ + Συν1(α, β)
    ΤΕΛΟΣ_ΑΝ
    ΓΡΑΨΕ α, β, χ
  ΜΕΧΡΙΣ_ΟΤΟΥ χ>=11
  ΓΡΑΨΕ χ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


ΔΙΑΔΙΚΑΣΙΑ Διαδ1(κ, λ, μ)
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: κ, λ, μ
ΑΡΧΗ
  λ<-κ+2*μ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ


ΣΥΝΑΡΤΗΣΗ Συν1(ε, ζ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ε, ζ
ΑΡΧΗ
  ζ<-ζ+2
  ε<-ε*2
  Συν1<-ε+ζ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


evry


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

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

Παράθεση από: evry στις 06 Μαΐου 2009, 12:47:02 ΠΜ
... δεν ορίζεται αν είναι λάθος να πειράζουμε τις παραμέτρους μιας συνάρτησης ή ότι μπορούμε να τις πειράζουμε αλλά οι αλλαγές δεν μεταφέρονται στο κύριο πρόγραμμα.

Αναφέρεται για τις συναρτήσεις στη σελ. 213: "Η λίστα παραμέτρων είναι μια λίστα μεταβλητών, των οποίων οι τιμές μεταβιβάζονται στη συνάρτηση κατά την κλήση"

και για τις διαδικασίες στη σελ. 214: "Η λίστα παραμέτρων είναι μια λίστα μεταβλητών, των οποίων οι τιμές μεταβιβάζονται προς τη διαδικασία κατά την κλήση ή/και επιστρέφονται στο κύριο πρόγραμμα μετά το τέλος της διαδικασίας".

(ευχαριστούμε τον Άλκη για τη μετατροπή των pdf των βιβλίων του μαθήματος ώστε να είναι δυνατή η αντιγραφή του κειμένου και η αναζήτηση. Βλ. https://alkisg.mysch.gr/steki/index.php?topic=1436.0)

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

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

evry

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

gpapargi

2 λόγια όχι τεχνικά αλλά ως προς τη φιλοσοφία της άσκησης.

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

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

Αντίθετα το να κάνεις με διαδικασία κάτι που έχει ήδη γίνει με συνάρτηση, ή το να κάνεις χωρίς υποπρόγραμμα κάτι που είναι ήδη με υποπρόγραμμα είναι απλώς συντακτικός έλεγχος και δεν έχει καμία σχέση με τη φιλοσοφία του τμηματικού προγραμματισμού. Γεμίζει το σκεπτόμενο μαθητή με την δίκαιη απορία: «Μα γιατί να το κάνουμε αυτό αφού είναι δυσκολότερο;» Και φυσικά στην πράξη δεν πρόκειται ποτέ μα ποτέ να χρειαστεί κάτι τέτοιο.

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

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

#5
Παράθεση από: evry στις 06 Μαΐου 2009, 09:49:22 ΠΜ
Το ότι το θέμα επιλέχθηκε από την επιτροπή δεν σημαίνει τίποτα. Αντίθετως μάλιστα με αυτά που έχουμε δει ως τώρα. Δεν είναι θέμα αν είναι λάθος η όχι. Το θέμα είναι πως δεν διευκρινίζεται τι είναι, ξεκάθαρα μέσα στο βιβλίο. Για παράδειγμα φαντάσου να έδινες μια συνάρτηση η οποια να διάβαζε κάτι. Θα ήταν λάθος? και αν ναι τι λάθος θα ήταν? Θέλω να πω ότι υπάρχουν ασάφειες και σκοτεινά σημεία στο βιβλίο. Δεν πρέπει λοιπόν να μπαίνουν θέματα τα οποια αγγίζουν τα σημεία αυτά γιατί μπορεί ένας καλός μαθητής να την πατήσει

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

Παράθεση από: gpapargi στις 06 Μαΐου 2009, 10:00:05 ΠΜ
Οι σωστές ασκήσεις στα υποπρογράμματα είναι αυτές που δείχνουν πως ένα αρχικά δύσκολο πρόβλημα γίνεται σημαντικά απλούστερο με τη χρήση υποπρογραμμάτων. Σε αυτές τα υποπρογράμματα είναι αναγκαία και δικαιολογούν πλήρως τη χρήση τους.

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

Ωστόσο, σε όλα τα θέματα (3ο και 4ο) πανελληνίων όπου έπρεπε οι μαθητές να φτιάξουν ένα υποπρόγραμμα, υπήρχε κλήση σε αυτό μόνο από ένα σημείο του κύριου προγράμματος, γεγονός που απλά αύξανε την πολυπλοκότητα της λύσης αφού θα έπρεπε οι μαθητές να διαχειριστούν και το θέμα της κλήσης και του περάσματος των παραμέτρων. Κατά τα άλλα το ίδιο το υποπρόγραμμα δεν προσέφερε τίποτα στην λύση.

Παράθεση από: gpapargi στις 06 Μαΐου 2009, 10:00:05 ΠΜ
Κατά τη γνώμη μου εμείς στο στέκι πρέπει να κριτικάρουμε τέτοια θέματα και να μην τα αναπαράγουμε… και όχι να πέφτουμε στη λούμπα «έπεσε στις πανελλήνιες, άρα ας το πάμε ένα βήμα παραπέρα». Έχω πέσει σε αυτή τη λούμπα, αλλά τώρα πιστεύω ότι πρέπει πάνω από όλα να βάζουμε το παιδαγωγικό και το επιστημονικό ζήτημα και όχι τις εξετάσεις.

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

Και τέλος πάντως δεν είναι απαραίτητο να συμφωνούμε και σε όλα! Αλλιώς τότε δεν έχει νόημα η ύπαρξη του forum...

evry

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

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


ενώ παρακάτω λέει ότι

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


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

Παρακάτω δίνω ένα παράδειγμα όπου ζητείται από έναν μαθητή να φτιάξει μια συνάρτηση που να υπολογίζει το μέγιστο για έναν πίνακα Βαθ[Ν]

Αυτό θα το θεωρούσατε σωστό?

ΣΥΝΑΡΤΗΣΗ Μέγιστο(Βαθ) : ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
     ΑΚΕΡΑΙΕΣ:Βαθ[Ν], χ, μεγ, ΜΟ, Σ
ΑΡΧΗ
     μεγ <- Βαθ[1]
     Σ <- μεγ
     ΓΙΑ χ ΑΠΟ 2 ΜΕΧΡΙ Ν
          Σ <- Σ + Βαθ[χ]
          ΑΝ Βαθ[χ] > μεγ ΤΟΤΕ
             μεγ <- Βαθ[χ]
          ΤΕΛΟΣ_ΑΝ 
     ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      ΜΟ <- Σ / Ν
     Μέγιστο <- μεγ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


Παράθεση από: Νίκος Αδαμόπουλος στις 06 Μαΐου 2009, 12:28:29 ΜΜ
Δεν υπεραμύνομαι της λογικής των θεμάτων των εξετάσεων. Ωστόσο, πιστεύω ότι και για τα δύο ζητήματα που θέτεις (1. αλλαγή τυπικών παραμέτρων σε συνάρτηση, και 2. Διάβασμα μέσα σε συνάρτηση), ασχέτως των προσωπικών μας απόψεων (και της δικής μου συμπεριλαμβανομένης), στα χρόνια που πέρασαν αυτά τα έχουμε ξεκαθαρίσει.
Εγώ, τουλάχιστον για τους σκοπούς του μαθήματος, τα έχω υιοθετήσει: 1. Επιτρέπεται αλλαγή των τυπικών παραμέτρων στις συναρτήσεις μόνο που δεν επιστρέφουν πίσω οι αλλαγές, 2. Δεν επιτρέπεται Διάβασμα και Γράψε μέσα σε συνάρτηση.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gpapargi

Παράθεση από: Νίκος Αδαμόπουλος στις 06 Μαΐου 2009, 12:28:29 ΜΜ
Ωστόσο, σε όλα τα θέματα (3ο και 4ο) πανελληνίων όπου έπρεπε οι μαθητές να φτιάξουν ένα υποπρόγραμμα, υπήρχε κλήση σε αυτό μόνο από ένα σημείο του κύριου προγράμματος, γεγονός που απλά αύξανε την πολυπλοκότητα της λύσης αφού θα έπρεπε οι μαθητές να διαχειριστούν και το θέμα της κλήσης και του περάσματος των παραμέτρων. Κατά τα άλλα το ίδιο το υποπρόγραμμα δεν προσέφερε τίποτα στην λύση.

Αυτό ακριβώς προσπαθούμε να εξηγήσουμε τόσο καιρό με τα διαγωνίσματα που φτιάχνει το στέκι. Το 2007 βάλαμε την υλοποίηση της δυναμοσειράς του συνημιτόνου με συνάρτηση παραγοντικού. Το 2008 βάλαμε προσομοίωση της Eurovision που η μια χώρα ψηφίζει την άλλη και συνάρτηση αναζήτησης. Kαι φέτος σάρωση σε σχήμα "Γ" με συνάρτηση. Κάθε φορά το υποπρόγραμμα έκοβε το πρόβλημα ακριβώς στη μέση... έβαζε το μέσα βρόχο μέσα στο υποπρόγραμμα και τον εξωτερικό στο κυρίως πρόγραμμα απλουστεύοντας τη σκέψη και δίνοντας εικόνα ανάλυσης προβλήματος. Κάθε φορά το υποπρόγραμμα δικαιολογεί τη χρήση του. Πχ να μια περυσινή κριτική που μιλάει για το θέμα 4 (Eurovision)
"[...] και στο 4ο είπαν επιτέλους  γράψαμε συνάρτηση για να μν γράφουμε πάλι τον ίδιο κώδικα"
https://alkisg.mysch.gr/steki/index.php?topic=1260.msg8681#msg8681
 
Παράθεση από: Νίκος Αδαμόπουλος στις 06 Μαΐου 2009, 12:28:29 ΜΜ
Συνάδελφοι μου φαίνεται ότι υπερβάλετε λιγάκι! Δηλαδή, να μην προετοιμάσουμε κατάλληλα τους μαθητές ώστε να μπορούν να αντιμετωπίσουν κάτι παρόμοιο στις εξετάσεις; Εσείς δηλαδή, στους μαθητές σας δεν έχετε πει τίποτα; Δεν το πιστεύω!

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

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

Παράθεση από: gpapargi στις 06 Μαΐου 2009, 01:40:24 ΜΜ
Αν για παράδειγμα προτείνουμε ασκήσεις είναι σα να λέμε και ότι είναι καλές και θα έπρεπε να πέφτουν. Κατά τη γνώμη μου το σωστό είναι όταν προτείνουμε θέματα και τα αναφέρουμε δημόσια να περιοριζόμαστε σε θέματα σωστά από παιδαγωγική και επιστημονική άποψη.

Μα..... σε κάποιο άλλο post... δεν είχαμε πει να ανεβάζουμε ό,τι νομίζουμε ότι δεν πρέπει να πέσει ώστε να το δει η επιτροπή και να μην το βάλει;;;  >:D

Κι εγώ πάνω είπα ότι είναι "τραβηγμένο" για εξετάσεις...

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

Παρόλα αυτά εγώ συνεχίζω να θεωρώ ότι δεν υπάρχει λάθος παιδαγωγικό ούτε επιστημονικό στο παραπάνω αλλά ότι βοηθάει στην κατανόηση του μηχανισμού κλήσης των υποπρογραμμάτων... :angel:

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

Παράθεση από: evry στις 06 Μαΐου 2009, 01:32:00 ΜΜ
  Θα διαφωνήσω με την κατηγοριοποίηση που κάνεις. Αν θεωρείς λάθος το Διάβασε μέσα σε συνάρτηση τότε για τον ίδιο ακριβώς λόγο πρέπει να θεωρήσεις λάθος και την απόδοση τιμής σε μια παράμετρο μέσα στη συνάρτηση και εξηγώ το σκεπτικό μου.

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

Ως προς το πέρασμα των παραμέτρων σε Διαδικασία και σε Συνάρτηση (για το αν επιστρέφουν πίσω οι τιμές των παραμέτρων) δεν προκύπτει ανακολουθία με αυτό που ισχύει σε διάφορες γλώσσες (πέρασμα κατά αναφορά, κατά τιμή, κατά τιμή/αποτέλεσμα... - έχεις κάνει και εργασία πάνω σε αυτό: με την ευκαιρία, την έχω πρώτη πρώτη: βλ. http://dide.ilei.sch.gr/keplinet/education/info-gel.php). Γιατί όμως να απαγορεύεται να μεταβληθεί η τιμή των τυπικών παραμέτρων (ασχέτως αν δεν επιστρέφουν πίσω); Το ίδιο θα ρωτήσω κι εγώ: Υπάρχει καμία γλώσσα προγραμματισμού που σε κλήση κατά τιμή να απαγορεύεται η μεταβολή αυτών των τιμών;

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

Παράθεση από: evry στις 06 Μαΐου 2009, 01:32:00 ΜΜ
Παρακάτω δίνω ένα παράδειγμα όπου ζητείται από έναν μαθητή να φτιάξει μια συνάρτηση που να υπολογίζει το μέγιστο για έναν πίνακα Βαθ[Ν]

Αυτό θα το θεωρούσατε σωστό?

ΣΥΝΑΡΤΗΣΗ Μέγιστο(Βαθ) : ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
     ΑΚΕΡΑΙΕΣ:Βαθ[Ν], χ, μεγ, ΜΟ, Σ
ΑΡΧΗ
     μεγ <- Βαθ[1]
     Σ <- μεγ
     ΓΙΑ χ ΑΠΟ 2 ΜΕΧΡΙ Ν
          Σ <- Σ + Βαθ[χ]
          ΑΝ Βαθ[χ] > μεγ ΤΟΤΕ
             μεγ <- Βαθ[χ]
          ΤΕΛΟΣ_ΑΝ 
     ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      ΜΟ <- Σ / Ν
     Μέγιστο <- μεγ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ



(υποθέτουμε ότι το Ν είναι σταθερά;)

Αναφέρεσαι στο ότι υπολογίζεις και το ΜΟ (δεύτερο αποτέλεσμα παρόλο που και δεν το επιστρέφεις);

Είναι μια χαρά!  >:D

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

Παράθεση από: gpapargi στις 06 Μαΐου 2009, 01:40:24 ΜΜ
Αυτό ακριβώς προσπαθούμε να εξηγήσουμε τόσο καιρό με τα διαγωνίσματα που φτιάχνει το στέκι...

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

evry

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

(Στο παράδειγμα που έδωσα το Ν είναι σταθερά.)
Δεν υπολογίζει 2 διαφορετικά πράγματα? Δεν θα έπρεπε να εκληφθεί ως λάθος? Και να κάνω και μια άλλη ερώτηση.
Ένας άλλος μαθητής δίνει την παρακάτω συνάρτηση

ΣΥΝΑΡΤΗΣΗ ΔιάβασεΑποδεκτόΑριθμό(κάτω, πάνω) : ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
     ΑΚΕΡΑΙΕΣ:κάτω, πάνω
     ΠΡΑΓΜΑΤΙΚΕΣ: αριθμός
ΑΡΧΗ
     ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
            ΔΙΑΒΑΣΕ αριθμός
     ΜΕΧΡΙΣ_ΟΤΟΥ αριθμός >= κάτω ΚΑΙ αριθμός <= πάνω ΚΑΙ Α_Μ(αριθμός) = αριθμός
     ΔιάβασεΑποδεκτόΑριθμό <- Α_Μ(αριθμός)
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


Ποιος από τους 2 μαθητές έχει κατανοήσει καλύτερα τις βασικές αρχές του τμηματικού προγραμματισμού? ο 1ος ή ο 2ος?

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

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

#13
Παράθεση από: evry στις 06 Μαΐου 2009, 06:36:06 ΜΜ
... Προφανώς και συμβουλεύεις τους μαθητές να μην χρησιμοποιούν Διάβασε και Γράψε μέσα σε συνάρτηση. Όπως και τους συμβουλεύεις να μην πειράζουν τις τιμές των παραμέτρων της συνάρτησης αφού δεν υπάρχει λόγος.

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

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

Ελπίζω να μη μου χρεωθεί η "κακή" ιδέα αν ποτέ βάλει η επιτροπή θέμα σαν το παραπάνω... ::)

evry

Παράθεση από: Νίκος Αδαμόπουλος στις 06 Μαΐου 2009, 03:37:44 ΜΜ
Ως προς το πέρασμα των παραμέτρων σε Διαδικασία και σε Συνάρτηση (για το αν επιστρέφουν πίσω οι τιμές των παραμέτρων) δεν προκύπτει ανακολουθία με αυτό που ισχύει σε διάφορες γλώσσες (πέρασμα κατά αναφορά, κατά τιμή, κατά τιμή/αποτέλεσμα... - έχεις κάνει και εργασία πάνω σε αυτό: με την ευκαιρία, την έχω πρώτη πρώτη: βλ. http://dide.ilei.sch.gr/keplinet/education/info-gel.php).
Ευχαριστώ πολύ, τώρα που το λες καλή ιδέα για αντίστοιχη εργασία πάνω στα υποπρογράμματα. Ίσως του χρόνου

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

Στη C++ όταν θες να μην τροποποιηθεί η παράμετρος την περνάς by value. Έτσι όμως γίνεται αντίγραφο μέσα και αυτό σου κοστίζει στην απόδοση, ειδικά αν η κλήση της συνάρτησης γίνεται πολλές φορές. Έτσι περνάς όλες τις παραμέτρους κατ'αναφορά. Δεν θέλεις όμως να μπορούν να τροποποιηθούν μέσα στη συνάρτηση γιατί σε αυτή την περίπτωση η αλλαγή θα μεταφερθεί στο κύριο πρόγραμμα έτσι τις ορίζεις const, και αν πάει κάποιος να τις τροποποιήσει του χτυπάει λάθος. Αυτός είναι ένας τρόπος αναφοράς που έχει η C++, θα μπορούσαμε να τον ονομάσουμε const-by-reference. Το ίδιο const-by-reference χρησιμοποιείται ώστε να μην επιστρέφεται reference σε private member μιας κλάσης (συγγνώμη για την αγγλική ωρολογία)

int myFunction( const String &word)


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

What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr