ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ: Xρήση σταθερών σαν παράμετροι

Ξεκίνησε από Sergio, 04 Μαΐου 2003, 11:08:46 ΜΜ

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

Sergio

Μπορεί κανείς να περάσει στη συνάρτηση μία σταθερή τιμή; (χωρίς να την καταχωρήσει προηγούμενα σε μεταβλητή).  

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

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

Μπορεί κανέις να περάσει στη συνάρτηση μία σταθερή τιμή; (χωρίς να την καταχωρήσει προηγούμενα σε μεταβλητή).  Δηλαδή, μπορεί να πεί:

Πλήθος_ατόμων <-- Πλήθος[Όνομα, 'Βασίλης'] + Πλήθος[Όνομα, 'Βασιλική']

ή θα πρέπει υποχρεωτικά να χρησιμοποιήσει μεταβλητές και να κάνει:

Πλήθος_Ατόμων <-- 0
Ζητούμενος <-- 'Βασίλης'
Πλήθος_Ατόμων <-- Πλήθος_Ατόμων + Πλήθος[Όνομα, Ζητούμενος]
Ζητούμενος <-- 'Βασιλική'
Πλήθος_Ατόμων <-- Πλήθος_Ατόμων + Πλήθος[Όνομα, Ζητούμενος]

Αν και, νομίζω, ότι είναι προφανές πως θα πρέπει να επιτρέπεται ΚΑΙ η πρώτη (απλή) περίπτωση με το πέρασμα σταθερών τιμών (γενικά ο μηχανισμός Call by Value το επιτρέπει) το βιβλίο μιλάει ΜΟΝΟ για αντιγραφή της τιμής της μεταβλητής του προγράμματος στη μεταβλητή της συνάρτησης άρα αποκλείει (?) το πέρασμα σταθερής τιμής (?)

Ποιά η γνώμη σας;

Και το ίδιο ερώτημα αφορά και τις διαδικασίες!!!  Και κεί τα πράγματα ίσως να είναι πιό ... επικίνδυνα αφού ο μηχανισμός είναι ο copy-restore (copy-in, copy-out ή value-result)

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

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

ΔΙΑΔΙΚΑΣΙΑ Πρόσθεση_Τιμής(Π, Τιμή)
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: Π[100], Τιμή
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 100
    Π[ι] <-- Π[ι] + Τιμή
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

Όμως η κλήση της θα μπορούσε {?) να γίνει:

ΚΑΛΕΣΕ Πρόσθεση_Τιμής(Χαρτζηλίκι, 10)

ή θα ΕΠΡΕΠΕ (?) να γίνει με τη χρήση μεταβλητής;

Αύξηση <-- 10
ΚΑΛΕΣΕ Πρόσθεση_Τιμής(Χαρτζηλίκι, Αύξηση)

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

Όλα αυτά τα ερωτήματα φαίνονται πολύ ... τυπικά αλλά ... προβληματίζουν.

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

bugman

#1
ΦΥΣΙΚΑ ΚΑΙ ΜΠΟΡΕΙ!
πχ. ΓΡΑΨΕ  ΠΛΗΘΟΣ(Κ,5)
οπου Κ είναι πινακας ισου μεγέθους και ομοίου τύπου με αυτόν που δηλώσαμε στην ΠΛΗΘΟΣ.
Για να ξεμπλέκει κανείς αν σε μια περίπτωση περνάμε μεταβλητή με αναφορά ή με τιμή πρέπει να δεί ένα άλλο πιο ουσιαστικό ερώτημα: Αν περνάει παράσταση. Δηλαδή παράσταση είναι το Α+Β ή το Α ή το Α+12 ή το 12 κ.ο.κ.
Οι συναρτήσεις επειδή δουλεύουν σε παραστάσεις,  εν τέλει συμβαίνει αυτό: Οτιδήποτε είναι σε μια παράσταση θα μετατραπεί σε τιμή και θα οδηγηθεί στον συσσωρευτή όπου εκεί θα γίνουν όλες οι πράξεις.

Τώρα για να λύσω και ένα άλλο θέμα με το πέρασμα μεταβλητών (και όχι των τιμών μόνο αυτών) στις διαδικασίες:
Δεν έχουν όλες οι γλώσσες το ίδιο σύστημα (by reference). Θυμίζω στους παλιότερους τα Procedures της BBC BASIC. Σε αυτές τις περιπτώσεις οι διαδικασίες δουλεύουν και με αναδρομή τα δε αποτελέσματα δεν τα επιστρέφουν όπως οι συναρτήσεις αλλά χρησιμοποιόντας καθολικές μεταβλητές (φανερές σε όλες τις διαδικασίες).
Για την γλώσσα όμως του σχολείου έχει ξεκαθαριστεί ότι στις Διαδικασίες περιμένουμε μόνο μεταβλητές για ορίσματα, ενώ στις συναρτησεις περιμένουμε παραστάσεις.


Sergio

Φίλε Γιώργο,

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

ΠαράθεσηΦΥΣΙΚΑ ΚΑΙ ΜΠΟΡΕΙ!
πχ. ΓΡΑΨΕ  ΠΛΗΘΟΣ(Κ,5)
οπου Κ είναι πινακας ισου μεγέθους και ομοίου τύπου με αυτόν που δηλώσαμε στην ΠΛΗΘΟΣ.
.
.
.
Για την γλώσσα όμως του σχολείου έχει ξεκαθαριστεί ότι στις Διαδικασίες περιμένουμε μόνο μεταβλητές για ορίσματα, ενώ στις συναρτησεις περιμένουμε παραστάσεις.


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

ΠαράθεσηΛύθηκε η ασάφεια με τις διαδικασίες:
Μετά από επικοινωνία με τους συγγραφείς του βιβλίου προέκυψαν τα εξής συμπεράσματα: Στη ΓΛΩΣΣΑ το πέρασμα των μεταβλητών γίνεται με αναφορά στις διαδικασίες και με τιμή στις συναρτήσεις. Άρα είναι αδύνατη η κλήση μιας διαδικασίας με εκφράσεις (ή σταθερές) σαν παραμέτρους (δεν επιτρέπεται η  ΚΑΛΕΣΕ ΚάνεΚάτι(Α - 1)).
.
.

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

Αν το πέρασμα με τιμή ορίζεται όπως και από τους Aho & Ullman (Principles of Compiler Design, p.61) ή Aho, Sethi, Ullman (Principles of Compiler Design, p.424) ο μηχανισμός Call by Nalue "..the caller evaluates the actual parameters and places their r-values in thw storage for the formals" τότε αφού η σταθερή έχει r-value την τιμή της, σωστά μπορεί να χρησιμοποιηθεί.  Όμως αυτό είναι προς το παρόν δική μας υπόθεση..

Από την άλλη υπάρχει το σχολικό πακέττο που αποτελεί και τη μόνη επίσημη πηγή για τον "ορισμό" της γλώσσας (βιβλίο/τετράδιο μαθητή - βιβλίο καθηγητή), το οποίο χωρίς να παρουσιάζει πουθενά κανένα παράδειγμα με πέρασμα σταθερής τιμής σε συνάρτηση δίνει τα εξής στοιχεία:
1) "... Οι τιμές που περνούν από το ένα υποπρόγραμμα στο άλλο λέγονται παράμετροι..... Μία παράμετρος είναι μία μεταβλητή που επιτρέπει το πέρασμα της τιμής από το ένα τμήμα προγράμματος στο άλλο..." (Β.Μ.σ.210)
2) παράδειγμα και περιγραφή διαδικασίας κλήσης συνάρτησης (Β.Μ.σ.213)
3) παραδείγματα διαδικασίας κλήσης συνάρτησης (Β.Μ.σ.223, Τ.Μ.σ.101)

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

Έχεις δεί πουθενά στο Δ.Π. που χρησιμοποιείται σαφή υπόδειξη οτι ο μαθητής 'δικαιούται' να περάσει σταθερή τιμή σε συνάρτηση;

(ίσως αυτό να είναι ένα ακόμα στοιχείο που πρέπει να ξεκαθαριστεί σαφέστερα πριν αρχίσει η διόρθωση των φετινών γραπτών)


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

bugman

#3
Οι συγγραφείς του βιβλίου σε κάποια γλώσσα στηρίχθηκαν για να γράψουν τπν ψευδοκώδικα. Στον πρόλογο γράφουν: 'Η υποθετική αυτή γλώσσα αποκαλείται ΓΛΩΣΣΑ και όπως θα γίνει αμέσως φανερό, η μετατροπή ενός προγράμματος από τη ΓΛΩΣΣΑ σε μια πραγματική γλωσσα προγραμματισμού είναι μια απλή υπόθεση'.
Κεφ 10,  στο  5.1 Οι συγγραφείς στην δεύτερη παράγραφο ξεκαθαρίζουν τον ρόλο των διαδικασιών σε σχέση με την επιστροφή τιμών μέσω των μεταβλητών που δίνουμε ως παράμετρους εισόδου. Άρα λένε για πέρασμα μεταβλητών By reference. Στην αμέσως επόμενη παράγραφο μιλάνε για τον τρόπο χειρισμού των συναρτήσεων που **είναι όμοια με την χρήση των ενσωματωμένων συναρτήσεων**. Πουθενά και σε καμιά γλώσσα οι ενσωματωμένες συναρτήσεις δεν δέχονται by reference μεταβλητές - πλην από τις κλήσεις στο λειτουργικό (π.χ. windows, οι οποιές ορίζονται ως εξωτερικές συναρτήσεις-διαδικασίες **δεν τις υποστηρίζει η ΓΛΩΣΣΑ αφού καμμιά σχέση δεν έχει με τις εφαρμογές!**) που στην ουσία η επιστροφή τιμής είναι ο κωδικός λάθους και αυτό γιατί ο τρόπος κλήσης τους είναι παραξενιά του κατασκευαστή!

Διάλεξα δυο τυχαία παραδείγματα από το API των Windows ( για όποιον θέλει να ασχοληθεί:http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html )

Declare Sub AdsFreeAdsValues Lib "activeds.dll" ( _
       ByRef pAdsValues As PADSVALUE, _
       ByVal dwNumValues As Long)

Declare Function getsockname Lib "ws2_32.dll" ( _
       ByVal s As Long, _
       ByRef name As sockaddr, _
       ByRef namelen As Long) As Long

**Είναι σε Visual Basic**

Σκέψου και αυτό: Ότι έχει γραφτεί πίσω από το 10ο κεφάλαιο δεν υποχρεώνει κανένα να ακολουθήσει τους κανόνες της ΓΛΩΣΣΑΣ του 10 κεφαλαίου. **κάνω λάθος μόνο αν έχει οριστεί άλλη σειρά μάθησης κεφαλαίων!Sergio ωραίο αυτό που έγραψες με αναφορά το Compilers Design. Ξέχασες να δώσεις και την ημερομηνία έκδοσης -της πρώτης φυσικά- Θέλω να πω ότι ο προγραμματισμός είναι η τέχνη της αντιστοίχισης - το 65 είναι το Α - και ο καθένας κάνει αντιστοίχιση σε αυτό που θέλει όπως θέλει αρκεί το αποτέλεσμα να είναι το επιθυμητό (δες πόσα διαφορετικοκά σύνολα χαρακτήρων έχουμε και ρωτάω ποιο νούμερο έχει το Α το ελληνικό...;).
Ένας τρόπος στις εξετάσεις να αποφύγει ο μαθητής τον δύστροπο εξεταστή είναι να ξεκαθαρίσει με μια παραδοχή στην αρχή της λύσης ότι στην συγκεκριμένη υλοποίηση δεχόμαστε τό και τό (π.x. οι παράμετροι των υποπρογραμμάτων τύπου συνάρτηση είναι παραστάσεις/εκφράσεις).



alkisg

Σχετικά με το πέρασμα σταθερών σε συναρτήσεις, είχα στείλει την εξής ερώτηση στην κα Αθηνά Βακάλη:
ΠαράθεσηΣτη σελίδα 213, για τις συναρτήσεις αναφέρετε ότι «Η λίστα παραμέτρων είναι μια λίστα μεταβλητών, των οποίων οι τιμές μεταβιβάζονται στη συνάρτηση κατά την κλήση». Με αυτό υποθέτω ότι η λίστα παραμέτρων των συναρτήσεων είναι με τιμή, αν και θα έπρεπε να λέει ότι είναι μία λίστα εκφράσεων, και όχι μεταβλητών.
Μου απάντησε ο κ. Χρήστος Κοίλιας, ο οποίος έχει επιμεληθεί το 10ο κεφάλαιο:
ΠαράθεσηΣτις συναρτήσεις, πράγματι έπρεπε να λέει "λίστα μεταβλητών, σταθερών ή εκφράσεων" αφού το πέρασμα είναι με τιμή.
Φυσικά αυτό σε καμία περίπτωση δεν αποτελεί επίσημη απάντηση, όμως θεωρώ ότι αν κάποτε στείλουμε επίσημα τις ερωτήσεις μας στο Π.Ι. οι απαντήσεις θα είναι λίγο - πολύ οι ίδιες ;-)

Γιώργο (bugman) στο API των Windows οι functions δέχονται var παραμέτρους και συγχρόνως επιστρέφουν τιμή επειδή οι προγραμματιστές είχαν κατά νου την C, στην οποία δεν υπάρχουν procedures, παρά μόνο functions. Γενικά βολεύει στο ότι μπορείς συγχρόνως με την κλήση να κάνεις και μία if, ώστε να πράξεις ανάλογα με το αν η κλήση ήταν επιτυχής ή όχι. Πλέον και το Delphi χρησιμοποιεί αυτήν την τακτική, αν και γενικά η συμπύκνωση κάνει τον κώδικα δυσκολοδιάβαστο από (αρχάριους) μαθητές και δεν θα ήταν ό,τι καλύτερο για ένα μάθημα δευτεροβάθμιας...

bugman

#5
Άλκη είναι γνωστό **από τους παλιούς** ότι σε C γράφτηκε μεγάλο μέρος των Windows. Το ζήτημα είναι το interface, ο προσαρμογέας του τρόπου κλήσης μιας συνάρτησης τύπου C από μια άλλη γλώσσα. Αν πρόσεξες έδωσα δυο τυχαίους ορισμούς του API των Windows, από τους οποίους ο ένας λέει sub δηλώνοντας SUBRUTINE δηλαδή ΔΙΑΔΙΚΑΣΙΑ. Τελικά η visual basic εσωτερικά θα μετατρέψει την ΔΙΑΔΙΚΑΣΙΑ σε ΣΥΝΑΡΤΗΣΗ.

Τώρα για τον λόγο που έχει γίνει η όλη συζήτηση, πιστεύω ότι το κομάτι που λέει για τις συναρτησεις, την χρήση τους (στο 10.5.1) **είναι όμοια με την χρήση των ενσωματωμένων συναρτήσεων**, η χρήση της Α_Τ( ή της Α_Κ( μας περιορίζει σε μεταβλητές, ή μπορούμε να βάλουμε εκφράσεις- και μια σταθερά είναι μια μορφή έκφρασης-;