Συνάρτηση καλεί διαδικασία

Ξεκίνησε από andreas_p, 12 Φεβ 2020, 07:10:01 ΠΜ

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

andreas_p

Καλημέρα σας.

ΠΡΟΣ :  Συνάδελφο που έχει πρόσβαση (ας ελπίσουμε να εισακουστεί ) στο ΙΕΠ.

Β1/σελ. 179

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

Άρα , εκ πλαγίου , μία συνάρτηση μπορεί να διαβάσει μία τιμή ( ; )

Μπορεί (  ; )

Ας στείλει το ΙΕΠ μία απάντηση.   Όχι πάλι  μία δύο μέρες πριν κλείσουμε για Πάσχα !

Αναμένουμε , ως κοινότης , την  ευαισθησία σας.

Ανδρέας Πυρόβολος

ApoAntonis


gthal

Θα έβρισκα ευκολότερο και συνεπέστερο να αναιρεθεί ο περιορισμός ότι η συνάρτηση δε μπορεί να περιέχει ΓΡΑΨΕ ή ΔΙΑΒΑΣΕ, ο οποίος ακριβώς οδηγεί στην απαγόρευση κλήσης διαδικασίας μέσα από συνάρτηση και κατά τη γνώμη μου αλλοιώνει και την πραγματικότητα.
Φιλικά,
Γιώργος Θαλασσινός

alkisg

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

Μάλιστα εμένα το "απαγορεύεται" σε τέτοια θέματα δεν μου ακούγεται ορθό, καλύτερο θα ήταν "είναι κακή προγραμματική τεχνική", "συμβουλεύουμε", "προτείνουμε" κλπ. Όχι σε επίπεδο ΓΛΩΣΣΑΣ δηλαδή αλλά σε επίπεδο καλών πρακτικών. Όπως θα κόβαμε (?) σε κάποιον που κάνει ταξινόμηση για να βρει τον μέγιστο, έτσι θα κόβαμε και σε κάποιον που δομεί λάθος τα υποπρογράμματά του και κάνει ΔΙΑΒΑΣΕ σε συνάρτηση.

Αν κάποιος προσπαθούσε να βάλει αυτές τις απαγορεύσεις σε μορφή συντακτικού BNF, θα γελούσε και το παρδαλό κατσίκι. :)

gthal

Ακριβώς!
Να αρθεί η απαγόρευση αλλά να σημειώνεται ότι δεν συνιστάται (και γιατί δε συνιστάται άραγε; )
Συμφωνώ με όλα όσα είπες.
Φιλικά,
Γιώργος Θαλασσινός

pgrontas

#5
Παράθεση από: gthal στις 12 Φεβ 2020, 08:35:21 ΠΜ
Θα έβρισκα ευκολότερο και συνεπέστερο να αναιρεθεί ο περιορισμός ότι η συνάρτηση δε μπορεί να περιέχει ΓΡΑΨΕ ή ΔΙΑΒΑΣΕ, ο οποίος ακριβώς οδηγεί στην απαγόρευση κλήσης διαδικασίας μέσα από συνάρτηση και κατά τη γνώμη μου αλλοιώνει και την πραγματικότητα.

Αυτός είναι ένας περιορισμός ο οποίος έχει ξανασυζητηθεί και με τον οποίο προσωπικά συμφωνώ.
Δεν επιτρέπεται ΔΙΑΒΑΣΕ, ΓΡΑΨΕ στις συναρτήσεις ώστε η έξοδος να εξαρτάται μόνο από την είσοδο και αυτό να δηλώνεται στο πρόγραμμα, να είναι εμφανές στον προγραμματιστή, όπως συμβαίνει στις μαθηματικές συναρτήσεσεις. Αλλιώς η έξοδος εξαρτάται και από την είσοδο και από τις μεταβλητές του ΔΙΑΒΑΣΕ και μπορεί να εμφανίζεται στην οθόνη και να μην δίνεται σε μεταβλητή (οπότε να μην  μπορεί να χρησιμοποιηθεί σε εκφράσεις).
Η τεχνική αυτή μπορεί να μη συναντάται στις mainstream γλώσσες προγραμματισμού, αλλά υπάρχει στις pure συναρτησιακές γλώσσες (πχ. Haskell).
Άρα όχι μόνο δεν αλλοιώνεται η πραγματικότητα, αλλά εμπλουτίζεται.

ΥΓ: Ακόμα δηλαδή και αν δεν μπορεί να υλοποιηθεί ή είναι δύσκολο να υλοποιηθεί σε BNF έχει διδακτική αξία.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

taxata

Παράθεση από: andreas_p στις 12 Φεβ 2020, 07:10:01 ΠΜ
Καλημέρα σας.

ΠΡΟΣ :  Συνάδελφο που έχει πρόσβαση (ας ελπίσουμε να εισακουστεί ) στο ΙΕΠ.

Όλοι οι συνάδελφοι έχουν προσβαση στο ΙΕΠ για ερωτήσεις, παρατηρήσεις, προτάσεις ... δεν χρειάζονται ειδικά διαπιστευτήρια είμαι βέβαιος ότι οι υπεύθυνοι ΠΕ86, τουλάχιστον διαβάζουν, όλα τα email τους
Τάσος_Χατζηπαπαδόπουλος
Κύριε δεν έχω internet
http://users.sch.gr/chatzipap/

Γιάννης Αναγνωστάκης

Παιδιά στείλτε στο ΙΕΠ, απαντάνε

gthal

Παράθεση από: pgrontas στις 12 Φεβ 2020, 10:15:26 ΠΜ
Αυτός είναι ένας περιορισμός ο οποίος έχει ξανασυζητηθεί και με τον οποίο προσωπικά συμφωνώ.
Ναι Παναγιώτη το θυμάμαι, και τότε διαφωνούσα αλλά ακόμα περισσότερο τώρα, γιατί για χάρη αυτού του (στενόμυαλου για μένα) περιορισμού θυσιάζεται μια από τις βασικότερες αρχές (μια αρμονία αν θες) του προγραμματισμού: ότι κάθε υποπρόγραμμα μπορεί να καλείται από ένα άλλο υποπρόγραμμα! Κι αυτό για μένα έχει περισσότερη διδακτική αξία από οσεσδήποτε άλλες λεπτομέρειες αναφέρονται για να στηριχτεί η συγκεκριμένη απαγόρευση.

Δεν έχω αγγίξει πολλές γλώσσες, οπότε δε θα σε αντικρούσω σε αυτό, αλλά με τις 5-6 που έτυχε ή να δουλέψω ή να έχω έστω μια αμυδρή επαφή, καμία δε θυμάμαι να έχει τέτοιο περιορισμό. Προφανώς υπάρχει η Haskell και σ' ευχαριστώ για το παράδειγμα που δεν το ήξερα, αλλά διαισθάνομαι ότι η συντριπτική πλειοψηφία των γλωσσών δεν τον έχει. Γιαυτό λέω ότι αλλοιώνουμε την πραγματικότητα - από την άλλη, δε βλέπω πώς την εμπλουτίζουμε.

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

Συμφωνώ με όσα λες περί της εισόδου, και αυτό δεν είναι λεπτομέρεια, για να είμαι δίκαιος. Αλλά και πάλι, μπορεί να είναι στη ευχέρεια του προγραμματιστή. Αν θέλει να φτιάξει μια μαθηματική συνάρτηση, δεν πρέπει να παίρνει είσοδο από το πληκτρολόγιο. Αν θέλει να φτιάξει κάποιου άλλου είδους λειτουργία που τυγχάνει να επιστρέφει μοναδικό αποτέλεσμα όπως οι μαθηματικές συναρτήσεις, ας είναι ελεύθερος να τη φτιάξει όπως θέλει.
Παράθεση από: pgrontas στις 12 Φεβ 2020, 10:15:26 ΠΜ
Αλλιώς η έξοδος εξαρτάται και από την είσοδο και από τις μεταβλητές του ΔΙΑΒΑΣΕ και μπορεί να εμφανίζεται στην οθόνη και να μην δίνεται σε μεταβλητή (οπότε να μην  μπορεί να χρησιμοποιηθεί σε εκφράσεις).
Αλλά αυτό που λες για την έξοδο φοβάμαι ότι εμπεριέχει μια μεγάλη παρανόηση (ίσως τελικά γιαυτό να διαφωνούμε).
Αυτό που υποστηρίζω εγώ ΔΕΝ είναι το να εμφανίζει η συνάρτηση το αποτέλεσμά της στην οθόνη αντί να το επιστρέφει!
Η συνάρτηση πρέπει να επιστρέφει το αποτέλεσμά της πίσω στο κύριο πρόγραμμα, μέσα από το όνομά της!! Αυτό δεν το διαπραγματευόμαστε!
Το να εμφανίσει κάτι στην οθόνη δεν συνιστά επιστροφή αποτελέσματος και δεν είναι αποδεκτό ούτε και για τις Διαδικασίες εξ' άλλου. Αν μια Διαδικασία πρέπει να επιστρέψει κάποια αποτελέσματα, και απλώς τα εμφανίσει στην οθόνη, δεν έχει κάνει τη δουλειά της. Θα πρέπει να εκχωρήσει τα αποτελέσματά της σε παραμέτρους τις οποίες έχει δεχθεί για το σκοπό αυτό.

Οπότε τελικά, τι κακό έχει το παρακάτω ;
ΣΥΝΑΡΤΗΣΗ παραγοντικό(ν) : ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι, ν, γιν
ΑΡΧΗ
  ΓΡΑΨΕ 'Υπολογίζω το παραγοντικό του ', ν
  γιν <- 1
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ ν
    γιν <- γιν*ι
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  παραγοντικό <- γιν
  ΓΡΑΨΕ 'Έτοιμο!'
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
και δε θα μπορούσε να χρησιμοποιηθεί διδακτικά η ΓΡΑΨΕ μέσα στη συνάρτηση; (εγώ προσωπικά τη χρησιμοποιούσα πριν καταλάβω ότι απαγορεύεται, για να δείχνω στα παιδιά ότι οι τυπικές παράμετροι μπορεί να άλλαζαν μέσα στη συνάρτηση αλλά επιστρέφοντας, οι πραγματικές ήταν αναλλοίωτες, τώρα πια δε μπορώ - είναι φάουλ)
Φιλικά,
Γιώργος Θαλασσινός

pgrontas

#9
Παράθεση από: gthal στις 13 Φεβ 2020, 01:55:42 ΠΜ
από την άλλη, δε βλέπω πώς την εμπλουτίζουμε.
Ο εμπλουτισμός γίνεται επειδή έχεις δύο εκφραστικές δυνατότητες και όχι μία. Και έχει διδακτικά ωφέλη: οι μαθητές προκειμένου να διαλέξουν το είδος υποπρογράμματος πρέπει να κάτσουν εκ των προτέρων να σκεφτούν τι θέλουν να κάνουν. Άρα θα σκεφτούν και θα κατανοήσουν το πρόβλημα και η λύση που θα γράψουν θα αντανακλά τη σκέψη τους.

Για να το θέσω πιο απλά και χωρίς αναφορές σε άλλες γλώσσες: οι συναρτήσεις είναι εκφράσεις (χρησιμοποιούνται στη θέση μιας τιμής συμφωνα με το βιβλίο), οι διαδικασίες είναι εντολές.
Οι εκφράσεις πρέπει να είναι self contained, ό,τι κάνουν να μην επηρεάζει την συνολική κατάσταση (state) του προγράμματος. Αυτό επιτυγχάνεται μέσω της τοπικότητας και της απαγόρευσης επικοινωνίας με τον έξω κόσμο.

Παράθεση από: gthal στις 13 Φεβ 2020, 01:55:42 ΠΜ
Οπότε τελικά, τι κακό έχει το παρακάτω ;
ΣΥΝΑΡΤΗΣΗ παραγοντικό(ν) : ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι, ν, γιν
ΑΡΧΗ
  ΓΡΑΨΕ 'Υπολογίζω το παραγοντικό του ', ν
  γιν <- 1
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ ν
    γιν <- γιν*ι
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  παραγοντικό <- γιν
  ΓΡΑΨΕ 'Έτοιμο!'
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
και δε θα μπορούσε να χρησιμοποιηθεί διδακτικά η ΓΡΑΨΕ μέσα στη συνάρτηση; (εγώ προσωπικά τη χρησιμοποιούσα πριν καταλάβω ότι απαγορεύεται, για να δείχνω στα παιδιά ότι οι τυπικές παράμετροι μπορεί να άλλαζαν μέσα στη συνάρτηση αλλά επιστρέφοντας, οι πραγματικές ήταν αναλλοίωτες, τώρα πια δε μπορώ - είναι φάουλ)
Το κακό με το παραγοντικό που περιέχει γράψε:
1. Παραβιάζει τον κανόνα που λέει ότι το υποπρόγραμμα πρέπει να κάνει μία λειτουργία. Κάνει δύο: υπολογίζει και εμφανίζει κάτι.
2. Μπορείς να το χρησιμοποιήσεις αντί για μία τιμή; Μου φαίνεται τραγικό το να γράψεις Αν παραγοντικό(ν) > 100 και ταυτόχρονα να εμφανίζεται και 'Υπολογίζω...' και 'Ετοιμο' στην οθόνη.
Αν το υποστηρίζεις, γιατί να μην έχουμε τη δυνατότητα  να κάνουμε: y<--5+8 ^2 γραψε 13 ή Αν διάβασε χ > 0 πχ. όπως κάνουν αρχικά πολλοί μαθητές (φυσικά υπερβάλλω, αλλά νομίζω καταλαβαίνεις την ουσία).
Παράθεση από: gthal στις 13 Φεβ 2020, 01:55:42 ΠΜ
Αλλά αυτό που λες για την έξοδο φοβάμαι ότι εμπεριέχει μια μεγάλη παρανόηση (ίσως τελικά γιαυτό να διαφωνούμε).
Αυτό που υποστηρίζω εγώ ΔΕΝ είναι το να εμφανίζει η συνάρτηση το αποτέλεσμά της στην οθόνη αντί να το επιστρέφει!
Η συνάρτηση πρέπει να επιστρέφει το αποτέλεσμά της πίσω στο κύριο πρόγραμμα, μέσα από το όνομά της!! Αυτό δεν το διαπραγματευόμαστε!
Μα αυτό που λές (έμμεσα) υπονοεί να καταργήσουμε τις συναρτήσεις! Πώς θα διασφαλίσεις την επιστροφή έτσι;
Στο επιχείρημα υπάρχει η δυνατότητα αλλά να μην το κάνεις, νομίζω ότι απάντησα αρχικά: οποιαδήποτε γλώσσα πρέπει να επιβάλλει καλές πρακτικές και όχι να είναι στην ευχέρεια του μαθητή-προγραμματιστή. Αν συμβαίνει αυτό, ο μαθητής εκπαιδεύεται να σκέφτεται σωστά, ο προγραμματιστής εκφράζει καλύτερα αυτό που θέλει.

Παράθεση από: gthal στις 13 Φεβ 2020, 01:55:42 ΠΜ
Επί της ουσίας τώρα, κατά την προσωπική μου αντίληψη οι συναρτήσεις στον προγραμματισμό είναι κάτι ευρύτερο από τις μαθηματικές συναρτήσεις.
Μια συνάρτηση που δέχεται πίνακα και επιστρέφει τη μέγιστη τιμή του, βρίσκει το αποτέλεσμά της αλγοριθμικά και όχι μέσα από έναν μαθηματικό τύπο, δεν την νιώθω "μαθηματική" αλλά "αλγοριθμική".
Ομοίως μια συνάρτηση που επιστρέφει αλφαριθμητικό, δεν ξέρω αν μπορούμε να πούμε ότι είναι μαθηματική συνάρτηση (ελπίζω να μη δίνω ιδέες και για άλλες απαγορεύσεις!)
Τέλος σχετικά με το min και την επεξεργασία αλφαριθμητικών είναι και αυτά μαθηματική επεξεργασία: Απλά δουλεύει σε σύνολα και στοιχεία συνόλων και όχι σε αριθμούς.
Για μένα αυτός είναι μεγαλύτερος περιορισμός: το ότι η συνάρτηση επιστρέφει μία απλή τιμή και όχι ένα σύνολο (ενα αποτέλεσμα και στις δύο περιπτώσεις).

Παράθεση από: gthal στις 13 Φεβ 2020, 01:55:42 ΠΜ
Μια συνάρτηση που δέχεται πίνακα και επιστρέφει τη μέγιστη τιμή του, βρίσκει το αποτέλεσμά της αλγοριθμικά και όχι μέσα από έναν μαθηματικό τύπο, δεν την νιώθω "μαθηματική" αλλά "αλγοριθμική".
ΥΓ: Ο αλγόριθμος είναι μαθηματικός τύπος, αλλά είναι και κάτι περισσότερο. Όταν ξεκινάω στη Β Λυκείου λέω ότι ο αλγόριθμος είναι ένας μαθηματικός τύπος με αναβολικά.
ΥΓ2: Γιώργο, sorry αλλά έκανα αρκετές τροποποιήσεις. Ελπίζω να μην σε μπέρδεψα.





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

gthal

Παναγιώτη, η τοποθέτησή σου είναι εξαιρετικά τεκμηριωμένη και σ' ευχαριστώ!
Για να σου δώσω μια βιαστική απάντηση, στη βάση όσων λες, δεν διαφωνώ σε τίποτα.
Όντως είναι τραγικό η συνάρτηση να υπολογίζει κάτι και στο ενδιάμεσο να εμφανίζει και μηνύματα. Αλλά αυτό θα γινόταν μόνο για παρακολούθηση της εκτέλεσης και λόγους εκσφαλμάτωσης. Δεν είναι καλό να γίνεται αλλά το ερώτημα είναι γιατί να μη μπορεί να γίνεται. Με τέτοιες γλώσσες προγραμματίσαμε κι εμείς και έτσι κάναμε το debugging όταν δεν υπήρχαν τα προχωρημένα σημερινά εργαλεία, και δε νομίζω ότι μας στοίχισε ως προς τη σωστή κατανόηση της έννοιας των συναρτήσεων. 
Οπότε δεν ανησυχώ ιδιαίτερα για το διδακτικό κόστος, ειδικά αν εμείς οι διδάσκοντες κατευθύνουμε προς τη σωστή πρακτική.
Από την άλλη, εξακολουθώ να υποστηρίζω ότι το διδακτικό κόστος από τη συνεπαγόμενη απαγόρευση της κλήσης διαδικασίας από συνάρτηση είναι τεράστιο!
Όπως είπε και ο Άλκης, το να μη μπορώ να κάνω ΚΑΛΕΣΕ αντιμετάθεση(α,β) ή ΚΑΛΕΣΕ ταξινόμηση(Α) μέσα από μια συνάρτηση που χρειάζεται να ταξινομήσει τον πίνακα για να βρει το αποτέλεσμά της (ενώ έχω γράψει ήδη την αντίστοιχη διαδικασία για να τη χρησιμοποιήσω και αλλού στο πρόγραμμα), καταστρατηγεί μια από τις βασικές αρχές και πλεονεκτήματα του τμηματικού προγραμματισμού.
Εσύ δεν το βρίσκεις αυτό το κόστος μεγάλο;
Οπότε είναι σωστότερο, αντί να συνιστούμε τη σωστή πρακτική, να την επιβάλλουμε, θυσιάζοντας και καταργώντας μια τόσο θεμελιώδη δυνατότητα, τη συνεργασία των υποπρογραμμάτων;
Για μένα, το διδακτικό κόστος εδώ, είναι πολύ μεγαλύτερο - ασύγκριτα μεγαλύτερο θα έλεγα.

ΥΓ. αν βρω χρόνο θα σου απαντήσω και στα σημεία
Φιλικά,
Γιώργος Θαλασσινός

akalest0s

Μπράβο για αυτή την εξαιρετική αντιπαράθεση. (χωρίς ειρωνεία)
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

thaaanos

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

Θα πρέπει να μπορούν να αποτιμηθούν χωρίς να αλλάζουν αλλάζουν την κατάσταση του προγράμματος (μεταβλητές, I/O).

πχ το
Χ <- F(X) + F(X)+ F(X)
να είναι ισοδύναμο με το
X <- 3*F(X)


alkisg

Αυτό λέγεται https://en.wikipedia.org/wiki/Referential_transparency

Έχει διδακτική αξία, φέρνει τις συναρτήσεις της ΓΛΩΣΣΑΣ πιο κοντά σε μαθηματικές συναρτήσεις, αλλά κανονικά υλοποιείται με την αντίστοιχη υποδομή, με const παραμέτρους, immutable objects, διαφοροποίηση στη σύνταξη εντολών που μεταβάλλουν την τιμή όπως η ΔΙΑΒΑΣΕ σε σχέση με αυτές που δεν την μεταβάλλουν όπως η ΓΡΑΨΕ κλπ.

Για παράδειγμα, αν από μια συνάρτηση καλέσω μια `ΔΙΑΔΙΚΑΣΙΑ Αντιμετάθεσε(α, β)` για δύο ΤΟΠΙΚΕΣ μεταβλητές της συνάρτησης, δεν παραβιάζω το referential transparency. Αλλά με βάση την οδηγία του Υπουργείου αυτό απαγορεύεται.

Όταν η οδηγία δίνεται ως high-level περιορισμός χωρίς την αντίστοιχη υποδομή, θα πρέπει να αναφέρεται ως "καλή πρακτική", όχι ως "λάθος χρόνου μεταγλώττισης" (και σίγουρα όχι ως "συντακτικό λάθος")...

thaaanos

#14
Αν απαγορέψεις Ι/Ο και επιστροφή μόνο στο όνομα είσαι εντάξει

και το F(X) + F(X) + F(X)  έχει την ίδια συμπεριφορά με το 3*F(X)

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