Η βασική συνάρτηση προγράμματος main() HEADER FILES main(){ ΔΗΛΩΣΕΙΣ ΜΕΤΑΒΛΗΤΩΝ ΕΝΤΟΛΕΣ (σειριακές, επιλογής ή επανάληψης) ΕΠΙΣΤΡΕΦΟΜΕΝΟΣ ΤΥΠΟΣ (return 0;)
Συναρτήσεις Η συνάρτηση είναι ένα υποπρόγραμμα που εκτελεί συγκεκριμένες λειτουργίες και ανάλογα με τα δεδομένα εισόδου (παράμετροι συνάρτησης) υπολογίζει τα δεδομένα εξόδου (επιστρεφόμενος τύπος). Δεδομένα Εισόδου ΣΥΝΑΡΤΗΣΗ Δεδομένα Eξόδου Πχ η τριγωνομετρική συνάρτηση sin(x), υπολογίζει το ημίτονο της γωνίας x.
Δήλωση Συνάρτησης (Επικεφαλίδα) Τύπος Δεδομένων ΌνομαΣυνάρτησης ( Παράμετροι ); Αν δεν επιστρέφεται τίποτα: void Αν δεν υπάρχουν: void Αν υπάρχουν λίστα τυπικών παραμέτρων: Τύπος1 μεταβλ1,..,τύποςν μεταβλν Παράδειγμα: int CalculateSum( int a, int b );
Υλοποίηση Συνάρτησης Τύπος Δεδομένων ΌνομαΣυνάρτησης ( Παράμετροι ) { Δηλώσεις μεταβλητών Εντολές Επιστροφή τύπου δεδομένων (όταν υπάρχει)
Κλήση Συνάρτησης ΌνομαΣυνάρτησης( Λίστα Πραγματικών Παραμέτρων ); Αν δεν υπάρχουν, κενό Πχ. Function1(); Αν υπάρχουν, λίστα μεταβλητών ή αριθμητικών τιμών, διαχωρισμένες με κόμμα Πχ. Function1(12,4,a,b);
Κλήση H ροή ελέγχου του προγράμματος είναι σειριακή και εκτελούνται οι εντολές και συναρτήσεις της main. Όταν κληθεί μια συνάρτηση ο έλεγχος του προγράμματος μεταφέρεται στην καλούμενη συνάρτηση. Κάθε συνάρτηση μπορεί να καλέσει και άλλες συναρτήσεις. (Δεν μπορεί να καλέσει τη main.)
Συναρτήσεις Δομή προγράμματος Όλες οι συναρτήσεις πρέπει να δηλωθούν Η δήλωση γίνεται πάντα πριν τη main. Η υλοποίηση μπορεί να γίνει ταυτόχρονα με τη δήλωση, ή ξεχωριστά πριν ή μετά τη main.
Συναρτήσεις Δομή προγράμματος 1 HEADER FILES ΔΗΛΩΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΣΥΝΑΡΤΗΣΗΣ main(){ Δηλώσεις Μεταβλητών ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΗΣ Σώμα εντολών return 0;
Παράδειγμα 1 Δήλωση μαζί με #include <stdio.h> #include <stdlib.h> υλοποίηση void ektyposi_epilogwn( void ) { printf( 1. Method 1\n ); printf( 2. Method 2\n ); printf( 3. Method 3\n );
Παράδειγμα 1 - Κλήση main(){ ektyposi_epilogwn(); system( pause ); return 0;
Συναρτήσεις Δομή προγράμματος HEADER FILES ΔΗΛΩΣΗ ΣΥΝΑΡΤΗΣΗΣ main(){ Δηλώσεις Μεταβλητών 2 ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΗΣ Σώμα εντολών return 0; ΥΛΟΠΟΙΗΣΗ ΣΥΝΑΡΤΗΣΗΣ
Παράδειγμα 2 Δήλωση #include <stdio.h> #include <stdlib.h> void ektyposi_epilogwn( void ) ;
Παράδειγμα 2 - Κλήση main(){ ektyposi_epilogwn(); system( pause ); return 0;
Παράδειγμα 2 - Υλοποίηση void ektyposi_epilogwn( void ) { printf( 1. Method 1\n ); printf( 2. Method 2\n ); printf( 3. Method 3\n );
Συναρτήσεις με επιστρεφόμενο τύπο int CalculateSum( int a, int b ) { int c; c = a + b; return c ; Η εντολή return παραλείπεται ΜΟΝΟ στην περίπτωση που η συνάρτηση δεν επιστρέφει κάποιο τύπο δεδομένων (void). Με την εντολή return ο έλεγχος ροής του προγράμματος επιστρέφει στο σημείο απ όπου κλήθηκε η συνάρτηση.
Κλήση main(){ int k; k = CalculateSum(5,2); printf( Calculated:%d,k); system( pause ); return 0;
Παράμετροι Λίστα τυπικών παραμέτρων στη δήλωση: int CalculateSum( int a, int b ) ; Λίστα πραγματικών παραμέτρων στην κλήση int k=2,l=5; CalculateSum( k, l ) ; Μεταβλητές ή αριθμητικές τιμές Οι τιμές των πραγματικών παραμέτρων αντιγράφονται στις τυπικές παραμέτρους όταν καλείται η συνάρτηση
Παράδειγμα Φτιάξτε μία συνάρτηση που να προσδιορίζει το πρόσημο ενός αριθμού (τύπος δεδομένων float).
Αλγόριθμος 1. Ζητάω από το χρήστη να δώσει έναν πραγματικό 2. Διαβάζεται ο αριθμός που θα δώσει ο χρήστης 3. Φτιάχνω συνάρτηση με παράμετρο τον αριθμό και επιστρεφόμενο τύπο χαρακτήρα 4. Αν ο αριθμός είναι αρνητικός επιστρέφεται -, διαφορετικά επιστρέφεται + 5. Εκτύπωση του χαρακτήρα
Επικεφαλίδα Συνάρτησης char CalcProsimo( float a ); Είσοδος: ο πραγματικός αριθμός Έξοδος: χαρακτήρας που δηλώνει το πρόσημο του a
Πρόγραμμα #include <stdio.h> #include <stdlib.h> char CalcProsimo( float a) { if (a < 0) return - ; else return + ; Η εντολή return θα πρέπει να υπάρχει σε όλες τις περιπτώσεις
Πρόγραμμα main(){ float w; char c; printf( Input float\n ); scanf( %f,&w); c = CalcProsimo( w ); printf( To prosimo einai: %c,c); system( pause ); return 0; Η αριθμητική τιμή της w θα αντιγραφεί στην τυπική παράμετρο a της συνάρτησης CalcProsimo Αναθέτω στη c την τιμή που επιστρέφει η συνάρτηση
Παράδειγμα Γράψτε μια συνάρτηση που να επιστρέφει το μεγαλύτερο από 3 ακέραιους αριθμούς.
Αλγόριθμος 1. Ζητώ από το χρήστη να δώσει 3 αριθμούς 2. Διαβάζονται οι αριθμοί 3. Σχεδιάζω συνάρτηση με παραμέτρους τους 3 ακεραίους και επιστρεφόμενη τιμή ακέραιο (για το μέγιστο)
Αλγόριθμος 4. Θα χρησιμοποιήσω μια μεταβλητή για να κρατήσω προσωρινό μέγιστο 5. Αν ο 1 ος ακέραιος είναι μεγαλύτερος από τον 2 ο, ο προσωρινός μέγιστος θα έχει την τιμή του 1 ου, διαφορετικά θα έχει την τιμή του δεύτερου 6. Αν ο 3ος ακέραιος είναι μεγαλύτερος από τον προσωρινό μέγιστο, ο προσωρινός μέγιστος θα πάρει την τιμή του 3 ου ακεραίου.
Σχηματικά 7. Επιστρέφεται ο προσωρινός ακέραιος 1 ος ακέραιος int arithmos1; 2 ος ακέραιος int arithmos2; 3 ος ακέραιος int arithmos3; 1. Αν arithmos1>arithmos2 Max = arithmos1 2. Διαφορετικά Max = arithmos2 1. Αν arithmos3>max Max = arithmos3
Επικεφαλίδα συνάρτησης int FindMax (int number1, int number2, int number3);
Πρόγραμμα #include <stdio.h> #include <stdlib.h> int FindMax( int number1, int number2, int number3) { int max; if ( number1 > number2) max = number1; else max = number2;
Πρόγραμμα if ( number3 > max) max = number3; return max;
Πρόγραμμα main(){ int a,b,c,result; printf( Input 3 integers\n ); scanf( %d%d%d,&a,&b,&c); result = FindMax(a,b,c); printf( Max number is:%d\n,result); system( pause ); return 0;
Παράδειγμα Ένα πρόγραμμα που να βρίσκει το μεγαλύτερο από 5 αριθμούς χρησιμοποιώντας τη συνάρτηση FindMax
Πρόγραμμα main(){ int a,b,c,d,e,result; printf( Input 5 integers\n ); scanf( %d%d%d%d%d,&a,&b,&c,&d,&e); result = FindMax(a,b,c); result = FindMax(result,d,e); printf( Max number is:%d\n,result); system( pause ); return 0;
Κατάσταση Μνήμης Η μνήμη είναι οργανωμένη σε «κελιά». Στα κελιά αποθηκεύονται οι τιμές των μεταβλητών και κάθε κελί έχει μία μοναδική διεύθυνση. 1000 1001 1002 1003 1004 132 8 5 43 1 1005 1006 1007 1008 1009 a 0 16000 b 800 1010 1011 1012 1013 1014 7 13 C 3 21
Μεταβλητές και μνήμη 1000 1001 1002 1003 1004 132 8 5 43 1 1005 1006 1007 1008 1009 a 0 16000 b 800 Οι μεταβλητές είναι συμβολικά ονόματα που χρησιμοποιούμε για να αναφερθούμε σε δεδομένα που είναι αποθηκευμένα στη μνήμη. 1010 1011 1012 1013 1014 7 13 C 3 21 int x = 21;
Μεταβλητές και μνήμη Μετά την εκτέλεση κάθε εντολής, αλλάζει η κατάσταση της μνήμης. Πχ με εντολή x=2; Αλλάζει η αριθμητική τιμή της x
Χαρακτηριστικά Μεταβλητών Εμβέλεια (ορατότητα) Διάρκεια ζωής (δημιουργία καταστροφή) Θέση στη μνήμη
Καθολικές (public) Μεταβλητές Δηλώνονται έξω από τη main Εμβέλεια: Είναι ορατές από όλες τις συναρτήσεις που ακολουθούν της δήλωσης Διάρκεια: Δημιουργούνται με την εκκίνηση εκτέλεσης του προγράμματος και καταστρέφονται με το τέλος εκτέλεσης Θέση στη μνήμη: Τοποθετούνται σε θέσεις οι οποίες υπάρχουν καθόλη τη διάρκεια εκτέλεσης του προγράμματος
Παράδειγμα #include <stdio.h> #include <stdlib.h> int a; void print(void){ printf( To a exei timh:%d\n, a ); main(){ a = 4; print(); system( pause ); return 0; Καθολική (public). Ορατή από όλες τις συναρτήσεις που έχουν δηλωθεί ΠΑΡΑΚΑΤΩ
Βρείτε το λάθος #include <stdio.h> #include <stdlib.h> void menu(void){ printf( Value of a is:%d, a ); int a; void print(void){ printf( To a exei timh:%d\n, a ); main(){ a = 4; menu(); print(); system( pause ); return 0; Μήνυμα λάθους από τον Compiler: To a δεν έχει δηλωθεί
Τοπικές (local) μεταβλητές Δηλώνονται μέσα σε κάποιο σώμα εντολών ή σε σώμα συνάρτησης Εμβέλεια: Είναι ορατές μόνο στο σώμα συνάρτηση που τις εμπεριέχει Διάρκεια: Δημιουργούνται κατά την εκκίνηση του σώματος εντολών ή της συνάρτησης και καταστρέφονται με το τέλος εκτέλεσης του σώματος ή της συνάρτησης Θέση στη μνήμη: Τοποθετούνται σε θέσεις που δεσμεύονται μόνο για την εκτέλεση του σώματος εντολών ή της συνάρτησης
Σχηματικά 1000 1001 9.8 1002 1003 3 1004 124 1005 26 Διευθύνσεις μνήμης που δεσμεύονται για τις τοπικές μεταβλητές της main. Διευθύνσεις μνήμης που void print(void){ δεσμεύονται για τις τοπικές μεταβλητές της print. int a,b,k; a =3; b=124; k = 26; printf( A:%d,B:%d,k:%d,a,b,k); main(){ double k; k=9.8; print(); printf( k:%d,k);
Έλεγχος ροής προγράμματος 4. Δέσμευση μνήμης για τοπικές μεταβλητές της print 5. 6. 7. 8. 1. Δέσμευση μνήμης για τοπικές μεταβλητές της main 2. 3. 9. void print(void){ int a,b,k; a =3; b=124; k = 26; printf( A:%d,B:%d,k:%d,a,b,k); main(){ double k; k=9.8; print(); printf( k:%d,k);
Βρείτε τι θα εκτυπωθεί int CalculateDiff(int a, int b ) { int c=9; printf( Value of c is:%d,c); return (a b); main() { int a=3, b=1, c=7, d=2; printf( Difference is : %d\n, CalculateDiff( c, d ) );
Στατικές Μεταβλητές - Static Δήλωση: static τύπος ΌνομαΜεταβλητής Πχ static int a=0; Οι στατικές μεταβλητές δεσμεύουν θέσεις μνήμης καθόλη τη διάρκεια του προγράμματος (η μνήμη δεν αποδεσμεύεται στο τέλος εκτέλεσης της συνάρτησης)
Παράδειγμα void printvalue(void){ static int k = 0; k++; printf( To k:%d\n,k); main(){ printvalue(); printvalue(); printvalue(); Η αρχικοποίηση γίνεται κατά το compilation Η μεταβλητή k δεν καταστρέφεται στο τέλος εκτέλεσης της συνάρτησης. Η τιμή της διατηρείται μέχρι το τέλος εκτέλεσης του προγράμματος. Θα εκτυπωθεί To k:1 To k:2 To k:3
Τι θα εκτυπωθεί void print(){ int k = 0; while(k<5) k++; printf( To k:%d\n,k); main() { print(); print(); void print(){ static int k = 0; while(k<5) k++; printf( To k:%d\n,k); main() { print(); print();
Άσκηση για το σπίτι Φτιάξτε ένα πρόγραμμα που να υπολογίζει το ελάχιστο κοινό πολλαπλάσιο 3 αριθμών Υπόδειξη: 1) Να υλοποιηθεί μία συνάρτηση με παραμέτρους τους 3 ακεραίους και επιστρεφόμενη τιμή το αποτέλεσμα (ακέραιος με το ελάχιστο κοινό πολλαπλάσιο) (Θα χρειαστεί να υλοποιήσετε και μια συνάρτηση που να υπολογίζει το μέγιστο από τους 3 αριθμούς)
Άσκηση για το σπίτι Υπενθύμιση Για 3 αριθμούς α, β, γ, το ΕΚΠ ανήκει στο σύνολο Α = [max(α,β,γ), α*β*γ], όπου max(α,β,γ) ο μέγιστος εκ των 3 αριθμών. Το ΕΚΠ είναι ο μικρότερος αριθμός του συνόλου Α που διαιρεί ακριβώς και τους 3 αριθμούς.
Υπενθύμιση Η πράξη a % b επιστρέφει το υπόλοιπο της διαίρεσης του a με το b. Αν ο b διαιρεί ακριβώς τον a, το υπόλοιπο είναι 0.
Υπoδείξεις Θα χρησιμοπιήσετε εντολή επανάληψης Η μεταβλητή στον έλεγχο συνθήκης θα παίρνει τιμές στο διάστημα Α (όπως προαναφέρθηκε) Στο σώμα εντολών της επανάληψης θα πρέπει να ελεγχθεί αν η μεταβλητή διαιρεί ακριβώς τους αριθμούς
Υποδείξεις Έξοδος από την επανάληψη: Το ΕΚΠ ενδέχεται να βρεθεί σε λιγότερα βήματα από αυτά που έχουμε ορίσει στην επανάληψη. Στην περίπτωση αυτή θέλουμε να διακοπεί η επανάληψη. 2 τρόποι: 1) Χρήση της εντολής break (διακόπτει την επανάληψη)
Υποδείξεις 2) Χρήση μιας μεταβλητής με ρόλο «διακόπτη» (όπως έχει υλοποιηθεί σε προηγούμενη διάλεξη η μεταβλητή flag για έξοδο από τη while) Δίνουμε στη μεταβλητή αυτή αρχικά την τιμή 1 και την ενσωματώνουμε, με χρήση κατάλληλου λογικού τελεστή, στη συνθήκη επανάληψης. Της δίνουμε την τιμή 0, όταν ικανοποιηθεί η συνθήκη που θέλουμε (στο σώμα εντολών) για να τερματίσουμε «πρόωρα» την επανάληψη.