====== Άσκηση 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 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ**
-