Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Συναρτήσεις
2
Τι είναι μία συνάρτηση Ένα κατονομασμένο, ανεξάρτητο κομμάτι κώδικα C που εκτελεί μία συγκεκριμένη εργασία. Η εκτέλεσή του μπορεί να ζητηθεί από οποιοδήποτε σημείο του προγράμματος C. Η συνάρτηση μπορεί να δέχεται παραμέτρους από τον κώδικα που την καλεί και να του επιστρέφει μία τιμή.
3
Αναλύοντας τον ορισμό (1)
Μία συνάρτηση είναι κατονομασμένη Έχει ένα όνομα, μοναδικό στα πλαίσια του προγράμματος Το όνομα αποτελείται από γράμματα, αριθμούς και κάτω παύλες (_) ξεκινώντας με γράμμα ή κάτω παύλα. Το όνομα πρέπει να είναι ενδεικτικό της λειτουργίας που επιτελεί η συνάρτηση cube, third_power, thirdPower write_file, writeFile, WriteFile
4
Αναλύοντας τον ορισμό (2)
Μία συνάρτηση είναι ένα ανεξάρτητο κομμάτι κώδικα C Δεν στηρίζεται σε τιμές μεταβλητών που έχουν ορισθεί σε άλλα τμήματα του κώδικα. Εξαρτάται μόνο από τις παραμέτρους της, τις δικές της μεταβλητές και τον δικό της κώδικα Δεν εξαρτάται (κατά κανόνα) από την ύπαρξη ή δομή άλλων τμημάτων κώδικα Δεν επηρεάζει άλλα τμήματα κώδικα, παρά μόνο με την τιμή που επιστρέφει
5
Αναλύοντας τον ορισμό (3)
Μία συνάρτηση επιτελεί μία συγκεκριμένη εργασία Η εργασία αυτή αποτελεί τμήμα της συνολικής λειτουργίας που πρέπει να επιτελέσει το πρόγραμμά μας Προτροπή στον χρήστη για στοιχεία και συλλογή της απάντησής του Υπολογισμός της μέσης τιμής των στοιχείων ενός πίνακα Ταξινόμηση των στοιχείων ενός πίνακα
6
Αναλύοντας τον ορισμό (4)
Μία συνάρτηση μπορεί να δέχεται παραμέτρους από τον κώδικα που την καλεί Ο κώδικας που καλεί τη συνάρτηση καθορίζει δεδομένα πάνω στα οποία η συνάρτηση θα ενεργήσει Προτροπή στον χρήστη για στοιχεία και συλλογή απάντησης: μήνυμα προτροπής υπολογισμός μέσης τιμής στοιχείων ενός πίνακα: ο πίνακας Άθροισμα δύο αριθμών: οι δύο αριθμοί
7
Αναλύοντας τον ορισμό (5)
Η συνάρτηση μπορεί να επιστρέφει μία τιμή στον κώδικα που την καλεί Το αποτέλεσμα της συνάρτησης Συλλογή στοιχείων: τα στοιχεία που συλλέχθηκαν Μέση τιμή πίνακα: η μέση τιμή Άθροισμα αριθμών: το άθροισμα Μία ένδειξη επιτυχίας/αποτυχίας Εγγραφή σε αρχείο: εντάξει, δεν βρέθηκε το αρχείο, ανεπαρκή δικαιώματα, η μονάδα δίσκου δεν έχει χώρο
8
Παραδείγματα συναρτήσεων (1)
#include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0;
9
Παραδείγματα συναρτήσεων (1)
#include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Όνομα συνάρτησης
10
Παραδείγματα συναρτήσεων (1)
#include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Παράμετροι
11
Παραδείγματα συναρτήσεων (1)
#include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Δεδομένα που επιστρέφονται
12
Παραδείγματα συναρτήσεων (1)
#include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Κώδικας συνάρτησης (σώμα)
13
Παραδείγματα συναρτήσεων (1)
#include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Κλήση συνάρτησης
14
Η διαδοχή εντολών κατά την κλήση
#include <stdio.h> void waitReturn(void) { char myStr[128]; puts("Πατήστε ENTER"); gets(myStr); return; } int main(void) { waitReturn(); return 0; main:1 waitReturn(); waitreturn:1 puts("Πατήστε ENTER"); waitreturn:2 gets(mystr); waitreturn:3 return; main:2 return
15
Παραδείγματα συναρτήσεων (2)
#include <stdio.h> void printSum(int a, int b) { /* Εκτύπωση του αθροίσματος δύο ακεραίων */ printf("To άθροισμα των %d και %d είναι %d\n", a, b, a + b); return; } int main(void) { printSum(1, 7); printSum(-3, -8); printSum(2, -11); return 0;
16
Η μεταβίβαση παραμέτρων
int main(void) { ... printSum(1, 7); void printSum(int a, int b) { printf("To άθροισμα των %d και %d είναι %d\n", a, b, a + b); return; } Τα a και b καλούνται παράμετροι. Τα «1» και «7» ονομάζονται ορίσματα της συνάρτησης για τη συγκεκριμένη κλήση.
17
Παραδείγματα συναρτήσεων (3)
#include <stdio.h> #include <stdlib.h> int readInteger(void) { /* Προτροπή του χρήστη για εισαγωγή ενός ακεραίου, ανάγνωση της εισόδου και επιστροφή της τιμής */ char tmpStr[128]; int result; printf("Δώστε έναν ακέραιο: "); gets(tmpStr); result = atoi(tmpStr); return result; } int main(void) { int a, b; a = readInteger(); b = readInteger(); printSum(a, b); return 0;
18
Επιστροφή τιμής από συναρτήσεις
int readInteger(void) { ... result = atoi(tmpStr) return result; } a = readInteger();
19
Παραδείγματα συναρτήσεων (4)
#include <stdio.h> int sum(int a, int b) { /* Υπολογισμός και επιστροφή του αθροίσματος δύο ακεραίων */ int result; result = a + b; return result; } int main(void) { int x; x = sum(3, 12); printf(" = %d\n", x); printf(" = %d\n", sum(2000, 11)); return 0;
20
Μεταβίβαση παραμέτρων και επιστροφή τιμής
x = sum(3, 12); int sum(int a, int b) { result = a + b; return result; }
21
Κοινά σφάλματα σε συναρτήσεις (1)
Λάθος πλήθος παραμέτρων σε συναρτήσεις #include <stdio.h> int sum(int a, int b) { int result; result = a + b; return result; } int main(void) { printf(" = %d\n", sum(2000)); printf(" = %d\n", sum(2000, 11, 30)); return 0; gcc -o sum sum.c sum.c: In function 'main': sum.c:10: too few arguments to function 'sum' sum.c:11: too many arguments to function 'sum'
22
Κοινά σφάλματα σε συναρτήσεις (2)
Λάθος τύπος παραμέτρων σε συναρτήσεις #include <stdio.h> int sum(int a, int b) { int result; result = a + b; return result; } int main(void) { int a; a = sum(2, "300"); printf("Το άθροισμα είναι %d\n", a); return 0; gcc -o sum sum.c sum.c:11: warning: passing arg 2 of 'sum' makes integer from pointer without a cast ./sum Το άθροισμα είναι 67578
23
Κοινά σφάλματα σε συναρτήσεις (3)
Δεν επιστρέφουμε τιμή από συνάρτηση που πρέπει να επιστρέψει τιμή #include <stdio.h> int sum(int a, int b) { int result; result = a + b; } int main(void) { printf("Το άθροισμα είναι %d\n", sum(2, 100)); return 0; gcc -o sum sum.c ./sum Το άθροισμα είναι 102 Είναι σωστό! (αλλά συμπτωματικά μόνο...)
24
Κοινά σφάλματα σε συναρτήσεις (4)
Δεν επιστρέφουμε τιμή από συνάρτηση που πρέπει να επιστρέψει τιμή #include <stdio.h> int sum(int a, int b) { int result; result = a + b; printf("Υπολόγισα άθροισμα ίσο με %d\n", result); } int main(void) { printf("Το άθροισμα είναι %d\n", sum(2, 100)); return 0; gcc -o sum sum.c ./sum Υπολόγισα άθροισμα ίσο με 102 Το άθροισμα είναι 2
25
Κοινά σφάλματα σε συναρτήσεις (5)
Προσπαθούμε να χρησιμοποιήσουμε τιμή επιστροφής από συνάρτηση “void” #include <stdio.h> void waitReturn(void) { char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { int a; a = waitReturn(); return 0; gcc -o sum sum.c sum.c: In function 'main': sum.c:14: void value not ignored as it ought to be
26
Κοινά σφάλματα σε συναρτήσεις (6)
Παράλειψη των παρενθέσεων στην κλήση συνάρτησης #include <stdio.h> void waitReturn(void) { char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn; return 0; gcc –o wait wait.c ./wait
27
Κοινά σφάλματα σε συναρτήσεις (7)
Δήλωση με τον «παλιό» τρόπο (K&R C) int sum(a, b) int a, b; { int result; result = a + b; return result; } int main(void) { printf("3 + 7 = %d\n", sum(3)); printf(" = %d\n", sum(199, 500, 801)); printf(" = %d\n", sum("199", "500")); return 0; gcc -o sum sum.c ./sum 3 + 7 = = 699 =
28
Πρότυπα συναρτήσεων (1)
#include <stdio.h> int main(void) { double x; x = sum(3.2, 12.15); printf(" = %f\n", x); printf(" = %f\n", sum( , 11.6)); return 0; } double sum(double a, double b) { /* Υπολογισμός του αθροίσματος δύο πραγματικών */ double result; result = a + b; return result;
29
Πρότυπα συναρτήσεων (2)
gcc -o sum sum.c sum.c:14: warning: type mismatch with previous implicit declaration sum.c:8: warning: previous implicit declaration of 'sum' sum.c:14: warning: 'sum' was previously implicitly declared to return 'int' ./sum = =
30
Πρότυπα συναρτήσεων (3)
#include <stdio.h> int main(void) { double x; x = sum(3.2, 7); printf(" = %f\n", x); printf(" = %f\n", sum("199", "500")); return 0; } double sum(double a, double b) { double result; result = a + b; return result;
31
Πρότυπα συναρτήσεων (4)
gcc -o sum sum.c sum.c:12: warning: type mismatch with previous implicit declaration sum.c:6: warning: previous implicit declaration of 'sum' sum.c:12: warning: 'sum' was previously implicitly declared to return 'int' ./sum = =
32
Πρότυπα συναρτήσεων (3)
#include <stdio.h> double sum(double, double); int main(void) { double x; x = sum(3.2, 12.15); printf(" = %f\n", x); printf(" = %f\n", sum( , 11.6)); return 0; } double sum(double a, double b) { /* Υπολογισμός του αθροίσματος δύο πραγματικών */ double result; result = a + b; return result; Πρότυπο συνάρτησης
33
Πρότυπα συναρτήσεων (4)
Στο πρότυπο συνάρτησης ορίζουμε ΠΑΝΤΑ: Το όνομα της συνάρτησης Τον τύπο αποτελέσματος που επιστρέφει. Αν η συνάρτηση δεν επιστρέφει αποτέλεσμα, γράφουμε void Το πλήθος και τον τύπο των παραμέτρων της. Αν η συνάρτηση δεν δέχεται παραμέτρους, γράφουμε void Στο πρότυπο συνάρτησης ΜΠΟΡΕΙ ΝΑ ορίζουμε: Τα ονόματα των παραμέτρων Στο πρότυπο συνάρτησης ΔΕΝ ορίζουμε Τον κώδικα που την υλοποιεί (το σώμα της συνάρτησης) Το πρότυπο της συνάρτησης καταλήγει ΠΑΝΤΑ με ερωτηματικό (;) ΣΕ ΑΝΤΙΘΕΣΗ με τη συνάρτηση
34
Πρότυπα συναρτήσεων (5)
Πρότυπο Συνάρτησης Σωστό/Λάθος int sum(int, int); int sum(int a, int b); int sum(a, b); waitReturn(); void waitReturn(void); void waitReturn(void)
35
Πρότυπα συναρτήσεων (6)
Καλή πρακτική: Δώστε πάντα στην αρχή του αρχείου κώδικα τα πρότυπα των συναρτήσεων που θα χρησιμοποιήσετε, ανεξαρτήτως αν οι συναρτήσεις ορίζονται στη συνέχεια. #include <stdio.h> int sum(int, int); void waitReturn(void); int readInteger(void); ...
36
Πιο πολύπλοκες ακολουθίες κλήσης συναρτήσεων (1)
Μία συνάρτηση στη C μπορεί να καλεί πάνω από μία συναρτήσεις διαδοχικά #include <stdio.h> void f1(void) { puts("Κλήθηκε η συνάρτηση f1"); return; } void f2(void) { puts("Κλήθηκε η συνάρτηση f2"); int main(void) { f1(); puts("Μεταξύ f1 και f2"); f2(); return 0; Έναρξη προγράμματος
37
Πιο πολύπλοκες ακολουθίες κλήσης συναρτήσεων (2)
Μία συνάρτηση που έχει κληθεί, μπορεί με τη σειρά της να καλέσει άλλες συναρτήσεις void f1(void) { puts("Κλήθηκε η συνάρτηση f1"); return; } void f2(void) { puts("Κλήθηκε η συνάρτηση f2"); f1(); puts("Πριν την επιστροφή από την f2"); int main(void) { puts("Αρχή της main"); f2(); puts("Τέλος της main"); return 0; Έναρξη προγράμματος
38
Πιο πολύπλοκες ακολουθίες κλήσης συναρτήσεων (3)
Το όρισμα μιας κλήσης σε συνάρτηση μπορεί να είναι κλήση σε μία άλλη συνάρτηση #include <stdio.h> int sum(int a, int b) { int result; result = a + b; return result; } int main(void) { int x, y; x = sum(3, sum(7, 12)); y = sum(sum(sum(7, 3), 2), sum(9, 4)); printf("x = %d, y = %d\n", x, y); return 0;
39
Η εκτέλεση των κλήσεων y = sum(sum(sum(7, 3), 2), sum(9, 4));
40
Χρήση συναρτήσεων σε εκφράσεις
Μία συνάρτηση που επιστρέφει αποτέλεσμα τύπου t μπορεί να χρησιμοποιηθεί οπουδήποτε είναι επιτρεπτή η χρήση ενός δεδομένου τύπου t int sum(int, int); int readInteger(void); int main(void) { int r; r = (sum(1, 5) * readInteger()) / sum(8, 2); printf("r = %d\n", r); return 0; }
41
Τοπικές μεταβλητές (1) Μία συνάρτηση μπορεί να ορίζει και να χρησιμοποιεί οποιοδήποτε πλήθος και τύπο τοπικών μεταβλητών void computeFinalPrice(void) { int netValue; float VATrate, VATvalue; char reply[128]; printf("Δώστε την καθαρή τιμή: "); gets(reply); netValue = atoi(reply); printf("Δώστε το ποσοστό Φ.Π.Α.: "); VATrate = atof(reply); VATvalue = VATrate / 100 * netValue; printf("Η αξία του ΦΠΑ είναι %f\n", VATvalue); printf("Η τελική τιμή είναι %f\n", VATvalue + netValue); return; }
42
Τοπικές μεταβλητές (2) Οι τοπικές μεταβλητές μιας συνάρτησης ΕΙΝΑΙ ΑΠΟΛΥΤΩΣ ΑΝΕΞΑΡΤΗΤΕΣ από τις τοπικές μεταβλητές άλλων συναρτήσεων Οι τιμές που αποδίδονται στην τοπική μεταβλητή μιας συνάρτησης ΔΕΝ ΕΠΗΡΕΑΖΟΥΝ τις τιμές τυχόν ομώνυμων μεταβλητών σε άλλες συναρτήσεις ΔΕΝ ΜΠΟΡΟΥΜΕ να χρησιμοποιήσουμε εντός μίας συνάρτησης τοπικές μεταβλητές άλλων συναρτήσεων Οι τοπικές μεταβλητές ΔΕΝ ΔΙΑΤΗΡΟΥΝ ΤΗΝ ΤΙΜΗ ΤΟΥΣ μεταξύ δύο διαδοχικών κλήσεων της ίδιας συνάρτησης
43
Τοπικές μεταβλητές (3) int a; int f1(int x) { a = x * x + 2 * x + 1;
return a; } void f2(void) { for (a = 1; a < 100; a++) printf("f(%d) = %d\n", a, f(a));
44
Τοπικές μεταβλητές (4) Οι τοπικές μεταβλητές δηλώνονται ακριβώς μετά το αριστερό άγκιστρο που οριοθετεί την αρχή του σώματος της συνάρτησης και πριν την πρώτη εντολή της συνάρτησης void computeFinalPrice(void) { float VATrate, VATvalue; char reply[128]; printf("Δώστε την καθαρή τιμή: "); gets(reply); int netValue; netValue = atoi(reply); printf("Δώστε το ποσοστό Φ.Π.Α.: "); VATrate = atof(reply);
45
Τοπικές μεταβλητές (5) gcc -o local local.c ./local Κλήση της f2
#include <stdio.h> void f1(void) { int a; a = 2; printf("f1:a = %d\n", a); return; } void f2(void) { printf("f2:a = %d\n", a); int main(void) { puts("Κλήση της f2"); f2(); puts("Κλήση της f1"); f1(); return 0; gcc -o local local.c ./local Κλήση της f2 f2:a = 0 Κλήση της f1 f1:a = 2 f2:a =
46
Τοπικές μεταβλητές (6) gcc -o local local.c local.c: In function 'f2':
#include <stdio.h> void f1(void) { int a; a = 2; printf("f1:a = %d\n", a); return; } void f2(void) { int main(void) { f1(); f2(); return 0; gcc -o local local.c local.c: In function 'f2': local.c:11: 'a' undeclared (first use in this function) local.c:11: (Each undeclared identifier is reported only once local.c:11: for each function it appears in.)
47
Η χρήση της εντολής return
48
Η χρήση της εντολής return Παράδειγμα
double power(double x, int n) { int i, result; /* Υπολογισμός x^n για θετικό n */ if (n < 0) return 0.0; /* κώδικας για υπολογισμό του x^n */ for (i = 1, result = 1; i <= n; i++) result *= x; return result; } if (n >= 0) { result = ...; else result = 0.0;
49
Αναδρομή (1) Αναδρομή έχουμε όταν μία συνάρτηση καλεί τον εαυτό της είτε άμεσα: η συνάρτηση f περιέχει μία κλήση στην f έμμεσα: η συνάρτηση f περιέχει μία κλήση στη g που περιέχει μία κλήση ... που περιέχει μία κλήση στην f ΠΑΝΤΑ πρέπει να υπάρχει μία συνθήκη τερματισμού, έτσι ώστε να μην συνεχίζεται η αναδρομή επ’ άπειρον
50
Αναδρομή – Παράδειγμα 1 double power(double x, unsigned int n) {
double result; if (n == 0) result = 1; else result = x * power(x, n – 1); return result; } int main(void) { printf("2.0 εις την ογδόη = %f\n", power(2.0, 8)); return 0;
51
Αναδρομή – Παράδειγμα 2 int fib(unsigned int n) { int result;
if (n == 0) result = 1; else if (n == 1) result = 2; else result = fib(n - 1) + fib(n - 2); return result; } int main(void) { printf("fib(3) = %d\n", fib(3)); printf("fib(4) = %d\n", fib(4)); printf("fib(5) = %d\n", fib(5)); return 0;
52
Αναδρομή – Παράδειγμα 3 Κεφάλαιο μετά από ν έτη με σταθερό επιτόκιο
double capital(double money, double pct, unsigned int years); double interest(double money, double pct, unsigned int years); double capital(double money, double pct, unsigned int years) { double result; if (years == 0) result = money; else result = capital(money, pct, years - 1) + interest(money, pct, years); return result; } double interest(double money, double pct, unsigned int years) { result = 0; result = capital(money, pct, years - 1) * pct / 100;
53
Ερωτήσεις (1) Τι πρέπει να περιέχει η πρώτη γραμμή δήλωσης μιας συνάρτησης; Σε ποια σημεία διαφέρει ένα πρότυπο συνάρτησης από την ίδια τη συνάρτηση; Πόσες παραμέτρους μπορεί να δέχεται μία συνάρτηση; Πόσες τιμές μπορεί να επιστρέψει; Πόσες τοπικές μεταβλητές μπορεί να ορίζει μία συνάρτηση; Πόσες εντολές return μπορεί να περιέχει μία συνάρτηση; Πόσες θα εκτελεσθούν σε μία μόνο κλήση της;
54
Ερωτήσεις (2) Τι είναι άμεση αναδρομή; Τι έμμεση;
Έστω η αναδρομική συνάρτηση Είναι καλά ορισμένη; Πώς γράφουμε ένα πρόγραμμα βάσει της τεχνικής του δομημένου προγραμματισμού;
55
Ασκήσεις (1) Γράψτε μία συνάρτηση που θα δέχεται ως παραμέτρους δύο ακεραίους και θα επιστρέφει τον μέσο όρο τους. Τι τύπο δεδομένων πρέπει να επιστρέφει; Γράψτε και πρόγραμμα που θα την καλεί. Γράψτε μία συνάρτηση που θα δέχεται ως παραμέτρους τρεις ακεραίους και θα τους τυπώνει κατ’ αύξουσα σειρά. Η συνάρτηση δεν θα επιστρέφει αποτέλεσμα. Γράψτε και πρόγραμμα που θα την καλεί.
56
Ασκήσεις (2) Γράψτε μία συνάρτηση που να δέχεται ως ορίσματα δύο ακεραίους και να επιστρέφει το πηλίκο της διαίρεσης του πρώτου δια τον δεύτερο. Τι θα συμβεί αν ο δεύτερος είναι 0; Γράψτε μία αναδρομική συνάρτηση για τον υπολογισμό του γινομένου δύο ακεραίων.
57
Ασκήσεις (3) Θέλουμε να φτιάξουμε ένα πρόγραμμα για την παρουσίαση των εκλογικών αποτελεσμάτων. Το πρόγραμμα αυτό θα πρέπει να επιτρέπει: την εισαγωγή αποτελεσμάτων για κάποιο νομό την ενημέρωση αποτελεσμάτων για κάποιο νομό τον υπολογισμό των συνολικών ψήφων ενός κόμματος την εκτύπωση των αποτελεσμάτων ταξινομημένα κατά νομό την εκτύπωση των 20 νομών με τη μεγαλύτερη δύναμη για ένα συγκεκριμένο κόμμα Σκιαγραφήστε της ενότητες του προγράμματος σύμφωνα με τον δομημένο προγραμματισμό
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.