Συναρτήσεις. Κατασκευαστικά Τεµάχια για τη ηµιουργία Αρθρωτών Προγραµµάτων

Σχετικά έγγραφα
Η τιµή εξόδου κάποιας συνάρτησης µπορεί να είναι δείκτης, π.χ.

Επανάληψη. Εντολές while, for, do-while

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ. Ενότητα 7: Συναρτήσεις

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. Δείκτες (Διάλεξη 14)

Η Γλώσσα C Μία Σφαιρική Ανασκόπηση

Η βασική λειτουργία σε όλες αυτές τις συναρτήσεις είναι η εκτύπωση γραµµών.

Μεθόδων Επίλυσης Προβλημάτων

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα.

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Περαιτέρω για Συναρτήσεις

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

οµές Επιλογής Εντολές if και switch

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Προγραµµατιστικές Τεχνικές

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Η/Υ (ΤΛ2007 )

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 4-2

Μεθόδων Επίλυσης Προβλημάτων

12. Συναρτήσεις (Μέρος ΙI)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Επανάληψη για τις Τελικές εξετάσεις

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Προγραμματισμό για ΗΜΥ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Η βασική συνάρτηση προγράμματος main()

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Προγραμματισμός Η/Υ (ΤΛ2007 )

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 8 η : Συναρτήσεις Χειµερινό Εξάµηνο 2011

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Δομημένος Προγραμματισμός (ΤΛ1006)

Συναρτήσεις και Πίνακες

Εισαγωγή στον Προγραμματισμό

Η γλώσσα προγραμματισμού C

Ηβασικήσυνάρτηση προγράμματος main()

Δομημένος Προγραμματισμός (ΤΛ1006)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

είκτες και Πίνακες (2)

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις. ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Η γλώσσα προγραμματισμού C

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

Επεξεργασία Αρχείων Κειµένου

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

Δομημένος Προγραμματισμός

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΠΛ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

5 &6. Τύποι δεδομένων, τελεστές και

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Εισαγωγή στον Προγραμματισμό

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 4η Διάλεξη Πίνακες Συναρτήσεις

Εισαγωγή στον Προγραμματισμό

ΕΠΛ 034: Εισαγωγήστον ΠρογραµµατισµόγιαΗΜΥ

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΕΡΓΑΣΤΗΡΙΟ 2 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Εργαστήριο 2. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Προγραμματισμό για ΗΜΥ

Προγραμματισμός Ι (ΗΥ120)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Γλώσσα Προγραμματισμού C

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

Εισαγωγή στον Προγραμματισμό (με. τη C)

Εισαγωγή στον Προγραμματισμό

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 3: Συναρτήσεις

Δομημένος Προγραμματισμός (ΤΛ1006)

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Προγραμματισμός Συστημάτων

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Συναρτήσεις διαχείρισης αλφαριθμητικών

Δομημένος Προγραμματισμός

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

ΠΛΗΡΟΦΟΡΙΚΗ Ι (MATLAB) Ενότητα 4

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Η/Υ (ΤΛ2007 )

Συναρτήσεις και διαδικασίες

Προγραμματισμός Η/Y. Διάλεξη 6 η : Συναρτήσεις

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Transcript:

Συναρτήσεις Κατασκευαστικά Τεµάχια για τη ηµιουργία Αρθρωτών Προγραµµάτων ιεπαφή Συναρτήσεων (Πρωτότυπα Συναρτήσεων function prototypes): εδοµένα εισόδου (παράµετροι parameters): πέρασµα δια τιµής ή µέσω διευθύνσεως εδοµένα εξόδου Ορισµοί Συναρτήσεων Πλευρικά Φαινόµενα (side effects) Κλήσεις Συναρτήσεων (πραγµατικές παράµετροι ορίσµατα) Αναδροµικότητα Συναρτήσεις Βιβλιοθηκών Αυτοδυναµία Συναρτήσεων

Παραδείγµατα #define PI 3.14159 /* Συνάρτηση για τον υπολογισµό του εµβαδού ενός κύκλου. */ double area (double radius) { return PI * radius * radius; } radius διεπαφή συνάρτησης τύπος ονοµασία παράµετρος εξόδου συνάρτησης double area (double radius) { return PI * radius * radius; } σώµα συνάρτησης κλήση συνάρτησης y = area(x); όρισµα 2

/* Συνάρτηση για τον υπολογισµό του όγκου ενός κύλινδρου */ double cyl_volume (double radius, double height) { double vol; vol = PI * radius * radius * height; return vol; } height radius /* Εναλλακτικοί ορισµοί */ double cyl_volume (double radius, double height) { double vol; vol = area(radius) * height; return vol; } double cyl_volume (double radius, double height) { double vol = area(radius) * height; return vol; } double cyl_volume (double radius, double height) { return area(radius) * height; } 3

cyl_volume radius area height * Ολόκληρο το Πρόγραµµα #include <stdio.h> #define PI 3.14159 /* Πρωτότυπα Συναρτήσεων */ double area (double radius); double cyl_volume (double radius, double height); void main(void) { double r, h; printf( \n ώσε την ακτίνα και µετά το ύψος του κυλίνδρου > ); scanf( %lf%lf, &r, &h); printf( \nεµβαδόν = %.2f Όγκος = %.2f, area(r), cyl_volume(r,h)); } double area (double radius) { return PI * radius * radius; } double cyl_volume (double radius, double height) { return area(radius) * height; } prog.c 4

$ gcc o prog prog.c $ prog ώσε την ακτίνα και µετά το ύψος του κυλίνδρου > 3.0 5.0 Εµβαδόν = 28.27 Όγκος = 141.37 Παράδειγµα: Υπολογισµός τετραγωνικών ριζών µε τη µέθοδο του Νεύτωνα. Είσοδος: x, πραγµατικός αριθµός Έξοδος: x, εάν x 0.0, διαφορετικά µήνυµα λάθους Σταθερά ακρίβειας προσέγγισης eps 0.0001 Εάν x 0.0 y x Ενόσω ( x y 2 > eps) επανέλαβε y (y + x / y) / 2.0 Εκτύπωσε (y) ιαφορετικά εκτύπωσε µήνυµα λάθους /* Συνάρτηση για απόλυτη τιµή */ double abs (double x) { if (x < 0.0) return x; else return x; } 5

/* Συνάρτηση για τετραγωνική ρίζα */ double sqrt (double x) { double y; /*µεταβλητή στην οποία θα καταχωρείται η προσέγγιση της τετραγωνικής ρίζας */ if (x >= 0.0) { y = x; while (abs(x y * y) > 0.0001) y = (y + x / y) / 2.0; return y; } else { printf( \nλάθος δεν επιτρέπεται αρνητικός αριθµός ); } return 1;} /* Επιστροφή εικονικής τιµής */ Περαιτέρω Άρθρωση #define eps 0.0001 /* σταθερά ακρίβειας προσέγγισης */ double square (double x) { return x * x ; } double abs (double x) { } /* Είναι η προσέγγιση ικανοποιητική; */ int good_enough (double x, double y) { return abs(x square(y)) <= eps; } /* Επόµενη προσέγγιση */ double next_approx (double x, double y) { return (y + x / y) / 2.0; } 6

/* Σύνθεση τεµαχίων για ένα πιο αφηρηµένο ορισµό της sqrt */ double sqrt (double x) { double y = x; if (x >= 0.0) {while (! good_enough(x,y)) y = next_approx(x,y); return y; } else { printf( \nαρνητικός αριθµός δεν επιτρέπεται ); return 1;} } Άρθρωση ιάσπαση Προβλήµατος sqrt good_enough next_approx abs square Σηµειώσεις: Προσοµοίωση λογικών τιµών µε ακεραίους. Πλευρικά φαινόµενα, π.χ. εκτύπωση µηνυµάτων λάθους. 7

Ολόκληρο το Πρόγραµµα #include <stdio.h> #define eps 0.0001 /* Σταθερά ακρίβειας προσέγγισης */ /* Πρωτότυπα συναρτήσεων */ /* Συνάρτηση για απόλυτη τιµή */ double abs (double x); /* Συνάρτηση για τετράγωνο */ double square (double x); /* Είναι η προσέγγιση ικανοποιητική; */ int good_enough (double x, double y); /* Επόµενη προσέγγιση */ double next_approx (double x, double y); /* Συνάρτηση για τετραγωνική ρίζα */ double sqrt (double x); void main (void) { double x, y; printf( ώσε τον αριθµό: ); scanf( %lf, &x); printf( Η τετραγωνική ρίζα είναι %f, sqrt(x)); } /* Ορισµοί Συναρτήσεων */ double abs (double x) { if (x < 0.0) return x; else return x;} double square (double x) { return x * x; } int good_enough (double x, double y) { return abs(x square(y)) <= eps; } double next_approx (double x, double y) { return (y + x / y) / 2.0; } 8

Συνέχεια Προγράµµατος double sqrt (double x) { double y = x; if (x >= 0.0) {while (! good_enough(x,y)) y = next_approx(x,y); return y; } else { printf( \nαρνητικός αριθµός δεν επιτρέπεται ); return 1;} } Σηµείωση: Η συνάρτηση main χρησιµοποιείται ως οδηγός (driver) για τη δοκιµή της συνάρτησης sqrt. Παράδειγµα: Μέγιστος κοινός διαιρέτης δύο ακεραίων Αλγόριθµος Είσοδος: m, n, οι δύο ακέραιοι Έξοδος: ο µέγιστος κοινός διαιρέτης των m και n Εάν m 0 και n 0 r m % n Ενόσω (r 0) επανέλαβε m n; n r; r m % n Επέστρεψε n ιαφορετικά Εκτύπωσε λάθος Επέστρεψε 0 ως εικονική τιµή 9

/* Συνάρτηση για µέγιστο κοινό διαιρέτη */ int gcd (int m, int n) { int r; if (m!= 0 && n!= 0) { r = m % n; while (r!= 0) { m = n; n = r; r = m % n; } return n; } } else { printf( Λάθος οι αριθµοί δεν πρέπει να είναι το µηδέν ); return 0; } Παράδειγµα: Μέγιστος δύο αριθµών double max2 (double x, double y) { if (x > y) return x; else return y; } Παράδειγµα: Μέγιστος τριών αριθµών double max3 (double x, double y, double z) { if (x > y && x > z) return x; else if (y > x && y > z) return y; else return z; } Σηµείωση: Θεωρείται καλύτερη πρακτική, στο σώµα µίας συνάρτησης να υπάρχει µόνο µία κλήση της εντολής return, παρά πολλαπλές, διάσπαρτες κλήσεις. 10

double max3 (double x, double y, double z) {double res; if (x > y && x > z) res = x; else if (y > x && y > z) res = y; else res = z; return res;} /* Αρθρωτός Ορισµός για max3 */ double max3 (double x, double y, double z) { return max2(x, max2(y,z)); } max3 x max2 y z max2 Ορίσµατα όρισµα 1 όρισµα 2 εσωτερικής κλήσης εσωτερικής κλήσης max2( x, max2( y, z ) ) όρισµα 1 όρισµα 2 εξωτερικής κλήσης εξωτερικής κλήσης 11

Κανόνες Σύνταξης Πρωτότυπο Συνάρτησης τύπος-εξόδου ονοµaσία-συνάρτησης (λίστα-παραµέτρων); τύπος-εξόδου: void (κενό) ή ονοµασία κάποιου τύπου λίστα-παραµέτρων: void ή τύπος 1 ονοµασία-παραµέτρου 1,,τύπος n ονοµασία-παραµέτρου n Π.χ. void main (void); void main ( ); double random ( ); double abs (double x); double cyl_volume (double radius, double height); Ορισµός Συνάρτησης τύπος-εξόδου ονοµασία-συνάρτησης (λίστα-παραµέτρων) { τοπικές-δηλώσεις εντολές } Κλήση Συνάρτησης ονοµασία-συνάρτησης ( ); ή ονοµασία-συνάρτησης (λίστα-ορισµάτων); λίστα-ορισµάτων: όρισµα 1,., όρισµα n όρισµα: τιµή ή διεύθυνση 12

Πρόγραµµα οδηγίες προς τον προεπεξεργαστή πρωτότυπα συναρτήσεων ορισµός συνάρτησης main ορισµοί υπολοίπων συναρτήσεων Ορίσµατα Πραγµατικές Παράµετροι Arguments Actual Parameters Ορίσµατα αντιπροσωπεύουν: Τιµές (values), οι οποίες µπορεί να διατυπωθούν ως οποιαδήποτε έκφραση (π.χ. απόλυτη τιµή, µεταβλητή, κλήση συνάρτησης, κτλ.) που αποτιµείται σε τιµή συµβατή µε τον τύπο της αντίστοιχης τυπικής παραµέτρου, ή ιευθύνσεις (addresses, references) χώρων µνήµης, οι οποίες µπορεί να διατυπωθούν ως διευθύνσεις µεταβλητών, τιµές δεικτών, κτλ. ιευθύνσεις είναι τυποποιηµένες (π.χ. διεύθυνση χώρου που αποθηκεύει int, double, κτλ) και ο τύπος της διεύθυνσης που αποτελεί το όρισµα πρέπει να είναι συµβατός µε τον τύπο της διεύθυνσης της αντίστοιχης τυπικής παραµέτρου. 13

Αντιστοιχία Ορισµάτων µε Παραµέτρους Τυπικές παράµετροι ή απλά παράµετροι αναφέρονται µία φορά, στον ορισµό της συνάρτησης. Πραγµατικές παράµετροι ή απλά ορίσµατα αναφέρονται σε κάθε ξεχωριστή κλήση της συνάρτησης. Συναρτήσεις µε παραµέτρους είναι πιο χρήσιµες (ευρύτερο πεδίο εφαρµογής) και εν γένει χαρακτηρίζονται από υψηλότερη αυτοδυναµία. Η αντιστοιχία ανάµεσα σε ορίσµατα και παραµέτρους είναι µίαπρος-µία. Συγκεκριµένα: Αντιστοιχία Ορισµάτων µε Παραµέτρους Ο αριθµός ορισµάτων σε δεδοµένη κλήση της συνάρτησης πρέπει να είναι ο ίδιος µε τον αριθµό παραµέτρων στον ορισµό της συνάρτησης. Η αντιστοιχία αποφασίζεται από τη σειρά των ορισµάτων. Το πρώτο όρισµα αντιστοιχεί στην πρώτη παράµετρο, το δεύτερο όρισµα στη δεύτερη παράµετρο, κτλ. Ο τύπος κάθε ορίσµατος θα πρέπει να είναι συµβατός προς τον τύπο της αντίστοιχης παραµέτρου, δηλαδή ο τύπος µπορεί να καταχωρηθεί στην εν λόγω παράµετρο, χωρίς την απροσδόκητη απώλεια πληροφορίας, π.χ. int µπορεί να ανατεθεί σε double χωρίς καθόλου απώλεια πληροφορίας, και double µπορεί να ανατεθεί σε int, µε αναµενόµενη όµως την απώλεια των δεκαδικών ψηφίων. 14

double cyl_volume (double area, double height) { } cyl_volume(3.0, 5.0) ροή πληροφοριών Οι παράµετροι area και height λαµβάνουν σάρκα και οστά από τα ορίσµατα 3.0 και 5.0 αντιστοίχως. Τα εν λόγω ορίσµατα είναι τιµές πέρασµα δια τιµής (call by value). Πέρασµα δια τιµής radius height cyl_volume double res = cyl_volume (3.0, 5.0); res res 141.37 3.0 5.0 radius height cyl_volume 141.37 Οι τιµές αντιγράφονται τοπικά, δηλαδή σε χώρο που ανήκει στην εν λόγω ενεργοποίηση της συνάρτησης. 15

double r = 3.0, h = 5.0; h r 5.0 3.0 cyl_volume(r, h); 3.0 5.0 radius height cyl_volume 141.37? Οι µεταβλητές r και h δεν επηρεάζονται από τη διεργασία της εν λόγω κλήσης της συνάρτησης cyl_volume. Μετά την ολοκλήρωση της εκτέλεσης της κλήσης οι τιµές τους παραµένουν 3.0 και 5.0 αντιστοίχως. Η τιµή που επιστρέφεται από την cyl_volume (141.37) δεν διοχετεύεται πουθενά. Με δεδοµένο ότι η συνάρτηση cyl_volume είναι καθαρή (pure function βλέπετε παρακάτω), στην ουσία η κλήση της αποτελεί µία κενή εντολή. 16

x y 2.0 1.5 όρισµα z = abs( x y * y ); αποτίµηση έκφρασης 1.5 1.5 2.0 * 0.25 z 0.25 0.25 abs 0.25 Καθαρές Συναρτήσεις Λαµβάνουν τιµές (πέρασµα δια τιµής) και επιστρέφουν τιµή, χωρίς να παρουσιάζουν πλευρικά φαινόµενα πέραν της εκτύπωσης µηνυµάτων λάθους. Όλες οι πιο πάνω συναρτήσεις ανήκουν σε αυτή την κατηγορία. 17

Βασικές Βιβλιοθήκες Παρέχουν µία πληθώρα επαναχρησιµοποιήσιµων (reusable) συναρτήσεων. Παραδείγµατα µαθηµατικών συναρτήσεων από βασικές βιβλιοθήκες είναι: Συνάρτηση Βιβλιοθήκη Λειτουργία Παράµετροι Αποτέλεσµα abs(x) <stdlib.h> Απόλυτη τιµή ακεραίου. ακέραιος ακέραιος ceil(x) <math.h> Η µικρότερη ακέραια τιµή που δεν είναι µικρότερη του x. πραγµατικός πραγµατικός fabs(x) <math.h> Απόλυτη τιµή πραγµατικού. πραγµατικός πραγµατικός floor(x) <math.h> Η µεγαλύτερη ακέραια τιµή που δεν είναι µεγαλύτερη του x. πραγµατικός πραγµατικός pow(x, y) <math.h> Υψώνει το x στη δύναµη y. Εάν x αρνητικό, y πρέπει να είναι ακέραια τιµή. πραγµατικός, πραγµατικός πραγµατικός sqrt(x) <math.h> Η τετραγωνική ρίζα του x. πραγµατικός πραγµατικός Επαναφορά στις συναρτήσεις printf και scanf Τα πρωτότυπα των συναρτήσεων είναι: int printf( ); int scanf( ); Και οι δύο συναρτήσεις έχουν ως τύπο εξόδου τον τύπο int. Αυτό σηµαίνει ότι κάθε κλήση τους επιστρέφει µία ακέραια τιµή. Η τιµή αυτή αντιπροσωπεύει πόσες τιµές, από αυτές που ζητήθηκαν, εκτυπώθηκαν/σαρώθηκαν επιτυχώς. Σε περίπτωση πλήρους αποτυχίας επιστρέφεται η τιµή 0. 18

Στην πραγµατικότητα η εκτύπωση ή η σάρωση, που στην ουσία είναι οι λειτουργίες των printf και scanf αντιστοίχως, αποτελούν πλευρικά φαινόµενα. Εποµένως αυτές οι συναρτήσεις καλούνται για τα πλευρικά τους φαινόµενα και όχι για την τιµή εξόδου τους, ο ρόλος της οποίας είναι η επισήµανση λαθών κατά την εκτύπωση ή σάρωση. Σε έτσι περιπτώσεις δεν είναι παράλογο να µη γίνει χρήση της τιµής εξόδου, µε άλλα λόγια αυτή η τιµή να µη διοχετευτεί πουθενά και η κλήση της συνάρτησης να αποτελεί µία ατοµική εντολή. printf( area = %f volume = %f, area, volume); scanf( %lf, &value); Όπως δηλαδή γίνεται µε συναρτήσεις των οποίων ο τύπος εξόδου είναι void: void display_menu (void) {printf( \nοι επιλογές είναι: ); printf( \n1. Υπολογισµός τετραγωνικής ρίζας ); printf( \n2. Tερµατισµός προγράµµατος ); } display_menu(); Όµως σε κρίσιµα σηµεία του προγράµµατος µπορεί να γίνει έλεγχος της τιµής εξόδου των συναρτήσεων printf και scanf προς επίτευξη υψηλότερης ανθεκτικότητας. 19

if (!scanf( %lf, &value)) printf( Εντοπίσθηκε λάθος κατά τη σάρωση της τιµής της value ); Παράλληλα µε τη σάρωση γίνεται έλεγχος της επισήµανσης λάθους. Πέρασµα Μέσω ιευθύνσεως Call by reference Παράδειγµα: Συνάρτηση για την εναλλαγή των περιεχοµένων δύο µεταβλητών τύπου double. void swap (double x, double y) {double temp = x; x = y; y = temp; } double num1 = 1.5, num2 = 3.8; swap(num1, num2); Ποιές είναι οι τιµές των µεταβλητών num1 και num2 µετά την εκτέλεση της πιο πάνω κλήσης της συνάρτησης swap; 20

num1 num2 1.5 3.8 x 1.5 y 3.8 temp 1.5 swap num1 num2 1.5 3.8 Οι τιµές των µεταβλητών num1 και num2 δεν έχουν εναλλαγεί. Η εναλλαγή έγινε στις τιµές των τοπικών µεταβλητών, x και y, της swap µε τη χρήση της τοπικής βοηθητικής µεταβλητής temp. Οι τοπικές µεταβλητές παύουν να υφίστανται µε την ολοκλήρωση της εκτέλεσης της κλήσης της swap. Για να γίνει η εναλλαγή στα περιεχόµενα εξωτερικών µεταβλητών, πρέπει να δοθούν στην swap οι διευθύνσεις αυτών των µεταβλητών. 21

num1 num2 1.5 3.8 x y temp 1.5 swap num1 num2 3.8 1.5 Η εναλλαγή στις τιµές των num1 και num2 έχει επιτευχθεί, διότι οι παράµετροι, x και y, της swap δεν είναι double αλλά δείκτες σε χώρους που περιέχουν double. Στην εν λόγω ενεργοποίηση της swap, η x περιέχει τη διεύθυνση της num1, και η y τη διεύθυνση της num2. 22

Ορθός Ορισµός της swap void swap (double *x, double *y) { double temp = *x; *x = *y; *y = temp; } Οι παράµετροι x και y της swap είναι τύπου double * δηλαδή δείκτες σε χώρους που περιέχουν τιµές τύπου double. Με άλλα λόγια οι τιµές που µπορεί να ανατεθούν στις x και y είναι διευθύνσεις. Το σύµβολο *, ως µοναδιαίος τελεστής, αντιπροσωπεύει επανακατεύθυνση (indirection): *x Σηµαίνει ακολούθα τον δείκτη x, δηλαδή τα περιεχόµενα του χώρου που δεικνύεται από τον δείκτη x. Εποµένως ο τελεστής µπορεί να εφαρµοστεί µόνο σε δείκτες. Η ανάθεση *x = *y σηµαίνει ότι το περιεχόµενο του χώρου που δεικνύεται από τον y καταχωρείται στο χώρο που δεικνύεται από τον x. 23

Οι διάφορες ερµηνείες του συµβόλου * τ *µ ήλωση µεταβλητής µ ως δείκτης τύπου τ. ε 1 * ε 2 Αριθµητικός τελεστής για γινόµενο. *µ Ακολούθα τον δείκτη µ. εν µπορεί να εφαρµοστεί σε µεταβλητές που δεν είναι δείκτες. Ο µοναδιαίος τελεστής & δίνει τη διεύθυνση του τελεστέου του. Π.χ., double num, *add; num = 6.2; add = &num; add num 6.2 *add = 5.8; add num 5.8 24

*num Λάθος αναφορά. Η µεταβλητή num δεν είναι δείκτης αλλά πραγµατικός αριθµός. &num &add Η διεύθυνση του χώρου που έχει παραχωρηθεί στη µεταβλητή num. Η διεύθυνση του χώρου που έχει παραχωρηθεί στη µεταβλητή add. Τα ορίσµατα σε κλήσεις της swap πρέπει να είναι διευθύνσεις. Π.χ., double m = 1.5, n = 2.8, *add_m = &m, *add_n = &n; add_m m 1.5 add_n n 2.8 printf( %3.1f %3.1f, *add_m, *add_n); 1.5 2.8 25

swap (&m, &n); add_m m 2.8 add_n n 1.5 swap(add_n, add_m); add_m m 1.5 add_n n 2.8 26

Ολόκληρο το Πρόγραµµα για τη οκιµή της swap #include <stdio.h> void swap (double *x, double *y); void main ( ) { double m, n, *add_m = &m, *add_n = &n; printf( \ngive 2 nos > ); scanf( %lf%lf, &m, &n); printf( \nm = %f n = %f, *add_m, *add_n); swap(&m, &n); printf( \nm = %f n = %f, m, n); printf( \nm = %f n = %f, *add_m, *add_n); swap(add_m, add_n); printf( \nm = %f n = %f, m, n); } void swap (double *x, double *y) { double temp = *x; *x = *y; *y = temp; } 27