Άσκηση 14 - functions

  1. ΑΝΟΙΓΜΑ ΕΡΓΟΥ - Αν δεν είναι ήδη ανοιχτό, θα ανοίξουμε το υπάρχον έργο anafora και το αρχείο anafora.pas
  2. ΤΡΟΠΟΠΟΙΗΣΗ 1- megistos
    1. Μερικές φορές είναι πιο βολικό αντί να καλέσουμε μια διαδικασία που αλλάζει μία μεταβλητή π.χ. εδώ την z
      megistos(x,y,z);

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

      z:=megistos(x,y);
    2. Θα πρέπει να τροποποιήσουμε αρχικά την δήλωσή της από
      procedure megistos(a:integer; b:integer; var c:integer);

      σε

      function megistos(a:integer; b:integer) : integer;
    3. Πριν αλλάζαμε την μεταβλητή c, βάζοντας της, την νέα τιμή. Τώρα θα χρησιμοποιήσουμε το όνομα της συνάρτησης. Αντί λοιπόν για
      if a>b then
          c:=a
      else
          c:=b;

      θα βάλουμε

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

* ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ