ΓΡΑΨΕ, ΔΙΑΒΑΣΕ σε συνάρτηση (ασάφεια διδακτικού πακέτο

Ξεκίνησε από sstergou, 11 Φεβ 2010, 07:37:53 ΜΜ

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

Σε μία συνάρτηση

Δεν επιτρέπεται η χρησιμοποίηση των εντολών, ΓΡΑΨΕ, ΔΙΑΒΑΣΕ ούτε και η κλήση διαδικασίας.
Επιτρέπονται όλα τα παραπάνω. Η χρήση εντολών εισόδου-εξόδου όμως δεν είναι ενδεδειγμένη.

sstergou

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

Υπάρχουν δύο επιλογές κατά την γνώμη μου
1) Οι εντολές Γράψε, Διάβασε και η κλήση διαδικασίας από συνάρτηση απαγορεύονται.
2) Οι εντολές Γράψε, Διάβασε επιτρέπονται και μια συνάρτηση μπορεί να καλέσει μια διαδικασία.

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

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

pgrontas

Η μητέρα όλων των ασαφειών. Προς το παρόν δεν έχω καταλήξει σε συγκεκριμένη άποψη.

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

Από την άλλη νομίζω ότι έχει διδακτικά ωφέλη το να έχουμε συναρτήσεις, ή κάτι τέλος πάντων, που η έξοδος τους έξαρτάται αποκλειστικά από την είσοδο όπως στα μαθηματικά (referential transparency νομίζω λέγεται αυτό).

Ας ακούσουμε και άλλες απόψεις...
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

tom

Παράθεση από: sstergou στις 11 Φεβ 2010, 07:37:53 ΜΜ
Στο διδακτικό πακέτο δεν υπάρχει σαφής αναφορά για το αν οι εντολές ΓΡΑΨΕ, ΔΙΑΒΑΣΕ μπορούν να μπουν στο εσωτερικό μιας συνάρτησης. Αν αυτές απλά απαγορευτούν όμως τότε κάποιος μπορεί εύκολα να παραβιάσει τον περιορισμό και να τις χρησιμοποιήσει μέσα σε μια διαδικασία η οποία καλείται από την συνάρτηση. Μια πλήρης απαγόρευση θα πρέπει να περιλαμβάνει και την απαγόρευση κλήσης διαδικασίας από συνάρτηση.

Υπάρχουν δύο επιλογές κατά την γνώμη μου
1) Οι εντολές Γράψε, Διάβασε επιτρέπονται και μια συνάρτηση μπορεί να καλέσει μια διαδικασία.
2) Οι εντολές Γράψε, Διάβασε και η κλήση διαδικασίας από συνάρτηση απαγορεύονται.

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

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

Συμφωνώ με το 2)! "Οι εντολές Γράψε, Διάβασε και η κλήση διαδικασίας από συνάρτηση απαγορεύονται."

Στο παράδειγμα σου Στάθη, μπορεί η ταξινόμηση να γίνει από συνάρτηση.

Το σκεπτικό μου είναι το εξής:

Στο σχολικό βιβλίο από ότι έχω καταλάβει, όσον αφορά τις συναρτήσεις, το πέρασμα παραμέτρων είναι με τιμή (by-value), μπορούν να υπάρχουν μία ή περισσότερες είσοδοι, οι μεταβλητές έχουν τοπική εμβέλεια και υπάρχει μόνο μία επιστρεφόμενη τιμή. Αν θέλει όμως να εισάγεις με μία "Εμφάνισε" πολλά δεδομένα; Πως θα τα περάσεις στο κύριο πρόγραμμα, με πίνακα ΧΑΡΑΚΤΗΡΕΣ  ;) :D Και αν θες να εμφανίζεις μηνύματα μαζί με τιμές; Π.Χ. "Ο μέσος όρος είναι:",  a

όσον αφορά τις διαδικασίες, το πέρασμα παραμέτρων δεν είναι ούτε με τιμή (by-value) ούτε με αναφορά (by-reference) αλλά με κάτι άλλο. Οι τιμές αντιγράφονται μέσα, όσο διαρκεί η διαδικασία είναι ορατές μόνο μέσα στο σώμα της και όταν τελειώσει αντιγράφονται πίσω στο κύριο πρόγραμμα.
Άρα η διαδικασία είναι πιο κατάλληλη για είσοδο και για έξοδο.

Παράθεση από: pgrontas στις 11 Φεβ 2010, 08:00:19 ΜΜ
Από την άλλη νομίζω ότι έχει διδακτικά ωφέλη το να έχουμε συναρτήσεις, ή κάτι τέλος πάντων, που η έξοδος τους έξαρτάται αποκλειστικά από την είσοδο.
Συμφωνώ
Θωμάς Σκυλογιάννης

- Ζήσε σα να' ταν να πεθάνεις αύριο. Μάθε σα να' ταν να ζεις για πάντα.
                                                                                     Μαχάτμα Γκάντι

sstergou

Παράθεση από: tom στις 11 Φεβ 2010, 08:40:06 ΜΜ
Στο παράδειγμα σου Στάθη, μπορεί η ταξινόμηση να γίνει από συνάρτηση.

Εννοείς ότι μια συνάρτηση μπορεί να επιστρέψει πίνακα; Αυτό σηκώνει κουβέντα.
Ακόμη και αν το δεχτούμε αυτό νομίζω η ταξινόμηση είναι προτιμότερο να γίνει με διαδικασία.

Σίγουρα η διαδικασία είναι προτιμότερη για είσοδο έξοδο αλλά δεν είναι αυτό το θέμα.

tom

Παράθεση από: sstergou στις 11 Φεβ 2010, 08:47:40 ΜΜ
Εννοείς ότι μια συνάρτηση μπορεί να επιστρέψει πίνακα; Αυτό σηκώνει κουβέντα.
Όχι, εξ'αλλου αν ξαναδείς το μήνυμα μου αναφέρω ότι επιστρέφει μόνο μια τιμή. Απλά δίνω έμφαση στο ότι δεν απάντησες σε αυτό:

"Αν θες να εμφανίζεις μηνύματα μαζί με τιμές; Π.Χ. Εμφάνισε "Ο μέσος όρος είναι:",  a, μέσα από συνάρτηση πως θα γίνει αυτό";  >:D ή αν θες να διαβάζεις τρεις τιμές π.χ. Διάβασε α,β,γ πως θα τις περνάς στο κύριο πρόγραμμα. Γιατί αν είναι να μπορείς να περάσεις τρεις τιμές γιατί να μη μπορείς και πίνακα; Μετά θα πρέπει να έχουμε χρήση by-reference.

Προτείνω να μείνουμε πιστοί σε αυτό που λέει ο ορισμός στη σελ. 211: "Η συνάρτηση είναι ένας τύπος υποπρογράμματος που υπολογίζει και επιστρέφει μόνο μία τιμή με το όνομα της (όπως οι μαθηματικές συναρτήσεις)".



Θωμάς Σκυλογιάννης

- Ζήσε σα να' ταν να πεθάνεις αύριο. Μάθε σα να' ταν να ζεις για πάντα.
                                                                                     Μαχάτμα Γκάντι

evry

  Ο τρόπος περάσματος παραμέτρων που επέλεξαν οι συγγραφείς είναι γνωστός στη βιβλιογραφία ως Call-by-copy-restore ή call-by-value-result ή call-by-value-return.
   Υπάρχει σε μια έκδοση της Algol, την AlgolW και χρησιμοποιείται και στην Ada, εκεί είναι οι γνωστές In out παράμετροι, παραθέτω κάποια links
http://c2.com/cgi/wiki?CallByValueResult
http://www.csc.liv.ac.uk/~grant/Teaching/COMP205/paramPassing.html#callByCopyRestore
Λοιπόν το πρόβλημα κατά τη γνώμη μου είναι ότι θα πρέπει να φαίνονται ποιες παράμετροι είναι εισόδου και ποιες εξόδου, ώστε να φαίνονται τα Δεδομένα και τα Αποτελέσματα.
Επειδή δεν θέλω να επαναλαμβάνομαι είχε γίνει κάποια συζήτηση για το θέμα του περάσματος παραμέτρων στο παρακάτω λινκ
https://alkisg.mysch.gr/steki/index.php?topic=289.msg1877#msg1877

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


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

tom

Παράθεση από: evry στις 11 Φεβ 2010, 10:18:37 ΜΜ
   Νομίζω ότι οι παρακάτω συνάρτηση θα ήταν μια χαρά (πάντα με κεφαλαία φυσικά  ;D):
ΣΥΝΑΡΤΗΣΗ ΘετικήΤιμή():ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
   ΑΚΕΡΑΙΕΣ: Τιμή
ΑΡΧΗ
   ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
       ΔΙΑΒΑΣΕ Τιμή
   ΜΕΧΡΙΣ_ΟΤΟΥ (Τιμή > 0)
   ΘετικήΤιμή <- Τιμή
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


    Αυτή απαγόρευση του Διάβασε/Γράψε στις συναρτήσεις ποτέ μου δεν κατάλαβα ποιον διδακτικό σκοπό εξυπηρετεί.
Και αν θες να διαβάσεις 2+ τιμές;;;
Θωμάς Σκυλογιάννης

- Ζήσε σα να' ταν να πεθάνεις αύριο. Μάθε σα να' ταν να ζεις για πάντα.
                                                                                     Μαχάτμα Γκάντι

evry

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

tom

Θωμάς Σκυλογιάννης

- Ζήσε σα να' ταν να πεθάνεις αύριο. Μάθε σα να' ταν να ζεις για πάντα.
                                                                                     Μαχάτμα Γκάντι

gthal

Ψήφισα το 1)   (που νομίζω στην ψηφοφορία ήταν δεύτερο)
Όταν ξεκίνησα να μαθαίνω προγραμματισμό που δεν υπήρχαν τα σημερινά IDE's ούτε debuggers, ήμουν ευγνώμων που μπορούσα να βάλω εντολές εξόδου οπουδήποτε - και μέσα στις συναρτήσεις. Έτσι γινόταν το debugging τότε (επιπλέον,  δεν πείραζα κανέναν).
Νομίζω ότι ένα υποπρόγραμμα πρέπει να μπορεί να κάνει ακριβώς ότι ένα πρόγραμμα. Άλλο τώρα αν εξυπηρετεί ή αν ενδείκνυται. Αν εξυπηρετεί στην περίσταση, ας έχει και είσοδο η συνάρτηση. Δεν βλέπω το πρόβλημα.

Πέρα από αυτά, η πρόταση 2) έχει ως απαράδεκτη παρενέργεια την απαγόρευση κλήσης υποπρογράμματος από υποπρόγραμμα: Καταστροφή !!!!
Φιλικά,
Γιώργος Θαλασσινός

tom

Παράθεση από: gthal στις 12 Φεβ 2010, 01:54:44 ΠΜ
Ψήφισα το 1)   (που νομίζω στην ψηφοφορία ήταν δεύτερο)
Όταν ξεκίνησα να μαθαίνω προγραμματισμό που δεν υπήρχαν τα σημερινά IDE's ούτε debuggers, ήμουν ευγνώμων που μπορούσα να βάλω εντολές εξόδου οπουδήποτε - και μέσα στις συναρτήσεις. Έτσι γινόταν το debugging τότε (επιπλέον,  δεν πείραζα κανέναν).
Νομίζω ότι ένα υποπρόγραμμα πρέπει να μπορεί να κάνει ακριβώς ότι ένα πρόγραμμα. Άλλο τώρα αν εξυπηρετεί ή αν ενδείκνυται. Αν εξυπηρετεί στην περίσταση, ας έχει και είσοδο η συνάρτηση. Δεν βλέπω το πρόβλημα.

Πέρα από αυτά, η πρόταση 2) έχει ως απαράδεκτη παρενέργεια την απαγόρευση κλήσης υποπρογράμματος από υποπρόγραμμα: Καταστροφή !!!!
Παράθεση από: evry στις 11 Φεβ 2010, 10:18:37 ΜΜ
Και τώρα στο θέμα μας
Τώρα σχετικά με τις συναρτήσεις, αν μας επέτρεπαν να χρησιμοποιούμε Διάβασε/Γράψε δεν ξέρω αν θα χρειαζόμασταν διαδικασίες. Προσωπικά θεωρώ ότι με τις παρούσες ώρες που διδάσκεται το μάθημα δεν υπάρχει χώρος για διαδικασίες, ούτε για μεγάλα προγράμματα τα οποία θα αναλύσει ο μαθητής με διαδικασίες.
   Αντιθέτως μάλιστα εμείς τον εξετάζουμε αν μπορεί να ορίσει μια διαδικασία ή αν ξέρει να περνάει σωστά τις παραμέτρους, δηλαδή καθαρά σε τεχνικά θέματα και φυσικά οι στόχοι του μαθήματος πάνε περίπατο.
   Νομίζω ότι οι παρακάτω συνάρτηση θα ήταν μια χαρά (πάντα με κεφαλαία φυσικά  ;D):
ΣΥΝΑΡΤΗΣΗ ΘετικήΤιμή():ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
   ΑΚΕΡΑΙΕΣ: Τιμή
ΑΡΧΗ
   ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
       ΔΙΑΒΑΣΕ Τιμή
   ΜΕΧΡΙΣ_ΟΤΟΥ (Τιμή > 0)
   ΘετικήΤιμή <- Τιμή
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Αυτή απαγόρευση του Διάβασε/Γράψε στις συναρτήσεις ποτέ μου δεν κατάλαβα ποιον διδακτικό σκοπό εξυπηρετεί.

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

πχ

ΥΠΟΠΡΟΓΡΑΜΜΑ  παρ1(ΕΙΣΟΔΟΣ: α, β , ΕΞΟΔΟΣ: γ)
ΜΕΤΑΒΛΗΤΕΣ
      ΑΚΕΡΑΙΕΣ: α, β
      ΛΟΓΙΚΕΣ: γ
ΑΡΧΗ
   ΑΝ α>β ΤΟΤΕ
     γ<-αληθής
   ΑΛΛΙΩΣ
     γ<-ψευδής
ΤΕΛΟΣ_ΥΠΟΠΡΟΓΡΑΜΜΑΤΟΣ


Αλλά αν μιλάμε για το υπάρχον διδακτικό πακέτο, γιατί να υποστηρίζει η συνάρτηση ΔΙΑΒΑΣΕ και ΓΡΑΨΕ, αφού υπάρχει η διαδικασία γι'αυτό. Αν συμβεί κάτι τέτοιο, η διαδικασία δεν χάνει αυτόματα το νόημα της ύπαρξής της;  :)

Θωμάς Σκυλογιάννης

- Ζήσε σα να' ταν να πεθάνεις αύριο. Μάθε σα να' ταν να ζεις για πάντα.
                                                                                     Μαχάτμα Γκάντι

ntzios kostas

#11
Νομίζω και εγώ ότι το σχολικό έχει στο "μυαλό" του τη συνάρτηση όπως αυτή ορίζεται στα μαθηματικά. Και δεν είμαι αντίθετος σε αυτο. Διαφορετικά θα προτιμούσα να είχαμε ένα άλλο όνομα για αυτήν, ας πούμε υποπρόγραμμα και να χρησιμοποιείται όπως γίνεται στη C.

Επίσης το συγκεκριμένο θέμα νομίζω περιγράφεται σαφέστατα από το σχολικό. Δεν ξέρω αν είναι λάθος, αλλά σαφές είναι. Τώρα για το αν θα μπορεί να υπάρχει διαδικασία που χρησιμοποιείται από τη συνάρτηση και η οποία θα χρησιμοποιεί το διάβασε ή γράψε, νομίζω ότι και αυτό είναι σαφές ότι δεν πρέπει να χρησιμοποιείται. Η διαδικασία αυτή είναι μέρος της συνάρτησης. Αν μας ρωτήσουν τι κάνει αυτή η συνάρτηση θα του απαντήσουμε ότι κάνει  το  ένα, ότι κάνει το άλλο και ότι διαβάζει κάτι. Τι με ενδιαφέρει αν το διαβάζει μέσω διαδικασίας. Τελικά αυτή διαβάζει. Άρα δεν επιτρέπεται.

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

evry

Ναι ε? πάντως εγώ ακόμα κάνω debugging με διαγνωστικά μηνύματα, μια χαρά είναι
απλά δεν πηγαίνουν πια στην οθόνη  :)

Παράθεση από: gthal στις 12 Φεβ 2010, 01:54:44 ΠΜ
Όταν ξεκίνησα να μαθαίνω προγραμματισμό που δεν υπήρχαν τα σημερινά IDE's ούτε debuggers, ήμουν ευγνώμων που μπορούσα να βάλω εντολές εξόδου οπουδήποτε - και μέσα στις συναρτήσεις. Έτσι γινόταν το debugging τότε (επιπλέον,  δεν πείραζα κανέναν).
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gthal

Παράθεση από: tom στις 12 Φεβ 2010, 02:34:32 ΠΜ
Αλλά αν μιλάμε για το υπάρχον διδακτικό πακέτο, γιατί να υποστηρίζει η συνάρτηση ΔΙΑΒΑΣΕ και ΓΡΑΨΕ, αφού υπάρχει η διαδικασία γι'αυτό. Αν συμβεί κάτι τέτοιο, η διαδικασία δεν χάνει αυτόματα το νόημα της ύπαρξής της;  :)
Παράθεση από: evry στις 11 Φεβ 2010, 10:18:37 ΜΜ
Τώρα σχετικά με τις συναρτήσεις, αν μας επέτρεπαν να χρησιμοποιούμε Διάβασε/Γράψε δεν ξέρω αν θα χρειαζόμασταν διαδικασίες.
χμμ... με αφορμή τα παραπάνω, κι επειδή για μένα δεν είναι οι ΓΡΑΨΕ/ΔΙΑΒΑΣΕ που κάνουν τη διαφορά μεταξύ συναρτήσεων/διαδικασιών, νομίζω ότι αξίζει να αποσαφηνίσω τη διαφορά μεταξύ τους όπως τη βλέπω εγώ. Ελπίζω να μην σας κουράσω και να μην περιγράφω τα προφανή...

Παράθεση από: ntzios kostas στις 12 Φεβ 2010, 09:04:12 ΠΜ
Νομίζω και εγώ ότι το σχολικό έχει στο μυαλό του τη συνάρτηση όπως αυτή ορίζεται στα μαθηματικά.
Αυτό νομίζω κι εγώ. Είναι σαν να μπορώ να συμπληρώσω συναρτήσεις στις ήδη υπάρχουσες "ενσωματωμένες" συναρτήσεις της ΓΛΩΣΣΑΣ (Τ_Ρ, Α_Τ κλπ). Είναι "μαθηματική" συνάρτηση. Δέχεται ένα ή περισσότερα ορίσματα και επιστρέφει μια τιμή. Μάλιστα ας μου επιτραπεί η έκφραση: η συνάρτηση είναι τιμή (το γράφω έτσι για να τονίσω ότι έχει φτιαχτεί γι αυτό το σκοπό- να επιστρέφει τιμές), γι αυτό και μπορεί να μπει με το όνομά της μέσα σε εκφράσεις.

Ας πούμε ότι θέλω να υπολογίζω συχνά το παραγοντικό. Για να μην παρεμβάλλω συνεχώς τον κώδικα που το υπολογίζει, γράφω τη συνάρτηση, έστω παρ(χ). Έτσι μπορώ να γράψω
ΓΡΑΨΕ παρ(5)    όμορφα και καθαρά

Αν η παρ ήταν διαδικασία θα έπρεπε να γράψω
χ<-5  ! αφού λόγω by-reference δεν μπορώ να περάσω τη σταθερή 5
ΚΑΛΕΣΕ παρ(χ, αποτέλεσμα)
ΓΡΑΨΕ αποτέλεσμα
σίγουρα, όχι τόσο βολικό και φανταστείτε να είχα να υπολογίσω το 10!/(7!*3!)
(ίσως λοιπόν να λέγαμε ότι συνάρτηση είναι μια διαδικασία, διαμορφωμένη έτσι ώστε να χρησιμοποείται πιο εύκολα στις εκφράσεις - με την προυποθεση ότι επιστρέφει τιμή)
Φυσικά είναι μάλλον απίθανο, υπολογίζοντας μια μαθηματική συνάρτηση να διαβάσουμε ή να εμφανίζουμε κάτι, αλλά πάλι αν το κάνουμε ποιο το κακό ώστε να απαγορεύεται; Φυσικά αν κάποιος θέλει μέσα από συνάρτηση να διαβάσει πολλές τιμές και να τις επιστρέψει στο πρόγραμμα, έχασε (και θα έπρεπε να το καταλάβει από μόνος του) γιατί μόνο μία τιμή μπορεί να επιστρέψει.

Τώρα, η διαδικασία δεν έχει φτιαχτεί για να επιστρέφει τιμές. Είναι απλά μια ρουτίνα (δουλειά/διαδικασία) που εκτελείται και τέλος. Όπως πχ να εμφανίσω όλα τα στοιχεία ενός πίνακα. Μπορεί να τη γράψω (αυτή τη δουλειά) ως υποπρόγραμμα είτε γιατί θα εκτελεστεί πολλές φορές είτε για να αφαιρέσω την πολυπλοκότητά της από το κυρίως πρόγραμμα. Η διαδικασία (κατ'αρχήν) δεν είναι για να επιστρέφει τιμές.
Συμβαίνει βέβαια, οι παράμετροι στη διαδικασία να μεταβιβάζονται by-reference, το οποίο δίνει τη δυνατότητα στη διαδικασία (αν χρειάζεται) να μπορεί να αλλάξει τις τιμές των πραγματικών παραμέτρων (δηλ. των μεταβλητών του προγράμματος) και έτσι, έμμεσα (και όχι άμεσα, όπως η συνάρτηση) να μπορεί να επιστρέψει πολλές (και όχι μόνο μία) τιμές.

Αν αντι για συναρτήσεις είχαμε μόνο διαδικάσιες, φαίνεται από το παράδειγμα με το παραγοντικό ότι θα ήταν δυσλειτουργικό.
Αντίστροφα, αν αντι για διαδικασίες είχαμε μόνο συναρτήσεις, τότε κάθε φορά που θα θέλαμε να κάνουμε μια "κουραστική" δουλειά η οποία δεν παράγει αποτέλεσμα, θα έπρεπε να επιστρέφουμε και ένα εικονικό αποτέλεσμα και, ακόμα χειρότερα, να έχουμε και μια ψευτομεταβλητή στο κυρίως πρόγραμμα για να το δεχθεί. Εντάξει, το αποτέλεσμα θα μπορούσε να είναι true/false (πήγαν όλα καλά ή όχι) αλλά τι θα μπορούσε να πάει στραβά όταν εκτυπώνω τα στοιχεία ενός πίνακα? Λίγο αδέξιο κι αυτό.

Ουφ! Μάλλον κουραστικά τα παραπάνω αλλά δεν μπορώ να τα συμπυκνώσω περισσότερο ώστε να αποσαφηνίσω τα σημεία που διαφωνούμε.

Συνοψίζω την άποψή μου:
1. Η χρήση των ΔΙΑΒΑΣΕ/ΓΡΑΨΕ στη συνάρτηση είναι συνήθως άχρηστη αλλά δε χρειάζεται να απαγορεύεται.
2. Η χρήση ή μη χρήση των ΔΙΑΒΑΣΕ/ΓΡΑΨΕ στα υποπρογράμματα δεν καθιστά κανένα είδος υποπρογράμματος αντικαταστάσιμο από το άλλο.
Φιλικά,
Γιώργος Θαλασσινός

pgrontas

Παράθεση από: gthal στις 12 Φεβ 2010, 01:39:11 ΜΜ
Είναι "μαθηματική" συνάρτηση. Δέχεται ένα ή περισσότερα ορίσματα και επιστρέφει μια τιμή. Μάλιστα ας μου επιτραπεί η έκφραση: η συνάρτηση είναι τιμή (το γράφω έτσι για να τονίσω ότι έχει φτιαχτεί γι αυτό το σκοπό- να επιστρέφει τιμές), γι αυτό και μπορεί να μπει με το όνομά της μέσα σε εκφράσεις.
....
Φυσικά είναι μάλλον απίθανο, υπολογίζοντας μια μαθηματική συνάρτηση να διαβάσουμε ή να εμφανίζουμε κάτι, αλλά πάλι αν το κάνουμε ποιο το κακό ώστε να απαγορεύεται;
Το "κακό" είναι ότι αν επιτρέπεται ΔΙΑΒΑΣΕ στην συνάρτηση το αποτέλεσμα της μπορεί να επηρεαστεί από τα δεδομένα που διαβάζονται και όχι μόνο από την είσοδο, όπως συμβαίνει στα μαθηματικά.
Δεν ξέρω βέβαια κατά πόσο πρέπει να επιμείνουμε στον τόσο αυστηρό ορισμό. Σε κάθε περίπτωση δεν μπορούμε να το απαγορέψουμε, αλλά αυτό μας δημιουργεί κενό.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson