Τπολογιςτζσ Ι Ε. Νιςταηάκθσ Αναπλ. Κακθγθτισ Σμιματοσ Φυςικισ 2018-2019 1
Πραγματικζσ και Φανταςτικζσ Ρίηεσ Δευτεροβάκμιασ Εξίςωςθσ Ζςτω θ δευτεροβάκμια εξίςωςθ: ax 2 bx c 0 Η διακρίνουςα είναι: b 2 4ac Όταν θ Δ>0, προκφπτουν πραγματικζσ ρίηεσ: b x1,2 2a Όταν Δ<0, προκφπτουν μιγαδικζσ ρίηεσ: x 1,2 2 b a 2a Τι γίνεται όμωσ με τθ ρίηα αφοφ το υπόριηο είναι αρνθτικό; 2
Πραγματικζσ και Φανταςτικζσ Ρίηεσ Δευτεροβάκμιασ Εξίςωςθσ Ζςτω θ δευτεροβάκμια εξίςωςθ: ax 2 bx c 0 τθν περίπτωςθ αυτι κα πρζπει να χρθςιμοποιθκεί θ φανταςτικι μονάδα, i, για τθν οποία ιςχφει: 2 i 1 Ζτςι, οι ρίηεσ τθσ εξίςωςθσ γράφονται ωσ: 2 b b i b x1,2 i x _ re 2a 2a 2a 2a 2a 2a ix _ im Οπότε, τελικά κα γραφτεί ωσ: printf( x1 = %lf + i%lf\n, x_re, x_im); 3
Πραγματικζσ και Φανταςτικζσ Ρίηεσ Δευτεροβάκμιασ Εξίςωςθσ Ζςτω θ δευτεροβάκμια εξίςωςθ: ax 2 bx c 0 #include <stdio.h> #include <math.h> int main() { double a, b, c, p1, p2, p12; double p1re, p1im, p2re, p2im, dia; printf( Dwste tis times twn: a b c\n ); scanf( %lf %lf %lf, &a, &b, &c); dia = b*b 4*a*c; if(dia<0) { p_re = (-b)/(2*a); p_im = (sqrt(fabs(dia)))/(2*a); printf( p1 = %lf + i%lf\n, p_re, p_im); printf( p2 = %lf - i%lf \n, p_re, p_im); } return 0; } if(dia>=0) { p1 = (-b + sqrt(dia))/(2*a); p2 = (-b - sqrt(dia))/(2*a); printf( p1 = %lf kai p2 = %lf\n,p1,p2); } 4
Πράξεισ Πινάκων (1) Πρόςκεςθ (Αφαίρεςθ) Πινάκων: Α*m][p] +(-) Β*m][p] = C[m][p] Πολλαπλαςιαςμόσ Πινάκων: Α*m][n] B[n][p] = C[m][p] 5
Πράξεισ Πινάκων (2) Πρόςκεςθ Πινάκων: Α*m][p] + Β*m][p] = C[m][p] for (i=0; i<m; ++i) for (j=0; j<p;++j) { c[i][j] = a[i][j]+b[i][j]; printf( \n C[%d][%d] = %lf, i+1, j+1, c[i][j]); } 6
Πράξεισ Πινάκων (3) Πολλαπλαςιαςμόσ Πινάκων: Α*m][n] B[n][p] = C[m][p] for (i=0; i<m; ++i) for (j=0; j<p;++j) { c[i][j] = 0.0; for (k=0; k<n; ++k) c[i][j] = c[i][j] + a[i][k]*b[k][j]; printf( \n C[%d][%d] = %lf, i+1, j+1, c[i][j]); } 7
Πράξεισ Πινάκων (4) Πολλαπλαςιαςμόσ Πινάκων: Α*m][n] B[n][p] = C[m][p] printf( \n ); for (i=0; i<m; ++i) { for (j=0; j<p;++j) { c[i][j] = 0.0; for (k=0; k<n; ++k) c[i][j] = c[i][j] + a[i][k]*b[k][j]; printf( C[%d][%d] = %lf\t, i+1, j+1, c[i][j]); } printf( \n ); } 8
Πράξεισ Πινάκων (5) Πολλαπλαςιαςμόσ Πινάκων: Α*m][n] B[n][p] = C[m][p] #include <stdio.h> int main(void) { int n, m, p, i, j; printf( \n Give number of rows of matrix A, M= ); scanf( %d, &m); printf( \n Give number of columns of matrix A, N= ); scanf( %d, &n); printf( \n Give number of columns of matrix B, P= ); scanf( %d,&p); double a[m][n]; double b[n][p]; double c[m][p];... Return 0; } 9
Εντολι while (1) Σι κάνει θ εντολι while; (α) Επαναλαμβάνει ζνα κομμάτι του προγράμματοσ για όςο διάςτθμα ιςχφει μια ςυγκεκριμζνθ ςυνκικθ. (β) Πρζπει να είναι γνωςτι θ ςυνκικθ από πριν για να ξεκινιςουν οι επαναλιψεισ. Πωσ χρθςιμοποιείται ςτο πρόγραμμα; Οριςμόσ αρχικισ τιμισ τθσ ςυνκικθσ while (ςυνκικθ) {τμιμα του προγράμματοσ που κα επαναλθφκεί και μεταβολι των παραμζτρων τθσ ςυνκικθσ} 10
Εντολι while (2) Σμιμα προγράμματοσ (παραγοντικό του n): while (counter <= n) { par = par*counter; counter = counter + 1; } Σο Πρόγραμμα αυτό τρζχει; Δίνει αποτελζςματα; 11
Εντολι while (2) Σμιμα προγράμματοσ (παραγοντικό του n): counter = 2; par = 1; while (counter <= n) { par = par*counter; counter = counter + 1; } Γιατί το counter ξεκινάει από τθν τιμι 2; Ποιά προκφπτει να είναι θ τιμι του par όταν n=1; 12 Ποιά είναι θ τιμι του counter ωσ προσ το n μετά τθ λιξθ του loop;
Εντολι while (3) Να γραφτεί πρόγραμμα που να υπολογίηει το άκροιςμα και να ςταματάει όταν το 1/n γίνει μικρότερο από μία τιμι ε (epsilon): A n 1 1 n 1 #include <stdio.h> int main(void) { double athroisma = 0.0, oros = 1, epsilon = 0.001; int plithos = 1; while (oros>=epsilon) { athroisma = athroisma + oros; plithos = plithos + 1; oros = 1.0 / plithos; } 1 2... printf( Πλήθος όρων = %d. Άθροισμα σειράς =%6.3f, plithos-1, athroisma); return 0; } 13
Εντολι do while (1) Σι κάνει θ εντολι do while; (α) Επαναλαμβάνει ζνα κομμάτι του προγράμματοσ για όςο διάςτθμα ιςχφει μια ςυγκεκριμζνθ ςυνκικθ. (β) ΔΕΝ Χρειάηεται να είναι γνωςτι θ ςυνκικθ από πριν για να ξεκινιςουν οι επαναλιψεισ. Πρϊτα ξεκινάει με τθν πρϊτθ επανάλθψθ και μετά ελζγχει αν κα ςυνεχίςει. Πωσ χρθςιμοποιείται ςτο πρόγραμμα; do {τμιμα του προγράμματοσ που κα επαναλθφκεί και οριςμόσ/μεταβολι των παραμζτρων τθσ ςυνκικθσ} while (ςυνκικθ) 14
Εντολι do while (2) Να γραφτεί πρόγραμμα που να υπολογίηει το άκροιςμα : A n 1 1 n 1 1 2... #include <stdio.h> int main(void) { double athroisma = 0.0, oros, epsilon = 0.001; int plithos = 1; do { athroisma = athroisma + oros; plithos = plithos + 1; oros = 1.0 / plithos; } while (oros>=epsilon) printf( Πλήθος όρων = %d. Άθροισμα σειράς =%6.3f, plithos-1, athroisma); return 0; } 15
Εντολι do while (2) Να γραφτεί πρόγραμμα που να υπολογίηει το άκροιςμα : A n 1 1 n 1 1 2... #include <stdio.h> int main(void) { double athroisma = 0.0, oros, epsilon = 0.001; int plithos = 1; do { athroisma = athroisma + oros; plithos = plithos + 1; oros = 1.0 / plithos; } while (oros>=epsilon) Γιατί δεν «τρζχει» αυτό το πρόγραμμα; printf( Πλήθος όρων = %d. Άθροισμα σειράς =%6.3f, plithos-1, athroisma); return 0; } 16
Εντολι do while (3) Να γραφτεί πρόγραμμα που να υπολογίηει το άκροιςμα : A n 1 1 n 1 1 2... #include <stdio.h> int main(void) { double athroisma = 0.0, oros, epsilon = 0.001; int plithos = 1; do { oros = 1.0 / plithos; athroisma = athroisma + oros; plithos = plithos + 1; } while (oros>=epsilon); printf( Πλήθος όρων = %d. Άθροισμα σειράς =%6.3f, plithos-1, athroisma); return 0; } 17
Αρχεία (1) Σι ςθμαίνει Δθμιουργώ και τι Αποκθκεφω ςε ζνα αρχείο; (α) Ανοίγω ςε μία περιοχι του δίςκου ζνα αρχείο και του δίνω όνομα, π.χ. results.dat (β) Αποκθκεφω ςε αυτό δεδομζνα τα οποία μπορϊ να τα μεταφζρω (μζςω e- mail, USBstick, DVD, etc). (γ) Η αποκικευςθ των ςτοιχείων γίνεται με ςυγκεκριμζνο τρόπο που πρζπει να είναι ακριβώσ ο ίδιοσ όταν κα χρειαςτεί να τα «διαβάςω» απο το αρχείο για να τα χρθςιμοποιιςω. Σι ςθμαίνει Διαβάηω από ζνα αρχείο; (α) αναςφρω απο τον δίςκο τα ςτοιχεία που ζχουν αποκθκευτεί και τα φζρνω ςτθ μνιμθ του υπολογιςτι μου για επεξεργαςία. (β) πρζπει να δθμιουργιςω ζνα πρόγραμμα το οποίο να ζχει τθ δυνατότθτα να διαβάηει δεδομζνα, που ζχουν αποκθκευτεί με ςυγκεκριμζνο τρόπο ςε κάποιο αρχείο, ςτο δίςκο του ςυςτιματοσ μασ. 18
Αρχεία (2) Δθμιουργία Αρχείου #include <stdio.h> #include <stdlib.h> int main() { FILE* fp; double x, fx; fp=fopen( test1.dat, w ); for(x=-100; x<100; x=x+0.1) { fx = 3*pow(x,4)+2*pow(x,3)-5*x+1; fprintf(fp, %lf, %lf\n, x, fx);} fclose(fp); return 0;} Προζοτή ζηε ζσγθεθρηκέλε βηβιηοζήθε Ορηζκός ηοσ fp, φς ηη; Αλοίγοσκε ηο αρτείο, δίλοληας ηο ζσγθεθρηκέλο ολοκα θαη δειώλοσκε όηη είλαη γηα εγγραθή ζηοητείφλ (w) Μπορούκε λα τρεζηκοποηήζοσκε ηο τ<=100; Αποζήθεσζε ζηο αρτείο, κε ζσγθεθρηκέλο ηρόπο, ζε ζσγθεθρηκέλε ζέζε, θαη ζσγθεθρηκέλοσς ηύποσς δεδοκέλφλ. Κιείλοσκε ηο αρτείο ώζηε λα κελ τρεηάδεηαη λα ηοσ γράυοσκε άιια ζηοητεία. 19
Διάβαςμα Αρχείου int main() { FILE* fp; Αρχεία (3) fp=fopen("test1.dat", "r"); plithos=0.; athroisma_x=0.; // Αρχικοποίθςθ τιμών athroisma_x2=0.; while(!feof(fp)){ fscanf(fp, "%lf, %lf", &timi_x, &timi_f); plithos +=1; athroisma_x += timi_f; athroisma_x2 += pow(timi_f,2);} mesos = athroisma_x/plithos; diaspora = athroisma_x2/plithos+pow(mesos,2.); fclose(fp); return 0; } // ΠΑΝΤΑ με τον ίδιο τρόπο που ζγινε το SAVE 20
Διάβαςμα Αρχείου #include <stdio.h> #include <stdlib.h> Αρχεία (4) int main() { FILE* fp; double timi_f, athroisma_x, athroisma_x2, mesos, diaspora, timi_x, plithos; fp=fopen("test1.dat", "r"); plithos=0.; athroisma_x=0.; Για να μποροφμε να ςυνεχίςουμε τθν άκροιςθ ζχοντασ ζνα ςθμείο αναφοράσ-εκκινθςθσ athroisma_x2=0.; while(!feof(fp)){ fscanf(fp, "%lf, %lf", &timi_x, &timi_f); ΠΑΝΤΑ με τον ίδιο τρόπο που ζγινε το SAVE plithos +=1; athroisma_x += timi_f; athroisma_x2 += pow(timi_f,2);} mesos = athroisma_x/plithos; diaspora = athroisma_x2/plithos+pow(mesos,2.); printf("\nn = \t %lf\n", plithos); Μπορϊ να γράψω: fprintf("\nn = \t %lf\n", plithos);??? printf("mesos = \t %lf\n", mesos); Τι αλλαγζσ πρζπει να κάνω; printf("diaspora = \t%lf \n", diaspora); fclose(fp); return 0; } 21
Μζκοδοι Ολοκλιρωςθσ υναρτιςεων f(x) υνάρτθςθ x 1 x 2 x N+1 a b Διαμζριςθ ςε Ν μικρά Σραπζηια ι Παραλλθλόγραμμα. Αρα το βιμα ςτον άξονα x κα είναι: dx=(b-a)/n x 26
Μζκοδοι Ολοκλιρωςθσ υναρτιςεων Μζκοδοσ Σραπεηίου (1) 27 dx dx a f a f dx x f x f B b de 2 ) ( ) ( 2 ) ( ) ( 2 2 1 1 Κάκε ςτοιχειώδεσ Τραπζηιο κα ζχει εμβαδό: dx dx a f dx a f dx x f x f B b de 2 ) 2 ( ) ( 2 ) ( ) ( 2 3 2 2 dx b f dx b f dx x f x f B b de N N N 2 ) ( ) ( 2 ) ( ) ( 2 1 1.. +.
Μζκοδοι Ολοκλιρωςθσ υναρτιςεων Μζκοδοσ Σραπεηίου (2) Σο ςυνολικό ολοκλιρωμα, κα ιςοφται με το άκροιςμα των ςτοιχειωδϊν εμβαδϊν τραπεηίων και κα υπολογίηεται ωσ: E de dx 1 de dx 2 f ( x ) f ( x )... f ( x ) f ( x ) f ( x ) 1 2... de 2 N 1 N 1 1 N 1 28
Μζκοδοι Ολοκλιρωςθσ υναρτιςεων Μζκοδοσ Σραπεηίου (3) υνάρτθςθ: f(x) = cos(x) sum = 0.0; for (i=0; i<n+1; ++i) sum = sum + cos(a+dx*i)*dx; sum -= 0.5*dx*(cos(a)+cos(b)); 29
Μζκοδοι Ολοκλιρωςθσ υναρτιςεων Μζκοδοσ Σραπεηίου (4) (γενικά) ςυνάρτθςθ: f(x) sum = 0.0; for (i=0; i<n+1; ++i) sum = sum + f(a+dx*i)*dx; sum -= 0.5*dx*(f(a)+f(b)); 30
Σι είναι υποπρόγραμμα; Σι είναι υποπρόγραμμα, βοθκθτικι ςυνάρτθςθ, function; Μία ςυνάρτθςθ ι υποπρόγραμμα είναι μία ανεξάρτθτθ και αυτόνομθ ενότθτα κϊδικα, που γράφεται για να εκτελεί μία οριςμζνθ εργαςία και προαιρετικά επιςτρζφει μία τιμι ςτο πρόγραμμα που τθν κάλεςε. Γιατί χρθςιμοποιοφμε τα βοθκθτικά προγράμματα; (1) Επανάλθψθ παρόμοιασ διαδικαςίασ (π.χ. Σο πρόγραμμα πολλαπλαςιαςμοφ και άκροιςθσ ι αφαίρεςθσ πινάκων). (2) Μια διαδικαςία που μπορεί αυτοφςια να χρθςιμοποιθκεί και ςε άλλα προγράμματα. (3) Εφκολοσ ζλεγχοσ του ςυνολικοφ προγράμματοσ. (4) ωςτότερθ δομι του προγράμματοσ. 31
Οριςμόσ τθσ Function ςτο Πρόγραμμα Οριςμόσ τθσ function ςτο πρόγραμμα, ονομάηεται θ διλωςθ των ςθμαντικϊν τθσ ςτοιχείων, δθλαδι του ονόματόσ τθσ, των παραμζτρων τθσ (οριςμάτων τθσ) και του τφπου τθσ πικανισ επιςτρεφόμενθσ τιμισ τθσ ςυνάρτθςθσ Η γενικι περίπτωςθ διλωςθσ μίασ ςυνάρτθςθσ ζχει τθν παρακάτω μορφι: Σο όνομα_σσνάρτησης πρζπει να είναι μοναδικό μζςα ςτο πρόγραμμα, δθλαδι να μθν υπάρχει άλλθ μεταβλθτι ι ςυνάρτθςθ με το ίδιο όνομα Η διλωςθ τθσ ςυνάρτθςθσ πρζπει να τελειϊνει πάντοτε με το ελλθνικό ερωτθματικό ; 34
Ποφ δθλϊνουμε τθ υνάρτθςθ; Η διλωςθ μίασ ςυνάρτθςθσ πρζπει να ςυμπεριλθφκεί ςτθν αρχι του προγράμματοσ (μετά τα #include ). Π.χ. οι δθλϊςεισ των ςυναρτιςεων printf(), scanf(), βρίςκονται ςτθ βιβλιοκικθ stdio.h θ οποία ςυμπεριλαμβάνεται ςτο πρόγραμμα μζςω τθσ εντολισ: #include <stdio.h>. Αντίςτοιχα οι δθλϊςεισ των ςυναρτιςεων pow(), sin(), cos(), βρίςκονται ςτθ βιβλιοκικθ math.h θ οποία ςυμπεριλαμβάνεται ςτο πρόγραμμα μζςω τθσ εντολισ: #include <math.h>. Η διλωςθ τθσ ςυνάρτθςθσ γίνεται πριν από τθ ςυνάρτθςθ int main(). 35
Σι επιςτρζφει θ ςυνάρτθςθ; Ο τύπος_επιστρουής μίασ ςυνάρτθςθσ κακορίηει τον τφπο δεδομζνων που επιςτρζφει θ ςυνάρτθςθ ςτο πρόγραμμα, ςτο ςθμείο που τθν κάλεςε. Ο τύπος_επιστρουής μπορεί να είναι οποιοςδιποτε τφποσ δεδομζνων τθσ C, όπωσ int, double, δείκτθσ, κλπ. Ο τφποσ επιςτροφισ void χρθςιμοποιείται όταν θ ςυνάρτθςθ δεν επιςτρζφει κάποια τιμι. 36
Ορίςματα ςυνάρτθςθσ Η ςυνάρτθςθ μπορεί να δεχτεί μία λίςτα οριςμάτων, που χωρίηονται μεταξφ τουσ με κόμμα (,). Ο τφποσ κάκε παραμζτρου (τύπος_παραμ_1, τύπος_παραμ_2,...) μπορεί να είναι μία οποιαδιποτε ζγκυρθ ζκφραςθ τθσ C, όπωσ π.χ. μία ςτακερά, μία μεταβλθτι, μία μακθματικι ι λογικι ζκφραςθ κλπ. Σο όνομα κάκε παραμζτρου (όνομα_1, όνομα_2,...) μπορεί να είναι οποιοδιποτε ζγκυρο όνομα επιλζξει ο προγραμματιςτισ (μόνο λατινικοι χαρακτιρεσ, ποτζ Ελλθνικά γράμματα) Εάν θ ςυνάρτθςθ δεν δζχεται παραμζτρουσ, τότε θ λίςτα παραμζτρων δθλϊνεται ωσ (void) ι με κενι παρζνκεςθ (). Προτιμάται θ περίπτωςθ του (void). 37
Παραδείγματα (διλωςθσ) ςυνάρτθςεων Πωσ αλλιϊσ κα μποροφςε να δθλωκεί (ωσ προσ το όριςμα); Πωσ κα γραφόταν αν δεν επζςτρεφε τιποτα; Αν είχε για ορίςματα δφο long float; 38
θμαντικζσ Παρατθριςεισ Η κφρια ςυνάρτθςθ main() ενόσ προγράμματοσ ςτθ C είναι μία ςυνάρτθςθ, επίςθσ. Η main() καλείται από το λειτουργικό ςφςτθμα όταν αρχίηει θ εκτζλεςθ του προγράμματοσ και τερματίηεται όταν τελειϊνει θ εκτζλεςθ του προγράμματοσ Η διλωςθ int main() ι int main(void), ςθμαίνει ότι θ ςυνάρτθςθ ότι δεν δζχεται παραμζτρουσ και επιςτρζφει μία ακζραια τιμι (int). θμαντικό ςχόλιο: Σο όνομα μίασ ςυνάρτθςθσ πρζπει να επιλζγεται με τζτοιο τρόπο, ϊςτε να περιγράφει όςο το δυνατόν καλφτερα τον ςκοπό τθσ Δθλαδι, αν κζλετε να δθλϊςετε μία ςυνάρτθςθ που να υπολογίηει το άκροιςμα κάποιων αρικμϊν, τότε ζνα επιτυχθμζνο περιγραφικό όνομα κα μποροφςε να είναι το sum ι το athroisma και όχι ζνα όνομα όπωσ function, func, test, dokimi, programma1, κλπ. 39
Τποπρόγραμμα ςυνάρτθςθσ Σο υποπρόγραμμα τθσ ςυνάρτθςθσ ζπεται τθσ επικεφαλίδασ τθσ και περιζχει τισ εντολζσ τθσ ςυνάρτθςθσ ανάμεςα ςε άγκιςτρα {}, όπωσ ςυμβαίνει και ςτθ ςυνάρτθςθ main(). Η επικεφαλίδα τθσ ςυνάρτθςθσ πρζπει να είναι ίδια με τθ διλωςθ τθσ ςυνάρτθςθσ, με τθ διαφορά ότι δεν μπαίνει το ελλθνικό ερωτθματικό ςτο τζλοσ τθσ. Σο υποπρόγραμμα τθσ ςυνάρτθςθσ εκτελείται μόνο όταν αυτι κλθκεί από κάποιο ςθμείο του κυρίωσ προγράμματόσ μασ. Όταν καλείται μία ςυνάρτθςθ, θ εκτζλεςθ του προγράμματοσ τθσ αρχίηει με τθν πρϊτθ εντολι τθσ και τερματίηεται είτε όταν βρεκεί μία εντολι return είτε όταν θ εκτζλεςθ φτάςει ςτο άγκιςτρο κλειςίματοσ. Σο πρόγραμμα μίασ ςυνάρτθςθσ ειςάγεται μετά το τζλοσ τθσ ςυνάρτθςθσ main(). 40
Πωσ λειτουργεί θ εντολι return ςε μια ςυνάρτθςθ (1) Η εντολι return χρθςιμοποιείται για τον άμεςο τερματιςμό μίασ ςυνάρτθςθσ. Όταν το πρόγραμμα τθσ ςυνάρτθςθσ φτάςει ςε μία εντολι return, τότε θ ςυνάρτθςθ τερματίηεται αυτομάτωσ ανεξάρτθτα απο το αν επιςτρζφει ι όχι κάτι ςτο κυρίωσ πρόγραμμα. Σι κάνει θ εντολι while ςτο παρακάτω πρόγραμμα; Με ποιζσ τιμζσ τερματίηει το παρακάτω πρόγραμμα και γιατί; Σι εξοδο δίνει το πρόγραμμα αυτό ςτθν οκόνθ; 41
Πωσ λειτουργεί θ εντολι return ςε μια ςυνάρτθςθ (2) Αν θ ςυνάρτθςθ δεν ζχει οριςτεί να επιςτρζφει κάποια τιμι (δθλ. αν ο επιςτρεφόμενοσ τφποσ τθσ είναι void ή κενό), τότε για να τερματίςουμε άμεςα ςε κάποιο ςθμείο τθ ςυνάρτθςθ - γράφουμε απλά return; Αν, όμωσ, θ ςυνάρτθςθ ζχει οριςτεί να επιςτρζφει κάποια τιμι, τότε θ εντολι return πρζπει να ακολουκείται από κάποια τιμι (Σι ςυμβαίνει ςτθν main();). Αυτι θ τιμι επιςτρζφεται ςτο πρόγραμμα που τθν κάλεςε. Ο τφποσ τθσ τιμισ που επιςτρζφεται πρζπει να είναι ίδιοσ (δθλαδι int, double, char, κλπ) με τον τφπο που ορίςτθκε να επιςτρζφει θ ςυνάρτθςθ ςτθ διλωςι τθσ, δθλαδι ςτο πρωτότυπό τθσ. 42
Παραδείγματα ςυναρτιςεων (1) Σι ορίςματα ζχει θ ςυνάρτθςθ αυτι και τι επιςτρζφει όταν τθν καλζςει το κυρίωσ πρόγραμμα; Ποφ τερματίηεται αυτι θ ςυνάρτθςθ, αφοφ δεν περιζχει τθν εντολι return; Γιατί για τθν παράμετρο i ορίηουμε τον τφπο τθσ; Γιατί δεν χρειάηεται να οριςτεί ο τφποσ των a, b; 43
Παραδείγματα ςυναρτιςεων (2) Σι κάνει θ ςυνάρτθςθ αυτι; Σι δζχεται ωσ όριςμα και τι επιςτρζφει ςτο πρόγραμμα; Ποφ τερματίηεται θ ςυνάρτθςθ αυτι; 44
Παραδείγματα ςυναρτιςεων (3) Ποιά είναι τα ορίςματα τθσ ςυνάρτθςθσ αυτισ και τι επιςτρζφει ςτο πρόγραμμα όταν τρζξει; Σι δίνει θ ςυνάρτθςθ αυτι όταν τρζχει; Σι επιςτρζφει ςτο κυρίωσ πρόγραμμα; Επιζηρέθονηαι ακέραιες ηιμές ΠΡΟΟΧΗ: δεν επιηρέπεηαι η επιζηροθή άλλοσ ηύποσ (π.τ. δεκαδικού) Πότε ςταματάει θ εξζλιξθ αυτοφ του υποπρογράμματοσ; Όταν μία ςυνάρτθςθ επιςτρζφει κάποια τιμι, κα πρζπει όλα τα δυνατά «μονοπάτια» τθσ, να επιςτρζφουν κάποια τιμι. Σι γίνεται όταν δεν επιςτρεφουν τιμι όλεσ οι δυνατζσ διαδρομζσ; 45
Κλιςθ ςυνάρτθςθσ Όταν καλείται μία ςυνάρτθςθ, το πρόγραμμα ςυνεχίηει με τθν εκτζλεςθ του κώδικα τθσ ςυνάρτθςθσ. Όταν τερματίηεται θ ςυνάρτθςθ, θ εκτζλεςθ του προγράμματοσ επιςτρζφει ςτο ςθμείο κλιςθσ τθσ ςυνάρτθςθσ και ςυνεχίηει με τθν εκτζλεςθ τθσ επόμενθσ εντολισ του κυρίωσ προγράμματοσ. Μία ςυνάρτθςθ μπορεί να κλθκεί όςεσ φορζσ είναι απαραίτθτο για τουσ ςκοποφσ του προγράμματοσ (π.χ. επανάλθψθ παρόμοιων διαδικαςιϊν). Όταν γίνεται θ κλιςθ μίασ ςυνάρτθςθσ, ο μεταγλωττιςτισ δεςμεφει μνιμθ για να αποκθκεφςει τισ μεταβλθτζσ που δθλϊνονται ςτθ λίςτα παραμζτρων τθσ ςυνάρτθςθσ, κακϊσ και αυτζσ που δθλϊνονται μζςα ςτο ςϊμα τθσ. Αυτι θ μνιμθ δεςμεφεται από ζνα ςυγκεκριμζνο τμιμα μνιμθσ που παρζχει το λειτουργικό ςφςτθμα ςτο πρόγραμμα και ονομάηεται ςτοίβα (stack). Η αποδζςμευςθ τθσ μνιμθσ αυτισ γίνεται αυτόματα όταν τερματιςτεί θ εκτζλεςθ τθσ ςυνάρτθςθσ. 46
Κλιςθ ςυνάρτθςθσ χωρίσ παραμζτρουσ Η κλιςθ μία ςυνάρτθςθσ που δεν δζχεται παραμζτρουσ ςθμαίνει ότι δεν τθσ μεταβιβάηεται κάποια πλθροφορία και άρα κάνει κάτι απολφτωσ ςυγκεκριμζνο που το επαναλαμβάνει κάκε φορά που κα κλθκεί από το πρόγραμμα ι από κάποια άλλθ ςυνάρτθςθ. Η κλιςθ μίασ τζτοιασ ςυνάρτθςθσ γίνεται γράφοντασ (μζςα ςτο πρόγραμμα, ςτο ςθμείο που επικυμοφμε να τθν καλζςουμε) το όνομά τθσ, ακολουκοφμενθ από κενζσ παρενκζςεισ. 47
Παράδειγμα ςυνάρτθςθσ χωρίσ παραμζτρουσ που δεν επιςτρζφει τιμι Σι ορίςματα ζχει και τι ζξοδο δίνει θ ςυνάρτθςθ αυτι; Θα δϊςει διαφορετικό αποτζλεςμα κάκε φορά που κα τρζχει θ ςυνάρτθςθ αυτι; Σι ακριβϊσ κάνει θ ςυνάρτθςθ κάκε φορά που τθν καλοφμε; Ένξδξπ: Call_1 In In Call_2 In In Σι αποτζλεςμα κα δϊςει το πρόγραμμα όταν κα τρζξει; 48
Παράδειγμα ςυνάρτθςθσ χωρίσ παραμζτρουσ που επιςτρζφει τιμι Σι ορίςματα ζχει και τι ζξοδο δίνει θ ςυνάρτθςθ αυτι; Θα δϊςει διαφορετικό αποτζλεςμα κάκε φορά που κα τρζχει θ ςυνάρτθςθ αυτι; Σι ακριβϊσ κάνει θ ςυνάρτθςθ κάκε φορά που τθν καλοφμε; Σι αποτζλεςμα κα δϊςει το πρόγραμμα όταν κα τρζξει; 49 Ένξδξπ: Sum = 30
Κλιςθ ςυνάρτθςθσ με παραμζτρουσ Η κλιςθ μίασ ςυνάρτθςθσ που δζχεται παραμζτρουσ ςθμαίνει ότι ςτθ ςυνάρτθςθ μεταβιβάηεται πλθροφορία μζςω των παραμζτρων τθσ και άρα, ανάλογα με τισ παραμζτρουσ αυτζσ δίνει (επιςτρζφει ςτο πρόγραμμα) διαφορετικό αποτζλεςμα κάκε φορά. Η κλιςθ μίασ τζτοιασ ςυνάρτθςθσ, αφοφ πρϊτα δθλωκεί, γίνεται γράφοντασ το όνομά τθσ και μζςα ςε παρενκζςεισ μία λίςτα παραμζτρων Σο πλικοσ και ο τφποσ των παραμζτρων τθσ, κα πρζπει να είναι ςε απόλυτθ ςυμφωνία με τθ διλωςθ τθσ ςυνάρτθςθσ. π.χ. αν μία ςυνάρτθςθ ζχει δθλωκεί να ζχει δφο ακζραιεσ παραμζτρουσ, τότε ςτθν κλιςθ τθσ ςυνάρτθςθσ πρζπει να τθσ διοχετεφονται υποχρεωτικά δφο ακζραιεσ τιμζσ, και όχι μία ι περιςςότερεσ από δυο, ανεξάρτθτα από το πόςεσ είναι μθ μθδενικζσ. Ο μεταγλωττιςτισ ελζγχει αν το πλικοσ και ο τφποσ των παραμζτρων ςυμφωνοφν με τθ διλωςθ τθσ ςυνάρτθςθσ Αν δεν υπάρχει ςυμφωνία είτε ςτο πλικοσ είτε ςτον τφπο των παραμζτρων, τότε ενθμερϊνει τον προγραμματιςτι με ζνα λάκοσ μεταγλώττιςθσ. 50
Παράδειγμα εκχϊρθςθσ κζςεων μνιμθσ 51
Δθλαδι... Όταν εκτελείται το προθγοφμενο πρόγραμμα, ο μεταγλωττιςτισ δεςμεφει 8 κζςεισ μνιμθσ (π.χ. 100-107) για τθν αποκικευςθ των τιμϊν (10 και 20) των ακζραιων μεταβλθτϊν a και b αντίςτοιχα Όταν καλείται θ ςυνάρτθςθ function() ο μεταγλωττιςτισ δεςμεφει άλλεσ 8 κζςεισ μνιμθσ (π.χ. 2000-2007) για τθν αποκικευςθ των τιμϊν των ακζραιων μεταβλθτϊν x και y τθ ςυνζχεια, αντιγράφει τισ τιμζσ των παραμζτρων a και b (δθλ. 10 και 20) ςτισ αντίςτοιχεσ κζςεισ μνιμθσ των μεταβλθτϊν x και y Όπωσ φαίνεται λοιπόν οι διευκφνςεισ μνιμθσ των μεταβλθτϊν x και y είναι διαφορετικζσ από τισ διευκφνςεισ μνιμθσ των ακζραιων μεταβλθτϊν a και b Ωςτόςο, τα περιεχόμενα των διευκφνςεων μετά τθν αντιγραφι είναι τα ίδια. Η αποδζςμευςθ αυτισ τθσ μνιμθσ (π.χ. 2000-2007) γίνεται αυτόματα, όταν τερματιςτεί θ εκτζλεςθ τθσ ςυνάρτθςθσ function() Πάντα ακολουκείται αυτι θ διαδικαςία; 52
Μεταβίβαςθ παραμζτρων ςε ςυνάρτθςθ Δφο είναι οι διαφορετικοί τρόποι μεταβίβαςθσ παραμζτρων ςε μία ςυνάρτθςθ Κλιςθ μζςω τιμισ (call by value) Κλιςθ μζςω αναφοράσ (call by reference) 53
Κλιςθ ςυνάρτθςθσ μζςω τιμισ (call by value) Όταν γίνεται κλιςθ ςυνάρτθςθσ μζςω τιμισ, τότε ςτθ ςυνάρτθςθ διοχετεφονται οι τιμζσ των παραμζτρων του προγράμματοσ που τθν καλεί. Οποιαδιποτε αλλαγι γίνει ςτισ τιμζσ των παραμζτρων μζςα ςτο ςώμα τθσ ςυνάρτθςθσ δεν επθρεάηει τισ τιμζσ των αντίςτοιχων παραμζτρων που διοχετεφκθκαν ςτθ ςυνάρτθςθ απο το κυρίωσ πρόγραμμα, γιατί οι τυχόν αλλαγζσ γίνονται ςε διαφορετικζσ διευκφνςεισ μνιμθσ (όπωσ είδαμε ςε προθγοφμενθ διαφάνεια). 54
Κλιςθ υνάρτθςθσ μζςω αναφοράσ (call by reference) Όταν κζλουμε μία ςυνάρτθςθ να μπορεί να αλλάξει τισ τιμζσ των παραμζτρων, τότε πρζπει να γίνει κλιςθ τθσ ςυνάρτθςθσ μζςω αναφοράσ. ε αυτι τθν περίπτωςθ, ςτθ ςυνάρτθςθ διοχετεφονται οι διευκφνςεισ μνιμθσ των παραμζτρων του προγράμματοσ που τθν καλεί και όχι οι τιμζσ τουσ (γεγονόσ που πραγματοποιείται κατά τθν κλιςθ μζςω τιμισ). Επομζνωσ, αφοφ θ ςυνάρτθςθ ζχει πρόςβαςθ ςτισ διευκφνςεισ των παραμζτρων του προγράμματοσ που τθν κάλεςε, τότε μπορεί να μεταβάλλει τισ τιμζσ αυτϊν. 55
Διαχείρθςθ μνιμθσ για κλιςθ ςυνάρτθςθσ μζςω τιμισ Ένξδξπ: Val = 10 56
Διαχείρθςθ μνιμθσ για κλιςθ ςυνάρτθςθσ μζςω αναφοράσ Ένξδξπ: Val = 20 Kαταχωρεί το i=10 το οποίο αποκθκεφεται ςτισ διευκφνςεισ 100-103. Οριηει τθν ptr ωσ τθ διεφκυνςθ που ζχει αποκθκευτεί το i. τζλνει ςτθν function(ptr) τθ διεφκυνςθ που ζχει καταχωρθκεί το περιεχόμενο του i. Aλλάηει απευκείασ, το περιεχόμενο, ςτθν function. 57
Παράδειγμα διαχείρθςθσ μνιμθσ για κλιςθ ςυνάρτθςθσ μζςω τιμισ και μζςω αναφοράσ Ένξδξπ: 300 200 Δηεύζσλζε Μλήκες 152 153 154 155 156 157 158 159.. RAM Περηετόκελο Μλήκες 0 0 0 100 0 0 0 200 2000 0 2001 0 2002 0 2003 2004 0 2005 0 2006 0 2007.. 152 200 58
Παραδείγματα (1) Οι κλιςεισ των ςυναρτιςεων scanf() και printf() με ποιον από τουσ δφο τρόπουσ κλιςθσ μίασ ςυνάρτθςθσ γίνονται ςτο παρακάτω παράδειγμα; Απάμηηζη: scanf(): κλήζη μέζω αναθοράς (αθού διαβιβάζεηαι η διεύθσνζη μίας μεηαβληηής) printf(): κλήζη μέζω ηιμής (αθού διαβιβάζεηαι η ηιμή μίας μεηαβληηής) 59
Παραδείγματα (2) Δθμιουργιςτε μία ςυνάρτθςθ που να δζχεται ςαν παράμετρο ζναν πραγματικό αρικμό και να επιςτρζφει το εμβαδό του αντίςτοιχου κφκλου. τθ ςυνζχεια γράψτε ζνα πρόγραμμα το οποίο να διαβάηει το μικοσ τθσ ακτίνασ και να εμφανίηει το εμβαδό του κφκλου με χριςθ τθσ προθγοφμενθσ ςυνάρτθςθσ 60
Παραδείγματα (3) Δθμιουργιςτε μία ςυνάρτθςθ που να δζχεται ςαν παράμετρο ζναν ακζραιο αρικμό και ζναν χαρακτιρα και να εμφανίηει τον χαρακτιρα τόςεσ φορζσ όςεσ και θ τιμι του ακεραίου τθ ςυνζχεια γράψτε ζνα πρόγραμμα το οποίο να διαβάηει ζναν ακζραιο αρικμό και ζναν χαρακτιρα και να εμφανίηει τον χαρακτιρα τόςεσ φορζσ όςο και ο ακζραιοσ (με χριςθ τθσ ςυνάρτθςθσ) 61
Παραδείγματα (4) Ποια είναι θ ζξοδοσ του παρακάτω προγράμματοσ; Ένξδξπ: 13 62
Παραδείγματα (5) Δθμιουργιςτε μία ςυνάρτθςθ που να δζχεται ςαν παράμετρο ζναν ακζραιο αρικμό (n) και να επιςτρζφει τθν τιμι τθσ παράςταςθσ: 1 3 + 2 3 + 3 3 +... + n 3 τθ ςυνζχεια γράψτε ζνα πρόγραμμα το οποίο να διαβάηει ζναν κετικό ακζραιο αρικμό μζχρι 1000 και να εμφανίηει τθν τιμι τθσ παραπάνω παράςταςθσ με χριςθ τθσ ςυνάρτθςθσ 63
Εμβζλεια Μεταβλθτϊν Κάκε μεταβλθτι που δθλϊνεται ςε ζνα πρόγραμμα (π.χ. απλι μεταβλθτι, πίνακασ, δείκτθσ, δομι,...) αποκτά μία εμβζλεια μζςα ςε αυτό Ο όροσ εμβζλεια αναφζρεται ςτο κατά πόςο τα διαφορετικά τμιματα του προγράμματοσ ζχουν πρόςβαςθ ςε αυτι τθ μεταβλθτι Σα διαφορετικά είδθ μεταβλθτϊν βάςει τθσ εμβζλειάσ των είναι: Οι κακολικζσ μεταβλθτζσ (global variables) Οι τοπικζσ μεταβλθτζσ (local variables) 64
Κακολικζσ Μεταβλθτζσ (global) Μία μεταβλθτι που δθλϊνεται ζξω από οποιαδιποτε ςυνάρτθςθ ονομάηεται κακολικι (global) μεταβλθτι Η εμβζλεια μίασ κακολικισ μεταβλθτισ εκτείνεται ςε όλο το πρόγραμμα Αυτό ςθμαίνει ότι όλεσ οι ςυναρτιςεισ του προγράμματοσ ζχουν πρόςβαςθ ςε αυτι τθ μεταβλθτι, άρα μποροφν να τροποποιιςουν τθν τιμι τθσ 65
χόλια... Να δθλϊνετε μία μεταβλθτι ςαν κακολικι, μόνο όταν οι περιςςότερεσ ςυναρτιςεισ του προγράμματόσ ςασ πρζπει να τθ χρθςιμοποιοφν. Σο όνομα μίασ κακολικισ μεταβλθτισ πρζπει να επιλζγεται, ζτςι ϊςτε να περιγράφει όςο το δυνατόν καλφτερα τον ςκοπό τθσ. Να δίνετε αρχικι τιμι (να κάνετε δθλ. ρθτι αρχικοποίθςθ) ςε μία κακολικι μεταβλθτι, αμζςωσ όταν τθ δθλϊνετε 66
Παράδειγμα 1 Ποια είναι θ ζξοδοσ του παρακάτω προγράμματοσ??? Ένξδξπ: Value = 1 Value = 10 Value = 20 67
Παράδειγμα 2 Ποια είναι θ ζξοδοσ του παρακάτω προγράμματοσ??? Ένξδξπ: Ι_test = 200 I_main = 10 68
Παράδειγμα 3 Ποια είναι θ ζξοδοσ του παρακάτω προγράμματοσ??? Ένξδξπ: Values: 100 100 69
Αναδρομικι υνάρτθςθ 1 Αμ ξ χοήζηηπ πληκηοξλξγήζει 3: Ένξδξπ: val = 1 val = 2 val = 3 Διόηι, όηαν μία ζσνάρηηζη καλεί ηον εασηό ηης, οι επόμενες ενηολές ηοσ ζώμαηός ηης καθώς και οι ηιμές ηων εμπλεκόμενων μεηαβληηών (οι οποίες αποθηκεύονηαι) παραμένοσν ζηη μνήμη. Όηαν η ζσνάρηηζη ζηαμαηήζει να καλεί ηον εασηό ηης, οι αποθηκεσμένες ενηολές εκηελούνηαι με ανηίζηροθη ζειρά (δηλ. από ηην ηελεσηαία προς ηην πρώηη) 70
Αναδρομικι υνάρτθςθ 2 Γράψτε ζνα πρόγραμμα το οποίο να διαβάηει ζναν ακζραιο αρικμό (n) και να εμφανίηει το παραγοντικό του (n!) με χριςθ αντίςτοιχθσ αναδρομικισ ςυνάρτθςθσ 71 C: Από τθ Θεωρία ςτθν Εφαρμογι 11 ο Κεφάλαιο
Παράδειγμα 2 #include <stdio.h> double fun(double); int main() { double a1; printf( Dvse enan arithmo ); scanf( %lf,&a1); printf( f(%lf) = %lf, a1, fun(a1)); return 0; } double fun(double x1) { double f1, f2, f3, f4; f1 = x1*x1*x1; f2 = x1*x1; f3 = x1 + 4; f4 = f1 + f2 + f3; return f4; } 73
#include <stdio.h> int paragontiko(int); int main() { int n, k, ar, par1, par2, res; printf( Dvse ton arithmo twn stoixeiwn (n) ); scanf( %d,&n); printf( Dvse ton arithmo twn thesewn (k) ); Παράδειγμα 3 scanf( %d,&k); ar = paragontiko(n); par1 = paragontiko(k); par2 = paragontiko(n-k); res = ar/(par1*par2); printf( (%d ana %d) = %d, n, k, res); return 0; } 74
#include <stdio.h> int paragontiko(int); int main() { int n, k, ar, par1, par2, res; printf( Dvse ton arithmo twn stoixeiwn (n) ); scanf( %d,&n); printf( Dvse ton arithmo twn thesewn (k) ); n k n! k!( n k)! Παράδειγμα 3 scanf( %d,&k); ar = paragontiko(n); par1 = paragontiko(k); par2 = paragontiko(n-k); res = ar/(par1*par2); printf( (%d ana %d) = %d, n, k, res); return 0; } Η ςχζςθ αυτι υπολογίηει το πλικοσ των δυνατϊν ςυνδυαςμϊν που μποροφν να τοποκετθκοφν n 75 αντικείμενα ςε k ςυγκεκριμζνεσ κζςεισ
#include <stdio.h> int paragontiko(int); int n_ana_k(int,int); int main() { int n, k, ar, par1, par2, res; printf( n=? ); scanf( %d,&n); printf( k=? ); scanf( %d,&k); printf( (%d ana %d) = %d, n, k, n_ana_k(n, k)); return 0; } int n_ana_k (int n1, int k1) { int nk1; if (k1>n1) Παράδειγμα 4 nk1 = 0; else nk1 = paragontiko(n)/( paragontiko(k)* paragontiko(n-k)); return nk1; } int paragontiko(int x1) { int i,f1=1; if (x1>1) for (i=1; i<=x1; i++) f1 = f1*i; return f1; } 76