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

Γενικό Λύκειο => Γ΄ Λυκείου => Τμηματικός προγραμματισμός => Μήνυμα ξεκίνησε από: Γιαννης Καραλης στις 17 Φεβ 2003, 04:52:23 μμ

Τίτλος: Υποπρογραμματα
Αποστολή από: Γιαννης Καραλης στις 17 Φεβ 2003, 04:52:23 μμ
Το βιβλιο δεν αναφερει τι γινεται με τα υποπρογραμματα και τους πινακες. γνωριζει κανεις πως πρεπει να γινεται η δηλωση τους σ'αυτα; ισχυει οτι και σε Pascal;
Τίτλος: Re: Υποπρογραμματα
Αποστολή από: Δημήτρης Σλαβούδης στις 18 Μάρ 2003, 12:49:44 μμ
Γεια σας,

Πρώτη φορά χρησιμοποιώ το forum και ελπίζω να μας βοηθήσει όλους στην καλύτερη επικοινωνία μεταξύ μας που τόσο απαραίτητη είναι...

Μήπως ακούγεται τίποτα για εξαίρεση του 10ου Κ. γιατι
πολλά σχολεία δεν προλαβαίνουν την ύλη;
Τίτλος: Re: Υποπρογραμματα
Αποστολή από: mxeg στις 20 Μάρ 2003, 12:25:11 μμ
ΝΟΜΙΖΩ ΟΤΙ Ο ΤΡΟΠΟΣ ΠΟΥ ΠΡΕΠΕΙ ΝΑ ΔΗΛΩΝΟΝΤΑΙ ΑΝΑΦΕΡΕΤΑΙ ΣΤΟ ΤΕΤΡΑΔΙΟ ΤΟΥ ΜΑΘΗΤΗ ΚΑΙ ΕΙΝΑΙ ΑΡΚΕΤΟΣ
ΔΗΛΑΔΗ ΓΙΑ ΜΟΝΟΔΙΑΣΤΑΤΟ ΠΙΝΑΚΑ
Α[ΑΡΙΘΜΟΣ ΚΕΛΙΩΝ]
ΕΝΩ ΓΙΑ ΠΙΝΑΚΑ ΔΥΟ ΔΙΑΣΤΑΣΕΩΝ
Α[ΓΡΑΜΜΕΣ , ΣΤΗΛΕΣ]
ΝΟΜΙΖΩ ΑΥΤΟ ΕΙΝΑΙ ΑΡΚΕΤΟ ΓΙΑ ΤΑ ΠΑΙΔΙΑ  :)

Τίτλος: Re: Υποπρογραμματα
Αποστολή από: Theofilos στις 25 Μάρ 2003, 09:32:15 μμ
Στο τετράδιο μαθητή σελ. 100
Τίτλος: Re: Υποπρογραμματα
Αποστολή από: alkisg στις 21 Σεπ 2003, 12:10:35 μμ
Επειδή έχω ξεκινήσει την υλοποίηση των υποπρογραμμάτων στον διερμηνευτή, θα ήθελα τις σκέψεις σας για κάποια θέματα, μήπως μου έχει ξεφύγει κάτι διαβάζοντας το βιβλίο.
Γράφω ένα παράδειγμα απλά για ευκολία στον σχολιασμό (Υ.Γ. για αυτόματο χρωματισμό του κώδικα στο στέκι αρκεί να γράφετε [glοssa]Εδώ μπαίνει το πρόγραμμα[/glοssa]):

[glossa]Πρόγραμμα Υποπρογράμματα
Μεταβλητές
 ακέραιες: α, β
Αρχή
 α ← 1
 β ← 2
 Κάλεσε Αντιμετάθεσε(α, β)
 Γράψε α, β
τέλος_προγράμματος

Διαδικασία Αντιμετάθεσε(γ, δ)
Μεταβλητές
 ακέραιες: γ, δ, προσωρινή
Αρχή
 προσωρινή ← γ
 γ ← δ
 δ ← προσωρινή
τέλος_διαδικασίας[/glossa]
Θέματα για συζήτηση:

Σχετικά με τις ασάφειες κατά το πέρασμα των παραμέτρων σκέφτηκα τα εξής:

Ξέρω ότι μερικά από αυτά είναι δύσκολα σημεία και οι περισσότεροι δεν έχουν την όρεξη να μπουν σε τέτοιες λεπτομέρειες, αν όμως υπάρχουν διαφορετικές ιδέες/ερμηνίες του βιβλίου σε οποιοδήποτε σημείο θα ήθελα να τις ακούσω πριν προχωρήσω με την υλοποίηση.
Τίτλος: Re: Υποπρογραμματα
Αποστολή από: ΝΙΚΟΣ ΧΑΤΖΗΓΙΑΝΝΑΚΗΣ στις 31 Οκτ 2003, 11:26:07 πμ
Αλκη συμφωνώ με την υλοποίηση που προτείνεις για το περασμα παραμέτρων. Δεδομένου οτι ειναι σαφές απο τα παραδείγματα του βιβλίου οτι το περασμα παραμέτρων γίνεται με αναφορά. Εγω θα προτιμούσα βέβαια να γίνεται με τιμή αλλα πρεπει να ακολουθηθεί το βιβλίο. Με τους πίνακες τι σκεφτεσε για το περασμα σε διαδικασία ? Πως θα δηλωνονται μεσα στη διαδικασία ? Θα δηλώνονται και οι διαστάσεις τους ?

Τίτλος: Re: Υποπρογραμματα
Αποστολή από: alkisg στις 31 Οκτ 2003, 06:06:40 μμ
Υποτίθεται ότι απλά «αναφέρονται» στη δήλωση της διαδικασίας και στη συνέχεια δηλώνονται κανονικά στο τμήμα μεταβλητών, π.χ.

[glossa]Διαδικασία ΠέραΒρέχει(εδώ, εκεί)
Μεταβλητές
 ακέραιες: εδώ
 πραγματικές: εκεί(100)
κτλ[/glossa]
Το μεγάλο κακό είναι ότι το βιβλίο περιγράφει copy-in/copy-out και όχι με αναφορά, οπότε αν χρειαστεί αναδρομή σε διαδικασία με παράμετρο πίνακα 100x100, τότε ΓΙΑ ΚΑΘΕ ΚΛΗΣΗ θα χρειάζεται μνήμη 100x100x16 bytes, το οποίο είναι ΥΠΕΡΒΟΛΙΚΟ!!! Έτσι το υλοποιώ τελικά, ελπίζω να μην χρειαστεί κανένα πρόγραμμα αναδρομή με μεγάλους πίνακες...
Τίτλος: Re: Υποπρογραμματα
Αποστολή από: bugman στις 06 Δεκ 2003, 04:55:30 μμ
Σιγά βρε Άλκη μην δείξεις και τους παλμούς τους ρολογιού της CPU.(τι λέω τώρα!)

1. Φτιάχνεις διαδικασίες και πρέπει να δείχνεις μεταβλητές. Πολύ καλά! Δεν θα δείχνεις μεταβλητές που δεν λαμβάνουν χώρα σε μια διαδικασία! Θα δείχνεις τις τοπικές και τις εξωτερικές αν αυτές δηλώνονται στην ΓΛΩΣΣΑ. Διαφορετικά ξέχνα τες.
2. Αυτός που σκέφθηκε το πέρασμα τιμών ByRef είχε στον νού του την μικρή μνήμη της εποχής. Το πέρασμα με τιμή σημαίνει να έχεις χώρο να την βάλεις και τα 8bit συστήματα είχαν πολύ μικρό stack και γενικά μνήμη. Η BBC BASIC δούλευε με heap, έναν αντίθετο STACK που τον έβαζε στο τέλος του προγράμματος, έτσι πέρναγε τις τιμές ByVal. Ο Bill έφτιαξε την BASIC του αρχικά χωρίς υπορουτίνες (όπως τις έλεγε).  Η QuickBasic για να φανεί διαφορετική αλλά και να έχει πολύ γρήγορο χρόνο μετατροπής σε εκτελέσιμο κώδικα έβαζε byref τις παράμετρους των υπορουτινών.

3. Προτεινόμενη μέθοδος:
κατά την κλήση μιας διαδικασίας, βρίσκεις μία προς μια κάθε παράμετρο από την δήλωση της διαδικασίας. Για κάθε τιμή ή παράσταση που περνάμε, πρώτα ελέγχουμε αν είναι απλά μια τιμή ή μια παράσταση. Αν είναι παράσταση τότε (εδώ ε'ίναι το μυστικό) φτιάχνεις εαυτόματα μια μεταβλητή ΚΡΥΦΗ. Σε αυτήν βάζεις το αποτέλεσμα της παράστασης και κατόπιν δίνεις τον δείκτη σε αυτήν την κρυφή μεταβλητή ως τιμή της παραμέτρου.
Στην ουσία οι μεταβλητές στην διαδικασία είναι δείκτες σε μεταβλητές. (Αλλά δεν το ξέρει κανένας απ΄έξω)
Το πέρασμα μεταβλητής ByVal θα γίνει βάζοντας την μεταβλητή σε παρένθεση. Οπότε ο μετατροπέας (compiler) θα καταλάβει ότι έχει να κάνει με παράσταση και όχι με μια μεταβλητή. Στο τέλος της διαδικασίας όσες μεταβλητές περάσαμε ΒyRef θα έχουν την σωστή τιμή (δεν χρειάζεται copy). Επίσης οι αυτόματα δημιουργημένες μεταβλητές ( ο χώρος τους) θα αποδωθεί πίσω.

Ελπίζω να έδωσα την ιδέα!