Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Πίνακες.

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

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

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

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

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

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

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

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

Εισαγωγή στη γλώσσα προγραμματισμού C++

Οντοκεντρικός Προγραμματισμός

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

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

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

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

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

Κλάσεις και Αντικείµενα

Στοιχειώδης προγραμματισμός σε C++

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

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

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

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

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Πληροφορική 2. Γλώσσες Προγραμματισμού

8. Μέθοδοι (Methods)

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

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

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

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

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

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

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΗΥ-150. Πίνακες (Arrays)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

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

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

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

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

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

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλάσεις και αντικείμενα #include <iostream.h<

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

a = 10; a = k; int a,b,c; a = b = c = 10;

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

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

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

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

Κεφάλαιο 10 ο Υποπρογράµµατα

3 Αλληλεπίδραση Αντικειμένων

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

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

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

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

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

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

Βασικά της γλώσσας JAVA

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

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

Περιεχόμενα. Πρόλογος... 21

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

scanf() scanf() stdin scanf() printf() int float double %lf float

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις I Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

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

Λογισµικό (Software SW) Γλώσσες

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Αντικειµενοστρεφής Προγραµµατισµός

Transcript:

1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 2η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr Περιεχόµενα 3 Τα Βασικά των Συναρτήσεων Παράµετροι και Υπερφόρτωση 1

Στόχοι εκµάθησης 4 Προκαθορισµένες συναρτήσεις Κάποιες επιστρέφουν τιµές και άλλες όχι Συναρτήσεις ορισµένες από τον προγραµµατιστή Ορισµός, ήλωση, Κλήση Αναδροµικές συναρτήσεις Κανόνες εµβέλειας Τοπικές µεταβλητές Καθολικές σταθερές και καθολικές µεταβλητές Blocks, φωλιασµένες εµβέλειες Εισαγωγή στις συναρτήσεις 5 Τα δοµικά blocks των προγραµµάτων Συναφής ορολογία σε άλλες γλώσσες: Procedures, subprograms, methods Στη C++: functions I-P-O Input Process Output Βασικά υπο-κοµµάτια σε κάθε πρόγραµµα Χρήση των συναρτήσεων για τα κοµµάτια αυτά Προκαθορισµένες συναρτήσεις 6 Οι βιβλιοθήκες περιέχουν πληθώρα συναρτήσεων για χρήση! ύο τύποι: Εκείνες που επιστρέφουν τιµή Εκείνες που δεν επιστρέφουν τιµή (void) Πρέπει να κάνουµε "#include" την κατάλληλη βιβλιοθήκη π.χ., <cmath>, <cstdlib> (Αρχικές "C" βιβλιοθήκες) <iostream> (για την cout, cin) 2

Προκαθορισµένες συναρτήσεις Οι µαθηµατικές συναρτήσεις Βρίσκονται στην βιβλιοθήκη <cmath.h> Οι περισσότερες επιστρέφουν κάποια τιµή (την απάντηση ) Π.χ., : theroot = sqrt(9.0); Συνιστώσες: sqrt = όνοµα της συνάρτησης βιβλιοθήκης theroot = µεταβλητή για ανάθεση της απάντησης 9.0 = όρισµα ή αρχική είσοδος της συνάρτησης Σε I-P-O: I = 9.0 P = υπολόγισε την τετραγωνική ρίζα O = 3, επιστρέφεται και ανατίθεται στη µεταβλητή theroot 7 Η Κλήση Συνάρτησης Ξανά στην ανάθεση: theroot = sqrt(9.0); Η έκφραση "sqrt(9.0)" είναι γνωστή ως κλήση συνάρτησης (function call), ή ενεργοποίηση συνάρτησης (function invocation) Το όρισµα σε µια κλήση συνάρτησης (9.0) µπορεί να είναι literal, µια µεταβλητή (variable), ή µια έκφραση (expression) Η κλήση από µόνη της µπορεί να είναι µέρος µιας έκφρασης: bonus = sqrt(sales)/10; Μια κλήση συνάρτησης επιτρέπεται οπουδήποτε είναι έγκυρο να χρησιµοποιούµε µια έκφραση του τύπου που επιστρέφεται από τη συνάρτηση 8 Ένα µεγάλο παράδειγµα (1/2) 9 3

Ένα µεγάλο παράδειγµα (2/2) 10 Άλλες προκαθορισµένες συναρτήσεις 11 #include <cstdlib> Η βιβλιοθήκη περιέχει συναρτήσεις όπως: abs() // Επιστέφει την απόλυτη τιµή ενός int labs() // Επιστέφει την απόλυτη τιµή ενός long int *fabs() // Επιστέφει την απόλυτη τιµή ενός float Στην πραγµατικότητα η *fabs() είναι στη βιβλιοθήκη <cmath>! Μπορεί να προκαλέσει σύγχυση Θυµηθείτε: οι βιβλιοθήκες προστέθηκαν µετά τη γέννηση της C++, σε διαδοχικά στάδια Αναφερόµαστε πάντα σε appendices/manuals για λεπτοµέρειες Μια ακόµη µαθηµατική συνάρτηση 12 pow(x, y) Επιστρέφει το x υψωµένο στη δύναµη y: double result, x = 3.0, y = 2.0; result = pow(x, y); cout << result; Το αποτέλεσµα είναι 9.0 αφού 3.0 2.0 = 9.0 Να σηµειωθεί ότι αυτή η συνάρτηση δέχεται δυο ορίσµατα Μια συνάρτηση µπορεί να δέχεται οποιοδήποτε αριθµό ορισµάτων οποιουδήποτε τύπου 4

Άλλες µαθηµατικές συναρτήσεις (1/2) 13 Άλλες µαθηµατικές συναρτήσεις (2/2) 14 15 Προκαθορισµένες Void Συναρτήσεις εν επιστρέφουν τιµή Εκτελούν µια λειτουργία, δεν στέλνουν απάντηση Όταν καλούνται, αποτελούν µια δήλωση από µόνες τους exit(1); // εν επιστρέφει τιµή, άρα δεν κάνουµε ανάθεση Αυτή η κλήση τερµατίζει το πρόγραµµα Οι void functions µπορεί να δέχονται ορίσµατα Οι υπόλοιπες πτυχές όπως και για τις συναρτήσεις που επιστρέφουν µια τιµή 5

Γεννήτρια Ψευδο-Τυχαίων Αριθµών 16 Επιστρέφει τυχαία επιλεγµένο αριθµό Χρησιµοποιείται για προσοµοιώσεις, παίγνια rand() εν δέχεται ορίσµατα Επιστρέφει τιµή µεταξύ 0 & RAND_MAX Κλιµάκωση Συµπίεση τυχαίων αριθµών σε µικρότερη ακτίνα rand() % 6 Επιστρέφει τυχαία τιµή µεταξύ 0 & 5 Μετατόπιση rand() % 6 + 1 Μετατοπίζει την ακτίνα µεταξύ 1 & 6 (π.χ., ρίψη ζαριών) Σπόρος Ψευδο-Τυχαίων Αριθµών 17 Ψευδο-τυχαίοι αριθµοί Κλήσεις στη rand() παράγουν δεδοµένη ακολουθία τυχαίων αριθµών Χρήση του seed για να αλλάξουµε την ακολουθία srand(seed_value); void function έχεται ένα όρισµα, το "seed" Μπορούµε να χρησιµοποιήσουµε οποιοδήποτε seed, περιλαµβανοµένου και του system time: srand(time(0)); Η time() επιστρέφει το system time ως αριθµητική τιµή Η βιβλιοθήκη <time> περιέχει τις συναρτήσεις time() Παραδείγµατα τυχαίων αριθµών 18 Τυχαίος double µεταξύ 0.0 & 1.0: (RAND_MAX rand())/static_cast<double>(rand_max) Type cast χρησιµοποιείται για να εξαναγκάσει διαίρεση double-precision Τυχαίος int µεταξύ 1 & 6: rand() % 6 + 1 % είναι τελεστής υπολοίπου (remainder) Τυχαίος int µεταξύ 10 & 20: rand() % 10 + 10 6

Συναρτήσεις ορισµένες από χρήστη 19 Χρειάζεται να γράφουµε τις δικές µας συναρτήσεις! οµικά blocks των προγραµµάτων ιαίρει & Βασίλευε (Divide & Conquer) Αναγνωσιµότητα Επαναχρησιµοποίηση (Re-use) Ο ορισµός µπορεί να είναι είτε: Στο ίδιο αρχείο µε τη main() Σε διαφορετικό αρχείο, ώστε να µπορούν και άλλοι να τη χρησιµοποιήσουν 20 Συνιστώσες της χρήσης συναρτήσεων 3 Βήµατα για τη χρήση συναρτήσεων: ήλωση/πρωτότυπο (Declaration/prototype) Συνάρτησης Πληροφορία για τον µεταγλωττιστή (compiler) Έγκυρη ερµηνεία κλήσεων Ορισµός (Definition) Συνάρτησης Actual implementation/code for what function does Κλήση (Call) Συνάρτησης Transfer control to function ήλωση συνάρτησης 21 Ονοµάζεται επίσης πρωτότυπο συνάρτησης Μια πληροφοριακή δήλωση για τον compiler Τον ενηµερώνει πώς να ερµηνεύσει τις κλήσεις Σύνταξη: <return_type> FnName(<formal-parameter-list>); Παράδειγµα: double totalcost(int numberparameter, double priceparameter); Τοποθετείται πριν από οποιαδήποτε κλήση Πριν από τη main() στον καθολικό χώρο 7

Ορισµός συνάρτησης 22 Υλοποίηση της συνάρτησης Όπως ακριβώς και η υλοποίηση της συνάρτησης main() Παράδειγµα: double totalcost(int numberparameter, double priceparameter) { const double TAXRATE = 0.05; double subtotal; subtotal = priceparameter * numberparameter; return (subtotal + subtotal * TAXRATE); } Παρατηρείστε το περιθώριο 23 Τοποθέτηση του ορισµού συνάρτησης Μετά τη συνάρτηση main() ΟΧΙ µέσα στη συνάρτηση main()! Οι συναρτήσεις είναι ισότιµες ; καµία συνάρτηση δεν είναι ποτέ µέρος κάποιας άλλης Τυπικές παράµετροι στον ορισµό "Placeholders" για τα δεδοµένα που αποστέλλονται Variable name χρησιµοποιείται για να αναφέρεται στα δεδοµένα του ορισµού ήλωση return Στέλνει δεδοµένα πίσω στη συνάρτηση που την κάλεσε Κλήση συνάρτησης Όπως και η κλήση των προκαθορισµένων συναρτήσεων bill = totalcost(number, price); Θυµηθείτε: η totalcost επιστρέφει τιµή double Ανατίθεται στη µεταβλητή µε όνοµα "bill" Τα ορίσµατα: number, price Θυµηθείτε: Τα ορίσµατα µπορεί να είναι literals, µεταβλητές, εκφράσεις, ή συνδυασµός τους Στην κλήση συνάρτησης, τα ορίσµατα συχνά αποκαλούνται πραγµατικά ορίσµατα ( actual arguments ) Επειδή περιέχουν τα πραγµατικά δεδοµένα που στέλνονται 24 8

Παράδειγµα συνάρτησης (1/2) 25 Παράδειγµα συνάρτησης (1/2) 26 Εναλλακτική δήλωση συνάρτησης 27 Θυµηθείτε: Η δήλωση συνάρτησης είναι απλώς πληροφοριακή για τον compiler Ο compiler χρειάζεται απλώς να γνωρίζει: Τύπος Επιστροφής Όνοµα Συνάρτησης Λίστα Παραµέτρων Οι τυπικοί παράµετροι δεν χρειάζονται: double totalcost(int, double); Still "should" put in formal parameter names Improves readability 9

Παράµετρος vs. Όρισµα 28 Οι όροι συχνά χρησιµοποιούνται εναλλάξιµα Τυπικοί παράµετροι/ορίσµατα Στη δήλωση συνάρτησης Στον header της δήλωσης συνάρτησης Πραγµατικοί παράµετροι/ορίσµατα Στην κλήση συνάρτησης Τεχνικά, η παράµετρος είναι το τυπικό κοµµάτι ενώ το όρισµα είναι το πραγµατικό κοµµάτι Κλήση συνάρτησης από συνάρτηση 29 Ήδη το έχουµε κάνει αυτό! Η main() ΕΊΝΑΙ µια συνάρτηση! Μόνη απαίτηση: Η δήλωση της συνάρτησης να προηγείται Ο ορισµός της συνάρτησης να υπάρχει κάπου αλλού Μετά τον ορισµό της main() Ή σε διαφορετικό αρχείο Κοινό για συναρτήσεις να καλούν άλλες συναρτήσεις Μια συνάρτηση µπορεί να καλεί τον εαυτό της Αναδροµή Αναδροµική κλήση: Παραγοντικό 30 10

Αναδροµική κλήση: Παραγοντικό 31 Συναρτήσεις µε τύπο Boolean 32 Ο τύπος επιστροφής µπορεί να είναι οποιοσδήποτε ήλωση συνάρτησης: bool appropriate(int rate); Ορισµός συνάρτησης: bool appropriate (int rate) { return (((rate>=10)&&(rate<20)) (rate==0); } Επιστρέφει "true" ή "false" Κλήση συνάρτησης, για κάποια άλλη συνάρτηση: if( appropriate(entered_rate) ) cout << "Rate is valid\n"; ήλωση συναρτήσεων void 33 Παρόµοια µε τις συναρτήσεις που επιστρέφουν τιµή Ο τύπος επιστροφής καθορίζεται ως "void" Παράδειγµα: ήλωση συνάρτησης: void showresults(double fdegrees, double cdegrees); Ο τύπος επιστροφής είναι "void" εν επιστρέφεται κάτι 11

Ορισµός συναρτήσεων void Ορισµός συνάρτησης: void showresults(double fdegrees, double cdegrees) { cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(1); cout << fdegrees << " degrees fahrenheit equals \n" << cdegrees << " degrees celsius.\n"; } Σηµείωση: δεν υπάρχει δήλωση return Είναι προαιρετική για τις συναρτήσεις void 34 Κλήση συναρτήσεων void 35 Όµοια όπως και η κλήση προκαθορισµένων void συναρτήσεων Κλήση από κάποια άλλη συνάρτηση, π.χ., main(): showresults(degreesf, degreesc); showresults(32.5, 0.3); εν υπάρχει ανάθεση, αφού δεν επιστρέφεται τιµή Πραγµατικά ορίσµατα (degreesf, degreesc) Περνώνται στη συνάρτηση Η συνάρτηση καλείται να εκτελέσει τη λειτουργία της µε τα δεδοµένα που δέχεται ως ορίσµατα Σχόλια για τη δήλωση return 36 Μεταφέρει τον έλεγχο πίσω στην καλούσα συνάρτηση Για τύπο επιστροφής διαφορετικό από void, ΠΡΕΠΕΙ να υπάρχει η δήλωση return Τυπικά, η τελευταία δήλωση σε έναν ορισµό συνάρτησης είναι η return Η δήλωση return είναι προαιρετική για συναρτήσεις void Το τελευταίο } που κλείνει, ουσιαστικά επιστρέφει τον έλεγχο από µια void συνάρτηση στην καλούσα συνάρτηση 12

Προσυνθήκες & Μετασυνθήκες 37 Όµοια µε τη συζήτηση για "I-P-O" Σχόλια στη δήλωση συνάρτησης: void showinterest(double balance, double rate); //Precondition: balance is nonnegative account balance // rate is interest rate as percentage //Postcondition: amount of interest on given balance, // at given rate Συχνά αποκαλούνται Inputs & Outputs 38 Η συνάρτηση main() είναι ξεχωριστή Θυµηθείτε: η main() ΕΙΝΑΙ µια συνάρτηση Είναι ξεχωριστή στο ότι: Μια και µόνο µια συνάρτηση µε αυτό το όνοµα, δηλ., main() θα υπάρχει στο πρόγραµµα Ποιος καλεί τη main()? Το λειτουργικό σύστηµα Η παράδοση απαιτεί η main() να έχει µια return δήλωση Η τιµή επιστρέφεται στον καλούντα Εδώ: στο λειτουργικό σύστηµα Θα πρέπει να επιστρέφει "int" ή "void" Κανόνες εµβέλειας 39 Τοπικές µεταβλητές ηλώνονται µέσα σε σώµατα συναρτήσεων ιαθέσιµες µόνο µέσα στη συνάρτηση Επιτρέπεται να υπάρχουν µεταβλητές µε το ίδιο όνοµα µέσα σε διαφορετικές συναρτήσεις Η εµβέλεια είναι τοπική Οι τοπικές µεταβλητές είναι προτιµότερες ιατηρούν καλύτερα τον έλεγχο πάνω στα δεδοµένα Οι συναρτήσεις µπορούν/πρέπει να δηλώνουν οποιαδήποτε τοπικά δεδοµένα χρειάζονται για να εκτελέσουν τη λειτουργία τους 13

ιαδικαστική αφαίρεση 40 Απαιτείται να γνωρίζουµε τι κάνει η συνάρτηση και όχι πώς το κάνει! Όπως ένα µαύρο κουτί Συσκευή που γνωρίζουµε πώς να τη χρησιµοποιούµε, αλλά όχι τον τρόπο λειτουργίας της Υλοποίηση συναρτήσεων όπως ένα µαύρο κουτί Ο χρήστης της συνάρτησης χρειάζεται µόνο: δήλωση ΕΝ χρειάζεται τον ορισµό της συνάρτησης Αποκαλείται Information Hiding Κρύβει τις λεπτοµέρειες του πώς η συνάρτηση εκτελεί τη λειτουργία της Καθολ. σταθερές & Καθολ. µεταβλητές 41 Όταν δηλώνονται έξω από σώµατα συναρτήσεων Γνωστές σε όλες τις συναρτήσεις στο συγκεκριµένο αρχείο Όταν δηλώνονται µέσα σε σώµατα συναρτήσεων Τοπικές στη συγκεκριµένη συνάρτηση Καθολικές δηλώσεις τυπικές για σταθερές (constants): const double TAXRATE = 0.05; ηλωµένη καθολικά, ώστε όλες οι συναρτήσεις να τη γνωρίζουν Καθολικές µεταβλητές? Πιθανό, αλλά ΣΠΑΝΙΑ ΧΡΗΣΙΜΟΠΟΙΟΜΕΝΟ Επικίνδυνο: δεν υπάρχει έλεγχος στη χρήση τους! Blocks 42 ήλωση δεδοµένων µέσα σε σύνθετη δήλωση Αποκαλείται "block" Έχει "block-scope" Σηµείωση: όλοι οι ορισµοί συναρτήσεων είναι blocks! Αυτό παρέχει τοπική εµβέλεια συνάρτησης Loop blocks: for (int ctr=0;ctr<10;ctr++) { sum+=ctr; } Η µεταβλητή ctr έχει εµβέλεια µόνο µέσα στο block του βρόχου 14

Φωλιασµένη εµβέλεια 43 Κάποια ονόµατα µεταβλητών δηλωµένα σε πολλά blocks Καθ όλα νόµιµο; Η εµβέλεια είναι "blockscope" εν υπάρχει αµφισηµία Κάθε όνοµα είναι διακριτό µέσα στην εµβέλειά του Περίληψη 1 44 υο είδη συναρτήσεων: Επιστρέφουν-µια-τιµή και συναρτήσεις void Οι συναρτήσεις πρέπει να είναι µαύρα κουτιά Κρύβουν τις λεπτοµέρειες ηλώνουν τα δικά τους τοπικά δεδοµένα Οι δηλώσεις συναρτήσεων πρέπει να είναι αυτόπεριγραφόµενες Παρέχουν προ- &µετα- συνθήκες σε σχόλια Παρέχουν τα πάντα που πρέπει να γνωρίζει αυτός που θα την καλέσει Περίληψη 2 45 Τοπικά δεδοµένα ηλώνονται στον ορισµό συναρτήσεων Καθολικά δεδοµένα ηλώνονται πάνω από τους ορισµούς συναρτήσεων OK για σταθερές, όχι για µεταβλητές Παράµετροι/Ορίσµατα Τυπικά: Στη δήλωση και ορισµό συνάρτησης Placeholder για τα εισερχόµενα δεδοµένα Πραγµατικά: Στην κλήση συνάρτησης Πραγµατικά δεδοµένα περνάνε στη συνάρτηση 15

Περιεχόµενα 46 Τα βασικά των συναρτήσεων Παράµετροι και Υπερφόρτωση Στόχοι εκµάθησης 47 Παράµετροι Κλήση-µε-τιµή (Call-by-value) Κλήση-µε-αναφορά (Call-by-reference) Μικτή λίστα παραµέτρων Υπερφόρτωση και Εξ Ορισµού ορίσµατα (Overloading και Default Arguments) Παράδειγµα, Κανόνες Ελέγχοντας και Αποσφαλµατώνοντας συναρτήσεις Μακροεντολή assert Stubs και Drivers Παράµετροι 48 υο µέθοδοι περάσµατος ορισµάτων ως παράµετροι Κλήση-µε-τιµή (Call-by-value) Περνάει αντίγραφο της τιµής Κλήση-µε-αναφορά (Call-by-reference) Περνάει η διεύθυνση του πραγµατικού ορίσµατος 16

Παράµετροι Call-by-Value 49 Περνάει αντίγραφο του πραγµατικού ορίσµατος Θεωρείται τοπική µεταβλητή µέσα στη συνάρτηση Εάν τροποποιηθεί, µόνο το τοπικό αντίγραφο αλλάζει Η συνάρτηση δεν έχει πρόσβαση στο πραγµατικό όρισµα της καλούσας συνάρτησης Αυτή είναι η εξ ορισµού µέθοδος Χρησιµοποιήθηκε σε όλα τα παραδείγµατα µέχρι στιγµής Παράδειγµα Call-by-Value (1/3) 50 Παράδειγµα Call-by-Value (2/3) 51 17

Παράδειγµα Call-by-Value (3/3) 52 Παγίδα Call-by-Value Σύνηθες λάθος: ήλωση της/των παραµέτρων ξανά µέσα στη συνάρτηση: double fee(int hoursworked, int minutesworked) { int quarterhours; // local variable int minutesworked // NO! } Προκαλεί Compiler error "Redefinition error " Τα ορίσµατα-µε-τιµή είναι όπως οι τοπικές µεταβλητές Αλλά δηλώνονται στη συνάρτηση αυτόµατα 53 Παράµετροι Call-By-Reference 54 Χρησιµοποιούνται για να παρέχουν πρόσβαση στο πραγµατικό όρισµα της καλούσας συνάρτησης Τα δεδοµένα της καλούσας συνάρτησης µπορεί να τροποποιηθούν από την καλούµενη συνάρτηση! Τυπικά, χρησιµοποιούνται για είσοδο/έξοδο Ανάκτηση δεδοµένων από την καλούσα συνάρτηση Επιστροφή δεδοµένων στην καλούσα συνάρτηση Καθορίζονται µε ampersand, &, µετά τον τύπο τους, στη λίστα των τυπικών παραµέτρων 18

55 Παράδειγµα Call-By-Reference (1/3) 56 Παράδειγµα Call-By-Reference (1/3) 57 Παράδειγµα Call-By-Reference (1/3) 19

Λεπτοµέρειες Call-By-Reference 58 Τι είναι αυτό που περνάει µέσα στη συνάρτηση? Μια αναφορά πίσω στο πραγµατικό όρισµα του καλούντα! Αναφέρεται στη θέση µνήµης του πραγµατικού ορίσµατος Αποκαλείται διεύθυνση, που είναι ένας µοναδικός αριθµός ο οποίος αναφέρεται σε µια διακριτή θέση στη µνήµη Παράµετροι Constant Reference 59 Τα ορίσµατα µε αναφορά είναι γενικών επικίνδυνα Τα δεδοµένα του καλούντα µπορεί να τροποποιηθούν Μερικές φορές είναι επιθυµητό, άλλες όχι Για να προστατέψουµε τα δεδοµένα, & να περάσουµε ορίσµατα µε αναφορά: Χρησιµοποιούµε τη δεσµευµένη λέξη const void sendconstref(const int &par1, const int &par2); Κάνει το ορίσµατα "read-only" µέσα στη συνάρτηση εν επιτρέπονται αλλαγές πάνω τους µέσα στη συνάρτηση Παράµετροι και Ορίσµατα 60 Πραγµατική έννοια: Τυπικοί παράµετροι Στη δήλωση και ορισµό συνάρτησης Ορίσµατα Γεµίζουν µια τυπική παράµετρο Στην κλήση συνάρτησης (λίστα ορισµάτων) Call-by-value & Call-by-reference Απλά ο µηχανισµός που χρησιµοποιείται στη διαδικασία 20

Μικτή λίστα παραµέτρων 61 Συνδυασµός µηχανισµών περάσµατος παραµέτρων Μπορεί να περιέχει παραµέτρους pass-by-value και pass-by-reference Η σειρά των ορισµάτων στη λίστα είναι σηµαντική: void mixedcall(int & par1, int par2, double & par3); Κλήση συνάρτησης: mixedcall(arg1, arg2, arg3); Το arg1 πρέπει να είναι int, περνάει µε αναφορά Το arg2 πρέπει να είναι int, περνάει µε τιµή Το arg3 πρέπει να είναι double, περνάει µε αναφορά Επιλογή ονοµάτων τυπικών παραµέτρων Ίδιος κανόνας που ισχύει για το όνοµα κάθε identifier: Ονόµατα µε νόηµα! Συναρτήσεις ως αυτό-περιεχόµενες δοµές Σχεδιάζονται χωριστά από το υπόλοιπο πρόγραµµα Ανατίθονται σε οµάδες προγραµµατιστών Όλοι πρέπει να καταλαβαίνουν την ορθή χρήση της συνάρτησης OK, εάν τα ονόµατα των τυπικών παραµέτρων είναι τα ίδια µε τα ονόµατα των ορισµάτων Επιλέξτε τα ονόµατα των συναρτήσεων µε βάση τους ίδιους κανόνες 62 Υπερφόρτωση (Overloading) 63 Ίδιο όνοµα συνάρτησης ιαφορετικές λίστες παραµέτρων υο διαφορετικοί ορισµοί των συναρτήσεων Υπογραφή της συνάρτησης Όνοµα της συνάρτησης & λίστα παραµέτρων Πρέπει να είναι µοναδικά για κάθε ορισµό συνάρτησης Επιτρέπει την ίδια λειτουργία πάνω σε διαφορετικά δεδοµένα 21

Παράδειγµα Overloading: Average 64 Η συνάρτηση υπολογίζει το µέσο όρο 2 αριθµών: double average(double n1, double n2) { return ((n1 + n2) / 2.0); } Τώρα υπολογίζει το µέσο όρο 3 αριθµών : double average(double n1, double n2, double n3) { return ((n1 + n2 + n3) / 3.0); } Ίδιο όνοµα, δυο συναρτήσεις Overloaded Average() (συνέχεια) 65 Ποια συνάρτηση καλείται? Εξαρτάται από την κλήση: avg = average(5.2, 6.7); Καλεί την "two-parameter average()" avg = average(6.5, 8.5, 4.2); Καλεί την "three-parameter average()" Ο compiler ξεδιαλύνει την κλήση µε βάση την υπογραφή της κλήσης συνάρτησης Ταιριάζει την κλήση µε την κατάλληλη συνάρτηση Κάθε µια θεωρείται διαφορετική συνάρτηση Παγίδα Overloading 66 Να κάνετε overload µόνο συναρτήσεις µε την ίδια λειτουργία Μια mpg() συνάρτηση πρέπει πάντα να εκτελεί την ίδια λειτουργία, σε όλες τις overloads ιαφορετικά, απρόβλεπτα αποτελέσµατα C++ function call ανάλυση: 1 st : ψάχνει για την ίδια υπογραφή 2 nd : ψάχνει για συµβατή υπογραφή 22

Ανάλυση Overloading 67 1 st : Ακριβές ταίριασµα Ψάχνει για την ίδια υπογραφή Όπου δεν απαιτείται µετατροπή ορίσµατος 2 nd : Συµβατό ταίριασµα Ψάχνει για συµβατή υπογραφή, όπου αυτόµατη µετατροπή τύπου είναι εφικτή: 1 st µε promotion (π.χ., int double) Καµία απώλεια δεδοµένων 2 nd µε demotion (π.χ., double int) Πιθανή απώλεια δεδοµένων Παράδειγµα ανάλυσης Overloading 68 Έστωσαν οι παρακάτω συναρτήσεις: 1. void f(int n, double m); 2. void f(double n, int m); 3. void f(int n, int m); Οι κλήσεις: f(98, 99); Calls #3 f(5.3, 4); Calls #2 f(4.3, 5.2); Calls??? Αποφύγετε overloading που προκαλεί σύγχυση Αυτόµ. Μετατρ. Τύπου & Overloading 69 Οι αριθµητικές τυπικές παράµετροι συνήθως γίνονται τύπου "double" Επιτρέπει για οποιοδήποτε αριθµητικό τύπο Οποιοδήποτε κατώτερο δεδοµένο αυτόµατα προάγεται int double float double char double *περισσότερα σε λίγο! Αποφεύγει overloading για διαφορετικούς αριθµητικούς τύπους 23

ΠαράδειγµαΑυτόµ. Μετατρ. Τύπου & Overloading double mpg(double miles, double gallons) { return (miles/gallons); } Παράδειγµα κλήσεως συναρτήσεων: mpgcomputed = mpg(5, 20); Μετατρέπει τα 5 & 20 σε doubles, και κατόπιν τα περνάει στη συνάρτηση mpgcomputed = mpg(5.8, 20.2); εν χρειάζεται µετατροπή mpgcomputed = mpg(5, 2.4); Μετατρέπει το 5 σε 5.0, και κατόπιν περνάει τις τιµές στη συνάρτηση 70 Εξ Ορισµού Ορίσµατα 71 Επιτρέπει παράλειψη κάποιων ορισµάτων Καθορίζονται στη δήλωση/πρωτότυπο της συνάρτησης void showvolume(int length, int width=1, int height=1); Τα τελευταία 2 ορίσµατα είναι εξ ορισµού Πιθανές κλήσεις: showvolume(2, 4, 6); //All arguments supplied showvolume(3, 5); //height defaulted to 1 showvolume(7); //width & height defaulted to 1 Παρ. Εξ Ορισµού Ορισµάτων (1/2) 72 24

Παρ. Εξ Ορισµού Ορισµάτων (2/2) 73 Έλεγχος & Αποσφαλµάτωση Συναρ. 74 Πολλές µέθοδοι: Πολλές δηλώσεις cout Σε κλήσεις και ορισµούς Χρησιµοποιούνται για να ιχνηλατήσουν την εκτέλεση ΟΑποσφαλµατωτής (Debugger) του compiler Environment-dependent assert Macro Πρώιµος τερµατισµός όπου χρειάζεται Stubs και drivers Αυξητική ανάπτυξη Η µακροεντολή assert 75 Assertion: µια δήλωση true ή false Χρησιµοποιείται για να καταγράφει και να ελέγχει την ορθότητα Preconditions & Postconditions Συνήθης χρήση της assert: επιβεβαίωση της εγκυρότητάς τους Σύνταξη: assert(<assert_condition>); εν επιστρέφει τιµή Υπολογίζει την assert_condition Τερµατίζει εάν false, συνεχίζει εάν true Προκαθορισµένη στη βιβλιοθήκη <cassert> Οι µακροεντολές χρησιµοποιούνται παρόµοια µε τις συναρτήσεις 25

Παράδειγµα µακροεντολής assert 76 Έστω η δήλωση συνάρτησης: void computecoin(int coinvalue, int& number, int& amountleft); //Precondition: 0<coinValue<100, 0<=amountLeft<100 //Postcondition: number set to max. number of coins Έλεγχος precondition: assert ((0 < currentcoin) && (currentcoin < 100) && (0 <= currentamountleft) && (currentamountleft < 100)); Εάν η If precondition δεν ικανοποιείται η condition είναι false τερµατίζεται η εκτέλεση του προγράµµατος! Παράδειγµα µακροεντολής assert 77 Χρήσιµη στο debugging Σταµατά την εκτέλεση ώστε να εξερευνηθεί το πρόβληµα assert On/Off 78 Ο Προεπεξεργαστής (Preprocessor) παρέχει τρόπους #define NDEBUG #include <cassert> Προσθέστε τη γραµµή "#define" πριν τη γραµµή #include Απενεργοποιεί τις assertions για όλη την έκταση του προγράµµατος Αφαιρέστε τη γραµµή "#define" (ή σχολιάστε τη) Ενεργοποιεί τις assertions 26

Stubs και Drivers 79 Μεταγλώττιση σε χωριστές µονάδες Κάθε συνάρτηση σχεδιάζεται, γράφεται, ελέγχεται χωριστά Εγγυάται εγκυρότητα της κάθε µονάδας ιαίρει & Βασίλευε Μετατρέπει µια µεγάλη εργασία σε µικρότερες, εύκολα διαχερίσιµες εργασίες Πώς όµως θα κάνουµε έλεγχο ανεξάρτητα? Προγράµµατα Οδηγοί (Driver) Παράδειγµα προγράµ. Driver (1/3) 80 Παράδειγµα προγράµ. Driver (2/3) 81 27

Παράδειγµα προγράµ. Driver (3/3) 82 Stubs Αυξητική ανάπτυξη Γράφουµε πρώτα τις συναρτήσεις που δίνουν τη µεγάλη εικόνα ( big-picture ) Τελευταίες γράφουµε τις χαµηλού επιπέδου συναρτήσεις "Stub-out" τις συναρτήσεις µέχρι την υλοποίηση Παράδειγµα: double unitprice(int diameter, double price) { return (9.99); // not valid, but noticeably // a "temporary" value } Η κλήση στη συνάρτηση εκτελείται κανονικά 83 Θεµελιώδης κανόνας ελέγχου 84 Γράφουµε σωστά προγράµµατα Ελαχιστοποιούµε τα λάθη, "bugs" Επιβεβαιώνουµε την εγκυρότητα των δεδοµένων Ελέγχουµε κάθε συνάρτηση σε ένα πρόγραµµα, όπου κάθε άλλη συνάρτηση έχει ήδη ελεγχθεί και αποσφαλµατωθεί Αποφεύγουµε τη µετάδοση των λαθών ( errorcascading ) & αντικρουόµενα αποτελέσµατα 28

Περίληψη 1 Οι τυπικές παράµετροι είναι placeholders, γεµίζουν µε τα πραγµατικά ορίσµατα στην κλήση της συνάρτησης Οι παράµετροι Call-by-value είναι τοπικά αντίγραφα στο σώµα της καλούµενης συνάρτησης Το πραγµατικό τους όρισµα δεν µπορεί να τροποποιηθεί Η τεχνική Call-by-reference περνάει τη διεύθυνση µνήµης ως πραγµατικό όρισµα Τα πραγµατικά ορίσµατα µπορούν να τροποποιηθούν Τα ορίσµατά τους ΠΡΕΠΕΙ να είναι µεταβλητές και όχι σταθερές 85 Περίληψη 2 Πολλαπλοί ορισµοί για το ίδιο όνοµα συνάρτησης είναι δυνατό: η τεχνική αυτή ονοµάζεται υπερφόρτωση (overloading) Τα εξ ορισµού ορίσµατα επιτρέπουν σε κλήσεις συναρτήσεων να παραλείπουν µερικά ή όλα τα ορίσµατα στη λίστα ορισµάτων Εάν δεν καθορίζουµε ορίσµατα ανατίθενται οι εξ ορισµού τιµές Η µακροεντολή assert εκκινεί τον τερµατισµό του προγράµµατος εάν αποτύχουν οι assertions Οι συναρτήσεις πρέπει να ελέγχονται ανεξάρτητα Ως ξεχωριστές µονάδες µεταγλώττισης, µε προγράµµατα οδηγούς (drivers) 86 29