Συναρτήσεις ΙΙ 1 Σημερινό μάθημα Εμβέλεια Εμφωλίαση Τύπος αποθήκευσης Συναρτήσεις ως παράμετροι Πέρασμα με τιμή Πολλαπλά return Προκαθορισμένοι ρ Παράμετροι ρ Υπερφόρτωση συναρτήσεων Inline συναρτήσεις Αναδρομή 2 1
Τοπικές μεταβλητές παράδειγμα/1 #include <iostream.h> float Convert(float); int main() { float TempFer; float TempCel; cout << ʺPlease enter the temperature in Fahrenheit: ʺ; cin >> TempFer; e TempCel = Convert(TempFer); cout << ʺ\nHereʹs the temperature in Celsius: ʺ; cout << TempCel << endl; return 0; 3 Τοπικές μεταβλητές παράδειγμα/2 float Convert(float TempFer) { float TempCel; TempCel = ((TempFer 32) * 5) / 9; return TempCel; Please enter the temperature in Fahrenheit: 212 Hereʹs the temperature in Celsius: 100 4 2
Σφαιρικές μεταβλητές #include <iostream.h> void myfunction(); int x = 5, y = 7; int main() { cout << ʺx from main: ʺ << x << ʺ\nʺ; cout << ʺy from main: ʺ << y << ʺ\n\nʺ; myfunction(); cout << ʺBack from myfunction!\n\nʺ; cout << ʺx from main: ʺ << x << ʺ\nʺ; cout << ʺy y from main: ʺ << y << ʺ\nʺ; ; return 0; x from main: 5 y from main: 7 x from myfunction: 5 y from myfunction: 10 Back from myfunction! x from main: 5 y from main: 7 void myfunction() { int y = 10; cout << ʺx from myfunction: ʺ << x << ʺ\nʺ; cout << ʺy from myfunction: ʺ << y << ʺ\n\nʺ; 5 Εμβέλεια Εμβέλεια μιας μεταβλητής είναι το τμήμα του προγράμματος που η μεταβλητή μπορεί να χρησιμοποιηθεί (που υπάρχει) Μια σφαιρική μεταβλητή έχει απεριόριστη εμβέλεια Η εμβέλεια μιας τοπικής μεταβλητής περιορίζεται μέσα στη συνάρτηση που δηλώνεται Η εμβέλεια μιας block μεταβλητής περιορίζεται μέσα στο block που δηλώνεται 6 3
Παράδειγμα int main(void) { int y=10; { int a = y; cout << a << endl; cout << a << endl; 7 Εμφωλίαση Στη C++ δεν υπάρχει εμφωλίαση συναρτήσεων αλλά υπάρχει εμφωλίαση blocks. 8 4
Εμφωλιασμένα Blocks void foo(void) { for (int j=0;j<10;j++) j<10 j++) { int k = j*10; cout << j <<, << k << endl; { int m = j+k; cout << m <<, << j << endl; cout << m << << j << endl; m k j 9 Τύπος αποθήκευσης Κάθε μεταβλητή έχει τύπο αποθήκευσης Ορίζει την περίοδο κατά την οποία μια μεταβλητή «υπάρχει» στη μνήμη Κάποιες μεταβλητές δημιουργούνται μια φορά και διατηρούνται στη μνήμη π.χ. Global Άλλες δημιουργούνται πολλές φορές π.χ local σε συνάρτηση 10 5
Τύπος αποθήκευσης auto δημιουργούνται κάθε φορά που μπαίνουμε στο block που υπάρχουν register το ίδιο με τις auto, αλλά υπαγορεύουν στον compiler να είναι πιο γρήγορος (πως;). static δημιουργείται μόνο μια φορά extern global μεταβλητή δηλωμένη αλλού 11 auto int j; Τύποι αποθήκευσης register int i_need_to_be_fast; static char remember_me; extern double a_global; 12 6
Πρακτική χρήση Οι Local μεταβλητές είναι auto εξ ορισμού Οι Global μεταβλητές είναι static εξ ορισμού Δηλώνοντας μια local μεταβλητή ως static σημαίνει ότι θα θυμάται την τελευταία τιμή της 13 static example int countcalls(void) { static int count = 0; count++; return(count); cout << countcalls() << endl; cout << countcalls() << endl; cout << countcalls() << endl; 14 7
Συναρτήσεις ως παράμετροι Answer = (double(triple(square(cube(myvalue))))); 15 Πέρασμα με τιμή παράδειγμα #include <iostream.h> void swap(int x, int y); int main() { int x = 5, y = 10; cout << ʺMain. Before swap, x: ʺ << x << ʺ y: ʺ << y << ʺ\nʺ; swap(x,y); cout << ʺMain. After swap, x: ʺ << x << ʺ y: ʺ << y << ʺ\nʺ; return 0; void swap (int x, int y) { int temp; cout << ʺSwap. Before swap, x: ʺ << x << ʺ y: ʺ << y << ʺ\nʺ; temp = x; x = y; y = temp; cout << ʺSwap. After swap, x: ʺ << x << ʺ y: ʺ << y << ʺ\nʺ; 16 8
Πέρασμα με τιμή έξοδος Main. Before swap, x: 5 y: 10 Swap. Before swap, x: 5 y: 10 Swap. After swap, x: 10 y: 5 Main. After swap, x: 5 y: 10 17 Πολλαπλά return/1 #include <iostream.h> int Doubler(int AmountToDouble); int main() { int result = 0; int input; cout << ʺEnter a number between 0 and 10,000 to double: ʺ; cin >> input; cout << ʺ\nBefore doubler is called... ʺ; cout << ʺ\ninput: ʺ << input << ʺ doubled: ʺ << result << ʺ\nʺ; ; result = Doubler(input); cout << ʺ\nBack from Doubler...\nʺ; cout << ʺ\ninput: ʺ << input << ʺ doubled: ʺ << result << ʺ\nʺ; return 0; 18 9
Πολλαπλά return/2 int Doubler(int original) { if (original <= 10000) return original * 2; else return 1; cout << ʺYou canʹt get here!\nʺ; 19 Προκαθορισμένοι Παράμετροι #include <iostream.h> int AreaCube(int length, int width = 25, int height = 1); int main() { int length = 100; int width = 50; int height = 2; int area; area = AreaCube(length, width, height); cout << ʺFirst area equals: ʺ << area << ʺ\nʺ; area = AreaCube(length, width); cout << ʺSecond time area equals: ʺ << area << ʺ\nʺ; area = AreaCube(length); cout << ʺThird time area equals: ʺ << area << ʺ\nʺ; return 0; AreaCube(int length, int width, int height) { return (length * width * height); 20 10
Προκαθορισμένοι Παράμετροι έξοδος First area equals: 10000 Second time area equals: 5000 Third time area equals: 2500 21 Υπερφόρτωση συναρτήσεων Η C++ επιτρέπει τη πολλαπλή δημιουργία συναρτήσεων ρή με το ίδιο όνομα Οι συναρτήσεις αυτές πρέπει να διαφέρουν στο πλήθος ή τον τύπο των παραμέτρων: int myfunction (int, int); int myfunction (long, long); int myfunction (long); Κάθε φορά καλείται αυτόματα η κατάλληλη ανάλογα με τις παραμέτρους που περνάμε. 22 11
Inline συναρτήσεις #include <iostream.h> inline int Double(int); int main() { int target; cout << ʺEnter a number to work with: ʺ; cin >> target; cout << ʺ\nʺ; target = Double(target); cout << ʺTarget: ʺ << target << endl; target = Double(target); cout << ʺTarget: ʺ << target << endl; target = Double(target); cout << ʺTarget: ʺ << target << endl; return 0; int Double(int target) { return 2*target; 23 Αναδρομή Έχουμε αναδρομή όταν μία συνάρτηση καλεί λίτον εαυτό της Η αναδρομή είναι πολύ χρήσιμη σε περίπτωση πολύπλοκων υπολογισμών 24 12
Αναδρομή char *chicken_or_egg( int gen ) { if (gen == 0) return("chicken!"); else if (gen == 1) return( Egg! ); else return(chicken_or_egg(gen-1)); 25 Υπολογισμός παραγοντικού int factorial( int x ) { if (x == 1) return(1); else return(x * factorial(x-1)); 26 13
Σχεδιασμός αναδρομικών συναρτήσεων Ορίζουμε συνθήκη τερματισμού: Πρόκειται για την περίπτωση όπου η συνάρτηση παύει να καλεί τον εαυτό της Ορίζουμε επανάκληση της συνάρτησης από τον εαυτό της 27 συνθήκη τερματισμού Η συνθήκη τερματισμού αντιστοιχεί σε μια περίπτωση που γνωρίζουμε ήδη την απάντηση ή υπολογίζεται εύκολα Αν δεν έχουμε συνθήκη τερματισμού δεν πρέπει να χρησιμοποιήσουμε αναδρομή ή δεν έχουμε καταλάβει το πρόβλημα 28 14
Επανάκληση Η επανάκληση χρησιμοποιείται για να λύσουμε κάποιο υπο πρόβλημαπρόβλημα Σε κάθε επανάκληση οι παράμετροι θα πρέπει να διαφέρουν ώστε να πλησιάζουμε στη λύση 29 Λάθη? #include <iostream.h> int myfunc(unsigned short int x); int main() { unsigned short int x, y; y = myfunc(x); cout << ʺx: ʺ << x << ʺ y: ʺ << y << ʺ\nʺ; int myfunc(unsigned short int x); { return (4*x); 30 15
Λάθη? #include <iostream.h> void myfunc(unsigned short int x); int main() { unsigned short int x, y; y = myfunc(int); cout << ʺx: ʺ << x << ʺ y: ʺ << y << ʺ\nʺ; void myfunc(unsigned short int x) { return (4*x); 31 16