2 Παράμετροι

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

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

Στην παρούσα ενότητα ελπίζουμε να λύσουμε όλες τις απορίες σας.

2.1 Ορισμός

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

Δραστηριότητα 5

Ξαναγυρίσετε για λίγο στο παράδειγμα 3. Σκεφτείτε τι ανταλλαγή στοιχείων χρειάζεται να γίνει μεταξύ του κυρίως προγράμματος όπου καλείται το υποπρόγραμμα και του υποπρογράμματος; Για να απαντήσετε σωστά, θα σας φανεί χρήσιμο να διατυπώσετε πρώτα πολύ σύντομα τι κάνει το υποπρόγραμμα και τι αποτέλεσμα έχει (ή πιο σωστά θέλουμε να έχει) η ενεργοποίηση του στο κυρίως πρόγραμμα.Η δική μας απάντηση ακολουθεί παρακάτω

Το υποπρόγραμμα ΕισαγωγήΑριθμού δέχεται από το χρήστη ένα ακέραιο αριθμό Χ από το 1 μέχρι και το 50. Σε περίπτωση λανθασμένης εισαγωγής αριθμού (εκτός των ορίων) ξαναζητείται από το χρήστη να δώσει άλλο που να πληροί τους περιορισμούς.

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

Δηλαδή ουσιαστικά θέλουμε το υποπρόγραμμα κατά την κλήση του να δώσει τιμή στη μεταβλητή Ν ή με άλλα λόγια θέλουμε οι ενέργειες που κάνει το υποπρόγραμμα για το Χ, να γίνονται για τη μεταβλητή Ν του κυρίως προγράμματος.

Το παραπάνω ρόλο, δηλαδή το πέρασμα τιμών από ένα τμήμα (υπο)προγράμματος σε ένα άλλο αναλαμβάνουν να διεκπεραιώσουν οι παράμετροι.

Δραστηριότητα 6

Από αυτά που διαβάσατε στην ενότητα αυτή, επιχειρήσετε να δώσετε ένα ορισμό για το τι είναι μία παράμετρο. Δώστε ένα παράδειγμα χρήσης παραμέτρων.

Συγκρίνετε την απάντηση σας με την παρακάτω

Μία παράμετρος είναι μία μεταβλητή που επιτρέπει το πέρασμα της τιμής της από ένα τμήμα προγράμματος σε ένα άλλο.

Στο προηγούμενο παράδειγμα η τιμή που παίρνει η μεταβλητή Χ μέσα στο υποπρόγραμμα περνάει στη μεταβλητή Ν του κυρίως προγράμματος.

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

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


2.2 Πως γίνεται το πέρασμα τιμών από/προς το υποπρόγραμμα

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

  • Το πλήθος των παραμέτρων που χρειάζονται σε ένα υποπρόγραμμα εξαρτάται από την ακριβή λειτουργία που επιτελεί και τον τρόπο που επικοινωνεί με το τμήμα προγράμματος από το οποίο κλήθηκε. Στη γενική περίπτωση μπορούν να υπάρχουν καμία, μία ή περισσότε­ρες παράμετροι. Ορισμένες φορές αναφερόμαστε στο σύνολο των παραμέτρων με τον όρο λίστα παραμέτρων. Όταν δεν έχουμε καμία παράμετρο τότε λέμε ότι ή λίστα παραμέτρων είναι κενή.
  • Η λίστα παραμέτρων γράφετε μετά το όνομα του υποπρογράμματος μέσα σε παρενθέσεις.
  • Δεν πρέπει να ξεχνάμε ότι οι παράμετροι παρά τον ειδικό ρόλο που παίζουν, παραμένουν απλές μεταβλητές και άρα πρέπει να δηλώνονται κανονικά στο τμήμα δηλώσεων του τμήματος προγράμματος στο οποίο χρησιμοποιούνται

Παράδειγμα 6
Ας εφαρμόσουμε τώρα τα παραπάνω και να δούμε πως τροποποιείται η λύση του προηγούμενου παραδείγματος 3

Το αποτέλεσμα για το κυρίως πρόγραμμα και το 1ο και 3ο υποπρόγραμμα φαίνεται παρακάτω:
ΠΡΟΓΡΑΜΜΑ ΕισπράξειςΕταιρειών
ΜΕΤΑΒΛΗΤΕΣ
ΠΡΑΓΜΑΤΙΚΕΣ: Εισπράξεις[50], ΜΟ
ΑΚΕΡΑΙΕΣ: Ν
ΧΑΡΑΚΤΗΡΕΣ: Εταιρείες[50]
ΑΡΧΗ
ΚΑΛΕΣΕ ΕισαγωγήΑριθμού(Ν)
ΚΑΛΕΣΕ ΕισαγωγήΣτοιχείωνΠινάκων(Εταιρείες, Εισπράξεις, Ν)
ΚΑΛΕΣΕ ΥπολογισμόΜέσουΟρου( Εισπράξεις , Ν , ΜΟ )
ΚΑΛΕΣΕ ΕμφάνισηΑποτελεσμάτων(Εταιρείες, Εισπράξεις, ΜΟ)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΥΠΟΠΡΟΓΡΑΜΜΑ ΕισαγωγήΑριθμού( x )
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: x
ΑΡΧΗ
ΓΡΑΨΕ ‘Δώσε θετική και ακέραια τιμή μέχρι το 50:'
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΔΙΑΒΑΣΕ x
ΜΕΧΡΙΣ_ΌΤΟΥ ( x > 0) ΚΑΙ ( x <=50)
ΤΕΛΟΣ_ΥΠΟΠΡΟΓΡΑΜΜΑΤΟΣ

ΥΠΟΠΡΟΓΡΑΜΜΑ ΥπολογισμόΜέσουΟρου( Α , Ν , ΜΟ )
ΜΕΤΑΒΛΗΤΕΣ
ΠΡΑΓΜΑΤΙΚΕΣ: Α[50], ΜΟ, Συν
ΑΚΕΡΑΙΕΣ: i , Ν
ΑΡΧΗ
Συν ¬ 0
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν
Συν ¬ Συν + Α[ i ]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΜΟ ¬ Σ / Ν
ΤΕΛΟΣ_ΥΠΟΠΡΟΓΡΑΜΜΑΤΟΣ

ΥΠΟΠΡΟΓΡΑΜΜΑ ΕισαγωγήΣτοιχείωνΠινάκων( Α , Β , Ν )
ΜΕΤΑΒΛΗΤΕΣ
ΠΡΑΓΜΑΤΙΚΕΣ: Α[50]
ΧΑΡΑΚΤΗΡΕΣ:Β[50]
ΑΚΕΡΑΙΕΣ: i , Ν
ΑΡΧΗ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν
ΓΡΑΨΕ ‘Δώσε το όνομα και την είσπραξη της ‘, i , ‘ης εταιρείας :'
ΔΙΑΒΑΣΕ Α [ i ], Β[ i ]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΥΠΟΠΡΟΓΡΑΜΜΑΤΟΣ

Ο μηχανισμός για την αντιστοίχηση των παραμέτρων και το πέρασμα των τιμών περιγράφεται παρακάτω:
•  Εκτελούνται οι εντολές του κυρίως προγράμματος μέχρι το σημείο κλήσης του πρώτου υποπρογράμματος, στο συγκεκριμένο παράδειγμα το ΕισαγωγήΑριθμού.
•  Με την ενεργοποίησή του, το υποπρόγραμμα παίρνει από το πρόγραμμα την παράμετρο Ν (η οποία δεν έχει πάρει πουθενά τιμή) και την αντιστοιχίζει στην αντίστοιχη παράμετρο x.
•  Μέσα στο υποπρόγραμμα η μεταβλητή x παίρνει τιμή από το χρήστη (με την εντολή ΔΙΑΒΑΣΕ).
•  Όταν τελειώνει το υποπρόγραμμα η τιμή της παραμέτρου - μεταβλητής x, δίνεται στην παράμετρο - μεταβλητή Ν.
•  Στο πρόγραμμα μας πλέον, η μεταβλητή Ν έχει την τιμή που της έδωσε το υποπρόγραμμα.

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

 

2.3 Τυπικές και Πραγματικές Παράμετροι

Όταν μία παράμετρος γράφεται στο τμήμα δήλωσης του υποπρογράμματος χαρακτηρίζεται ως Τυπική Παράμετρος, ενώ όταν γράφεται στην εντολή κλήσης του υποπρογράμματος ονομάζεται Πραγματική Παράμετρος. Κατά την κλήση ενός υποπρογράμματος οι τιμές των πραγματικών παραμέτρων «περνάνε» στις τυπικές και μετά την ολοκλήρωση του, οι νέες τιμές που έχουν πάρει οι τυπικές παράμετροι «περνάνε» και πάλι στις πραγματικές παραμέτρους.
Στο προηγούμενο παράδειγμα οι μεταβλητές Α, Β, Ν στη δήλωση του υποπρογράμματος ΕισαγωγήΣτοιχείωνΠινάκων είναι οι τυπικές παράμετροι, ενώ οι μεταβλητές Εταιρείες, Εισπράξεις, Ν είναι οι πραγματικές παράμετροι. Είναι σαφές ότι:

  • Ο αριθμός των πραγματικών και των τυπικών παραμέτρων πρέπει να είναι ίδιος.
  • Κάθε πραγματική παράμετρος αντιστοιχεί στην τυπική παράμετρο που βρίσκεται στην αντίστοιχη θέση. Για παράδειγμα η πρώτη της λί­στας των τυπικών παραμέτρων στην πρώτη της λίστας των πραγμα­ τικών παραμέτρων κοκ.
  • Η τυπική παράμετρος και η αντίστοιχη της πραγματική πρέπει να είναι του ιδίου τύπου δεδομένων (π.χ. να είναι και οι δύο πραγματικές, κλπ)
  • Σε κάποιες γλώσσες προγραμματισμού οι τυπικές παράμετροι αναφέρονται σαν ορίσματα, ενώ οι πραγματικές απλώς σαν παράμετροι.

2.4 Παρατηρήσεις

Παρακάτω ακολουθούν μερικές υποδείξεις για το πώς θα γράφουμε και πως θα δηλώνουμε με συνέπεια τις παραμέτρους των υποπρογραμμάτων καθώς και μερικές παρατηρήσεις για τη σωστή χρήση τους:

  • Οι πίνακες δηλώνονται μόνο με το όνομά τους στο τμήμα δήλωσης των παραμέτρων του υποπρογράμματος και ο τύπος αλλά και το μέγιστο πλήθος των στοιχείων τους δηλώνονται στη συνέχεια στο τμήμα δηλώσεων μεταβλητών του υποπρογράμματος. Συνηθίζεται δε σαν παράμετρος να περνάει και το «ενεργό» πλήθος των στοιχείων του πίνακα
  • Άλλες παράμετροι χρησιμο­ ποιούνται για να μεταβιβάσουν τιμές στη διαδικασία, άλλες για να επι­ στρέψουν τιμές στο κύριο πρόγραμμα και άλλες και τα δύο.
  • Οι εμβέλεια των μεταβλητών που δηλώνονται σε κάθε υποπρόγραμμα είναι τοπική. Επομένως κάθε μεταβλητή είναι γνωστή μόνο μέσα στο υποπρόγραμμα. Έξω από αυτό δεν έχει καμία τιμή.
  • Οι τυπικές παράμετροι δεν πρέπει να έχουν τα ίδια ονόματα με τις αντίστοιχες πραγματικές.
  • Όλες οι τυπικές παράμετροι δηλώνονται κανονικά στο τμήμα δήλωσης του υποπρογράμματος.

2.5 Η στοίβα χρόνου εκτέλεσης κατά την κλήση υποπρογραμμάτων

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

Όταν μία διαδικασία ή συνάρτηση καλείται από το κύριο πρόγραμμα, τότε η αμέσως επόμενη διεύθυνση του κυρίου προγράμματος, που ονομάζεται διεύθυνση επιστροφής (return address), α­ποθηκεύεται από το μεταφραστή σε μία στοίβα που ονομάζεται στοίβα χρόνου εκτέλεσης (execution time stack). Μετά την εκτέλεση της διαδικασίας ή της συνάρτησης η διεύθυνση επιστροφής απωθείται από τη στοίβα και έτσι ο έλεγχος του προγράμματος μεταφέρεται και πάλι στο κύριο πρόγραμμα. Η τεχνική αυτή εφαρμόζεται και γενικότερα, δηλαδή οποτεδήποτε μία διαδικασία ή συνάρτηση καλεί μία διαδικασία ή συνάρτηση.

Παράδειγμα 7
Δίνεται ένα κυρίως πρόγραμμα το οποίο καλεί μία διαδικασία Διαδικασία_1, αυτή με τη σειρά της καλεί τη διαδικασία_2 κοκ.

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

 

Σχήμα 3: Χρήση στοίβας από το μεταφραστή για το χειρισμό κλήσεων διαδικασιών και επιστροφών από αυτές.

Μετά την εκτέλεση κάθε διαδικασίας, η διεύθυνση επιστροφής απωθείται από τη στοίβα και ο έλεγχος μεταβιβάζεται στη διεύθυνση αυτή. Το παρά­δειγμα αυτό δείχνει μία από τις πολλές χρησιμότητες της L.I.F.O. (Last In First Out) ιδιότητας της στοίβας.