Εισαγωγή στον Προγραµµατισµό Διάλεξη 8 η : Συναρτήσεις Χειµερινό Εξάµηνο 2011
Συναρτήσεις (functions) Συνάρτηση (function) σύνολο εντολών που έχει οµαδοποιηθεί και τους έχει αποδοθεί ένα όνοµα Κλήση (calling) η εκτέλεση των εντολών της συνάρτησης που έχει κληθεί Ορίσµατα (arguments) οι παραστάσεις που επιτρέπουν στο καλούν πρόγραµµα να µεταβιβάζει πληροφορία στη συνάρτηση π.χ. printf( Hello, World ); Επιστροφή (returning) η επάνοδος στο καλούν πρόγραµµα µετά το τέλος εκτέλεσης των εντολών της συνάρτησης Επιστροφή τιµής (returning a value) H επιστροφή κάποιας τιµής στο καλούν πρόγραµµα µετά το τέλος εκτέλεσης εντολών µιας συνάρτησης π.χ. x=sqrt(y);
Συναρτήσεις (functions) Ήδη έχουµε δει αρκετές συναρτήσεις: main(): Πρέπει να υπάρχει σε κάθε πρόγραµµα Συναρτήσεις βιβλιοθήκης: printf(), scanf(), sqrt(), pow(), κ.λ.π.
Δήλωση συναρτήσεων Πρωτότυπο Συνάρτησης (function prototype) επιστρεφόµενος_τύπος όνοµα(όρισµα 1, όρισµα 2,...) επιστρεφόµενος_τύπος: ο τύπος δεδοµένων της τιµής που επιστρέφει η συνάρτηση όνοµα: το όνοµα της συνάρτησης όρισµα: τύπος δεδοµένων και όνοµα µεταβλητής που µεταβιβάζεται ως όρισµα από το καλούν πρόγραµµα στη συνάρτηση void ορίζει ότι µια συνάρτηση δεν επιστρέφει κάποια τιµή ή δεν δέχεται κάποιο όρισµα π.χ. void function1(int a); π.χ. int function2(void);
Συγγραφή συνάρτησης επιστρεφόµενος_τύπος όνοµα(όρισµα1, όρισµα2,...)... εντολές;... return(παράσταση); return(παράσταση); παράσταση: η τιµή που επιστρέφει η συνάρτηση στο καλούν πρόγραµµα return; αν η συνάρτηση δεν επιστρέφει κάποια τιµή ο επιστρεφόµενος τύπος είναι void
Celsius σε Fahrenheit #include <stdio.h> #define LowerLimit 0 // Starting value for temperature table #define UpperLimit 100 // Final value for temperature table #define StepSize 5 // Step size between table entries double CelsiusToFahrenheit(double c); //Function prototype main() int c; printf("celsius to Fahrenheit table.\n"); printf(" C F\n"); for (c = LowerLimit; c <= UpperLimit; c += StepSize) printf("%3d %3g\n", c, CelsiusToFahrenheit(c)); double CelsiusToFahrenheit(double c) return (9.0 / 5.0 * c + 32);
Πίνακας 2 k #include <stdio.h> #define LowerLimit 0 // Starting value for k #define UpperLimit 10 // Final value for k #define StepSize 5 // Step size for k int intpower(int x, int y); //Function prototype main() int k; printf( 2^k table.\n"); printf(" k 2^k\n"); for (k = LowerLimit; k <= UpperLimit; k += StepSize) printf("%3d %3d\n", k, power(2, k)); int intpower(int x, int y) int i, total; total = 1; for (i = 0; i < y; i++) total *= x; return (total);
Μεταβίβαση ορισµάτων Έστω η συνάρτηση int fun(int x) x++; return (x); Έστω int a=2, b; b=fun(a); Προσοχή: Η συνάρτηση δεν µπορεί να αλλάξει την τιµή του a. (Κλήση κατά τιµή).
Μεταβίβαση ορισµάτων Άρα, γενικά µια συνάρτηση δεν µπορεί να αλλάξει τις τιµές των µεταβλητών που χρησιµοποιούνται ως ορίσµατά της. H scanf() πώς µπορεί; Η scanf() δέχεται ως όρισµα τη διεύθυνση της µνήµης που βρίσκεται η µεταβλητή (δείκτης). Αυτό σηµαίνει το &. Για τους δείκτες θα µάθετε στο επόµενο εξάµηνο. Μια συνάρτηση όµως µπορεί να αλλάξει τις τιµές των στοιχείων ενός πίνακα. Το όνοµα του πίνακα δείχνει τη διεύθυνση της µνήµης όπου αρχίζει ο πίνακας.
Συναρτήσεις 1/2 #include <stdio.h> #include <math.h> double cube(double x) return(x*x*x); int factorial(int x) int i,f=1; for (i=1;i<=x;i++) f=f*i; return(f); int abs(int x) if (x>0) return(x); else return(-x);
Συναρτήσεις 2/2 double absreal(double x) if (x>0) return(x); else return(-x); int max(int x, int y) if (x>y) return(x); else return(y); int max4(int a, int b, int c, int d) return(max(max(a,b),max(c,d))); double root4(double x) return(sqrt(sqrt(x)));
Άσκηση Γράψτε συνάρτηση int megisto(int array[], int n) η οποία επιστρέφει το µέγιστο στοιχείο ενός πίνακα µεγέθους n. Χρησιµοποιήστε την παραπάνω συνάρτηση σε ένα πρόγραµµα που διαβάζει 5 ακέραιους από το πληκτρολόγιο, τους αποθηκεύει σε έναν πίνακα και εκτυπώνει την τιµή του µεγαλύτερου από αυτούς.
Αντιµετάθεση στοιχείων πίνακα (1/4) /* * File: reverse.c * --------------- * This program reads in an array of integers, reverses the * elements of the array, and then displays the elements in * their reversed order. */ #include <stdio.h> /* * Constants * --------- * MaxElements -- Maximum number of elements */ #define MaxElements 5 /* Private function prototypes */ void GetIntegerArray(int array[], int max); void PrintIntegerArray(int array[], int n); void ReverseIntegerArray(int array[], int n); void SwapIntegerElements(int array[], int p1, int p2); void GiveInstructions(void);
Αντιµετάθεση στοιχείων πίνακα (2/4) /* Main program */ main() int list[maxelements]; GiveInstructions(); GetIntegerArray(list, MaxElements); ReverseIntegerArray(list, MaxElements); PrintIntegerArray(list, MaxElements); /* * Function: GiveInstructions * Usage: GiveInstructions(); * -------------------------- * This function gives instructions for the array reversal program. */ void GiveInstructions(void) printf("enter numbers, one per line.\n"); printf("the program will then display those values in reverse order.\n");
Αντιµετάθεση στοιχείων πίνακα (3/4) void GetIntegerArray(int array[], int max) int n; for (n = 0; n < max; n++) printf(" Element %d?, n); scanf("%d", &array[n]); return; /* * Function: PrintIntegerArray * Usage: PrintIntegerArray(array, n); * ----------------------------------- * This function displays the first n values in array, * one per line, on the console. */ void PrintIntegerArray(int array[], int n) int i; for (i = 0; i < n; i++) printf( Array[%d] = %d\n", i, array[i]);
Αντιµετάθεση στοιχείων πίνακα (4/4) /* Function: ReverseIntegerArray * Usage: ReverseIntegerArray(array, n); * ------------------------------------- * This function reverses the elements of array, which has n size. */ void ReverseIntegerArray(int array[], int n) int i; for (i = 0; i < n / 2; i++) SwapIntegerElements(array, i, n - i - 1); /* Function: SwapIntegerElements * Usage: SwapIntegerElements(array, p1, p2); * ------------------------------------------ * This function swaps the elements in array at index positions p1 and p2. */ void SwapIntegerElements(int array[], int p1, int p2) int tmp; tmp = array[p1]; array[p1] = array[p2]; array[p2] = tmp;
Άσκηση Γράψτε συνάρτηση float myfun(float x, int n) η οποία χρησιµοποιεί την εντολή switch και επιστρέφει: Το τετράγωνο του x αν το n είναι 1 Την τετραγωνική ρίζα του x αν το n είναι 2 Εκτυπώνει µήνυµα λάθους και επιστρέφει τιµή -99999 αν το n παίρνει οποιαδήποτε άλλη τιµή.