====== Άσκηση 14 - functions ====== * Στην προηγούμενη άσκηση είδαμε την χρήση διαδικασιών (procedures), παραμέτρους κατά αναφορά και κατά τιμή και απόκρυψη μεταβλητών * Στην νέα Άσκηση θα δούμε * Συναρτήσεις - functions και πότε τις χρησιμοποιούμε - **ΑΝΟΙΓΜΑ ΕΡΓΟΥ** - Αν δεν είναι ήδη ανοιχτό, θα ανοίξουμε το υπάρχον έργο **anafora** και το αρχείο **anafora.pas** - **ΤΡΟΠΟΠΟΙΗΣΗ 1- megistos** - Μερικές φορές είναι πιο βολικό αντί να καλέσουμε μια διαδικασία που αλλάζει **μία μεταβλητή** π.χ. εδώ την z megistos(x,y,z); να την καλέσουμε λίγο διαφορετικά σαν συνάρτηση ως εξής : z:=megistos(x,y); - Θα πρέπει να τροποποιήσουμε αρχικά την δήλωσή της από procedure megistos(a:integer; b:integer; var c:integer); σε function megistos(a:integer; b:integer) : integer; - Πριν αλλάζαμε την **μεταβλητή c**, βάζοντας της, την νέα τιμή. Τώρα θα χρησιμοποιήσουμε το **όνομα της συνάρτησης**. Αντί λοιπόν για if a>b then c:=a else c:=b; θα βάλουμε if a>b then megistos:=a else megistos:=b; - Μεταγλωττίστε και καλέστε τώρα την συνάρτηση με **z:=megistos(x,y);**. Το πρόγραμμά μας κάνει ακριβώς το ίδιο αλλά είναι πιο ευανάγνωστο. Παρατηρούμε επίσης ότι μέσα στην function **megistos** δεν έχει αλλάξει ακόμα το **z**. Η συνάρτηση επιστρέφει πρώτα στο κυρίως πρόγραμμα την νέα τιμή της και εκεί αλλάζει η **z**. - **ΤΡΟΠΟΠΟΙΗΣΗ 2 - μέσος όρος** * Ανοίγουμε το αρχείο **mesos_oros.pas** * Παρατηρούμε ότι υπάρχουν κάποιες γραμμές κώδικα που επαναλαμβάνονταιmo:= athroisma / epanalipseis; writeln('Ο μέσος όρος σου είναι ',mo:0:1); - Φτιάξτε μια διαδικασία **emfanise_mo** που θα έχει 2 μεταβλητές ως παραμέτρους **athr, epan** και μία τοπική **m_oros** (προσοχή διαφορετικά ονόματα από τις καθολικές μεταβλητές του κυρίως προγράμματος). Σκεφτείτε για κάθε μία από τις 2 μεταβλητές, εάν θα δηλωθεί κατά τιμή ή κατά αναφορά. - Βάλτε μέσα στο **begin .. end** της **procedure emfanise_mo** τις παραπάνω 2 γραμμές κώδικα αλλάζοντάς τις όπως πρέπει. - Και στα 3 σημεία που εμφανίζονται οι 2 παραπάνω γραμμές κώδικα, διαγράψτε τις και καλέστε στην θέση τους την διαδικασία που φτιάξατε ως εξής **emfanise_mo(athroisma,epanalipseis);** - Μεταγλωττίστε και εκτελέστε για να δείτε αν όλα λειτουργούν σωστά όπως πριν. - Μας χρειάζεται πλέον η καθολική μεταβλητή **mo**; - **ΤΡΟΠΟΠΟΙΗΣΗ 3 - μέσος όρος** * Στο ίδιο πρόγραμμα mesos_oros υπάρχουν και άλλες γραμμές κώδικα που επαναλαμβάνονται write('Δώσε ', i,'ο βαθμό '); readln(vathmos); athroisma:=athroisma+vathmos; - Φτιάξτε μια διαδικασία **diabase_bathmo** που θα έχει 3 μεταβλητές ως παραμέτρους **j, vath, athr** (προσοχή **j** όχι **i**). Σκεφτείτε για κάθε μία από τις 3 μεταβλητές, εάν θα δηλωθεί κατά τιμή ή κατά αναφορά. - Βάλτε μέσα στο **begin .. end** της **procedure diabase_bathmo** τις παραπάνω 3 γραμμές κώδικα αλλάζοντάς τις όπως πρέπει. - Και στα 3 σημεία που εμφανίζονται οι 3 παραπάνω γραμμές κώδικα, διαγράψτε τις και καλέστε στην θέση τους την διαδικασία που φτιάξατε ως εξής **diabase_bathmo(i,vathmos,athroisma);** - Μεταγλωττίστε και εκτελέστε για να δείτε αν όλα λειτουργούν σωστά όπως πριν. - Ο μεταγλωττιστής προειδοποιεί ότι η καθολική μεταβλητή **vathmos** δεν έχει αρχική τιμή. Πριν της βάζαμε πρώτη τιμή στο πρόγραμμα από τον χρήστη μέσω της **readln(vathmos)**. Τώρα όμως περνάμε επικίνδυνα μια άγνωστη τιμή της στην διαδικασία **diabase_bathmo**. Είναι απαραίτητο να συνηθίσουμε στην αρχή του προγράμματος να βάζουμε σε όλες τις μεταβλητές αρχική τιμή 0 ή **' '** αν είναι κείμενο, ακόμα και εάν η 1η εντολή που τις χρησιμοποιεί μετά είναι μια **readln**. Κάντε το για την μεταβλητή **vathmos**. - Η μεταβλητή **vathmos** δεν χρησιμοποιείται στο κυρίως πρόγραμμα. Μήπως δεν χρειάζεται; Όπως κάνατε για την μεταβλητή **mo**, αφαιρέστε και την **vathmos** από το κυρίως πρόγραμμα. - Τώρα καλέστε την diabase_bathmo με 2 μόνο παραμέτρους **diabase_bathmo(i,athroisma);** - Αλλάξτε την δήλωση της **diabase_bathmo** ώστε να έχει 2 μόνο παραμέτρους και δηλώστε την **vath** ως τοπική μεταβλητή μέσα στην διαδικασία **diabase_bathmo** (όπως είχατε κάνει για την **m_oros** μέσα στην διαδικασία **emfanise_mo**). - **ΤΡΟΠΟΠΟΙΗΣΗ 4 - μέσος όρος** - Έχουμε φτιάξει 2 διαδικασίες. Μήπως κάποια από αυτές μπορεί να αλλάξει και να γίνει συνάρτηση. Κάντε όλες τις απαραίτητες αλλαγές στην **procedure** για να γίνει **function** καθώς και στην **κλήση** της από το κυρίως πρόγραμμα. ---- * **ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** - * **ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** -