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

Post on 26-Feb-2020

4 views 0 download

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sqrt2.0 r

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

r = sqrt(2.0);

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

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

Γενικά

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

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

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

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

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

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

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

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

double square(double x);

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

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

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

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

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

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

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

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

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

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

συνάρτηση

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

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

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

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

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

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

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

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

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

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

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

double f;

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

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

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

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

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

double CelciusToFarenheit(double c){

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

Η οδηγία #define

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

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

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

#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);}

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

int abs(int n){

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

}else {

return (n);}

}

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

int Factorial(int n){

int product, i;

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

product *= i;}

return (product);}

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

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”);

}

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

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

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

return (n % 2 == 0);}

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

• Η κλήση

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

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

...}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

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

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

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

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

printf(“gia to xrhsth”);}

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