ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα 8: Συναρτήσεις Κουκουλέτσος Κώστας Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστικών Συστημάτων
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σκοποί ενότητας Oι διδακτικοί σκοποί της ενότητας για τους σπουδαστές είναι: 1. Να γνωρίσουν τις συναρτήσεις και τον τρόπο που ορίζονται από τον χρήστη 2. Να εκτιμήσουν την διαδικασία με την οποία ένα πρόγραμμα διασπάται σε μικρότερα δομικά στοιχεία 3. Να μάθουν την χρήση και εφαρμογή των συναρτήσεων 4. Να εξοικειωθούν με τις επιστρεφόμενες τιμές από συναρτήσεις 5. Να γνωρίσουν τις συναρτήσεις void που δεν επιστρέφουν τιμή 6. Να γνωρίσουν την χρήση των συναρτήσεων χωρίς παραμέτρους
Περιεχόμενα ενότητας Συναρτήσεις βιβλιοθήκης Συναρτήσεις που ορίζονται από τον χρήστη Συναρτήσεις χρήστη Παρατηρήσεις στις συναρτήσεις Πρότυπα συναρτήσεων Κλήση συνάρτησης που δεν επιστρέφει τιμή Κλήση συνάρτησης χωρίς παραμέτρους Παραδείγματα
Συναρτήσεις Ο δομημένος προγραμματισμός βασίζεται στην αρχή της επίλυσης μίας εφαρμογής προγραμματισμού κάνοντας χρήση μικρότερων δομικών στοιχείων Το πρόβλημα διασπάται σε μικρότερα κομμάτια και μπορεί να επιλυθεί πιο εύκολα Με την χρήση των συναρτήσεων ένα πρόγραμμα μπορεί να χωριστεί σε άλλα μικρότερα κομμάτια (δομές) Η συνάρτηση είναι ένα σύνολο εντολών που καλείται και χρησιμοποιείται από ένα σημείο ενός προγράμματος. Στην C ακόμη και το main θεωρείται ότι είναι μία συνάρτηση
Συναρτήσεις βιβλιοθήκης (1/2) Oι βιβλιοθήκες της C περιλαμβάνουν ένα πλήθος συναρτήσεων που μπορεί να χρησιμοποιήσει ο προγραμματιστής. Τα αρχεία επικεφαλίδων (header files) περιέχουν τους ορισμούς - δηλώσεις συναρτήσεων που μπορεί να χρησιμοποιηθούν από τον προγραμματιστή. Έχουν ήδη χρησιμοποιηθεί κάποιες βασικές συναρτήσεις όπως η printf και η scanf που ενσωματώνονται στον κώδικα με το #include Oι δύο αυτές συναρτήσεις περιλαμβάνονται στο αρχείο επικεφαλίδων stdio.h
Συναρτήσεις βιβλιοθήκης (2/2) Πολλές μαθηματικές συναρτήσεις (sin, cos, tan, sqrt κλπ.) περιέχονται στο αρχείο επικεφαλίδων math.h Για παράδειγμα η συνάρτηση sqrt(k) υπολογίζει (και επιστρέφει) μία τιμή που αντιστοιχεί στην τετραγωνική ρίζα του κ.» int k;» for (k=0;k<10;k++)» printf("%d %f\n",k, sqrt(k));»
Συναρτήσεις του χρήστη O προγραμματιστής μπορεί να ορίζει και δικές του συναρτήσεις (user defined functions) Μία τέτοια συνάρτηση πρέπει να δηλωθεί και να οριστεί πριν γίνει χρήση της συνάρτησης στο πρόγραμμα Η συνάρτηση επιστρέφει το πολύ μία τιμή γι αυτό στον ορισμό μίας συνάρτησης περιλαμβάνεται ο τύπος της τιμής που επιστρέφει Επίσης υπάρχει και τουλάχιστον μία εντολή return που επιστρέφει την τιμή στο πρόγραμμα από το οποίο καλείται η συνάρτηση
Ορισμός συναρτήσεων χρήστη (1/2) Ο ορισμός μίας συνάρτησης έχει την παρακάτω μορφή:» Τύπος ονομα_συνάρτησης(τύπος παράμετρος1,τύπος παράμετρος2, )» {» εντολές» }
Ορισμός συναρτήσεων χρήστη (2/2) Η παρακάτω συνάρτηση βρίσκει το άθροισμα δύο ακεραίων αριθμών» int athoisma(int a, int b)» {» return a+b;» } Για να χρησιμοποιηθεί η συνάρτηση πρέπει να γίνει κλήση της με ένας από τους παρακάτω τρόπους:» z = addition (15, 8);» z = addition (k, l);
Παράδειγμα (1/2) Το πλήρες πρόγραμμα μαζί με τον ορισμό της συνάρτηση φαίνεται παρακάτω Όμως τώρα η συνάρτηση υπολογίζει το άθροισμα το αποθηκεύει σε μία μεταβλητή p και το επιστρέφει με χρήση της μεταβλητής p, δηλαδή αντί για return a+b; η εντολή έχει αντικατασταθεί από το return p;» int addition (int a, int b){» int p;» p=a+b;» return (p);» }
Παράδειγμα (2/2)» int main (){» int z; z = addition (15, 8);» printf( Ta athroisma einai %d\n",z);» int k=40,l=50; z=addition (k, l);» printf( To athroisma einai %d\n",z);» return 0;» }»
Παρατηρήσεις στις συναρτήσεις Υπάρχει αντιστοιχία μεταξύ του τύπου και του αριθμού των παραμέτρων που χρησιμοποιούνται στον ορισμό και στην κλήση της συνάρτησης.»int addition (int a, int b) // orismos sinartisis»z = addition (15, 8); // klisi sinartisis Οι παράμετροι που χρησιμοποιούνται για να ορίσουν την συνάρτηση λέγονται παράμετροι (parameters) ή τυπικές παράμετροι (formal parameters). Οι εκφράσεις που χρησιμοποιούνται στην κλήση μίας συνάρτησης λέγονται ορίσματα (arguments). Μόλις γίνει κλήση της συνάρτησης, οι τιμές των ορισμάτων μεταφέρονται στις παραμέτρους που βρίσκονται στον ορισμό της συνάρτησης. Εάν η συνάρτηση δεν επιστρέφει καμία τιμή τότε ορίζεται σαν τύπου void.
Το παρακάτω πρόγραμμα να γραφεί με χρήση δύο συναρτήσεων που υπολογίζουν την δύναμη και το παραγοντικό. Άσκηση
Άσκηση-επίλυση»// orismos sinartisis»int funcpow(int a, int b) {» int dinami = 1; int i;» for(i = 0; i < b; i++) {» dinami = dinami * a;» }» return dinami;»}»// orismos sinartisis»int funcfact(int b) {» int parag = 1; int i;» if (b == 0) parag = 1;» else» for (i=1; i<=b; i++) {» parag *= i;» }» return parag;»}»// main»int main() {» int a = 5, b = 4;» if (b<0) b=-b;»» // Klisi sinartiseon» printf("dinami(%d ^ %d)=", a,b);» printf("=%d\n", funcpow(a,b));»» printf("paragontiko(%d)=", b);» printf("%d \n", funcfact(b))»}
Πρότυπα συναρτήσεων (1/3) Το πρότυπο είναι στην ουσία η πρώτη γραμμή του ορισμού της συνάρτησης Ο ορισμός της συνάρτησης γίνεται πριν το main. Όμως συνηθίζεται για να είναι το πρόγραμμα πιο ευανάγνωστο το main να είναι στη αρχή Επειδή για να γίνει κλήση μίας συνάρτησης (δηλαδή για να χρησιμοποιηθεί η συνάρτηση) πρέπει προηγουμένως να έχει δηλωθεί μπορούμε να δηλώσουμε την συνάρτηση πριν το main. Η δήλωση γίνεται μέσω του λεγόμενου πρότυπου της συνάρτησης (function prototype) και επιτρέπει στον compiler να γνωρίζει τα απαραίτητα στοιχεία που αφορούν την συνάρτηση. Το πρότυπο πληροφορεί τον compiler ότι θα χρησιμοποιηθεί μία συνάρτηση, τα στοιχεία της οποίας δίνονται τώρα, όμως θα οριστεί αργότερα. Αυτά τα στοιχεία είναι ο τύπος, το όνομα της συνάρτησης καθώς και ο τύπος και ο αριθμός των παραμέτρων της συνάρτησης.
Πρότυπα συναρτήσεων (2/3) Παράδειγμα int addition (int a, int b);// function prototype» int main (){» int z;»»» return 0;» }
Πρότυπα συναρτήσεων (3/3)» int addition (int a, int b) {» int p;» p=a+b;» return (p);» } Σημείωση: Τα ονόματα των παραμέτρων της συνάρτησης μπορούν να παραληφθούν στο πρότυπο και να γραφεί με τον παρακάτω τρόπο» int addition (int, int ); // function prototype
Παρατηρήσεις στις συναρτήσεις (1/6) Ο ορισμός μίας συνάρτησης έχει την παρακάτω μορφή:» Τύπος ονομα_συνάρτησης(τύπος παράμετρος1,τύπος παράμετρος2, )» {» εντολές» } Ο τύπος της συνάρτησης μπορεί να είναι οποιοσδήποτε τύπος δεδομένων (int, float κλπ) ή ακόμη και δείκτης (pointer). Δεν μπορεί να είναι πίνακας.
Παρατηρήσεις στις συναρτήσεις (2/6) - Εάν η συνάρτηση δεν επιστρέφει τίποτε τότε ο τύπος της είναι void. - Αν ο τύπος παραληφθεί τότε θεωρείται ότι είναι int Παράδειγμα» main(){»»» return 0;» } - Το main είναι η κύρια συνάρτηση του προγράμματος και για το λόγο αυτό υπάρχει και η εντολή return. - Στην περίπτωση που η συνάρτηση δεν επιστρέφει τιμή τότε ο ορισμός γίνεται με την λέξη void και η εντολή return δεν έχει τιμή ή μπορεί και να παραληφθεί
Παρατηρήσεις στις συναρτήσεις (3/6) Οι void συναρτήσεις απλά εκτελούν μία ακολουθία εντολών και δεν επιστρέφουν τιμή. Παράδειγμα» void diplasio (int a){» int dipl;» dipl=2*a;» printf("to diplasio tou %d = %d\n",a,dipl);» return;» }
Παρατηρήσεις στις συναρτήσεις (4/6)» int main (){» int a=40;» diplasio(a);»» return 0;» }
Παρατηρήσεις στις συναρτήσεις (5/6) Το return πρέπει να επιστρέφει μία τιμή με τύπο ίδιο με τον τύπο της συνάρτησης για να αποφεύγονται απρόβλεπτα ή λανθασμένα αποτελέσματα Το όνομα της συνάρτησης είναι ένα αναγνωριστικό και ακολουθεί τους κανόνες σύνταξης αναγνωριστικών. Γενικά η επιλογή του ονόματος πρέπει να γίνεται με τρόπο ώστε να είναι περιγραφικό και σχετικό με την λειτουργία της συνάρτησης. Μία συνάρτηση μπορεί να καλείται περισσότερο από μία φορές
Παρατηρήσεις στις συναρτήσεις (6/6) Μία συνάρτηση όπως και το main μπορεί να έχει περισσότερα από ένα return. Όταν η εκτέλεση της συνάρτησης φτάσει στην εντολή return τότε η συνάρτηση τερματίζεται άμεσα. Το διπλανό παράδειγμα βρίσκει τον μεγαλύτερο από δύο ακέραιους. Υπάρχουν 2 return και η συνάρτηση καλείται 2 φορές με αριθμούς και με μεταβλητές.
Κλήση συνάρτησης που δεν επιστρέφει τιμή (1/2) Στο παρακάτω παράδειγμα γίνεται χρήση συναρτήσεων που δεν επιστρέφει τιμή: η μία έχει παραμέτρους ενώ η άλλη δεν έχει void PrintKalimera (); //protypo sinartisis void PrintKalinikta (int); //protypo sinartisis main ( ){ int num=5; } PrintKalimera ( ); PrintKalinikta (num);
Κλήση συνάρτησης που δεν επιστρέφει τιμή (2/2) void PrintKalimera (){ int i; for (i = 0; i < 3 ; i++) { printf ("!!Kalimera!!\n"); } } void PrintKalinikta (int fnum){ int i; for (i = 0; i < fnum; i++) { printf ("==Kalinikta==\n\n"); } }
Κλήση συνάρτησης χωρίς παραμέτρους (1/2) Εδώ γίνεται χρήση συναρτήσεων χωρίς παραμέτρους: η μία επιστρέφει τιμή ενώ η άλλη είναι τύπου void void Athr (); //protypo sinartisis int Diaf (); //protypo sinartisis main ( ){ int d; Athr(); d=diaf(); printf("h diafora =%d\n", d); return 0;
Κλήση συνάρτησης χωρίς παραμέτρους (2/2) } void Athr () { int i=5,j=10,ath; ath=i+j; printf("to athrisma %d + %d= %d\n",i,j,ath); } int Diaf () { int i=5,j=10,d; d=i-j; return d; }
Παραδείγματα συνάρτησης Εύρεση μεγαλυτέρου (1/4) Να γραφεί πρόγραμμα που να βρίσκει τον μεγαλύτερο από 2 ακέραιους. Η εισαγωγή των αριθμών καθώς και η εύρεση του μεγαλύτερου αριθμού να γίνονται με συναρτήσεις int max2(int,int); //prototype of function int dose1() { //function int a; printf("dose 1 akereo "); scanf("%d",&a); return a; } //=============================================
Παραδείγματα συνάρτησης Εύρεση μεγαλυτέρου (2/4) void minima() { printf("microsystems EPE\n"); printf("to continue press any key\n"); while(!getch()); } system("cls"); printf("synexeia tou programmatos\n");
Παραδείγματα συνάρτησης Εύρεση μεγαλυτέρου (3/4) //============================================= int main(void) { int k,l; minima(); k=dose1(); l=dose1(); printf("o megalyros apo tous dio einai %d\n",max2(k,l)); } return 0;
Παραδείγματα συνάρτησης Εύρεση μεγαλυτέρου (4/4) //============================================= int max2(int x,int y) { if (x>y) return x; else return y; }
Μέγιστος Κοινός Διαιρετής Nα γραφεί πρόγραμμα το οποίο έχει είσοδο 2 ακεραίους και υπολογίζει με την χρήση του αλγόριθμου του Ευκλείδη, τον Μέγιστο Κοινό Διαιρέτη (ΜΚΔ) των δυο ακεραίων αριθμών. O αλγόριθμος να υλοποιείται με την χρήση συνάρτησης ΜΚΔ(a,b) : O μεγαλύτερος ακέραιος που διαιρεί ακριβώς (υπόλοιπο 0) το a και b Παραδείγματα: ΜΚΔ(16,10) = 2 ΜΚΔ(3,12) = 3 ΜΚΔ(6, 24) = 6 ΜΚΔ(8,4) = 4 ΜΚΔ(49, 21) = 7 ΜΚΔ(26,52) = 26
Αλγόριθμος Ευκλείδη Βήματα Ενω το b είναι διάφορο του 0, διαίρεσε το a με το b Σε κάθε βήμα βάλε το b στην θέση του a και το υπόλοιπο a%b στο b. Όταν ο b γίνει 0, τότε ο a είναι ο ΜΚΔ των δύο αρχικών αριθμών ΜΚΔ(30,16) a b a%b 30 % 16 = 14 16 % 14 = 2 14 % 2 = 0 2 % 0 Επομένως ΜΚΔ(30,16)=2
ΜΚΔ με Συνάρτηση (1/2)» int mkd(int,int);» int main( ){» int a, b ;» printf("dose 2 akeraious arithmous");» scanf("%d %d",&a,&b);» printf("mkd (%d, %d)= %d\n", a, b, mkd(a,b));» return 0;» }
ΜΚΔ με Συνάρτηση (2/2)» int mkd(int a, int b){» int ypol;» while (b!= 0) {» ypol = a % b;» a = b; b = ypol;» }» return a;» }
Παράδειγμα Άθροισης Ψηφίων (1/2) Να γίνει συνάρτηση που να δέχεται έναν ακέραιο και να επιστρέφει το άθροισμα των ψηφίων του» #include <stdio.h>» int psum(int a) {» int total=0;» while (a!= 0){» total+= a%10;» a = a/10;» }» return total;» }
Παράδειγμα Άθροισης Ψηφίων (2/2)» int main(){» int a;» printf("dose ena akeraio: ");» scanf("%d",&a);» printf("athroisma ton psifion tou %d= %d\n",a, psum(a));»» return 0;» }
Τέλος Ενότητας