Βαγγϋλησ Οικονόμου Διϊλεξη 6 1
Αφαιρετικότητα ςτισ διεργαςύεσ Συνϊρτηςεισ Δόλωςη, Κλόςη και Οριςμόσ Εμβϋλεια Μεταβλητών Μεταβύβαςη παραμϋτρων ςε ςυναρτόςεισ Μηχανιςμόσ Κλόςησ Συνϊρτηςησ 2
Διεργαςύα : βαςικό δομικό ςτοιχεύο τησ διαδικαςύασ ανϊπτυξησ ςυςτημϊτων λογιςμικού. Διεργαςύα ςτη C εύναι η ςυνϊρτηςη. Στην καθημερινό μασ ζωό αναφερόμαςτε ςυχνϊ ςε διεργαςύεσ με τα ονόματϊ τουσ, τα οπούα δύνουν ϋμφαςη ςτο τι κϊνει η διεργαςύα και όχι ςτο πώσ. 3
Παρϊδειγμα: Κϊνε ϋνα φραπϋ, γλυκό με γϊλα Εςτιϊζουμε ςτο τι πρϋπει να γύνει όχι ςτο πωσ Δε γνωρύζουμε τη διαδικαςύα παραςκευόσ του φραπϋ, μασ ενδιαφϋρει να πιούμε τον φραπϋ Τμόματα Διεργαςύασ: Όνομα διεργαςύασ Εύςοδοσ και ϋξοδοσ διεργαςύασ Σώμα τησ διεργαςύασ 4
Ο αρθρωτόσ ςχεδιαςμόσ (modular design) βαςύζει την ανϊπτυξη ςύνθετων ςυςτημϊτων ςτην τμηματοπούηςη των ςύνθετων διεργαςιών ςε επιμϋρουσ απλούςτερεσ διεργαςύεσ (τεχνικό διαύρε και βαςύλευε) ό αντύςτοιχα, την τμηματοπούηςη του προγρϊμματοσ ςε επιμϋρουσ τμήματα (modules), ςυναρτήςεισ, όπωσ ονομάζονται ςτη C. 5
Ένα module (ό ςυνϊρτηςη) πρϋπει: 1. να εύναι ςχετικϊ μικρό, 2. να ϋχει αν εύναι δυνατό μια εύςοδο και μια ϋξοδο, 3. να αναπτύςςεται και ελϋγχεται ςαν αυτόνομη μονϊδα, 4. να εκτελεύ ϋνα ςαφώσ οριςμϋνο ϋργο, και 5. να ϋχει μια καλώσ προςδιοριςμϋνη διεπαφό (interface). 6
Η ςυνϊρτηςη εύναι μύα αυτόνομη μονϊδα κώδικα ςχεδιαςμϋνη να επιτελεύ ςυγκεκριμϋνο ϋργο. Βοηθϊ: 1. ςτην αποφυγό τησ επανϊληψησ, 2. ςτην αύξηςη τησ επαναχρηςιμοπούηςησ, 3. ςτη βελτύωςη τησ αναγνωςιμότητασ του κώδικα, 4. καθώσ και ςτη βελτύωςη τησ διαδικαςύασ ςυντόρηςησ. Κϊθε C πρόγραμμα αποτελεύται από μια ό περιςςότερεσ ςυναρτόςεισ και περιϋχει οπωςδόποτε τη ςυνϊρτηςη main από την οπούα, όπωσ όδη γνωρύζετε, αρχύζει η εκτϋλεςη του προγρϊμματοσ. 7
Το όνομα μιασ ςυνϊρτηςησ το ςυναντϊμε ςε ϋνα πρόγραμμα ςε προτϊςεισ τριών διαφορετικών μορφών: 1. πρόταςη δόλωςησ τησ ςυνϊρτηςησ 2. πρόταςη κλόςησ τησ ςυνϊρτηςησ και 3. πρόταςη οριςμού τησ ςυνϊρτηςησ 8
Η πρόταςη δόλωςησ προςδιορύζει τον τρόπο αναφορϊσ ςτη ςυνϊρτηςη. Γενικό μορφό: <τύποσ> <όνομα ςυνάρτηςησ>(<τύποσ1> [<όνομα παραμέτρου1>],,<τύποσn> [<όνομα παραμέτρουn>]); προςδιορύζει τον τύπο τησ επιςτρεφόμενησ τιμόσ, το όνομα τησ ςυνϊρτηςησ, τον αριθμό και τον τύπο των παραμϋτρων και, προαιρετικϊ, τα ονόματα με τα οπούα το ςώμα τησ ςυνϊρτηςησ αναφϋρεται ςτισ ειςόδουσ που δϋχεται. Παρϊδειγμα: int max(int a,int b); void draw_circle(double x, double y, double r); 9
Για να ενεργοποιόςουμε μια ςυνϊρτηςη την καλούμε. Έχετε όδη καλϋςει τισ ςυναρτόςεισ printf και scanf τησ βαςικόσ βιβλιοθόκησ. H κλόςη μιασ ςυνϊρτηςησ που δεν επιςτρϋφει τιμό αποτελεύται από το όνομα τησ ςυνϊρτηςησ ακολουθούμενο από τη λύςτα των παραμϋτρων, τα οπούα καλούνται ορίςματα Γενικό μορφό: <όνομα ςυνάρτηςησ>(όριςμα1, όριςμα2,, όριςμα Ν); Οι παρενθϋςεισ εύναι απαραύτητεσ ακόμη και όταν δεν υπϊρχουν ορύςματα, για να γνωρύζει ο μεταγλωττιςτόσ ότι το όνομα εύναι ςυνϊρτηςη και όχι μεταβλητό. 10
Παρϊδειγμα: draw_circle(a/2.0, 2.0*b, c/3.0); Κλόςη ςυνϊρτηςησ που επιςτρϋφει τιμό: <όνομα μεταβλητήσ> = <όνομα ςυνάρτηςησ>(όριςμα1, όριςμα2,, όριςμα Ν); Οι ςυναρτόςεισ οι οπούεσ επιςτρϋφουν τιμϋσ αποτελούν τελεςτϋουσ ςε ςύνθετεσ εκφρϊςεισ Παρϊδειγμα: max_num = max(num1,num2); result = num1 + max(num2,num3); printf( Ο μεγαλύτεροσ αριθμόσ εύναι: %d\n, max(num1,num2) ); 11
Το ςώμα των ςυναρτόςεων printf και scanf τησ βαςικόσ βιβλιοθόκησ βρύςκεται ςε ϋνα από τα αρχεύα.lib που την αποτελούν. Αντύθετα, για κϊθε δικό μασ ςυνϊρτηςη, θα πρϋπει να ορύςουμε το ςώμα τησ. Ο οριςμόσ μιασ ςυνϊρτηςησ αποτελεύται από το πρωτότυπο τησ ςυνϊρτηςησ ακολουθούμενο από το ςύνολο των προτϊςεων που επιτελούν το ϋργο τησ ςυνϊρτηςησ 12
Παρϊδειγμα: Ο οριςμόσ τησ ςυνϊρτηςησ area που υπολογύζει την επιφϊνεια ορθογωνύου. float area(float width, float height) { float result; result = width * height; } return(result); 13
Οι κανόνεσ εμβϋλειασ τουσ προςδιορύζουν το τμόμα του πηγαύου κώδικα ςτο οπούο ϋνα όνομα εύναι ενεργό ό ορατό. Εμβέλεια προγράμματοσ: Μεταβλητϋσ με εμβϋλεια προγρϊμματοσ εύναι γνωςτϋσ και ςαν γενικϋσ ό καθολικϋσ (global) μεταβλητϋσ. Εμβέλεια αρχείου: Μεταβλητό με εμβϋλεια αρχεύου, εύναι ορατό μόνο ςτο αρχεύο που δηλώνεται και μϊλιςτα από το ςημεύο τησ δόλωςόσ τησ και κϊτω Εμβέλεια ςυνάρτηςησ: Προςδιορύζει την ορατότητα του ονόματοσ από την αρχό τησ ςυνϊρτηςησ μϋχρι το τϋλοσ τησ Εμβέλεια μπλοκ (block): Προςδιορύζει την ορατότητα από το ςημεύο δόλωςησ μϋχρι το τϋλοσ του μπλοκ ςτο οπούο δηλώνεται. Το μπλοκ εύναι ϋνα ςύνολο από προτϊςεισ που περικλεύονται ςε αγκύλεσ. 14
Παρϊδειγμα ςτην Visual C++ 15
Μεταβύβαςη Παραμϋτρων: ο τρόποσ που «περνϊμε» τισ παραμϋτρουσ ςτισ ςυναρτόςεισ. Η μεταβύβαςη παραμϋτρων (parameter passing) ςτη C γύνεται με δύο τρόπουσ. Ο πρώτοσ εξ αυτών εύναι γνωςτόσ ςαν κλήςη κατά τιμή (call by value), ενώ ο δεύτεροσ ςαν κλήςη κατ αναφορά (call by reference). Στη μεταβύβαςη με τιμό η ςυνϊρτηςη δουλεύει πϊνω ςε αντύγραφα των πραγματικών παραμϋτρων, ενώ ςτη μεταβύβαςη με αναφορϊ δουλεύει πϊνω ςτισ πραγματικϋσ παραμϋτρουσ. 16
Παρϊδειγμα ςτην Visual C++ t=max(max(a,b),c); 17