Το Στέκι των Πληροφορικών

Γενικό Λύκειο => Τμηματικός προγραμματισμός => Γ΄ Λυκείου => Συναρτήσεις => Μήνυμα ξεκίνησε από: Sergio στις 04 Μαΐου 2003, 11:18:40 ΜΜ

Τίτλος: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλεση!
Αποστολή από: Sergio στις 04 Μαΐου 2003, 11:18:40 ΜΜ
Τι μεταβλητές δημιουργούνται στη μνήμη κατά την εκτέλεση της συνάρτησης;

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

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

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

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

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

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

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

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

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

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

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

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

Γενικά όπου υπάρχει ασάφεια στο βιβλίο και είναι αποδεκτή η ερμηνεία κάποιας υπαρκτής γλώσσας προγραμματισμού, νομίζω ότι είναι καλύτερο να την προτιμούμε παρά να "αυτοσχεδιάζουμε". Συμφωνείτε;
Τίτλος: Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
Αποστολή από: Sergio στις 11 Μαΐου 2003, 08:55:50 ΠΜ
Σωστά..

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

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

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

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

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

Ποιά είναι η γνώμη σας;
Τίτλος: Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
Αποστολή από: P.Tsiotakis στις 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 γεμάτες λάθη ασκήσεις)
Τίτλος: Απ: Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
Αποστολή από: giannhs555 στις 06 Σεπ 2009, 02:24:07 ΜΜ


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

ευχαριστω.
Τίτλος: Απ: Re: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλ
Αποστολή από: dimitrios67 στις 07 Σεπ 2009, 09:36:48 ΜΜ
Παράθεση από: Τσιωτάκης Παναγιώτης στις 16 Φεβ 2004, 08:17:27 ΜΜ
Προτείνω τη χρήση άλλης μεταβλητής (π.χ. με το όνομα εκτίμηση) που μετά από όλους τους υπολογισμούς παίρνει την τιμή που πρέπει να επιστρεφεί και τελικά εκχωρείται στο όνομα της συνάρτησης ΩΣ ΤΕΛΕΥΤΑΙΑ ΕΝΤΟΛΗ.
θα συμφωνουσα κι εγω με τον Παναγιωτη, διοτι στις ευρεως χρησιμοποιούμενες γλώσσες προγραμματισμου C,C++, Java, C# υπαρχει το return, το οποίο "προσομοιώνεται" με την εκχωρηση του αποτελεσματος σε μια μεταβλητη (στην περίπτωσή μας στο όνομα της συναρτησης) και την έξοδο από τη συνάρτηση.
Διαφορετικά, εαν μπούμε στη λογική της αναδρομης, τοτε, πιστετω, οτι κανουμε λαθος σχεδιασμο του προγραμματος.
Τίτλος: Απ: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλεση!
Αποστολή από: Σπύρος Δουκάκης στις 07 Σεπ 2009, 10:55:25 ΜΜ
Επισυνάπτω δύο σχετικά κείμενα. Είναι "κάπως" παλιά, αλλά τα θέτω υπό την κρίση σας.

ΣΔ
Τίτλος: Απ: ΣΥΝΑΡΤΗΣΕΙΣ: εξέλιξη της μνήμης κατά την εκτέλεση!
Αποστολή από: P.Tsiotakis στις 08 Σεπ 2009, 04:01:35 ΜΜ
Σπύρο, που τα ξετρυπώνεις;

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

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