(Πρόχειρο σχέδιο - Μαθήµατος 3) p23-29 5. ΣΥΝΑΡΤΗΣΕΙΣ 5.1 Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή Η συνάρτηση είναι void, δεν επιστρέφει κάποια τιµή. //Oρισµός συνάρτησης χωρίς παραµέτρους // 12. starline void starline () for (int i=0;i<25;i++) cout << * ; cout << endl; //κλήση συνάρτησης starline(); //Oρισµός συνάρτησης µε µία παράµετρο void starline (char ch) for (int i=0;i<25;i++) cout <<ch; cout << endl; Oι µεταβλητή ch λέγεται και τυπική παράµετρος //κλήση συνάρτησης µε όρισµα * starline( * ); //κλήση συνάρτησης µε όρισµα # starline( # ); Οι τιµές µε τις οποίες καλείται µια συνάρτηση λέγονται ορίσµατα //Oρισµός συνάρτησης µε 2 παραµέτρους void starline (char ch, int n) for (int i=0;i<12;i++) cout <<setw(n)<<ch; cout << endl; //κλήση συνάρτησης µε ισάριθµα oρίσµατα *, 2 starline( *,2); //κλήση συνάρτησης µε oρiσµατα #, 3 starline( #,3); 5.2 Συναρτήσεις, που επιστρέφουν κάποια τιµή Η συνάρτηση είναι π.χ. float επιστρέφει κάποια τιµή float. //Oρισµός συνάρτησης VK - page 23
//13. mesosoros float mo(int x, int y) float m; m=(x+y)/2.0; return(m); //κλήση συνάρτησης µε ισάριθµα oρίσµατα 3, 8 mo(3, 8); //αλλά και κλήση συνάρτησης µε µεταβλητές a, b int a,b; a=23; b=2; mo(a,b); 5.3 Γενικά Γενικά όταν καλείται µια συνάρτηση, το πλήθος και ο τύπος των ορισµάτων πρέπει να είναι αντίστοιχα µε τις τυπικές παραµέτρους της. Ο προκαθορισµένος τρόπος µεταβίβασης των ορισµάτων λέγεται κλήση κατ αξία call by value Ενας άλλος τρόπος µεταβίβασης των ορισµάτων, λέγεται κλήση κατ αναφορά call by reference Eνας τρίτος τρόπος µεταβίβασης των ορισµάτων στις συναρτήσεις είναι µε την χρήση δεικτών (pointers). Μια αναφορά- reference είναι απλά ένα διαφορετικό όνοµα για µια µεταβλητή. Όταν τα ορίσµατα µεταβιβάζονται κατ αξία, η συνάρτηση που καλείται δηµιουργεί µια νέα µεταβλητή x, ίδιου τύπου µε το όρισµα a και αντιγράφει την τιµή του ορίσµατος στο x. Η τιµή του x µέσα στην συνάρτηση µπορεί να αλλάξει αλλά όχι και η τιµή του a. float mo(int x, int y) float m=(x+y)/2.0;return(m);... int a=23,b=2; mo(a,b); //η mo δηµιουργεί νέα µεταβλητή x=23; Αν όµως επιβάλλεται η αλλαγή της τιµής του a µέσα στην συνάρτηση χρησιµοποιώ αναφορά (που δηλώνεται µε το & αµέσως µετά τον τύπο του x, δηλ. int& x) //14. MOcallbyREF float mo(int& x, int y) float m=(x+y)/2.0; x=3;return(m);... int a=23,b=2; mo(a,b); //η mo δεν δηµιουργεί νέα µεταβλητή αλλά x=a=3; Μεταβιβάζοντας ορίσµατα κατ αναφορά, η συνάρτηση µπορεί να προσπελάσει τις µεταβλητές του καλούντος προγράµµατος. VK - page 24
Oταν ένα πρόγραµµα καλεί µια συνάρτηση, πρέπει να ξέρει τον τύπο της. εν µπορεί να καλεστεί πριν τον ορισµό της. Αυτό µπορεί να ξεπεραστεί 1. ηλώνοντας την πρώτα - πρόσθια δήλωση (συνήθως πριν την main() ) PROTOTYPE 2. Ορίζοντάς την αργότερα (συνήθως µετά την main() ) // ήλωση συνάρτησης //15. MO πρόσθια δήλωση float mo(int x, int y); main().cout<<mo(3,6); float mo(int x, int y).; Xρήση συναρτήσεων βιβλιοθήκης #include <αρχείο> double sqrt (double num) π.χ. η συνάρτηση sqrt ορίζεται µέσα στο αρχείο cmath επιστρέφει double και έχει παράµετρο τύπου double. Οι συναρτήσεις µπορούν να καλούν τον εαυτό τους π.χ. fibo(n)=fibo(n-1) + fibo(n-2); // recursive function //16. recursive power (power & biblioθήκη)!!!! Υπερφόρτωση συνάρτησης & ασάφεια Ορισµός συναρτήσεων µε ίδιο όνοµα και διαφοροποίηση παραµέτρων. inline συναρτήσεις π.χ. inline float mo(int x, int y); Με τις συναρτήσεις inline εξοικονοµείται µνήµη, διότι όσες φορές και αν κληθεί η συνάρτηση εκτελείται ο ίδιος κώδικας δηλ. το σώµα της συνάρτησης δεν επαναλαµβάνεται στην µνήµη. Οταν ο compiler δει την κλήση δηµιουργεί ένα jump στην συνάρτηση και όταν την τελειώσει επιστρέφει στην επόµενη από την κλήση οδηγία. Αυτό θέλει λίγο extra χρόνο. Για να γλυτώσουµε χρόνο όταν έχουµε µικρές συναρτήσεις µπορεί να επιλεχθεί το σώµα της συνάρτησης να µπεί κατ ευθείαν µαζί µε το κώδικα του προγράµµατος που την καλεί (π.χ. µαζί µε το main). Έτσι κάθε φορά αντί να καλείται η συνάρτηση, παρεµβάλλεται ο κώδικάς της inline. //17. Inline.cpp VK - page 25
inline float pounds(float klib) return klib / 0.453592 ; int main() float kgs; cout << "\nenter your weight in kilograms: "; cin >> kgs; cout << "Your weight in pounds is: "<< pounds(kgs)<< endl; system( "PAUSE" ); Στατική µεταβλητή π.χ. static float m=0; //αρχική τιµή µόνο µια φορά έχει την ορατότητα µιας τοπικής µεταβλητής (δηλ. µέσα στην συνάρτηση που την περιέχει),και δεν υπάρχει µέχρι την πρώτη φορά που θα καλεστεί η συνάρτηση, κατόπιν υπάρχει για πάντα. χρησιµοποιείται όταν είναι απαραίτητο για µια συνάρτηση να θυµάται την τιµή της µεταβλητής όταν δεν εκτελείται η συνάρτηση (ανάµεσα στις κλήσεις της συνάρτησης) σαν να είναι global για την συνάρτηση). //18. Static.cpp float mo(float); int main(void) float data = 1, avg; while(data!= 0) cout << "Enter a number or 0 to stop: "; cin >> data; avg = mo(data); cout << "Neos mesos oros "<< avg << endl; float mo(float newdata) static float total = 0; static int count = 0; count++; total += newdata; return total / count; VK - page 26
6. ΤΥΠΟΙ ΟΡΙΖΟΜΕΝΟΙ ΑΠΟ ΤΟΝ ΧΡΗΣΤΗ 6.1 Απαριθµήσεις (enumerations) enum meres DEY,TRI,TET,PEP,PAR,SAV,KYR; ηλώνεται νέος τύπος µε όνοµα meres, οι µεταβλητές του οποίου µπορούν να πάρουν τιµές µόνο από την λίστα τιµών. meres douleia, giorti, simera; //η µεταβλητή douleia µπορεί π.χ. να πάρει τιµή DEU (ανήκει στη λίστα) douleia=dey; giorti=kyr; Αν δεν ορίζεται διαφορετικά το 1 ο στοιχείο της λίστας έχει τιµή 0, το 2 ο έχει 1 κ.ο.κ. TRI+PEP //1+3=4 DEY=1; //EINAI ΛΑΘΟΣ enum meres DEY=1,TRI,TET,PEP,PAR,SAV,KYR //ΣΩΣΤΟ Οι λίστες κάνουν πιο ευανάγνωστο το πρόγραµµα if (simera==dey) cout << DOULEIA!! \n ; // καλύτερο από το if (simera==0) enum meres DEY,TRI,TET,PEP,PAR,SAV,KYR mathima,argia; //19. enumerations enum meres DEY=1,TRI,TET,PEM,PAR,SAV,KYR; #include "gconsole.h" /*Ο τύπος color είναι µέσα στο gconsole enum color cblack=0, cdark_blue=1, cdark_green=2, cdark_cyan=3, cdark_red=4, cdark_magenta=5, cbrown=6, clight_gray=7, cdark_gray=8, cblue=9, cgreen=10, ccyan=11, cred=12, cmagenta=13, cyellow=14, cwhite=15; */ VK - page 27
int main() meres giorti, simera; simera=dey; giorti=tet; //µέσα στο gconsole init_graphics(); set_color(cred); if (simera==dey) cout <<"DOULEIA!! \n" ; set_color(cmagenta); cout<<"sum DEY & TET = "<<DEY+TET<<endl; //µετατροπή σε τύπο color set_color( static_cast<color>(rand()%16) ); //H rand() επιστρέφει έναν τυχαίο ακέραιο 6.2 οµές (Structures) Συλλογή από µεταβλητές κάθε τύπου, που αναφέρονται µε κοινό όνοµα. Η δηµιουργία µιας δοµής δίνει δυνατότητα να οριστούν µεταβλητές αυτού του τύπου //20. structures struct mathitis char onoma[15]; char address[20]; char thl[13]; int ilikia; ; int main() mathitis M1,M2="GIORGOS","EGNATIAS 122","2310335234",22; M1.ilikia=23; cout<<m1.ilikia<<endl; //ορισµός δοµής mathitis µε 4 µεταβλητές-µέλη struct mathitis ; //δήλωση µεταβλητής της δοµής mathitis mathitis M1,M2; //απόδοση αρχικών τιµών στα µέλη µιας δοµής main() VK - page 28
. mathitis Μ1= GIORGOS, EGNATIAS 122, 2310335234,22;.. //αναφορά στα µέλη µιας δοµής µέσω του τελεστή τελεία (.) Μ1.ilikia=23; //µεγάλωσε //συναρτήσεις ως µέλη δοµής //21. funinstruct struct trigono float basi; float ypsos; float emvado() return basi*ypsos/2; ; int main() trigono T1=15,50; trigono T2=40,70; cout<<"to E tou T1 einai "<<T1.basi<<"x"<<T1.ypsos<<" : " <<T1.emvado()<<endl; // to trigono έχει δυο µεταβλητές µέλη και µια συνάρτηση µέλος. οι συναρτήσεις µέλη µπορούν νάχουν και παραµέτρους. 6.3 Άλλοι τύποι δεδοµένων Ενώσεις (π.χ. επιτρέπουν σε δυο µεταβλητές να µοιράζονται ίδιο τµήµα µνήµης) Συνώνυµα (χρήση της typedef για να δώσει συνώνυµο σε υπάρχοντα τύπο δεδοµένων) typedef float pososto; pososto a,b; //ίδιο µε float a,b; Κλάσεις!!!! ΣΥΜΠΕΡΑΣΜΑ Αντικείµενα και κλάσεις είναι έννοιες που έχουν µεγάλη συγγένεια και οµοιότητα µε τις δοµές. Η ύπαρξη των κλάσεων κάνει περιττή την χρήση των δοµών στην C++, που όµως διατηρούνται για λόγους συµβατότητας µε τα προγράµµατα της C. VK - page 29