Υποπρόγραμμα
Ένα υποπρόγραμμα (subprogram) ή υπορουτίνα (subroutine) είναι ένα σύνολο εντολών της Pascal που κάνει μια συγκεκριμένη λειτουργία και γράφεται με τους ίδιους κανόνες που γράφεται ένα πρόγραμμα. Τα υποπρογράμματα χωρίζονται σε δύο κατηγορίες:
- διαδικασίες (procedures) -σε αυτές αναφέρεται το άρθρο-
- συναρτήσεις (functions)
Είναι χρήσιμα όταν θέλουμε να χρησιμοποιήσουμε ένα κομμάτι κώδικα πολλές φορές. Αντί να το αντιγράφουμε κάθε φορά που θέλουμε να το χρησιμοποιήσουμε, φτιάχνουμε ένα υποπρόγραμμα που κάνει αυτό που θέλουμε και το καλούμε κάθε φορά που το χρειαζόμαστε.
Υπάρχουν περιπτώσεις όπου αυτές οι εντολές που θέλουμε να εκτελεστούνε σε 2 διαφορετικά σημεία του προγράμματος διαφέρουν αλλά όχι πολύ μεταξύ τους. Και σε αυτή την περίπτωση μπορούμε να χρησιμοποιήσουμε υποπρογράμματα. Τα υποπρογράμματα μπόρουν να δέχονται δεδόμενα για είσοδο μέσω των παραμέτρων τους και να εκτελούν τις εντολές ανάλογα.
Διαδικασία (procedure)
Η Διαδικασία (procedure) είναι ένα υποπρόγραμμα που έχει σαν αποτέλεσμα την εκτέλεση μιας σειράς πράξεων για έναν και μοναδικό σκοπό. Διαδικασίες που ορίζονται μέσα από την Pascal, όπως οι Write, Writeln, Read και Readln καλούνται πρότυπα (standard) υποπρογράμματα.
Όταν τα πρότυπα υποπρογράμματα δεν είναι κατάλληλα για τον σκοπό μας, μπορούμε να ορίσουμε νέα, μέσω μιας δήλωσης διαδικασίας (ή συνάρτησης). Αφού οριστεί το νέο υποπρόγραμμα, τότε αυτό μπορεί να κληθεί απλά με το όνομά του όπως καλούνται και τα πρότυπα υποπρογράμματα.
[ms_expand class=”” id=”” more_icon=”fa-arrow-down” more_text=”Παράδειγμα” less_icon=”fa-arrow-up” less_text=”Για παράδειγμα, το παρακάτω πρόγραμμα περιέχει μια διαδικασία που κεντράρει μια γραμμή στην οθόνη.”]<pre class=”prettyprint” >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(‘Pascal !’, row+2); End</pre>.[/ms_expand]
Διαδικασία (procedure): παράδειγμα
Για παράδειγμα, το παρακάτω πρόγραμμα περιέχει μια διαδικασία που κεντράρει μια γραμμή στην οθόνη.
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('Pascal !', row+2); End.
[ms_expand class=”” id=”” more_icon=”fa-arrow-down” more_text=”Αποτέλεσμα” less_icon=”fa-arrow-up” less_text=”Το αποτέλεσμα του προγράμματος είναι το εξής :”]<pre class=”prettyprint”>Κάθε γραμμή κειμένου κεντράρεται ——- Pascal !</pre>[/ms_expand]
Το αποτέλεσμα του προγράμματος είναι το εξής :
Κάθε γραμμή κειμένου κεντράρεται
-------
Pascal !
Διαδικασία (procedure): Ορισμός των Διαδικασιών
Ο ορισμός μιας διαδικασίας αποτελείται από τρία μέρη:
- Τον τίτλο
- τα δεδομένα
- το κύριο μέρος (σώμα) της διαδικασίας
Ο τίτλος της διαδικασίας αποτελείται από τη δεσμευμένη λέξη Procedure που ακολουθείται από το όνομα της διαδικασίας καθώς και από τις απαιτούμενες παραμέτρους.
Ο τίτλος δεν περιλαμβάνει τύπο δεδομένο για τη διαδικασία. Οι διαδικασίες σε αντίθεση με τις συναρτήσεις δεν έχουν τύπο.
Τα δεδομένα που πρόκειται να χειριστούν οι εντολές της διαδικασίας, ορισμένα σαν επικεφαλίδες, σταθερές, τύποι και μεταβλητές, δηλώνονται μετά τον τίτλο αλλά πριν από την πρώτη εντολή της διαδικασίας. Όπως και στις συναρτήσεις αυτό είναι το κομμάτι δηλώσεων και δεν υπάρχει διαφορά.
Το κύριο μέρος ή «σώμα» της διαδικασίας αποτελείται από ένα σύνολο εκτελέσιμων εντολών, όπου περιγράφονται οι πράξεις που πρόκειται να γίνουν. Οι εντολές της διαδικασίας περικλείονται από τις δεσμευμένες λέξεις Begin και End ακολουθούμενες από ένα ελληνικό ερωτηματικό ;.
Η γενική σύνταξη μιας διαδικασίας έχει ως εξής:
Τίτλος_διαδικασίας (Προαιρετικές παράμετροι);
{ Δηλώσεις δεδομένων }
begin
{ Εντολές προγράμματος }
end;
Διαδικασία (procedure): Ο τίτλος
Ο τίτλος της διαδικασίας είναι υποχρεωτικός, ενώ τα δεδομένα και οι εντολές είναι προαιρετικά. Η Pascal γενικά απαιτεί τον προσδιορισμό κάποιας οντότητας πριν τη χρησιμοποίησή της.
Για παράδειγμα, για να χρησιμοποιήσουμε μια μεταβλητή χρειάζεται να δηλώσουμε το όνομά της καθώς και τον τύπο της. Ο ίδιος κανόνας ισχύει και για τις διαδικασίες.
Υπάρχουν περιπτώσεις, όμως, όπου απαιτείται η κλήση κάποιας διαδικασίας πριν αυτή οριστεί. Αυτό μπορεί να επιτευχθεί με τον Προορισμό της διαδικασίας.
Διαδικασία (procedure): Προορισμός της διαδικασίας
Ο Προορισμός της διαδικασίας είναι παρόμοιος με τον ορισμό της, μόνο που στην πρώτη περίπτωση ο ορισμός της διαδικασίας ακολουθείται από τη δεσμευμένη λέξη Forward και αυτή από ένα ελληνικό ερωτηματικό ;
.
Για παράδειγμα, για την περίπτωση του Προορισμού της διαδικασίας που είδαμε, θα είχαμε :
Procedure center_line(message: String; line: Byte);
Forward;
Διαδικασία (procedure): Κλήση των Διαδικασιών
Όπως είδαμε, μια διαδικασία εκτελείται δηλώνοντας απλά το όνομά της μαζί με οποιεσδήποτε απαιτούμενες παραμέτρους. Η παράμετρος είναι μια πληροφορία (συνήθως μια μεταβλητή), η οποία μεταφέρεται μεταξύ της διαδικασίας και του προγράμματος που την κάλεσε (το κύριο πρόγραμμα ή κάποιο άλλο υποπρόγραμμα).
Η διαδικασία center_line, που είδαμε προηγουμένως, απαιτεί τα εξής δεδομένα (παραμέτρους): ένα κομμάτι κειμένου που κεντράρεται, καθώς και τη γραμμή στην οποία θέλουμε να το τυπώσουμε. Οι παράμετροι χωρίζονται με κόμματα μεταξύ τους.
Η πρώτη παράμετρος είναι μια συμβολοσειρά (String), ενώ η δεύτερη παράμετρος είναι ένας αριθμός (Byte).