Υποπρόγραμματα

Οι Διαδικασίες και οι Συναρτήσεις

Ένα υποπρόγραμμα (subprogram) ή υπορουτίνα (subroutine) είναι ένα σύνολο εντολών της Pascal που κάνει μια συγκεκριμένη λειτουργία και γράφεται με τους ίδιους κανόνες που γράφεται ένα πρόγραμμα. Τα υποπρογράμματα χωρίζονται σε δύο κατηγορίες : τις διαδικασίες (procedures) και τις συναρτήσεις (functions).

Οι Διαδικασίες

Η διαδικασία (procedure) είναι ένα υποπρόγραμμα που έχει σαν αποτέλεσμα την εκτέλεση μιας σειράς πράξεων για έναν και μοναδικό σκοπό. Η συνάρτηση είναι ένα υποπρόγραμμα ειδικά σχεδιασμένο να επιστρέφει μία και μόνο μία τιμή· συνεπώς οι συναρτήσεις καλούνται μόνο μέσα σε εκφράσεις. Διαδικασίες που ορίζονται μέσα από την Turbo Pascal, όπως οι Write, Writeln, Read και Readln καλούνται πρότυπα (standard) υποπρογράμματα. Όταν τα πρότυπα υποπρογράμματα δεν είναι κατάλληλα για τον σκοπό μας, μπορούμε να ορίσουμε νέα, μέσω μιας δήλωσης διαδικασίας ή συνάρτησης. Αφού οριστεί το νέο υποπρόγραμμα, τότε αυτό μπορεί να κληθεί απλά με το όνομά του όπως καλούνται και τα πρότυπα υποπρογράμματα.

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

Program Center;

Uses crt;

Var

row : Byte;

title : String;

Procedure center_line(message : String; line : Byte);

Begin

GotoXY(40 – Length(message) div 2, line);

Writeln(message);

End;

Begin { Κύριο Πρόγραμμα }

row := 2;

title := ‘Κάθε γραμμή κειμένου κεντράρεται.’;

Clrscr;

center_line(title, row); { κλήση της διαδικασίας }

center_line(‘——–‘, row+1);

center_line(‘Borland Turbo Pascal !’, row+2);

End.

Το αποτέλεσμα του προγράμματος είναι το εξής :

Κάθε γραμμή κειμένου κεντράρεται

——-

Borland Turbo Pascal !

Κλήση των Διαδικασιών

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

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

Ορισμός των Διαδικασιών

Ο ορισμός μιας διαδικασίας αποτελείται από τρία μέρη : Τον τίτλο, τα δεδομένα και το κύριο μέρος (σώμα) της διαδικασίας.

Ο τίτλος της διαδικασίας αποτελείται από τη δεσμευμένη λέξη Procedure που ακολουθείται από το όνομα της διαδικασίας καθώς και από τις απαιτούμενες παραμέτρους.

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

Το κύριο μέρος ή «σώμα» της διαδικασίας αποτελείται από ένα σύνολο εκτελέσιμων εντολών, όπου περιγράφονται οι πράξεις που πρόκειται να γίνουν. Οι εντολές της διαδικασίας περικλείονται από τις δεσμευμένες λέξεις Begin και End ακολουθούμενες από ένα ελληνικό ερωτηματικό ;.

Η γενική σύνταξη μιας διαδικασίας έχει ως εξής :

Τίτλος διαδικασίας (Προαιρετικές παράμετροι);

{ Δηλώσεις δεδομένων }

begin

{ Εντολές προγράμματος }

end;

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

Υπάρχουν περιπτώσεις, όμως, όπου απαιτείται η κλήση κάποιας διαδικασίας πριν αυτή οριστεί. Αυτό μπορεί να επιτευχθεί με τον Προορισμό της διαδικασίας. Ο Προορισμός της διαδικασίας είναι παρόμοιος με τον ορισμό της, μόνο που στην πρώτη περίπτωση ο ορισμός της διαδικασίας ακολουθείται από τη δεσμευμένη λέξη Forward και αυτή από ένα ελληνικό ερωτηματικό ;.

Για παράδειγμα, για την περίπτωση του Προορισμού της διαδικασίας που είδαμε, θα είχαμε :

Procedure center_line(message : String; line : Byte);

Forward;

Ορισμός Τοπικών Μεταβλητών

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

Το παράδειγμα που ακολουθεί περιέχει δύο τοπικές μεταβλητές και απαιτεί από τον χρήστη να δώσει έναν αριθμό, προκειμένου να βρεθεί το παραγοντικό του. Το παραγοντικό π.χ. του 6 είναι το γινόμενο 1*2*3*4*5*6.

Program local_variables;

Var

num : Byte;

Procedure factor(value : Byte);

Var

factorial : Real;

count : Byte;

Begin

factorial := 1.0;

For count := 1 To value Do

factorial := factorial * count;

Write(‘Το παραγοντικό του ‘, value,’ είναι : ‘ );

Writeln(factorial);

End; { Τέλος της διαδικασίας Factor }

Begin { Κύριο πρόγραμμα }

Write(‘Δώστε έναν αριθμό μικρότερο του 34 : ‘);

Readln(num);

Factor(num);

End. { Τέλος του προγράμματος }

Ένα παράδειγμα από τη λειτουργία του προγράμματος είναι το εξής :

Δώστε έναν αριθμό μικρότερο του 34 : 5

Το παραγοντικό του 5 είναι : 1.200000000Ε+02

Το σημείο ορισμού των τοπικών μεταβλητών είναι πριν από το Begin της διαδικασίας και μετά από τον τίτλο της. Σε αντίθεση με τις καθολικές (global) μεταβλητές που δηλώνονται έξω από οποιαδήποτε διαδικασία και είναι «ορατές» σ’ ολόκληρο το πρόγραμμα, οι τοπικές μεταβλητές ορίζονται μέσα σε μια διαδικασία και δεν γίνονται κατανοητές από το υπόλοιπο πρόγραμμα.

Αν αναφερθούμε σε μια τοπική μεταβλητή έξω από το όριο στο οποίο είναι αυτή κατανοητή, η Pascal θα εμφανίσει το παρακάτω μήνυμα λάθους : Error 3 : “Unknown identifier”. Όταν ορισθεί μια μεταβλητή στον τίτλο μιας διαδικασίας σαν παράμετρος, τότε η μεταβλητή αυτή γίνεται τοπική. Π.χ. στο προηγούμενο παράδειγμα δημιουργήθηκε μια τοπική μεταβλητή με το όνομα value, που στο εσωτερικό της διαδικασίας συμπεριφέρεται όπως οποιαδήποτε άλλη τοπική μεταβλητή.

Πέρασμα Παραμέτρων με Τιμή

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

Στο πρόγραμμα που ακολουθεί παρουσιάζεται το πέρασμα παραμέτρων με τιμή :

Program byvalue;

Var

global_var : Integer;

Procedure proc(local_var : Integer);

Begin

Writeln(‘Τοπική μεταβλητή = ‘, local_var);

local_var := 333;

Writeln(‘Τοπική μεταβλητή = ‘, local_var);

End;

Begin { Κύριο πρόγραμμα }

global_var := 5;

proc(global_var);

Writeln(‘Καθολική μεταβλητή = ‘, global_var);

End.

Το αποτέλεσμα του προγράμματος θα είναι :

Tοπική μεταβλητή = 5

Tοπική μεταβλητή = 333

Kαθολική μεταβλητή = 5

Βλέπουμε ότι η μεταβλητή global_var δεν επηρεάζεται από την διαδικασία και ότι δίνει την τιμή της στην local_var.

Οι Συναρτήσεις

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

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

Program Funct;

Var

num, expo, powr : Real;

Function power(base, exponent : Real) : Real;

Begin

If base >0 Then

Power := Exp(exponent * Ln(base))

Else

Power := -1.0;

End; { end of power() }

Begin

Writeln(‘Δώστε έναν αριθμό : ‘);

Readln(num);

Writeln(‘Δώστε τον εκθέτη : ‘);

Readln(expo);

powr := Power(num, expo);

Writeln(num, ‘Ù’, expo, ‘ = ‘, powr);

End.

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

Κλήση των Συναρτήσεων

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

Ο τίτλος της συνάρτησης αποτελείται από τη δεσμευμένη λέξη Function ακολουθούμενη από το όνομα της συνάρτησης καθώς και τις απαιτούμενες παραμέτρους. Η ίδια η συνάρτηση πρέπει να δηλωθεί με κάποιον συγκεκριμένο τύπο δεδομένων.

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

Το κύριο μέρος της συνάρτησης αποτελείται από ένα σύνολο εκτελέσιμων εντολών, όπου περιγράφονται οι πράξεις που πρόκειται να γίνουν. Οι εντολές της συνάρτησης περικλείονται από τις δεσμευμένες λέξεις begin και end ακολουθούμενες από το σύμβολο ;.

Η γενική μορφή της συνάρτησης είναι η εξής :

Τίτλος_Συνάρτησης (Προεραιτικές παράμετροι) : Τύπος_Συνάρτησης;

{Δηλώσεις δεδομένων}

begin

{Εντολές Προγράμματος}

end;

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

Στο παρακάτω παράδειγμα :

powr := power(num, expo);

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

Μια συνάρτηση μπορεί επίσης να κληθεί μέσα σε πράξεις, όπως στο παρακάτω παράδειγμα :

dazzle := 12 * surprise(730, 88)/2;

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

Επιστρεφόμενες Τιμές Συναρτήσεων

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

power := -1.0

αναγκάζει τη συνάρτηση να επιστρέψει την τιμή -1.0. Επίσης η μεταβλητή που δέχεται την τιμή θα πρέπει να είναι του ίδιου τύπου με τον τύπο επιστροφής της συνάρτησης.

Ορισμός Συναρτήσεων

Ο ορισμός μιας συνάρτησης είναι πανομοιότυπος μ’ αυτόν μιας διαδικασίας. Η μόνη διαφορά είναι ότι αντί για τη δεσμευμένη λέξη Procedure χρησιμοποιείται η δεσμευμένη λέξη Function και ακόμη θα πρέπει να δηλωθεί και ο τύπος δεδομένων της τιμής επιστροφής της συνάρτησης με το σύμβολο : μετά από τις παραμέτρους.