Αποστολέας Θέμα: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλεση!  (Αναγνώστηκε 3997 φορές)

Sergio

  • Αστέριος Φανίκος, Καθηγητής Πληροφορικής, fanikosaATschDOTgr
  • Δεινόσαυρος
  • *****
  • Μηνύματα: 801
  • Κάλλιο γνώση, παρά γρόσι.. (ΛΑΪΚΗ ΠΑΡΟΙΜΙΑ)
    • Προσωπική Σελίδα
Τι μεταβλητές δημιουργούνται στη μνήμη κατά την εκτέλεση της συνάρτησης;

Συγκεκριμένα... θα πρέπει να δημιουργείται στον πίνακα τιμών μεταβλητή με '...το όνομα της συνάρτησης...' κατά την εκτέλεση της συνάρτησης; ή όχι;

Το βιβλίο αναφέρει, γενικά, ότι '...η συνάρτηση υπολογίζει ..... και το αποτέλεσμα αυτό εκχωρείται στο όνομα της συνάρτησης...' (σελ.213 - τελευταία παράγραφος).

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

Όμως το βιβλίο αναφέρει, '... Στις εντολές του σώματος της συνάρτησης θα πρέπει υποχρεωτικά να υπάρχει μία εντολή εκχώρησης τιμής στο όνομα της συνάρτησης ...'  Το υποχρεωτικά είναι ... παρεξηγήσιμο... :
- "υποχρεωτικά ... μία" ??? ή
- "θα πρέπει ... υποχρεωτικά" (επομένως ΤΟΥΛΑΧΙΣΤΟΝ μία)

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

ΣΥΝΑΡΤΗΣΗ Πλήθος(Π, Ζητούμενη_τιμή): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
 ΧΑΡΑΚΤΗΡΕΣ: Π[100], Ζητούμενη_Τιμή
ΑΡΧΗ
 Πλήθος <-- 0
 ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 100
   ΑΝ Π[ι]=Ζητούμενη_Τιμή ΤΟΤΕ
     Πλήθος <-- Πλήθος + 1
   ΤΕΛΟΣ_ΑΝ
 ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

αφού χρησιμοποιεί τη μεταβλητή πλήθος σαν κοινή μεταβλητή.... θα έπρεπε να γραφεί:

ΣΥΝΑΡΤΗΣΗ Πλήθος(Π, Ζητούμενη_τιμή): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
 ΧΑΡΑΚΤΗΡΕΣ: Π[100], Ζητούμενη_Τιμή
 ΑΚΕΡΑΙΑ: Μετρητής
ΑΡΧΗ
 Μετρητής <-- 0
 ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 100
   ΑΝ Π[ι]=Ζητούμενη_Τιμή ΤΟΤΕ
     Μετρητής <-- Μετρητής + 1
   ΤΕΛΟΣ_ΑΝ
 ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
 Πλήθος <-- Μετρητής
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

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

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 5144
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
« Απάντηση #1 στις: 05 Μάι 2003, 11:01:39 πμ »
Νομίζω ότι θα πρέπει να διαλέξουμε την ερμηνεία "ΤΟΥΛΑΧΙΣΤΟΝ ΜΙΑ", είναι η πιο λογική και αυτή που εφαρμόζεται  συνήθως. Όμως στην πρώτη υλοποίηση της συνάρτησης υπάρχει πρόβλημα, επειδή δεν επιτρέπεται να ΔΙΑΒΑΣΤΕΙ το όνομα της "μεταβλητής":
 Πλήθος <-- Πλήθος + 1
Το Πλήθος στο δεξί μέρος της ανάθεσης τιμής ουσιαστικά είναι ΚΛΗΣΗ στη συνάρτηση Πλήθος και προκαλεί αναδρομή. Βέβαια εδώ η συνάρτηση κανονικά έχει ορίσματα και κάποιος compiler / interpreter θα έβγαζε συντακτικό λάθος, αλλά στην περίπτωση που δεν είχε θα θεωρούταν κανονική κλήση στον εαυτό της.

Γι' αυτόν ακριβώς το λόγο στην Pascal σε κάθε συνάρτηση υπάρχει και μία κρυφή μεταβλητή Result, την οποία μπορούμε να την χρησιμοποιήσουμε για να διαβάσουμε την προσωρινή τιμή της συνάρτησης (δηλαδή θα γράφαμε Πλήθος <-- Result + 1 ή ισοδύναμα Result <-- Result + 1)

Η υλοποίηση σε γλώσσα μηχανής της επιστρεφόμενης τιμής των συναρτήσεων (Pascal, Basic, C: x86) γίνεται για τα strings στην στοίβα, για τους υπόλοιπους τύπους δεδομένων σε καταχωρητές. Δηλαδή ουσιαστική "μεταβλητή" συνάρτησης δεν υπάρχει, είναι απλά μία διευκόλυνση που προσφέρει η γλώσσα στους προγραμματιστές.

Δηλαδή προτείνω να ακολουθήσουμε αυτό που ορίζει η Pascal: επιτρέπονται ΟΣΕΣ αναθέσεις τιμής θέλουμε  στο όνομα της συνάρτησης, αλλά κάθε φορά που "διαβάζεται" το όνομα (σε δεξί μέρος ανάθεσης τιμής ή σε ΓΡΑΨΕ κτλ) προκαλεί ξανά ΚΛΗΣΗ της συνάρτησης, δηλαδή αναδρομή. Επίσης απαγορεύεται η αλλαγή της τιμής της συνάρτησης με άλλον τρόπο, εκτός από ανάθεση τιμής (δηλαδή απαγορεύονται: ΔΙΑΒΑΣΕ Πλήθος / ΚλήσηΔιαδικασίαςΜεΑναφορά(Πλήθος) κτλ).

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

Sergio

  • Αστέριος Φανίκος, Καθηγητής Πληροφορικής, fanikosaATschDOTgr
  • Δεινόσαυρος
  • *****
  • Μηνύματα: 801
  • Κάλλιο γνώση, παρά γρόσι.. (ΛΑΪΚΗ ΠΑΡΟΙΜΙΑ)
    • Προσωπική Σελίδα
Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
« Απάντηση #2 στις: 11 Μάι 2003, 08:55:50 πμ »
Σωστά..

όμως τι γίνεται όταν δύο γλώσσες δίνουν δύο διαφορετικές ερμηνείες;

Γι' αυτό νομίζω ότι, όπως αναφέρθηκε και σε άλλο σημείο (με αφορμή της αποστολή του Θανάση του Βρακόπουλου με τις ασάφειες / λάθη / παραλείψεις του βιβλίου) είναι σκόπιμο εδώ (στο στέκι) που 'μαζευόμαστε' να επισημάνουμε αυτές τις 'εκκρεμότητες' και να τις προωθήσουμε στο ΠΙ αφού, προηγούμενα, η κάθε περίπτωση παρουσιαστεί και σχολιαστεί.

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

Από την άλλη θα πρέπει να είναι σαφές ότι αυτή η ...'μεταβλητή' ΔΕΝ είναι μία ΚΟΙΝΗ μεταβλητή, αφού δε 'δικαιούται' να 'διαβαστεί' (κάτι τέτοιο θα σήμαινε αναδρομική κλήση της συνάρτησης) παρά μόνο να 'γραφτεί'.

Η τιμή ΑΥΤΗΣ της μεταβλητής είναι που αντιγράφεται πίσω (στη μεταβλητή του καλούντος) όταν επιστρέψει η συνάρτηση.

Ποιά είναι η γνώμη σας;
« Τελευταία τροποποίηση: 11 Μάι 2003, 01:43:18 μμ από fanikosa »
Απ τη μια η θητεία μου σε σχολικές αίθουσες: να φλυαρώ - να ελπίζω πως κατι κατάλαβαν - να εξερευνώ - να μαθαίνω. Απ την άλλη, σχεδόν συνομήλικη, η Διδακτική της Πληροφορικής: ερευνά διαδικασίες μάθησης - φλερτάρει με την Ψυχολογία - με καλεί να αφήσω το βλέμμα του Πληροφορικού και να δω με τα μάτια του δασκάλου. Τέκνα των 2, οι απόψεις μου.. (προσαρμοσμένο από τον πρόλογο του βιβλίου "Το μακρόν Φυσική προ του βραχέως διδάσκω" του Ανδρέα Κασσέτα)

Παναγιώτης Τσιωτάκης

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 3219
  • I love you 3000
    • Panagiotis Tsiotakis
Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
« Απάντηση #3 στις: 16 Φεβ 2004, 08:17:27 μμ »
Αγαπητοί φίλοι γεια σας,

1. θεωρώ "λάθος" τη χρήση εντολής εκχώρησης πολλές φορές. Εγώ που δεν ξέρω Pascal, Basic, Fortran, PL/1 κ.λ.π. δεν θα αναφέρομαι στη συμπεριφορά τους. Στη σελίδα 213 του σχολικού λέει: "με το τέλος της συνάρτησης γίνεται επιστροφή στο κύριο πρόγραμμα...". Ναι το ξέρω, περιγράφει το παράδειγμα που προηγείται.... Προτείνω τη χρήση άλλης μεταβλητής (π.χ. με το όνομα εκτίμηση) που μετά από όλους τους υπολογισμούς παίρνει την τιμή που πρέπει να επιστρεφεί και τελικά εκχωρείται στο όνομα της συνάρτησης ΩΣ ΤΕΛΕΥΤΑΙΑ ΕΝΤΟΛΗ. Δεν πρέπει να κολλάμε στο τι μπορούμε να κάνουμε και τι όχι αλλά στο τι είναι απλό στους μαθητές και ουδόλως παρεξηγίσιμο από κανέναν!!!

2. Για τον πίνακα τιμών με καλύπτει η προσέγγιση που είχε παρουσιάσει αρχικά ο Σπύρος Δουκάκης στη μεθοδολογία στο δικτυακό του κόμβο (users.ntua.gr/sdoukakis)
Οι ασκήσεις που καταθέτω είναι: http://users.kor.sch.gr/ptsiotakis/aepp/aepp_ask/ch10/aepp_ask10_9.htm
και μια πιο θεωρητική προσέγγιση στην http://users.kor.sch.gr/ptsiotakis/aepp/aepp_theory/ch10/aepp_theory10c.htm

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

Με εκτίμηση, Τσιωτάκης Παναγιώτης
(με άδειο γραμματοκιβώτιο Inbox παρά τις 320 γεμάτες λάθη ασκήσεις)

giannhs555

  • Οπαδός
  • **
  • Μηνύματα: 15
Απ: Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
« Απάντηση #4 στις: 06 Σεπ 2009, 02:24:07 μμ »


θα μπορουσατε να ανεβασετε την αναλυση που αναφερετε (2. Για τον πίνακα τιμών με καλύπτει η προσέγγιση που είχε παρουσιάσει αρχικά ο Σπύρος Δουκάκης στη μεθοδολογία στο δικτυακό του κόμβο (users.ntua.gr/sdoukakis))καθοτι οι συνδεσμοι δεν λειτουργουν.
Δεν εχω ξεκαθαρη εικονα για το συγκεκριμενο θεμα και θα με βοηθουσατε αρκετα.

ευχαριστω.

dimitrios67

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 104
Απ: Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
« Απάντηση #5 στις: 07 Σεπ 2009, 09:36:48 μμ »
Προτείνω τη χρήση άλλης μεταβλητής (π.χ. με το όνομα εκτίμηση) που μετά από όλους τους υπολογισμούς παίρνει την τιμή που πρέπει να επιστρεφεί και τελικά εκχωρείται στο όνομα της συνάρτησης ΩΣ ΤΕΛΕΥΤΑΙΑ ΕΝΤΟΛΗ.
θα συμφωνουσα κι εγω με τον Παναγιωτη, διοτι στις ευρεως χρησιμοποιούμενες γλώσσες προγραμματισμου C,C++, Java, C# υπαρχει το return, το οποίο "προσομοιώνεται" με την εκχωρηση του αποτελεσματος σε μια μεταβλητη (στην περίπτωσή μας στο όνομα της συναρτησης) και την έξοδο από τη συνάρτηση.
Διαφορετικά, εαν μπούμε στη λογική της αναδρομης, τοτε, πιστετω, οτι κανουμε λαθος σχεδιασμο του προγραμματος.

Σπύρος Δουκάκης

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 831
  • Έτερος εξ ετέρου σοφός, το τε πάλαι το τε νυν
    • http://sdoukakis.wordpress.com/
Απ: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλεση!
« Απάντηση #6 στις: 07 Σεπ 2009, 10:55:25 μμ »
Επισυνάπτω δύο σχετικά κείμενα. Είναι "κάπως" παλιά, αλλά τα θέτω υπό την κρίση σας.

ΣΔ
« Τελευταία τροποποίηση: 11 Ιούν 2016, 06:35:55 μμ από Σπύρος Δουκάκης »

Παναγιώτης Τσιωτάκης

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 3219
  • I love you 3000
    • Panagiotis Tsiotakis
Απ: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλεση!
« Απάντηση #7 στις: 08 Σεπ 2009, 04:01:35 μμ »
Σπύρο, που τα ξετρυπώνεις;

Πλέον, εγώ προκρίνω ένα απλό πινακάκι όπως αυτό στην http://users.kor.sch.gr/ptsiotakis/aepp/aepp_ask10_1.htm

που μπορεί να απεικονιστεί εύκολα και από τον μαθητή...