ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ 1. Συναρτήσεις ΣΥΝΑΡΤΗΣΕΙΣ 1.1. Ο λόγος ύπαρξης των συναρτήσεων Όπως είδαµε µία διαδικασία µπορεί να υπολογίζει περισσότερα από ένα αποτελέσµατα τα οποία επιστρέφει χρησιµοποιώντας παραµέτρους µεταβλητής. Παράδειγµα 1 : Η παρακάτω διαδικασία sum_avg δέχεται ως δεδοµένα δύο αριθµούς και υπολογίζει το άθροισµα και τη µέση τιµή τους. 1 program sum_average; 2 var x,y,sum:integer; avg:real; 4 5 procedure sum_avg(a,b:integer; var ath:integer; var mo:real); 6 begin 7 ath := a+b; 8 mo := ath / 2; 9 end; 10 11 begin 12 write(' ώσε δύο αριθµούς χωρισµένους µε κενό:'); 1 readln(x,y); 14 sum_avg(x,y,sum,avg); 15 writeln('αθροισµα:', sum); 16 writeln('μέση τιµη:', avg:0:2); Στο παραπάνω παράδειγµα η διαδικασία sum_avg χρειάζεται δύο τιµές ως δεδοµένα (δύο αριθµούς) και παράγει δύο αποτελέσµατα (άθροισµα και µέση τιµή). Συνεπώς έχει δύο παραµέτρους τιµής (a,b) µέσω των οποίων δέχεται τα δεδοµένα έχει δύο παραµέτρους µεταβλητής (ath, mo) στις οποίες τοποθετεί τα δύο αποτελέσµατα στο κυρίως πρόγραµµα διαβάζονται δύο τιµές στις µεταβλητές x, y και καλείται η διαδικασία sum_avg(x,y,sum,avg)οπότε η τιµή της µεταβλητής x εκχωρείται στη µεταβλητή a της διαδικασίας και η τιµή της µεταβλητής y εκχωρείται στη µεταβλητή b της διαδικασίας. Η διαδικασία βάζει στη µεταβλητή ath το άθροισµα και στη µεταβλητή mo το µέσο όρο. Συνεπώς όταν ολοκληρωθεί η εκτέλεση της διαδικασίας, το κυρίως πρόγραµµα βρίσκει στη µεταβλητή sum το άθροισµα και στη µεταβλητή avg το µέσο όρο. Αν ο µόνος λόγος που χρειαζόµαστε το µέσο όρο είναι απλώς για να τον τυπώσουµε δεν θα ήταν πιο απλό αν µπορούσαµε να γράψουµε κάτι σαν αυτό writeln('μέση τιµη:', avg(x,y):0:2); 1
Παράδειγµα 2 : Αν υποθέσουµε ότι θέλουµε ένα υποπρόγραµµα που θα δέχεται ως δεδοµένα δύο αριθµούς, έστω m και n και θα υπολογίζει τη δύναµη m n. 1 program dynami; 2 var m,n,pow:integer; 4 procedure power(basi, ekth:integer; var dyn:integer); 5 var I:integer; 6 begin 7 dyn := 1; 8 for I := 1 to ekth do 9 dyn := dyn*basi; 10 end; 11 12 begin 1 write(' ώσε τη βάση και τον εκθέτη : '); 14 readln(m,n); 15 power(m,n,pow); 16 writeln(m, ' εις την ', n, ' = ', pow); Αν µπορούσαµε να γράψουµε τη γραµµή 16 του παραπάνω προγράµµατος κάπως έτσι writeln(m, ' εις την ', n, ' = ', power(m,n)). Δηλαδή για τον υπολογισµό της δύναµης να καλούσαµε ένα είδος συνάρτησης (µε την έννοια που την γνωρίζουµε από τα µαθηµατικά) η οποία να µας επιστρέφει το αποτέλεσµα στο σηµείο όπου κλήθηκε. Θα ήταν πιο απλά καθώς δεν θα χρειαζόταν να χρησιµοποιούµε παραµέτρους µεταβλητής και το υποπρόγραµµα δεν θα χρειαζόταν να πειράζει καθολικές µεταβλητές παρά µόνο τοπικές. 1.2. Συναρτήσεις Όταν λοιπόν ένα υποπρόγραµµα θέλουµε να παράγει ένα µόνο αποτέλεσµα (τιµή) και δεν χρειάζεται να επιφέρει αλλαγές σε µεταβλητές εκτός των τοπικών µπορεί να υλοποιηθεί σαν συνάρτηση. Οι συναρτήσεις είναι ο δεύτερος τύπος υποπρογραµµάτων της Pascal. Μια συνάρτηση είναι ένα υποπρόγραµµα που α. δέχεται έναν αριθµό δεδοµένων εισόδου, β. εκτελεί κάποια επεξεργασία γ. και παράγει σαν αποτέλεσµα µία µόνο τιµή. Μια συνάρτηση καλείται σαν µια εντολή της Pascal δίνοντας το όνοµά της (πιθανόν ακολουθούµενο από πραγµατικές παραµέτρους). Κάθε συνάρτηση που χρησιµοποιούµε σε ένα πρόγραµµα πρέπει να έχει δηλωθεί στο τµήµα δηλώσεων του προγράµµατος αµέσως µετά από σταθερές και µεταβλητές. Αν στο πρόγραµµα µας έχουµε πολλά υποπρογράµµατα (διαδικασίες και συναρτήσεις) δεν έχει σηµασία η σειρά δήλωσής τους παρά µόνο αν ένα υποπρόγραµµα καλεί ένα άλλο. Τότε το καλούµενο υποπρόγραµµα πρέπει να έχει δηλωθεί πριν από το καλών. 2
1.. Δοµή συνάρτησης Μια συνάρτηση έχει την ίδια δοµή µε µια διαδικασία µε τη διαφορά ότι αντί για τη λέξη procedure έχουµε τη λέξη function και αµέσως µετά τις τυπικές παραµέτρους ακολουθεί ο τύπος δεδοµένων του αποτελέσµατος της συνάρτησης. επικεφαλίδα function όνοµα(λίστα παραµέτρων) : τύπος δεδοµένων; δηλώσεις σταθερών και µεταβλητών εντολές const.; var ; begin.. end; Το όνοµα χαρακτηρίζει την διαδικασία και χρησιµοποιείται για την κλήση της από το υπόλοιπο πρόγραµµα Η λίστα παραµέτρων είναι µια λίστα µεταβλητών που ονοµάζονται τυπικές παράµετροι και χρησιµοποιούνται για την είσοδο δεδοµένων στη συνάρτηση. Όπως και µια διαδικασία, µια συνάρτηση είναι δυνατόν να µην έχει καθόλου παραµέτρους. Επειδή δεν θέλουµε µια συνάρτηση να προκαλεί µεταβολές σε καθολικές µεταβλητές, οι τυπικές παράµετροι µιας συνάρτησης είναι πάντα παράµετροι µεταβλητής. Ο τύπος δεδοµένων που ακολουθεί τη λίστα των τυπικών παραµέτρων ορίζει τον τύπο του αποτελέσµατος της συνάρτησης ο οποίος µπορεί να είναι οποιοσδήποτε τύπος της Pascal. Αναφέραµε παραπάνω ότι µια συνάρτηση παράγει ένα µόνο αποτέλεσµα. Λέµε λοιπόν ότι µια συνάρτηση επιστρέφει µια τιµή ο τύπος της οποίας ορίζεται στην επικεφαλίδα της συνάρτησης κατά τη δήλωσή της. Παραδείγµατα επικεφαλίδας συνάρτησης function F1(x,y:integer; z,w:real, c:char):bolean; function F2(x:real; k:string; i:integer):integer; H πρώτη συνάρτηση έχει όνοµα F1, πέντε τυπικές παραµέτρους µε αντίστοιχους τύπους και επιστρέφει µια τιµή τύπου bolean. Η δεύτερη συνάρτηση έχει όνοµα F2, τρεις τυπικές παραµέτρους και επιστρέφει µια τιµή τύπου integer. Παράδειγµα : Παρακάτω δίνεται ένα πρόγραµµα µε µια συνάρτηση abs η οποία δέχεται ένα αριθµό και υπολογίζει και επιστρέφει την απόλυτη τιµή του. 1. program apolyti(input, output); 2. var x:integer;. 4. function abs(x:integer):integer; 5. begin 6. if x >= 0 then 7. abs:=x 8. else 9. abs:=-x 10. end; 11. 12. begin 1. readln(x); 14. writeln('απόλυτη τιµή του ', x, ' = ', abs(x)) 15. end.
Στο παραπάνω πρόγραµµα δηλώθηκε η συνάρτηση abs που υπολογίζει την απόλυτη τιµή ενός αριθµού (ο οποίος είναι το µοναδικό τυπικό όρισµα της συνάρτησης). Προσέξτε τις εντολές στις γραµµές 7 και 9 (abs:=x και abs:=-x) όπου έχουµε εντολές εκχώρησης όπου το αριστερό µέρος είναι το όνοµα της συνάρτησης. Σε κάθε συνάρτηση θα πρέπει να υπάρχει µια εντολή εκχώρησης της µορφής όνοµα_συνάρτησης := τιµή όπου µια τιµή (σταθερά, µεταβλητή, ή έκφραση) µε τύπο ίδιο µε τον τύπο αποτελέσµατος της συνάρτησης ανατίθεται στο όνοµα της συνάρτησης. Αυτή η εντολή καθορίζει την τιµή που επιστρέφει η συνάρτηση σε κάθε της κλήση. Η τιµή λοιπόν που ανατίθεται τελευταία στο όνοµα της συνάρτησης είναι αυτή που επιστρέφεται. 1.4. Κλήση συνάρτησης Μια διαδικασία καλείται γράφοντας το όνοµά της και µέσα σε παρενθέσεις µια λίστα τιµών που ονοµάζονται (όπως και στις διαδικασίες) πραγµατικοί παράµετροι. Σε κάθε περίπτωση: το πλήθος των πραγµατικών παραµέτρων πρέπει να είναι ίδιο µε το πλήθος των τυπικών παραµέτρων της συνάρτησης. κάθε πραγµατική παράµετρος αντιστοιχίζεται µε την τυπική παράµετρο που βρίσκεται στην ίδια θέση στη λίστα παραµέτρων της συνάρτησης κάθε πραγµατική παράµετρος πρέπει να έχει τον ίδιο τύπο µε την αντίστοιχη τυπική παράµετρο. Οι τυπικές παράµετροι µιας συνάρτησης είναι παράµετροι τιµής. Αυτό σηµαίνει ότι κατά την κλήση µιας συνάρτησης οι τιµές των πραγµατικών παραµέτρων εκχωρούνται ως τιµές των τυπικών παραµέτρων της συνάρτησης. 1.4.1. Χρήση συνάρτησης Όταν καλείται µια συνάρτηση επιστρέφει µια τιµή στο σηµείο που κλήθηκε. Ο τύπος δεδοµένων της τιµής είναι αυτός που ορίζεται στη δήλωση της συνάρτησης. Συνεχίζοντας το παραπάνω παράδειγµα, τροποποιούµε το κυρίως πρόγραµµα ώστε να δείξουµε όλες τις περιπτώσεις χρήσης µιας συνάρτησης. Παράδειγµα 4 : Παρακάτω δίνεται το πρόγραµµα του παραδείγµατος όπου στο κυρίως πρόγραµµα δείχνουµε όλες τις περιπτώσεις χρήσης µιας συνάρτησης. 1 program example7(input, output); 2 var x:integer; 4 function abs(x:integer):integer; 5 begin 6 if x >= 0 then 7 abs:=x 8 else 9 abs:=-x 10 end; 11 12 begin 1 readln(x); 14 y:=abs(x); 15 z:=2*x+abs(x); 16 writeln('απόλυτη τιµή του ', x, ' = ', abs(x)) 4
Όπως µπορείτε να δείτε στο παραπάνω πρόγραµµα µια συνάρτησης µπορεί να χρησιµοποιηθεί Ως το δεξί µέρος µιας εντολής εκχώρησης (γραµµή 14). Σ αυτή την περίπτωση η τιµή που επιστρέφει η συνάρτηση ανατίθεται στην µεταβλητή που βρίσκεται στο αριστερό µέρος. Ως µέρος µιας έκφρασης (γραµµή 15). Σ αυτή την περίπτωση η τιµή που επιστρέφει η συνάρτηση χρησιµοποιείται για τον υπολογισµό της τιµής της έκφρασης. Ως όρισµα σε µια εντολή write (γραµµή 16). Σ αυτή την περίπτωση τυπώνεται η τιµή που επιστρέφει η συνάρτηση. 1.5. Διαφορές συνάρτησης - διαδικασίας Μια συνάρτηση επιστρέφει µία µόνο τιµή ενώ µια διαδικασία µπορεί να υπολογίζει πολλά αποτελέσµατα. Το αποτέλεσµα µιας συνάρτησης επιστρέφεται στο σηµείο που κλήθηκε (δηλαδή η εντολή κλήσης της συνάρτησης αντικαθίσταται από την τιµή που επιστρέφει συνάρτηση) ενώ τα αποτελέσµατα µιας διαδικασίας είναι διαθέσιµα µέσω παραµέτρων µεταβλητής. Μια συνάρτηση έχει µόνο παραµέτρους τιµής ενώ µια διαδικασία έχει και παραµέτρους µεταβλητής. Μια συνάρτηση µπορεί να χρησιµοποιηθεί ως το δεξί µέρος µιας εντολής εκχώρησης και ως µέρος µιας έκφρασης ενώ µια διαδικασία όχι. Σύµφωνα και µε τις διαφορές συνάρτησης και µεταβλητής µπορούµε να καταλήξουµε σε ορισµένους γενικούς κανόνες για το ποτέ πρέπει να χρησιµοποιούµε συνάρτησης και πότε διαδικασία. Τέτοιοι κανόνες αναφέρονται στο σχολικό σας βιβλίο στη σελίδα 121 (πορτοκαλί πλαίσιο) 1.6. Ενσωµατωµένες συναρτήσεις της Pascal Η γλώσσα Pascal έχει ορισµένες ενσωµατωµένες µαθηµατικές συναρτήσεις τις οποίες µπορούµε να καλούµε σε ένα πρόγραµµα χωρίς να τις δηλώσουµε. Abs(x)απόλυτη τιµή Sin(x)ηµίτονο Sqr(x)τετράγωνο Sqrt(x)τετραγωνική ρίζα Ln(x)λογάριθµος 1.7. Άσκηση Να ξαναγράψετε το πρόγραµµα του παραδείγµατος 2 αντικαθιστώντας τη διαδικασία µε συνάρτηση. 5