Απλές συναρτήσεις |
Έχουμε ήδη συνατήσει την έννοια της συνάρτησης αφού, όπως είπαμε, το κυρίως πρόγραμμα που δηλώνεται με τη λέξη κλειδί main είναι μιά συνάρτηση. Ακόμη, η πρόταση εκτύπωσης ουσιαστικά αποτελεί κλήση της συνάρτησης printf. H printf είναι μιά συνάρτηση βιβλιοθήκης, δηλαδή παρέχεται μαζί με τον μεταφραστή. Τώρα θα συζητήσουμε γιά συναρτήσεις που ορίζει ο χρήστης και γιά τις σχέσεις τους με το κυρίως πρόγραμμα και μεταξύ τους. Το πρόγραμμα που βρίσκεται αποθηκευμένο στο αρχείο SUMSQRES.C δίνει ένα παράδειγμα συνάρτησεων που έχουν οριστεί από το χρήστη. Το σημείο εκκίνησης του προγράμματος, τόσο γιά την εκτέλεση όσο και γιά την ανάγνωση, παραμένει η λέξη κλειδί main. Μετά τη δήλωση της ακέραιας μεταβλητής index έχουμε την πρώτη εκτελέσιμη πρόταση του προγράμματος. Διαπιστώνουμε οτι πρόκειται γιά την κλήση μιάς συνάρτησης η οποία γίνεται με την αναγραφή του ονόματος της συνάρτησης, δηλαδή header(). Οι παρενθέσεις είναι απαραίτητες ακόμη και αν δεν περιέχουν τίποτε έτσι ώστε ο μεταφραστής να καταλάβει οτι δεν πρόκειται γιά όνομα μεταβλητής αλλά γιά όνομα συνάρτησης. Η κλήση της συνάρτησης header σημαίνει οτι ο έλεγχος του προγράμματος μεταφέρεται στην πρώτη πρόταση της συνάρτησης, οι προτάσεις εκτελούνται, και με τον τερματισμό της συνάρτησης ο έλεγχος επανέρχεται στο κυρίως πρόγραμμα στην πρόταση που ακολουθεί αμέσως μετά τη κλήση της συνάρτησης. Η πρόταση που ακολουθεί είναι μιά επανάληψη for που εκτελείται 7 φορές και κάθε φορά καλεί τη συνάρτηση square. Ας αγνοήσουμε προς το παρόν τη μεταβλητή index ανάμεσα στις παρενθέσεις μετά το όνομα της συνάρτησης. Μετά την ολοκλήρωση της πρότασης επανάληψης καλείται η συνάρτηση ending. Τώρα πρέπει να ορίσουμε τις συναρτήσεις. Ο ορισμός αυτός ακολουθεί το τέλος του κυρίως προγράμματος και ακολουθεί τους ίδιους κανόνες σύνταξης που έχουμε συναντήσει στη συγγραφή του κυρίως προγράμματος που άλλωστε είναι μιά συνάρτηση με το όνομα main. Ξεκινώντας από την συνάρτηση header βλέπουμε οτι η πρώτη πρόταση που περιέχει θέτει την τιμή της μεταβλητής sum στο 0. Διαπιστώνουμε οτι η μεταβλητή αυτή έχει δηλωθεί πριν (ή έξω) από τη main. Πρόκειται γιά μεταβλητή γενικής εμβέλειας (ή απλά γενική μεταβλητή) δηλαδή μεταβλητή η οποία είναι προσπελάσιμη από όλες τις συναρτήσεις που δηλώνονται στο ίδιο επίπεδο με τη main. Προσοχή στο γεγονός οτι να η μεταβλητή sum είχε δηλωθεί μαζί με την index, δηλαδή μέσα στη main, τότε θα ήταν άγνωστη στη header. Οι γενικές μεταβλητές μερικές φορές λέγονται και μεταβλητές αρχείου, με την έννοια οτι είναι γνωστές σε όλες τις συναρτήσεις του αρχείου που έχει δηλωθεί, εδώ π.χ. του αρχείου SUMSQRES.C. Περισσότερα γιά την εμβέλεια των μεταβλητών αργότερα στο ίδιο κεφάλαιο. Μετά από την πρόταση αρχικοποίησης ακολουθεί μιά κλήση της printf που εμφανίζει ένα μήνυμα στην οθόνη. Στη συνέχεια απλά η συνάρτηση τερματίζεται και επιστρέφουμε στο κυρίως πρόγραμμα. Είναι προφανές οτι οι δύο εκτελέσιμες προτάσεις της header θα μπορούσαν να τοποθετηθούν στις δύο πρώτες γραμμές του κυρίως προγράμματος main και να αντικαταστήσουν την κλήση της συνάρτησης. Η αίσθηση αυτή ενισχύεται από την απλότητα των εκτελουμένων λειτουργιών στο συγκεκριμένο παράδειγμα. Όμως σε πραγματικά προγράμματα η αξία του τμηματικού προγραμματισμού είναι εξ΄ ίσου σημνατική με αυτή του δομημένου προγραμματισμού. Πρόκειται ουσιαστικά γιά δύο θεμελιώδεις αρχές. Πρώτη, η ανάλυση ενός σύνθετου προγράμματος (ή προβλήματος) σε επι μέρους απλούστερα προγράμματα (προβλήματα) τα οποία είναι ευκολότερο να κωδικοποιηθούν (να λυθούν). Δεύτερη, η ανάπτυξη βιβλιοθηκών από απλά γενικά προγράμματα τα οποία μπορούν να ενταχθούν από το χρήστη σε ειδικές εφαρμογές. |
Πέρασμα τιμής μεταβλητής, τοπικές μεταβλητές |
Επιστρέφουμε στο κυρίως πρόγραμμα και στην επανάληψη for. Προσέξτε την έκφραση αυτο-αύξησης του μετρητή index. Θα το συνατάτε πολύ συχνά από δώ και πέρα. Στη κλήση της συνάρτησης square έχουμε ένα πρόσθετο στοιχείο, δηλαδή το όνομα της μεταβλητής index μέσα στις παρενθέσεις που ακολουθούν το όνομα της συνάρτησης. Αυτό σημαίνει οτι όταν ο μεταφραστής μεταφέρει τον έλεγχο στην συνάρτηση square πρέπει μεταφέρει στη συνάρτηση επίσης και την τρέχουσα τιμή της μεταβλητής index. Αν παρατηρήσουμε τη δήλωση της συνάρτησης square βλέπουμε ότι μέσα στις παρενθέσεις βρίσκεται ένα αλλο όνομα μεταβλητής, το number, ο δε τύπος της μεταβλητής δηλώνεται αμέσως μετά την συνάρτηση και πρίν το άνοιγμα των αγκυλών που περιέχουν τις προτάσεις της συνάρτησης. Η μεταβλητή number που βρίσκεται στη δήλωση της συνάρτησης λέγεται τυπική παράμετρος (ή τυπικό όρισμα), ενώ η μεταβλητή που βρίσκεται στη κλήση της συνάρτησης λέγεται πραγματική παράμετρος (ή πραγματικό όρισμα). Κατά την κλήση της συνάρτησης η τρέχουσα τιμή της πραγματικής παραμέτρου εκχωρείται στη τυπική παράμετρο και οι προτάσεις της καλούμενης συνάρτησης εκτελούνται με αυτή τη συγκεκριμένη τιμή μεταβλητής γιά την τυπική παράμετρο. Σε νέα επόμενη κλήση της συνάρτησης από το κυρίως πρόγραμμα η τυπική παράμετρος θα πάρει την νέα τρέχουσα τιμή της πραγματικής παραμέτρου, κ.οκ. Με αυτό τον τρόπο οι τιμές της μεταβλητής index μεταφέρονται στη συνάρτηση square μέσω της μεταβλητής number. Να σημειωθεί οτι οποιαδήποτε αλλαγή στην τιμή της τυπικής παραμέτρου number κατά την εκτέλεση των προτάσεων της συνάρτησης δεν επηρρεάζει καθόλου την τιμή της πραγματικής παραμέτρου, δηλαδή της μεταβλητής index του κυρίως προγράμματος. Συνεχίζοντας την ανάγνωση του ορισμού της συνάρτησης square βλέπουμε οτι μετά το άνοιγμα των αγκυλών δηλώνεται μιά ακέραια μεταβλητή με το όνομα numsq η οποία μπορεί να χρησιμοποιηθεί μόνον από την συνάρτηση square, δηλαδή έχει μόνο τοπική εμβέλεια, και γι' αυτό λέγεται τοπική μεταβλητή. Σε αντίθεση με τη γενική μεταβλητή sum η οποία, όπως είπαμε, είναι γνωστή σε όλες τις συναρτήσεις εφ' όσον έχει δηλωθεί έξω από αυτές, η τοπική μεταβλητή numsq είναι γνωστή μόνον στη συνάρτηση μέσα στην οποία έχει δηλωθεί. Αντίστοιχα, η μεταβλητή index είναι μιά τοπική μεταβλητή του κυρίως προγράμματος, δηλαδή της main. Απλά μέχρι τώρα που είχαμε μία και μόνη συνάρτηση δεν είχε νόημα ο διαχωρισμός τοπικών και γενικών μεταβλητών. Περισσότερα γιά την εμβέλεια των μεταβλητών αργότερα. Θέτουμε τη τιμή της μεταβλητής numsq ίση με το τερτράγωνο της τιμής της παραμέτρου number και στη συνέχεια προσθέτουμε το τιμή της numsq στη τιμή της γενικής μεταβλητής sum. Εδώ έχουμε τη χρήση τριών διαφορετικών τύπωςν μεταβλητών: της γενικής sum, της τοπικής numsq και της παραμέτρου number. Η διαφορά παραμέτρου και τοπικής μεταβλητής έγκειται στο γεγονός οτι η παράμετρος είναι μιά τοπική μεταβλητή που αρχικοποιείται κατά την κλήση της συνάρτησης από την πρόταση που καλεί τη συνάρτηση. Τελικά η συνάρτηση square τερματίζεται με την εκτύπωση των τιμών των μεταβλητών number και numsq. Η επιστροφή στο κυρίως πρόγραμμα οδηγεί στην πρόταση αύξησης της επανάληψης for και στη συνέχεια στη συνθήκη ελέγχου της επανάληψης. Όταν τελικά, μετά από 7 κλήσεις της συνάρτησης square, η πρόταση επανάληψης ολοκληρωθεί, καλείται η συνάρτηση ending. Όπως και η header πρόκειται γιά συνάρτηση χωρίς παραμέτρους η οποία απλά εμφανίζει την τελική τιμή της γενικής μεταβλητής sum. Μετά και από αυτή τη κλήση το πρόγραμμα τερματίζεται. Η συνολική εικόνα του αποτελέσματος δίνεται παρακάτω. Το πρόγραμμα υπολογίζει τα τετράγωνα των αριθμών 1 έως 7 καθώς και το άθροισμα των τετραγώνων. This is the header for the square program The square of 1 is 1 The square of 2 is 4 The square of 3 is 9 The square of 4 is 16 The square of 5 is 25 The square of 6 is 36 The square of 7 is 49 The sum of the squares is 140 |
![]() |
![]() |
![]() |