ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 6 Ο Συναρτήσεις Τοπικές, καθολικές, στατικές μεταβλητές Μεταβλητές τύπου extern και register Αναδρομή ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 1
Συναρτήσεις Ο δομημένος προγραμματισμός, όπως η C, βασίζεται στη συνεργασία απλών τμημάτων του προγράμματος, Τα τμήματα αυτά στην C λέγονται συναρτήσεις. Το κυρίως πρόγραμμα καλεί τις κατάλληλες συναρτήσεις. Αλλά και οι συναρτήσεις, με τη σειρά τους μπορούν και καλούν άλλες συναρτήσεις ακόμα και τον εαυτό τους. Οι συναρτήσεις δηλώνονται όπως και οι μεταβλητές. Δηλαδή προσδιορίζεται το είδος του στοιχείου που επιστρέφουν. Επίσης δηλώνονται τα ορίσματά τους και το είδος των ορισμάτων τους. π.χ. float area(float x, float y) ή int min_mult(int n1, int n2) Οι συναρτήσεις μπορούν να θεωρηθούν ως μεταβλητές για τις οποίες το περιεχόμενό τους ερμηνεύεται από την περιγραφή που τους δίνει ο προγραμματιστής. Οτύποςvoid χρησιμοποιείται για συναρτήσεις που δεν επιστρέφουν κάποια τιμή, όπως για παράδειγμα η printf, puts κλπ! ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 2
Εμβέλεια μεταβλητών και συνάρτησης Η εμβέλεια των μεταβλητών, οι περιοχές του προγράμματος δηλαδή στις οποίες είναι ενεργές, εξαρτάται από το είδος τους. Διακρίνονται αρχικά σε καθολικές, τοπικές και στατικές μεταβλητές. Οι καθολικές μεταβλητές, όπως είναι φυσικό ισχύουν και είναι ενεργές σε όλη την έκταση και τα σημεία του προγράμματος. Πράγμα που σημαίνει ότι το περιεχόμενό τους μπορεί να τροποποιηθεί παντού. Αντίθετα οι τοπικές μεταβλητές, όπως είναι φυσικό, περιορίζονται στα όρια μιας συνάρτησης ή ακόμα και ενός μπλοκ εντολών, δηλαδή μεταξύ { }. Οι στατικές μεταβλητές με τη σειρά τους είναι τοπικές μεταβλητές με ένα ιδιαίτερο χαρακτηριστικό, ότι δηλαδή διατηρούν και θυμούνται την προηγούμενή τους τιμή. Στις συναρτήσεις δεν υπάρχει περιορισμός εμβέλειας καθόσον ορίζονται έξω από κάθε μπλοκ. Αυτό όμως σημαίνει ότι είναι αδύνατο να υπάρχουν συναρτήσεις με το ίδιο όνομα. Επίσης σημαίνει ότι μπορεί ή ίδια η συνάρτηση να καλεί τον εαυτό της, αναδρομή. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 3
Παράδειγμα Ενδιαφέρον παράδειγμα συνάρτησης που θα μελετήσουμε και στη συνέχεια αποτελεί το παραγοντικό. Ησυνάρτησηείναιπολύχρήσιμη στα μαθηματικά αλλά παρουσιάζει και προγραμματιστικό ενδιαφέρον. Το παραγοντικό συμβολίζεται με n! και σημαίνει να πολλαπλασιαστούν οι ακέραιοι από το 1 μέχρι τον ακέραιο n. Δηλαδή 5! σημαίνει 1 2 3 4 5=120 #include <stdio.h> int n, factorial(int number); int main() { printf("δωσε ΤΟΝ ΑΚΕΡΑΙΟ ΑΡΙΘΜΟ :"); scanf("%10d", &n); printf("\το ΠΑΡΑΓΟΝΤΙΚΟ ΤΟΥ %d ΕΊΝΑΙ %d", n, factorial(n)); return (0);} int factorial(int number) {int i, product; product=1; for(i=1; i<=number; i++){ product *=i;} ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 4 return (product);} Στο διπλανό πρόγραμμα βλέπουμε το πρωτότυπο της συνάρτησης την ανάπτυξή της και την επιστροφή της τιμής της. Επίσης μπορείτε να παρακολουθήσετε τα σημεία στα οποία ορίζονται μεταβλητές. Μπορείτε να δείτε μεταβλητές που ορίζονται έξω από αγκύλες όπως n (καθολικές) και μέσα από τις αγκύλες όπως product (τοπικές)
Αναδρομή Πολύ σπουδαίο χαρακτηριστικό της γλώσσας προγραμματισμού C είναι η δυνατότητα της αναδρομής, δηλαδή μια συνάρτηση να μπορεί να καλεί τον εαυτό της. Για παράδειγμα μπορούμε να δούμε το προηγούμενο πρόγραμμα τροποποιώντας τον υπολογισμό του παραγοντικού με αναδρομικό τρόπο. #include <stdio.h> int n, factorial(int number); int main() { printf("δωσε ΤΟΝ ΑΚΕΡΑΙΟ ΑΡΙΘΜΟ :"); scanf("%10d", &n); printf("\το ΠΑΡΑΓΟΝΤΙΚΟ ΤΟΥ %d ΕΙΝΑΙ %d", n, factorial(n)); return (0); } int factorial(int number) { int product; if(number==1) return 1; product=number*factorial(number-1); return (product);} Η διαφορά σε σχέση με το προηγούμενο είναι η λειτουργία της συνάρτησης factorial. Εδώ λειτουργεί με αναδρομικό τρόπο και μάλιστα πολλαπλασιάζει από τον ζητούμενο αριθμό κατεβαίνοντας μέχρι την 1. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 5
Στατική extern - register Εκτός από τις καθολικές και τοπικές μεταβλητές έχουμε και τις τύπου register και extern. Ως μεταβλητή τύπου register δηλώνεται μια μεταβλητή που καλείται και χρησιμοποιείται πολύ συχνά. Βέβαια η χρήση της είναι περιορισμένη γιατί οι διαθέσιμοι καταχωρητές είναι περιορισμένοι. Μια μεταβλητή δεν μπορεί να χρησιμοποιηθεί ως register αυτόματα μεταφέρεται στον κλασικό της τύπο. register int i; Ως extern ορίζεται μια μεταβλητή ή συνάρτηση που υπάρχει συνήθως σε άλλο αρχείο, όχι στον συγκεκριμένο κώδικα, και ο συνδέτης του προγράμματος αναλαμβάνει να κάνει τη σωστή συσχέτιση κάθε φορά. #include <stdio.h> int n, funct(int number); int main() { for (n=1; n<5; n++) { printf ("ΤΟ ΑΠΟΤΕΛΕΣΜΑ %d ΕΙΝΑΙ %d\n", n, funct(n)); } return (0); } int funct(int number) { static int product=1; product=product*number; return (product); } ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 6