ΣΥΝΑΡΤΗΣΕΙΣ Παραδείγματα χρήσης συναρτήσεων ΟΡΙΣΜΟΣ ΣΥΝΑΡΤΗΣΗΣ ΜΕ ΕΠΙΣΤΡΟΦΗ ΤΙΜΗΣ int compare_numbers(int num1, int num2);.... int compare_numbers(int num1, int num2) if (num1>mum2) return (num1); ΟΡΙΣΜΟΣ ΣΥΝΑΡΤΗΣΗΣ ΧΩΡΙΣ ΕΠΙΣΤΡΟΦΗ ΤΙΜΗΣ void compare_numbers(int num1, int num2);.... void compare_numbers(int num1, int num2) if (num1>mum2) printf( max=%d\n, num1); else printf( max=%d\n, num1); σελ. 1
ΤΟΠΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ Το παρακάτω πρόγραμμα δείχνει την συμπεριφορά μεταβλητών. #include<stdio.h> int tetragono(int a); void main() int x, y; x=3; y=tetragono(x); printf("to y ths main einai=%d\n", y); printf("to tetragono toy %d einai %d\n", x, y); int tetragono(int a) int y=10; printf("to y ths tetragono einai=%d\n", y); return(a*a); ΕΞΟΔΟΣ To y ths tetragono einai 10 To y ths main einai 9 To tetragono toy 3 einai 9 Press any key to continue ΠΙΝΑΚΑΣ ΩΣ ΠΑΡΑΜΕΤΡΟΣ ΣΥΝΑΡΤΗΣΗΣ #include <stdio.h> void func_arr(int Pin[]); void main() int A[10],i; for(i=0;i<=9;i++) A[i]=i; func_arr(a); void func_arr(int Pin[]) int k; for(k=0;k<=9;k++) printf("%d\n",pin[k]); σελ. 2
Σε αυτό το πρόγραμμα αρχικοποιούμε τον πίνακα Α[10] με τις τιμές που παίρνει ο μετρητής του βρόχου και μετά καλούμε την συνάρτηση func_arr με όρισμα το όνομα του πίνακα Α. η συνάρτηση με την σειρά της τυπώνει τι τιμές του πίνακα Pin[ ] τις οποίες έχει δεχθεί από τον πίνακα Α[ ]. ΠΟΛΛΕΣ ΕΝΤΟΛΕΣ ΕΠΙΣΤΡΟΦΗΣ Το παρακάτω πρόγραμμα διπλασιάζει ένα ποσό που του δίνει ο χρήστης μεταξύ 0 και 1000. Κατόπιν ελέγχει εάν το ποσό που εισήχθη είναι μεγαλύτερο από 1000 βγάζει μήνυμα λάθους. int diplasio(int posogiadiplasiasmo); int apotelesma=0; int posoeisagomeno; cout<<"dose poso metaxy 0 kai 10000 gia na to diplasiaso: "; cin>>posoeisagomeno; cout<<"\nprin kaleso thn diplasio... "; cout<<"\neisagomeno poso: "<<posoeisagomeno<<" Diplasio: "<<apotelesma<<"\n"; apotelesma=diplasio(posoeisagomeno); if (apotelesma==-1) cout<<"\nepistrofh apo thn diplasio...\n"; cout<<"to poso pou edoses einai megalytero apo 10000\n\n"; else cout<< "\nepistrofh apo thn diplasio..."; cout<< "\neisagomeno poso: "<<posoeisagomeno<< "Diplasio: "<<apotelesma<< "\n\n"; int diplasio(int pragmatiko) if (pragmatiko<=10000) return pragmatiko * 2; σελ. 3
else return -1; ΠΕΡΑΣΜΑ ΟΡΙΣΜΑΤΩΝ ΜΕ ΤΙΜΗ (ΠΑΡΑΜΕΤΡΟΙ ΣΑΝ ΤΟΠΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ) Το παρακάτω πρόγραμμα κάνει αλλαγή θέσης 2 τιμών τοπικών μεταβλητών χωρίς να επηρεάζονται οι αρχικές μεταβλητές. void swap(int x, int y); int a,b; cout<<"dose a: "<<endl; cin>>a; cout<<"dose b: "<<endl; cin>>b; cout<<"main. Prin to swap, a: "<<a<<" b: "<<b<<"\n"; swap(a,b); cout<<"main. Meta to swap, a: "<<a<<" b: "<<b<<"\n"; void swap(int x, int y) int temp; cout<<"swap. Prin to swap, x: "<<x<<" y: "<<y<<"\n"; temp=x; x=y; y=temp; cout<<"swap. Meta to swap, x: "<<x<<" y: "<<y<<"\n"; Σημ. Σε αυτό το πρόγραμμα ένα αντίγραφο των τιμών των μεταβλητών a,b περνούν στις x,y. Στην έξοδο έχουμε την αντιστροφή των μεταβλητών x,y χωρίς να επηρεαστούν οι τιμές των μεταβλητών a,b. σελ. 4
ΣΥΝΑΡΤΗΣΗ ΜΕ ΑΝΑΔΡΟΜΗ Το παρακάτω πρόγραμμα υπολογίζει το παραγοντικό ενός αριθμού λαμβάνοντας υπόψη ότι αν: n=0 τότε n!=1 και αν n>0 τότε n!=n*(n-1) long paragontiko(long n); //dhlosh prototypou long arithmos; cout<<"dose enan arithmo: "<<endl; cin>>arithmos; // exodus me klhsh ths synarthshs cout<<arithmos<<"!=" <<paragontiko(arithmos)<<endl; //telos ths main long paragontiko(long n) // orismos synarthshs if (n>1) return (n*paragontiko(n-1)); else return 1; //telos synarthshs ΛΕΙΤΟΥΡΓΙΑ Πχ. Εάν το n=5 τότε η συνάρτηση καλεί τον εαυτό της με όρισμα n-1 μέχρι το παραγοντικό του 0 όπου και σταματά λόγω της συνθήκης του if όπου θα επιστρέψει 1 δηλαδή: Επιστρέφει 120 Επιστρέφει 24 5 * paragontiko(4) 4 * paragontiko(3) 3 * paragontiko(2) 2 * paragontiko(1) 1 * paragontiko(0) Επιστρέφει 6 Επιστρέφει 2 Επιστρέφει 1 σελ. 5
ΣΥΝΑΡΤΗΣΗ ΜΕ ΕΠΑΝΑΛΗΨΗ Το παρακάτω πρόγραμμα πρόγραμμα υπολογίζει την δύναμη ενός αριθμού. Ο αριθμός και η δύναμη θα εισάγεται από το χρήστη. Λάβετε υπόψη ότι: x n = x*x*x*..*x, n φορές. int power(int x, int n); // dhlosh synarthshs int a,b,dynamh; cout<<"dose ton arithmo: "<<endl; cin>>a; cout<<"dose thn dynamh: "<<endl; cin>>b; dynamh=power(a,b); // klhsh ths synarthshs cout<<"to "<<a<<"sthn"<<b<<" mas kanei: <<dynamh<<endl; //telos ths main int power(int x, int n) // orismos synarthshs int i,p; p = 1; for (i=1; i<=n; i++) p = p*x; return p; //telos synarthshs σελ. 6
ΠΡΟΚΑΘΟΡΙΣΜΕΝΕΣ ΤΙΜΕΣ ΠΑΡΑΜΕΤΡΩΝ Το παρακάτω πρόγραμμα υπολογίζει τον όγκο ενός κύβου. Χρησιμοποιούνται προκαθορισμένες τιμές. int ogkoskyvou(int mhkos, int platos = 30, int ypsos = 2); int mhkos = 50; int platos = 20; int ypsos = 5; int ogkos; ogkos = ogkoskyvou(mhkos, platos, ypsos); cout <<"1h Klhsh Synarthshs o ogkos einai: "<<ogkos<<"\n"; ogkos = ogkoskyvou(mhkos, platos); cout <<"2h Klhsh Synarthshs o ogkos einai: "<<ogkos<<"\n"; ogkos = ogkoskyvou(mhkos); cout <<"3h Klhsh Synarthshs o ogkos einai: "<<ogkos<<"\n"; ogkoskyvou(int mhkos, int platos, int ypsos) return (mhkos * platos * ypsos); Σημ. Εδώ το πρόγραμμα θα χρησιμοποιήσει (καλέσει) την συνάρτηση 3 φορές με διαφορετικές κάθε φορά παραμέτρους κατά την κλήση. Την πρώτη φορά θα υπολογιστεί ο όγκος χρησιμοποιώντας τις τιμές των παραμέτρων που έχουν οριστεί μέσα στην main. Την δεύτερη φορά χρησιμοποιώντας τις τιμές δύο εκ των παραμέτρων που έχουν οριστεί μέσα στην main και την τελευταία στη σειρά στο πρωτότυπο και τη Τρίτη φορά χρησιμοποιώντας την τιμή της μιας παραμέτρου που έχει οριστεί μέσα στην main και την 2 η και 3 η κατά σειρά στο πρωτότυπο. σελ. 7
ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΗΣ ΑΠΟ ΣΥΝΑΡΤΗΣΗ Το παρακάτω πρόγραμμα υπολογίζει εάν ο αριθμός που εισάγει ο χρήστης είναι άρτιος ή περιττός. Εάν δοθεί σαν επιλογή ο αριθμός 0 τότε το πρόγραμμα να τερματίζει. void peritos(int a); void artios(int a); int i; do cout<<"dose enan arithmo (0 gia EXODO): "; cin>>i; peritos(i); while (i!=0); void peritos(int a) if ((a%2)!=0) cout<<"o arithmos pou edoses einai PERITOS.\n"; else artios(a); void artios(int a) if ((a%2)==0) cout<<"o arithmos pou edoses einai ARTIOS.\n"; else peritos(a); Σημ. Εδώ το πρόγραμμα θα βρει εάν ο αριθμός που εισήχθη είναι άρτιος ή περιττός με την χρήση κλήσης συνάρτησης από συνάρτηση. Η πρώτη συνάρτηση καλείται μέσα στην main. Εκεί ελέγχεται εάν ο αριθμός που εισήχθη είναι το 0 κάτι που προκαλεί το τερματισμό του προγράμματος. Στην πρώτη συνάρτηση (peritos) ελέγχεται εάν το υπόλοιπο της διαίρεσης του αριθμού δεν είναι 0 τότε ο αριθμός είναι περιττός αλλιώς καλείται η δεύτερη συνάρτηση (artios) που ελέγχει με την σειρά της εάν ο αριθμός είναι άρτιος. σελ. 8
INLINE ΣΥΝΑΡΤΗΣΕΙΣ Το παρακάτω πρόγραμμα διπλασιάζει 3 φορές διαδοχικά μια τιμή εισόδου με την χρήση INLINE συνάρτησης. inline int Diplasio(int); int timh; cout<<"dose MIA TIMH: "; cin>>timh; cout<<"\ndiadoxikos DIPLASIASMOS TIMHS\n"; cout<<"\narxikh TIMH: "<<timh<<endl; timh=diplasio(timh); cout<<"timh1 (ARXIKH TIMH x 2): "<<timh<<endl; timh=diplasio(timh); cout<<"timh2 (TIMH1 x 2): "<<timh<<endl; timh=diplasio(timh); cout<<"timh3 (TIMH2 x 2): "<<timh<<endl; cout<<endl; int Diplasio(int timh) return 2*timh; Σημ. Εδώ έχουμε ορίσει μία inline συνάρτηση (Diplasio) που την καλούμε μέσα στην main τρεις φορές. Ουσιαστικά ο compiler αντιγράφει τον κώδικα της συνάρτησης σε κάθε σημείο της main που καλείται η συνάρτηση. Με αυτό τον τρόπο δεν έχουμε τρεις μεταπηδήσεις από την main στην συνάρτηση και έτσι κερδίζουμε χρόνο κατά την εκτέλεση του προγράμματος. Χρησιμοποιούμε inline συναρτήσεις όταν η συνάρτηση έχει μία έως δύο εντολές και χρειάζεται να την καλέσουμε μέσα στην main πολλές φορές. σελ. 9
ΥΠΕΡΦΟΡΤΩΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Το παρακάτω πρόγραμμα χρησιμοποιεί μία συνάρτηση με υπερφόρτωση ώστε να κάνει τα εξής: I. Να τυπώνει στην οθόνη 50 μηδενικά (0), II. Να τυπώνει στην οθόνη 50 χαρακτήρες που θα καθορίζονται από την κλήση της συνάρτησης και III. Να τυπώνει στην οθόνη χαρακτήρες που ο χαρακτήρας αλλά και ο αριθμός των χαρακτήρων να καθορίζονται στην κλήση της συνάρτησης. void printfunc(); void printfunc(char ch); void printfunc(char ch, int n); void main() printfunc(); printfunc('/'); printfunc('%',40); void printfunc() int i; for (i=0; i<50; i++) cout << "0"; cout << endl; void printfunc(char ch) int i; for (i=0; i<50; i++) cout << ch; cout << endl; void printfunc(char ch, int n) int i; for (i=0; i<n; i++) cout << ch; cout << endl; σελ. 10
ΥΠΕΡΦΟΡΤΩΣΗ ΣΥΝΑΡΤΗΣΕΩΝ (ΜΕ ΠΡΟΕΠΙΛΕΓΜΕΝΑ ΟΡΙΣΜΑΤΑ) Το παρακάτω πρόγραμμα χρησιμοποιεί μία συνάρτηση με υπερφόρτωση και προεπιλεγμένα ορίσματα - και 50 void printfunc(char ch='-', int n=50); void main() printfunc(); printfunc('/'); printfunc('%',40); void printfunc(char ch, int n) int i; for (i=0; i<n; i++) cout << ch; cout << endl; Σημ. Εδώ το πρόγραμμα θα χρησιμοποιήσει (καλέσει) την συνάρτηση 3 φορές. Την πρώτη φορά το loop που βρίσκεται μέσα στον ορισμό της συνάρτησης θα χρησιμοποιήσει και τα δύο προεπιλεγμένα ορίσματα που βρίσκονται μέσα στο πρωτότυπο. Την δεύτερη φορά θα χρησιμοποιήσει το όρισμα της κλήσης συνάρτησης και το δεξί του πρωτοτύπου και την τρίτη φορά θα χρησιμοποιήσει τα ορίσματα που βρίσκονται στη κλήση της συνάρτησης. σελ. 11