Συναρτήσεις.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Κεφάλαιο Τμηματικός προγραμματισμός
Advertisements

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΥΠΟΡΟΥΤΙΝΕΣ
ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΤΜΗΜΑΤΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ
Πολυδιάστατοι Πίνακες, Δομές, Ενώσεις
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΜΑΘ-3122/106 Προγραμματισμός
Τύποι πραγματικών αριθμών
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πίνακες Κλάσεις και Αντικείμενα.
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων, Σημασιολογικές Ενέργειες.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
Μήτρες (templates)  Μία μήτρα είναι ένα κομμάτι κώδικα που περιέχει παραμέτρους οι οποίες δέχονται ως τιμές τύπους δεδομένων.  Είναι ένας μηχανισμός.
ΗΥ-150 Προγραμματισμός Εντολές Ελέγχου Ροής.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 5: Επαναληπτικές και εξωτερικές συναρτήσεις και διαδικασίες Εαρινό εξάμηνο 2009.
Τελεστές ανάθεσης (assignment)
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
ΜΕΤΑΒΛΗΤΕΣ - ΤΥΠΟΙ ΜΑΘΗΜΑ 3.
ΕΠΑΝΑΛΗΨΗΕΠΑΝΑΛΗΨΗ ΠΡΟΓΡΑΜΜΑΤΑ. ΠΡΟΓΡΑΜΜΑ 1 ΕΞΗΓΗΣΤΕ ΤΙ ΕΞΟΔΟ ΠΑΡΑΓΕΙ ΤΟ ΠΑΡΑΚΑΤΩ ΠΡΟΓΡΑΜΜΑ #include int main() { char ch; int i; float fl; printf("dose.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
Υποθετικός τελεστής Ο υποθετικός τελεστής (?:) αποτελείται από δύο σύμβολα. Ανήκει στην κατηγορία των τελεστών που αποτελούνται από συνδυασμό συμβόλων.
Δείκτες, Πίνακες σε Δείκτες, Δείκτες σε Συναρτήσεις
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
ΣΥΝΑΡΤΗΣΕΙΣ.
Πάνω προς Κάτω Σχεδιασμός και Συναρτήσεις
Ενότητα Α.4. Δομημένος Προγραμματισμός
Άσκηση 1. Θεωρούμε το ακόλουθο κομμάτι κώδικα int i,j; double result, a[110][4]; for(i=0; i
Κεφάλαιο 10 – Υποπρογράμματα
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
ΜΑΘ3122/106 – Γλώσσα προγραμματισμούΞενοφών Ζαμπούλης ΜΑΘ3122/106 Γλώσσα προγραμματισμού Συναρτήσεις.
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ-3122/106 Γλώσσα Προγραμματισμού Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Syntax Directed Translation and alpha Language.
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 getchar() /* char_count.c A program to count characters of input. */ main() { int c ; int count = 0; while.
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΚΕΦΑΛΑΙΟ Το αλφάβητο της ΓΛΩΣΣΑΣ
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Προγραμματισμός ΗΥ Ενότητα 2: Συναρτήσεις Εισόδου ⁄ Εξόδου. Διδάσκων: Ηλίας Κ Σάββας, Αναπληρωτής Καθηγητής.
ΔΠΘ-ΤΜΗΜΑ ΜΠΔ: ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ 1 Εισαγωγή στη γλώσσα Προγραμματισμού C ΠΙΝΑΚΕΣ (arrays)
Επανάληψη.
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Ενισχυτική διδασκαλία
ΕΝΤΟΛΕΣ ΕΠΙΛΟΓΗΣ Η εντολή if if ( παράσταση) εντολή επόμενη εντολή.
for (παράσταση_1; παράσταση_2; παράσταση_3)
Τύποι Μεταβλητών.
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος
Η Γλώσσα Pascal Υποπρογράμματα
Μανασσάκης Βασίλης Καθηγητής Πληροφορικής
Εισαγωγή στον Προγ/μό Υπολογιστών
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Αρχές Προγραμματισμού (C)
Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου
UNIT 1 Τα Πρώτα Προγράμματα.
ΑΣΚΗΣΕΙΣ.
Μεταγράφημα παρουσίασης:

Συναρτήσεις

Τι είναι μία συνάρτηση Ένα κατονομασμένο, ανεξάρτητο κομμάτι κώδικα C που εκτελεί μία συγκεκριμένη εργασία. Η εκτέλεσή του μπορεί να ζητηθεί από οποιοδήποτε σημείο του προγράμματος C. Η συνάρτηση μπορεί να δέχεται παραμέτρους από τον κώδικα που την καλεί και να του επιστρέφει μία τιμή.

Αναλύοντας τον ορισμό (1) Μία συνάρτηση είναι κατονομασμένη Έχει ένα όνομα, μοναδικό στα πλαίσια του προγράμματος Το όνομα αποτελείται από γράμματα, αριθμούς και κάτω παύλες (_) ξεκινώντας με γράμμα ή κάτω παύλα. Το όνομα πρέπει να είναι ενδεικτικό της λειτουργίας που επιτελεί η συνάρτηση cube, third_power, thirdPower write_file, writeFile, WriteFile

Αναλύοντας τον ορισμό (2) Μία συνάρτηση είναι ένα ανεξάρτητο κομμάτι κώδικα C Δεν στηρίζεται σε τιμές μεταβλητών που έχουν ορισθεί σε άλλα τμήματα του κώδικα. Εξαρτάται μόνο από τις παραμέτρους της, τις δικές της μεταβλητές και τον δικό της κώδικα Δεν εξαρτάται (κατά κανόνα) από την ύπαρξη ή δομή άλλων τμημάτων κώδικα Δεν επηρεάζει άλλα τμήματα κώδικα, παρά μόνο με την τιμή που επιστρέφει

Αναλύοντας τον ορισμό (3) Μία συνάρτηση επιτελεί μία συγκεκριμένη εργασία Η εργασία αυτή αποτελεί τμήμα της συνολικής λειτουργίας που πρέπει να επιτελέσει το πρόγραμμά μας Προτροπή στον χρήστη για στοιχεία και συλλογή της απάντησής του Υπολογισμός της μέσης τιμής των στοιχείων ενός πίνακα Ταξινόμηση των στοιχείων ενός πίνακα

Αναλύοντας τον ορισμό (4) Μία συνάρτηση μπορεί να δέχεται παραμέτρους από τον κώδικα που την καλεί Ο κώδικας που καλεί τη συνάρτηση καθορίζει δεδομένα πάνω στα οποία η συνάρτηση θα ενεργήσει Προτροπή στον χρήστη για στοιχεία και συλλογή απάντησης: μήνυμα προτροπής υπολογισμός μέσης τιμής στοιχείων ενός πίνακα: ο πίνακας Άθροισμα δύο αριθμών: οι δύο αριθμοί

Αναλύοντας τον ορισμό (5) Η συνάρτηση μπορεί να επιστρέφει μία τιμή στον κώδικα που την καλεί Το αποτέλεσμα της συνάρτησης Συλλογή στοιχείων: τα στοιχεία που συλλέχθηκαν Μέση τιμή πίνακα: η μέση τιμή Άθροισμα αριθμών: το άθροισμα Μία ένδειξη επιτυχίας/αποτυχίας Εγγραφή σε αρχείο: εντάξει, δεν βρέθηκε το αρχείο, ανεπαρκή δικαιώματα, η μονάδα δίσκου δεν έχει χώρο

Παραδείγματα συναρτήσεων (1) #include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0;

Παραδείγματα συναρτήσεων (1) #include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Όνομα συνάρτησης

Παραδείγματα συναρτήσεων (1) #include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Παράμετροι

Παραδείγματα συναρτήσεων (1) #include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Δεδομένα που επιστρέφονται

Παραδείγματα συναρτήσεων (1) #include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Κώδικας συνάρτησης (σώμα)

Παραδείγματα συναρτήσεων (1) #include <stdio.h> void waitReturn(void) { /* Η συνάρτηση αυτή περιμένει να πατήσει ο χρήστης το Enter */ char myStr[128]; puts("Πατήστε ENTER για συνέχεια"); gets(myStr); return; } int main(void) { waitReturn(); return 0; Κλήση συνάρτησης

Η διαδοχή εντολών κατά την κλήση #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

Παραδείγματα συναρτήσεων (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;

Η μεταβίβαση παραμέτρων 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» ονομάζονται ορίσματα της συνάρτησης για τη συγκεκριμένη κλήση.

Παραδείγματα συναρτήσεων (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;

Επιστροφή τιμής από συναρτήσεις int readInteger(void) { ... result = atoi(tmpStr) return result; } a = readInteger();

Παραδείγματα συναρτήσεων (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("3 + 12 = %d\n", x); printf("2000 + 11 = %d\n", sum(2000, 11)); return 0;

Μεταβίβαση παραμέτρων και επιστροφή τιμής x = sum(3, 12); int sum(int a, int b) { result = a + b; return result; }

Κοινά σφάλματα σε συναρτήσεις (1) Λάθος πλήθος παραμέτρων σε συναρτήσεις #include <stdio.h> int sum(int a, int b) { int result; result = a + b; return result; } int main(void) { printf("2000 + 11 = %d\n", sum(2000)); printf("2000 + 11 = %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'

Κοινά σφάλματα σε συναρτήσεις (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

Κοινά σφάλματα σε συναρτήσεις (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 Είναι σωστό! (αλλά συμπτωματικά μόνο...)

Κοινά σφάλματα σε συναρτήσεις (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

Κοινά σφάλματα σε συναρτήσεις (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

Κοινά σφάλματα σε συναρτήσεις (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

Κοινά σφάλματα σε συναρτήσεις (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("199 + 500 = %d\n", sum(199, 500, 801)); printf("199 + 500 = %d\n", sum("199", "500")); return 0; gcc -o sum sum.c ./sum 3 + 7 = -13369245 199 + 500 = 699 199 + 500 = 135368

Πρότυπα συναρτήσεων (1) #include <stdio.h> int main(void) { double x; x = sum(3.2, 12.15); printf("3.2 + 12.15 = %f\n", x); printf("2000.43 + 11.6 = %f\n", sum(2000.43, 11.6)); return 0; } double sum(double a, double b) { /* Υπολογισμός του αθροίσματος δύο πραγματικών */ double result; result = a + b; return result;

Πρότυπα συναρτήσεων (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 3.2 + 12.15 = 1074370969.000000 2000.43 + 11.6 = 2000.429932

Πρότυπα συναρτήσεων (3) #include <stdio.h> int main(void) { double x; x = sum(3.2, 7); printf("3.2 + 7 = %f\n", x); printf("199 + 500 = %f\n", sum("199", "500")); return 0; } double sum(double a, double b) { double result; result = a + b; return result;

Πρότυπα συναρτήσεων (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 3.2 + 7 = 1074370969.000000 199 + 500 = 0.000000

Πρότυπα συναρτήσεων (3) #include <stdio.h> double sum(double, double); int main(void) { double x; x = sum(3.2, 12.15); printf("3.2 + 12.15 = %f\n", x); printf("2000.43 + 11.6 = %f\n", sum(2000.43, 11.6)); return 0; } double sum(double a, double b) { /* Υπολογισμός του αθροίσματος δύο πραγματικών */ double result; result = a + b; return result; Πρότυπο συνάρτησης

Πρότυπα συναρτήσεων (4) Στο πρότυπο συνάρτησης ορίζουμε ΠΑΝΤΑ: Το όνομα της συνάρτησης Τον τύπο αποτελέσματος που επιστρέφει. Αν η συνάρτηση δεν επιστρέφει αποτέλεσμα, γράφουμε void Το πλήθος και τον τύπο των παραμέτρων της. Αν η συνάρτηση δεν δέχεται παραμέτρους, γράφουμε void Στο πρότυπο συνάρτησης ΜΠΟΡΕΙ ΝΑ ορίζουμε: Τα ονόματα των παραμέτρων Στο πρότυπο συνάρτησης ΔΕΝ ορίζουμε Τον κώδικα που την υλοποιεί (το σώμα της συνάρτησης) Το πρότυπο της συνάρτησης καταλήγει ΠΑΝΤΑ με ερωτηματικό (;) ΣΕ ΑΝΤΙΘΕΣΗ με τη συνάρτηση

Πρότυπα συναρτήσεων (5) Πρότυπο Συνάρτησης Σωστό/Λάθος int sum(int, int);  int sum(int a, int b); int sum(a, b);  waitReturn(); void waitReturn(void); void waitReturn(void)

Πρότυπα συναρτήσεων (6) Καλή πρακτική: Δώστε πάντα στην αρχή του αρχείου κώδικα τα πρότυπα των συναρτήσεων που θα χρησιμοποιήσετε, ανεξαρτήτως αν οι συναρτήσεις ορίζονται στη συνέχεια. #include <stdio.h> int sum(int, int); void waitReturn(void); int readInteger(void); ...

Πιο πολύπλοκες ακολουθίες κλήσης συναρτήσεων (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; Έναρξη προγράμματος

Πιο πολύπλοκες ακολουθίες κλήσης συναρτήσεων (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; Έναρξη προγράμματος

Πιο πολύπλοκες ακολουθίες κλήσης συναρτήσεων (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;

Η εκτέλεση των κλήσεων y = sum(sum(sum(7, 3), 2), sum(9, 4));

Χρήση συναρτήσεων σε εκφράσεις Μία συνάρτηση που επιστρέφει αποτέλεσμα τύπου 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; }

Τοπικές μεταβλητές (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; }

Τοπικές μεταβλητές (2) Οι τοπικές μεταβλητές μιας συνάρτησης ΕΙΝΑΙ ΑΠΟΛΥΤΩΣ ΑΝΕΞΑΡΤΗΤΕΣ από τις τοπικές μεταβλητές άλλων συναρτήσεων Οι τιμές που αποδίδονται στην τοπική μεταβλητή μιας συνάρτησης ΔΕΝ ΕΠΗΡΕΑΖΟΥΝ τις τιμές τυχόν ομώνυμων μεταβλητών σε άλλες συναρτήσεις ΔΕΝ ΜΠΟΡΟΥΜΕ να χρησιμοποιήσουμε εντός μίας συνάρτησης τοπικές μεταβλητές άλλων συναρτήσεων Οι τοπικές μεταβλητές ΔΕΝ ΔΙΑΤΗΡΟΥΝ ΤΗΝ ΤΙΜΗ ΤΟΥΣ μεταξύ δύο διαδοχικών κλήσεων της ίδιας συνάρτησης

Τοπικές μεταβλητές (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));

Τοπικές μεταβλητές (4) Οι τοπικές μεταβλητές δηλώνονται ακριβώς μετά το αριστερό άγκιστρο που οριοθετεί την αρχή του σώματος της συνάρτησης και πριν την πρώτη εντολή της συνάρτησης void computeFinalPrice(void) { float VATrate, VATvalue;  char reply[128];  printf("Δώστε την καθαρή τιμή: "); gets(reply); int netValue;  netValue = atoi(reply); printf("Δώστε το ποσοστό Φ.Π.Α.: "); VATrate = atof(reply);

Τοπικές μεταβλητές (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 = 4198629

Τοπικές μεταβλητές (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.)

Η χρήση της εντολής return

Η χρήση της εντολής 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;

Αναδρομή (1) Αναδρομή έχουμε όταν μία συνάρτηση καλεί τον εαυτό της είτε άμεσα: η συνάρτηση f περιέχει μία κλήση στην f έμμεσα: η συνάρτηση f περιέχει μία κλήση στη g που περιέχει μία κλήση ... που περιέχει μία κλήση στην f ΠΑΝΤΑ πρέπει να υπάρχει μία συνθήκη τερματισμού, έτσι ώστε να μην συνεχίζεται η αναδρομή επ’ άπειρον

Αναδρομή – Παράδειγμα 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;

Αναδρομή – Παράδειγμα 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;

Αναδρομή – Παράδειγμα 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;

Ερωτήσεις (1) Τι πρέπει να περιέχει η πρώτη γραμμή δήλωσης μιας συνάρτησης; Σε ποια σημεία διαφέρει ένα πρότυπο συνάρτησης από την ίδια τη συνάρτηση; Πόσες παραμέτρους μπορεί να δέχεται μία συνάρτηση; Πόσες τιμές μπορεί να επιστρέψει; Πόσες τοπικές μεταβλητές μπορεί να ορίζει μία συνάρτηση; Πόσες εντολές return μπορεί να περιέχει μία συνάρτηση; Πόσες θα εκτελεσθούν σε μία μόνο κλήση της;

Ερωτήσεις (2) Τι είναι άμεση αναδρομή; Τι έμμεση; Έστω η αναδρομική συνάρτηση Είναι καλά ορισμένη; Πώς γράφουμε ένα πρόγραμμα βάσει της τεχνικής του δομημένου προγραμματισμού;

Ασκήσεις (1) Γράψτε μία συνάρτηση που θα δέχεται ως παραμέτρους δύο ακεραίους και θα επιστρέφει τον μέσο όρο τους. Τι τύπο δεδομένων πρέπει να επιστρέφει; Γράψτε και πρόγραμμα που θα την καλεί. Γράψτε μία συνάρτηση που θα δέχεται ως παραμέτρους τρεις ακεραίους και θα τους τυπώνει κατ’ αύξουσα σειρά. Η συνάρτηση δεν θα επιστρέφει αποτέλεσμα. Γράψτε και πρόγραμμα που θα την καλεί.

Ασκήσεις (2) Γράψτε μία συνάρτηση που να δέχεται ως ορίσματα δύο ακεραίους και να επιστρέφει το πηλίκο της διαίρεσης του πρώτου δια τον δεύτερο. Τι θα συμβεί αν ο δεύτερος είναι 0; Γράψτε μία αναδρομική συνάρτηση για τον υπολογισμό του γινομένου δύο ακεραίων.

Ασκήσεις (3) Θέλουμε να φτιάξουμε ένα πρόγραμμα για την παρουσίαση των εκλογικών αποτελεσμάτων. Το πρόγραμμα αυτό θα πρέπει να επιτρέπει: την εισαγωγή αποτελεσμάτων για κάποιο νομό την ενημέρωση αποτελεσμάτων για κάποιο νομό τον υπολογισμό των συνολικών ψήφων ενός κόμματος την εκτύπωση των αποτελεσμάτων ταξινομημένα κατά νομό την εκτύπωση των 20 νομών με τη μεγαλύτερη δύναμη για ένα συγκεκριμένο κόμμα Σκιαγραφήστε της ενότητες του προγράμματος σύμφωνα με τον δομημένο προγραμματισμό