Γ7.4 Συναρτήσεις (Functions) · 2020-07-23 · Οι συναρτήσεις με τη...
Transcript of Γ7.4 Συναρτήσεις (Functions) · 2020-07-23 · Οι συναρτήσεις με τη...
Γ7.4 Συναρτήσεις (Functions)Γ’ Λυκείου Κατεύθυνσης
Εισαγωγή
● Τμηματικός προγραμματισμός (Modular programming) είναι μία τεχνική ανάπτυξης προγραμμάτων, της οποίας κύριο χαρακτηριστικό είναι η διάσπαση ενός προβλήματος σε πιο απλά τμήματα προγραμμάτων, έτσι ώστε να διευκολυνθεί η αποσφαλμάτωση και να μειωθεί η έκταση του κώδικά.
● Αυτά τα τμήματα κώδικά καλούνται υποπρογράμματα. Υποπρόγραμμα θεωρείται ένα αυτόνομο κομμάτι κώδικα, το οποίο εκτελεί ένα συγκεκριμένο έργο και ορίζεται ξεχωριστά από το κυρίως πρόγραμμα.
Ορισμός και κλήση συναρτήσεων
Η συνάρτηση (function) είναι ένας τύπος υποπρογράμματος που υπολογίζει και επιστρέφει μόνο μία τιμή στο κυρίως πρόγραμμα.
Ορισμός και κλήση συναρτήσεων
Για κάθε συνάρτηση πρέπει να ορίζουμε τα εξής:(α) Τύπος επιστρεφόμενης τιμής: Η συνάρτηση μπορεί να επιστρέψει όλους τους βασικούς τύπους που γνωρίζουμε (int, double, char, boolean), ακόμα και συμβολοσειρές (string). Αν η συνάρτηση δεν θα επιστρέφει κάποια τιμή, ορίζεται με τύπο void. Αν επιστρέφει κάποια τιμή, αυτή θα εμφανίζεται μετά τη λέξη return.(β) Όνομα συνάρτησης: Ισχύουν οι ίδιοι κανόνες ονοματολογίας με τις μεταβλητές.(γ) Παράμετροι: Μεταβλητές που επιτρέπουν το πέρασμα της τιμής τους από ένα τμήμα προγράμματος σε άλλο. Μία συνάρτηση μπορεί να έχει μηδέν ή περισσότερες παραμέτρους.
Ορισμός και κλήση συναρτήσεων
Στο πιο πάνω παράδειγμα η επικεφαλίδα (πρότυπο) της συνάρτησης είναι η εξής:
int add_2_nums(int a, int b){Από την επικεφαλίδα συμπεραίνουμε τα εξής:● Η συνάρτηση θα επιστρέφει έναν ακέραιο αριθμό γιατί είναι τύπου integer● Το όνομα της συνάρτησης είναι add_2_nums● Η συνάρτηση δέχεται δύο παραμέτρους (a, b) ως ακέραιες τιμές●
Η κλήση της συνάρτησης γίνεται στο κυρίως πρόγραμμα ως εξής:cout << add_2_nums(65,97); // Αποτέλεσμα: 162
Παράδειγμα 4.1
Να δημιουργήσετε πρόγραμμα το οποίο να καλεί μία συνάρτηση η οποία να δέχεται παραμετρικά δύο ακέραιους αριθμούς και να επιστρέφει τον μεγαλύτερο από τους δύο. Να θεωρήσετε ότι οι δύο ακέραιοι που θα δοθούν δεν θα είναι ίσοι.
Λύση: https://ideone.com/4YVdCE
Εναλλακτικός ορισμός συναρτήσεων
Μπορούμε να δηλώσουμε μόνο την επικεφαλίδα (πρότυπο) της συνάρτησης πριν από το κυρίως πρόγραμμα και ο ορισμός της συνάρτησης να ακολουθήσει μετά το τέλος του προγράμματος. Αυτό μάς επιτρέπει να χρησιμοποιήσουμε τη συνάρτηση στο πρόγραμμα πριν ακόμα αυτή οριστεί.
Τοπικές (local) και καθολικές (global) μεταβλητές
● Μέσα σε μία συνάρτηση μπορούμε να δηλώσουμε τοπικές μεταβλητές. Οι τοπικές μεταβλητές μπορούν να χρησιμοποιηθούν μέσα σε μία δηλωμένη συνάρτηση, όμως δεν είναι προσβάσιμες από την κύρια συνάρτηση (main).
● Αντίθετα, μία καθολική μεταβλητή η οποία δηλώνεται εκτός της κύριας συνάρτησης, μπορεί να είναι προσβάσιμη από το κυρίως πρόγραμμα αλλά και από όσες συναρτήσεις ορίζονται σε αυτό.
Τοπικές (local) και καθολικές (global) μεταβλητές
#include <iostream>using namespace std;
int glob = 0; // Kαθολική (public)
int F(int x){ // Συνάρτηση
int num = 0; // Τοπική (local) glob += 10; // ΟΚ num = glob + x; // ΟΚ glob = val; // ΣΦΑΛΜΑreturn num;}
int main(){ // Κυρίως πρόγραμμα
int val = 0; // Τοπική (local)
cin >> val;
cout << num << endl; // ΣΦΑΛΜΑ
cout << x << endl; // ΣΦΑΛΜΑ
cout << glob << endl; // OK
cout << F(val) << endl;
return 0;}
ideone: https://ideone.com/CR76JK
Παράδειγμα: Το πρόγραμμα αυτό βρίσκει το συνολικό άθροισμα των ψηφίων των μονάδων για άγνωστο πλήθος ακεραίων, καθώς και το πλήθος των ακεραίων. Κάνει χρήση συνάρτησης η οποία υπολογίζει το ψηφίο των μονάδων ενός ακεραίου. Η είσοδος τερματίζει όταν δοθεί ο αριθμός 0.
#include <iostream>using namespace std;
int cnt = 0; // Kαθολική (public)
int monades(int x) {
int num = x%10;// Τοπική (local) cnt++;return num;}
int main(){
int a, sum = 0;
cin >> a;
while(a!=0){
sum += monades(a);
cin >> a;
}
cout << sum << endl << cnt;
return 0;}
ideone: https://ideone.com/nqVWno
Παράμετροι τιμών (by value) και παράμετροι αναφοράς (by reference)
● Οι συναρτήσεις με τη χρήση της εντολής return μπορούν να επιστρέψουν μόνο μία τιμή.
● Σε περίπτωση που θέλουμε η συνάρτησή μας να «επηρεάσει» περισσότερες από μία μεταβλητές, χρησιμοποιούμε την κλήση παραμέτρων με αναφορά.
● Με αυτό τον τρόπο περνάμε στη συνάρτηση τη διεύθυνση της μεταβλητής, με τη χρήση του τελεστή & και όχι την τιμή της.
Παράμετροι τιμών (by value) και παράμετροι αναφοράς (by reference)
int x = 5; // Δηλώνουμε μία μεταβλητή με όνομα x
int &y = x; // Δηλώνουμε το y σαν μεταβλητή αναφοράς της x
cout << y << endl; // 5 – Η τιμή της y είναι η ίδια με της x
cout << &y << endl; // 0x69fee8 (διεύθυνση μνήμης ίδια με την &x)
y = 10; // Αλλαγή της τιμής του y θα αλλάξει και την x
cout << x << endl; // 10 – Η τιμή της x έχει αλλάξει
Η θέση του τελεστή δεν παίζει κανέναν ρόλο. Όλες οι πιο κάτω εντολές είναι έγκυρες:
int &y1 = x; int& y2 = x; int & y3 = x;
Παράμετροι τιμών (by value) και παράμετροι αναφοράς (by reference)
void byvalue(int x){ // Τιμής
x = x + 1;
cout << x << endl;
}
void byreference(int &y){ // Αναφοράς
y = y + 1;
cout << y << endl;
}
int main() {
int num = 5;
byvalue(num); // 6
cout << num << endl; // 5
byreference(num); // 6
cout << num << endl; // 6
return 0;
}
Παράδειγμα 4.4
Να δημιουργήσετε πρόγραμμα το οποίο να καλεί μία συνάρτηση με το όνομα swap, η οποία να δέχεται δύο παραμέτρους αναφοράς και να αντιμεταθέτει τις τιμές τους. Το πρόγραμμα αρχικά θα διαβάζει δύο ακέραιους αριθμούς και θα τους αποθηκεύει στις μεταβλητές x και y. Στη συνέχεια, θα καλεί τη συνάρτηση swap η οποία θα δίνει στη μεταβλητή x την τιμή της μεταβλητής y και στην μεταβλητή y την τιμή της μεταβλητής x. Τέλος, να εμφανίζει τις τιμές των μεταβλητών στην οθόνη.
Παράδειγμα εισόδου
13 19
Παράδειγμα εξόδου
x=19 y=13 Λύση: https://ideone.com/3i3G4L
Παράδειγμα 4.5
Να δημιουργήσετε πρόγραμμα το οποίο να καλεί μία συνάρτηση με το όνομα rectangle, η οποία να δέχεται παραμετρικά το μήκος και το πλάτος ενός ορθογωνίου και να επιστρέφει με παραμέτρους αναφοράς στο κυρίως πρόγραμμα, το εμβαδόν και την περίμετρο.
Παράδειγμα εισόδου
10 5
Παράδειγμα εξόδου
Emvadon=50
Perimetros=30 Λύση: https://ideone.com/968lRc
Παράδειγμα 4.6
Με τη χρήση προκαταρκτικής εκτέλεσης, να παρουσιάσετε τα αποτελέσματα του προγράμματος.
Πρόγραμμα: https://ideone.com/2qfjpK
Παράδειγμα 4.6
Πίνακες και συναρτήσεις
● Ένας πίνακας αποτελείται από περισσότερες από μία τιμές, οπότε για να περάσουμε έναν πίνακα σε μία συνάρτηση ως παράμετρο, πρέπει να γίνει κλήση της συνάρτησης με παράμετρο αναφοράς (δηλαδή να περάσουμε τη διεύθυνση του πίνακα).
● Το μέγεθος του πίνακα δεν ορίζεται παραμετρικά στο πρότυπο, ενώ στην κλήση της συνάρτησης δηλώνουμε μόνο το όνομα του πίνακα.
Παράδειγμα 4.7
Να δημιουργήσετε πρόγραμμα το οποίο να χρησιμοποιεί τις συναρτήσεις fill για να γεμίζει και τη συνάρτηση print για να εμφανίζει έναν μονοδιάστατο πίνακα ακεραίων μεγέθους 20 θέσεων.
Λύση: https://ideone.com/qx2Y0x
Παράδειγμα 4.8
Να δημιουργήσετε πρόγραμμα το οποίο να υλοποιεί και να καλεί:(α) τη συνάρτηση read για να διαβάσει και να καταχωρίσει τους βαθμούς και τα ονόματα 25 μαθητών σε πίνακες τους οποίους θα δέχεται παραμετρικά(β) τη συνάρτηση average για να υπολογίσει και να εμφανίσει τον μέσο όρο των βαθμών. Η συνάρτηση θα δέχεται παραμετρικά τον πίνακα των βαθμών και θα επιστρέφει τον μέσο όρο στο κυρίως πρόγραμμα, όπου και θα εμφανίζεται με ένα δεκαδικό ψηφίο(γ) τη συνάρτηση max_grade για να βρει το όνομα του μαθητή με τον ψηλότερο βαθμό. Η συνάρτηση θα δέχεται παραμετρικά τους πίνακες των βαθμών και των ονομάτων και θα επιστρέφει στο κυρίως πρόγραμμα το όνομα του μαθητή με τον υψηλότερο βαθμό. Να θεωρήσετε ότι δεν θα υπάρχει ισοβαθμία βαθμών.
Λύση: https://ideone.com/xV0bZP
Αρχεία και συναρτήσεις
● Αν θέλουμε να χρησιμοποιήσουμε αρχεία σε συνδυασμό με συναρτήσεις, τότε οι εντολές που χρησιμοποιούμε για δημιουργία ροής ανάγνωσης (ifstream) και ροής εγγραφής (ofstream) θα πρέπει να δηλωθούν εκτός της κύριας συνάρτησης.
● Με αυτό τον τρόπο, οι εντολές αυτές θα είναι προσβάσιμες από όσες συναρτήσεις χρησιμοποιήσουμε στο πρόγραμμα.
Παράδειγμα 4.9
Να δημιουργήσετε πρόγραμμα το οποίο να:(α) χρησιμοποιεί τη συνάρτηση fill η οποία να δέχεται ως παράμετρο έναν πίνακα ακεραίων και να τον γεμίζει με τα περιεχόμενα του αρχείου numbers.txt. Το αρχείο numbers.txt θα αποτελείται από Ν (1<=Ν<=100), ακέραιους αριθμούς στο διάστημα [1…10000](β) χρησιμοποιεί τη συνάρτηση square η οποία να δέχεται παραμετρικά έναν ακέραιο αριθμό και να επιστρέφει true, αν ο αριθμός είναι τέλειο τετράγωνο ενός ακεραίου (π.χ. 16, 49), αλλιώς να επιστρέφει false(γ) χρησιμοποιεί τη συνάρτηση print η οποία να καταχωρίζει στο αρχείο squares.txt τα στοιχεία του πίνακα, τα οποία είναι τέλεια τετράγωνα ακέραιων αριθμών.
Λύση: https://ideone.com/hv25uE