Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα...

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

Transcript of Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα...

Page 1: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

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

Page 2: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Χρήση συναρτήσεων βιβλιοθήκης

• Εντολή κλήσης της συνάρτησης printf:printf(“Hello, world\n”);

• Μια συνάρτηση είναι ένα σύνολο εντολών που έχουν ομαδοποιηθεί και τους έχει αποδοθεί ένα όνομα.

• Η πράξη του συνόλου των εντολών που σχετίζονται με μια συνάρτηση ονομάζεται κλήση της συνάρτησης.

• Κατά την κλήση μιας συνάρτησης γράφουμε το όνομα της συνάρτησης ακολουθούμενο από παραστάσεις μέσα σε παρενθέσεις, που χωρίζονται από κόμμα, που ονομάζονται ορίσματα της συνάρτησης.

Page 3: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Διαδικασία κλήσης συνάρτησης• Όταν κληθεί μια συνάρτηση

– Παίρνει τα δεδομένα που της παρέχονται ως ορίσματα

– Εκτελεί τις εντολές της– Επιστρέφει (returns) στο σημείο από το οποίο

κλήθηκε.• Κατά την επιστροφή της μια συνάρτηση είναι

δυνατόν να «στείλει» μια τιμή πίσω στη συνάρτηση που την κάλεσε. Αυτή η λειτουργία ονομάζεται επιστροφή τιμής.n = GetInteger();

Page 4: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Παράδειγμα κλήσης συνάρτησης

• Κλήση της συνάρτησης υπολογισμού της τετραγωνικής ρίζας της μαθηματικής βιβλιοθήκης math της C.

#include <math.h>/* Συμπερίληψη του αρχείου επικεφαλίδας math.h*/

...x = sqrt(2.0);distance = sqrt(x*x + y*y);

• Υπολογισμός του x2 y2

Page 5: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

sqrt2.0 r

Παράμετρος Επιστρεφόμενη τιμή

r = sqrt(2.0);

συνάρτησηΠαράμετρος

Επιστρεφόμενη τιμήΠαράμετρος...

Γενικά

Page 6: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Δήλωση συναρτήσεων• Στην πρότυπη (ANSI) C για να

χρησιμοποιηθεί μια συνάρτηση σε ένα πρόγραμμα πρέπει πρώτα να έχει δηλωθεί– Υπενθύμιση: Το ίδιο ισχύει και για τις

μεταβλητές στη C.• Η δήλωση μιας συνάρτησης ονομάζεται

πρωτότυπο συνάρτησης. Σε αυτήν ορίζονται:– Το όνομα της συνάρτησης– Ο τύπος κάθε ορίσματος και, τις περισσότερες

φορές, ένα όνομα για το όρισμα.– Ο τύπος της τιμής που επιστρέφει η συνάρτηση

Page 7: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Επιστρεφόμενος_τύπος όνομα_συνάρτησης (τύπος_ορίσματος όνομα_ορίσματος

προαιρ,...);

• Παράδειγμα:int sum (int x, int y);ήint sum(int, int);

double square(double x);

Μορφή Πρωτοτύπου Συνάρτησης

Page 8: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

• Κάθε αρχείο επικεφαλίδας (header file) περιέχει τα πρωτότυπα των συναρτήσεων της αντίστοιχης βιβλιοθήκης.

• Ένα πρωτότυπο προδιαγράφει τη μορφή μιας συνάρτησης και δεν ορίζει τη λειτουργία της.

• Μια συνάρτηση που δεν έχει ορίσματα χρησιμοποιεί την ειδική λέξη void ως προδιαγραφή του ορίσματος.int GetInteger(void);

Πρωτότυπα συνάρτησης

Page 9: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

• Η συγγραφή μιας συνάρτησης απαιτεί:1.Τον ορισμό του πρωτοτύπου της συνάρτησης

στην αρχή, συνήθως, του προγράμματος.2.Την υλοποίηση της συνάρτησης στην οποία

ορίζονται τα βήματα που θα εκτελεστούν από την συνάρτηση.

● Για τον ορισμό του πρωτοτύπου πρέπει να αποφασίσουμε: ● Με τι δεδομένα θέλουμε να “τροφοδοτήσουμε”

τη συνάρτηση – Ποια τιμή θέλουμε να μας επιστρέψει η

συνάρτηση

Συγγραφή μιας συνάρτησης

Page 10: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

• Παράδειγμα: Συνάρτηση μετατροπής θερμοκρασίας από βαθμούς Κελσίου σε Farenheit

• Η μετατροπή γίνεται σύμφωνα με τη σχέση– F = 9/5 C +32

• Δεδομένα εισόδου της συνάρτησης: Η θερμοκρασία σε βαθμούς Κελσίου. Τύπος: double

• Δεδομένα εξόδου της συνάρτησης: Η θερμοκρασία σε βαθμούς Farenheit. Τύπος: double

Page 11: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

• Το πρωτότυπο της συνάρτησης είναι το παρακάτω:double CelciusToFarenheit(double c);

• Η υλοποίηση μιας συνάρτησης ορίζεται ως εξής:

Επικεφαλίδα_συνάρτησης (χωρίς ερωτηματικό)

Σώμα συνάρτησης

Ορισμός του πρωτοτύπου

Page 12: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

• Στο παράδειγμα:double CelciusToFarenheit(double c){

double f;

f = 9.0 /5.0 * c + 32.0;return f;

}• Η εντολή return καθορίζει την τιμή που

πρόκειται να επιστραφεί.

Υλοποίηση συνάρτησης

Page 13: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Εναλλακτική υλοποίηση

double CelciusToFarenheit(double c){

return (9.0 /5.0 * c + 32.0);}

Page 14: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Η οδηγία #define

• Ενότητα 3.6, σελ. 127 του βιβλίου.• Η οδηγία (μηχανισμός) #define

αντιστοιχίζει μια σταθερή τιμή σε ένα σύμβολο του προγράμματος, ώστε η τιμή αυτή να είναι εύκολο να αλλαχθεί στο σύνολο του προγράμματος#define UpperLimit 0

[Χωρίς ερωτηματικό στο τέλος!]

Page 15: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

#include <stdio.h>#include “genlib.h”#include “simpio.h”double CelciusToFarenheit(double c);main(){

double c = 100.0;while (TRUE) {

printf(“Celcius? “);c = GetReal();if (c < 0.0)

break;printf(“Farenheit: %g\n”, CelciusToFarenheit(c));

}}double CelciusToFarenheit(double cc){

return (9.0 /5.0 * cc + 32.0);}

Page 16: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Συναρτήσεις με “εσωτερικές” δομές ελέγχου

int abs(int n){

if (n<0) {return (-n);

}else {

return (n);}

}

Page 17: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Συναρτήσεις με “εσωτερικές” δομές ελέγχου

int Factorial(int n){

int product, i;

product = 1;for (i = 1 ; i <= n ; i++) {

product *= i;}

return (product);}

Page 18: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Συναρτήσεις που επιστρέφουν μη αριθμητικές τιμές

string MonthName(int month){

switch (month) {case 1: return (“January”); /* No break needed */case 2: return (“February”);case 3: return (“March”);...case 11: return (“November”);case 12: return (“December”);default: return (“Illegal month”);

}

Page 19: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Κατηγορηματικές συναρτήσεις

• Συναρτήσεις που επιστρέφουν τιμές τύπου bool (TRUE ή FALSE)

• Παράδειγμα: Συνάρτηση που ελέγχει αν ένας αριθμός είναι άρτιος ή περιττός#include “genlib.h”bool IsEven(int n){

return (n % 2 == 0);}

Page 20: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Κλήση κατηγορηματικής συνάρτησης

• Η κλήση

if (IsEven(3) == TRUE){...

}είναι ισοδύναμη με την if (IsEven(3)) {

...}

Page 21: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Κατηγορηματική συνάρτηση σύγκρισης αλφαριθμητικών

• Η συνάρτησηbool StringEqual(string s1, string s2);

• Επιστρέφει TRUE όταν τα αλφαριθμητικά s1 και s2 είναι ίσα. Παραδείγματα:

StringEqual(“abc”,”abc”) TRUEStringEqual(“abc”,”cba”) FALSEStringEqual(“abc”,”abcd”) FALSE

Page 22: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Κλήση συνάρτησης και μεταβίβαση παραμέτρων

• Έστω το πρωτότυπο int Factorial (int n);

• Η μεταβλητή n στο πρωτότυπο της Factorial χρησιμεύει ως δεσμευτικό θέσης για το πραγματικό όρισμα. Μια τέτοια μεταβλητή ονομάζεται τυπική παράμετρος.

Page 23: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Μεταβίβαση παραμέτρων και επιστροφή αποτελέσματος

• int k; double f;• f = 3.5;• k = Factorial(f + 1);• Όταν καλείται μια συνάρτηση, εκτελούνται τα

παρακάτω βήματα:1. Οι παραστάσεις του ορίσματος (πραγματικές παράμετροι) αποτιμώνται,

δηλαδή υπολογίζεται η τιμή που τους αντιστοιχεί. 2. Η τιμή κάθε ορίσματος (πραγματική παράμετρος) αντιγράφεται στη θέση των

τυπικών παραμέτρων. Αν είναι αναγκαίο, γίνεται αυτόματη μετατροπή τύπων.3. Οι εντολές που περιλαμβάνονται στο σώμα της συνάρτησης αποτιμώνται

(εκτελούνται) μέχρι την εμφάνιση της εντολής return.4. Η τιμή της return αποτιμάται και μετατρέπεται, αν χρειαστεί, στον τύπο

αποτελέσματος που καθορίζεται στο πρωτότυπο της συνάρτησης5. Το πρόγραμμα που κάλεσε τη συνάρτηση συνεχίζει την εκτέλεσή του με την

κλήση της συνάρτησης να αντικαθίσταται από την επιστρεφόμενη τιμή της.

Page 24: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Τοπικές μεταβλητέςdouble Exp (double r, int m);main(){

double y;y = Exp(2.5, 2 );

}

double Exp(double r, int m){/* Τοπική μεταβλητή, δεν έχει σχέση με την y της main */

double y = 1.0 ;int i;for (i = 0; i < m; i++) }

y *= r;}return y;

}

Page 25: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

Διαδικασίες• Συναρτήσεις οι οποίες δεν επιστρέφουν κάποια τιμή αλλά

έχουν κατά την εκτέλεσή τους κάποια επίδραση.• Πολλές γλώσσες προγραμματισμού παρέχουν

ξεχωριστούς μηχανισμούς για την υλοποίηση διαδικασιών και συναρτήσεων.

Παράδειγμα διαδικασίας: Εκτύπωση μηνυμάτων στην οθόνη:void GiveInstructions(void);void GiveInstructions(void){

printf(“Ayto to programma kanei enan ypologismo\n”);

printf(“gia to xrhsth”);}

Page 26: Συναρτήσεις και διαδικασίες...Η οδηγία #define • Ενότητα 3.6, σελ. 127 του βιβλίου. • Η οδηγία (μηχανισμός)

ΔείτεΕνότητες 5.1 έως 5.4 του βιβλίου