Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilVítězslav Horáček
1
OSNOVA: a)Funkce – úvod b) Hlavičky funkcí c) Rekurze funkcí d)Knihovny funkcí e)Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro obor EST BPC1E PŘEDNÁŠKA 7
2
Funkce – úvod (1/3) Funkce: posloupnost příkazů uvedená hlavičkou Využití: – opakovaně volaná sekvence = jeden kód pro danou část vykonávaného algoritmu, ušetří se programová paměť – strukturování programu = funkce pro danou skupinu úloh (algoritmů) jsou zapouzdřeny ve společné knihovně (nezávislý soubor), volání dané funkce se provádí jen předáváním parametrů v hlavičce – např. y=cos(x), zdrojový soubor pro vykonání kosinu je skrytý v knihovním souboru – ošetření událostí = v případě vzniku události na základě přerušení (aktivační signál) se zavolá příslušná funkce, např. pohyb myší zavolá funkci, která přepočítá novou pozici kurzoru
3
Co se děje při volání funkce: Funkce – úvod (2/3)
4
Základní dělení funkcí: - funkce bez parametru - funkce s parametrem - volané parametrem – nezmění obsah vstupních pro- měnných, ty jsou kopírovány do nových proměnných alokovaných během provádění funkce - volané odkazem – mohou měnit obsah vstupních proměnných, předává se adresa proměnné, proto ji lze kdykoli během vykonávání funkce změnit) -funkce s/bez návratové hodnoty – pokud potřebujeme vrátit více než jednu hodnotu (výstup), musíme místa pro uložení výstupů definovat jako volání odkazem Funkce – úvod (3/3)
5
Hlavičky funkcí (1/13) void func_name(void) { } void warning(void) // no input, no output { printf("Your computer is being destroyed"); getchar(); } void main(void) { warning(); // calling the function } Funkce bez parametru a bez návratové hodnoty:
6
double func_name(double A) { } int pow3(int A) // 1 input, 1 output { int y = A*A*A; return y; } Funkce s jedním parametrem volaným hodnotou a s návratovou hodnotou: void main(void) { int n; for(n=0; n<20; n++) printf("%d^3 is %d\n", n, pow3(n)); } Hlavičky funkcí (2/13)
7
double func_name(double A, double B) { } float pow_n(float A, int B) // 2 inputs, 1 output { float y=1; int n; for(n=0; n<=B; n++) if(n>0) y*=A; return y; } Funkce se dvěma parametry volanými hodnotou a s návratovou hodnotou: Funkce pro n-tou mocninu racionálního čísla Hlavičky funkcí (3/13)
8
int main(void) { int n; float y[9]; float m = 5.123; for(n=2; n<11; n++) { y[n-2] = pow_n(m, n); printf("%dth power of %f is %f\n", n, m,y[n-2]); } getchar(); return 0; } Příklad: BPC1E_Ex54.c Hlavičky funkcí (4/13)
9
??? func_name(char* A) { } int numinstr(char *s) { int n, cnt=0; for(n=0; s[n]!='\0'; n++) if(s[n]>='0‘ && s[n]<='9') cnt++; return cnt; } Funkce s parametrem typu řetězec Funkce pro nalezení počtu znaků číslic v řetězci Hlavičky funkcí (5/13)
10
int main(void) { char txt1[]="ab9bj65D9"; char txt2[]="34x9z56A0"; char txt3[]="3cvz1111E"; int n1, n2, n3; n1=numinstr(txt1); n2=numinstr(txt2); n3=numinstr(txt3); printf("%d in 1st, %d in 2nd, %d in 3rd", n1, n2, n3); getchar(); return 0; } Příklad: BPC1E_Ex55.c Hlavičky funkcí (6/13)
11
??? func_name(int *A, int *B) { } void polar2cart(float *A, float *B) // A is magnitude {// B is phase in deg. float pha; pha=3.1415**B/180; *B=*A*sin(pha); // B is imag. part *A=*A*cos(pha);// A is real part } Funkce s parametry volanými odkazem Parametry jsou ukazatele odkazující na pozice proměnných v paměti Funkce pro převod z polárních do kartézských souřadnic Hlavičky funkcí (7/13)
12
int main(void) { float x=2.0; float y=90.0; printf("Magnitude is %f and phase is %f deg.", x, y); polar2cart(&x, &y); printf("Real part is %f and imag. part is %f", x, y); getchar(); return 0; } Příklad: BPC1E_Ex56.c Hlavičky funkcí (8/13)
13
float mean(float *vect, int n) // vect is input vector { // n is length of the vector int m; float s=0; // s is partial sum for(m=0; m<n; m++) // for all elements of vector s+=vect[m]; return s/(1.0*n); // average computation } Funkce s parametrem jako odkazem na první prvek pole (podobně jako u řetězců) Funkce pro výpočet střední hodnoty vektoru racion á ln í ch č í sel Hlavičky funkcí (9/13)
14
int main(void) { float x[5], m; int len_x=5, n; srand(time(NULL)); for(n=0; n<len_x; n++) { x[n]=(rand()%1000)/100.0; printf("%4.2f\n", x[n]); } m = mean(x, len_x); printf("The average of vector of number is %f", m); getchar(); return 0; } Příklad: BPC1E_Ex57.c Hlavičky funkcí (10/13)
15
typedef int t_mat[3][3]; void func_name(t_mat A, t_mat B) { } Definice proměnn é vlastn í ho typu pomoc í typedef int func_name(t_mat A) { } t_mat func_name(t_mat A) { } ! Funkce může vracet pouze hodnotu (ne pole) Hlavičky funkcí (11/13)
16
typedef int t_mat[3][3]; int det_mat(t_mat x)// determinant of 3x3 matrix { int det=0, m, n, pplus, pminus; for(m=0; m<3; m++) { pplus=1; pminus=1; for(n=0; n<3; n++) { pplus*=x[(m+n)%3][n]; pminus*=x[(m+n)%3][2-n]; } det+=pplus-pminus; } return det; } Funkce pro výpočet determinantu matice 3x3 Hlavičky funkcí (12/13)
17
int main(void) { t_mat mat; int m, n; srand(time(NULL)); for(m=0; m<3; m++)//random matrix for(n=0; n<3; n++) mat[m][n]=rand()%198-99; //from -99 to +99 printf("The determinant is %d", det_mat(mat)); getchar(); return 0; } Příklad: BPC1E_Ex58.c Hlavičky funkcí (13/13)
18
Rekurze funkcí (1/1) unsigned int factorial(unsigned int n) { if(n) // test if n is not zero return n*factorial(n-1); // n is not zero else // n is zero return 1; } int func_name(int A) { … x=func_name(y); … } Funkce může v jejím těle volat sebe samu – rekurzivní funkce Příklad: BPC1E_Ex59.c Funkce pro výpočet faktori á lu
19
my_lib.c: soubor obsahující zdrojové kódy našich funkcí my_lib.h: soubor obsahuj í c í hlavičky našich funkc í ze stejnojmenného souboru, v hlavičce jsou definovány typy proměnných a jméno funkce, jednotlivé hlavičky musí být odděleny středníkem pomocí direktivy #include "my_lib.h" vložené na začátek programu aktivuji přístup k funkcím z příslušného knihovního souboru my_lib.c, linker přidá knihovnu k projektu Ze souboru vlastních funkcí lze vytvořit knihovnu: Knihovny funkcí (1/10)
20
Postup v Code::Blocks: File > New > File my_lib.c + my_lib.h do adresáře projektu nebo do vlast- ního adresáře s vlastními knihovnami Knihovny funkcí (2/10)
21
Nastavení cest pro kompilátor v Code::Blocks: Settings > Compiler přidat cesty se zdrojovými soubory a hlavičkami knihoven tak, aby se přeložili i zdrojové kódy vlastních knihovních funkcí Knihovny funkcí (3/10)
22
Knihovny funkcí (4/10) Př. Vlastní knihovna funkcí pro práci s maticemi 3x3 hlavičkový soubor matops.h typedef int t_mat [3][3]; int det_mat(t_mat A);// determinant of A void print_mat(t_mat A);// printing A void gen_mat(t_mat A, int start, int stop); // gener. A void copy_mat(t_mat A, t_mat B); // copying A to B void add_mat(t_mat A, t_mat B);// A=A+B void sub_mat(t_mat A, t_mat B);// A=A-B void clr_mat(t_mat A);// zeroing A definice vlastních typů proměnných definice hlaviček funkcí s typy vstupních i výstupních parametrů
23
zdrojový soubor knihovny matops.c #include typedef int t_mat[3][3]; int det_mat(t_mat A)// compute determinant { int det=0, m, n, pplus, pminus; for(m=0; m<3; m++) { zdrojov é k ó dy jednotlivých funkc í podle hlavičkov é ho souboru matops.h Knihovny funkcí (5/10)
24
pplus=1; pminus=1; for (n=0; n<3; n++) { pplus*=A[(m+n)%3][n]; pminus*=A[(m+n)%3][2-n]; } det+=pplus-pminus; } return det; } Knihovny funkcí (6/10)
25
void print_mat(t_mat A)// printing matrix A {int m,n; for(m=0; m<3; m++) {for(n=0; n<3; n++) { printf("%4d ", A[m][n]); } printf("\n"); } void gen_mat(t_mat A, int start, int stop) // random {int m, n;// generation of matrix A srand(time(NULL)); for(m=0; m<3; m++) for(n=0; n<3; n++) A[m][n]=rand()%(stop-start+1)+start; } Knihovny funkcí (4/10)
26
void copy_mat(t_mat A, t_mat B) // copying A to B { int m, n; for(m=0; m<3; m++) for(n=0; n<3; n++) A[m][n]=B[m][n]; } void add_mat(t_mat A, t_mat B) // A=A+B { int m, n; for(m=0; m<3; m++) for(n=0; n<3; n++) A[m][n]+=B[m][n]; } Knihovny funkcí (4/10)
27
void sub_mat(t_mat A, t_mat B)// A=A-B { int m, n; for(m=0; m<3; m++) for(n=0; n<3; n++) A[m][n]-=B[m][n]; } void clr_mat(t_mat A)// zeroizing A { int m,n; for(m=0; m<3; m++) for(n=0; n<3; n++) A[m][n]=0; } Knihovny funkcí (4/10)
28
#include #include "matops.h" int main(void) { t_mat mat1, mat2, mat3; // this type was defined //in mathops.h int m, n; gen_mat(mat1, -9, 9); print_mat(mat1); printf("The det. of mat1 is %d\n",det_mat(mat1)); copy_mat(mat3, mat1); sub_mat(mat1, mat2); … Př. Program, který využ í v á na š i knihovnu matops.h Příklad: BPC1E_Ex60.c + matops.c(h) Knihovny funkcí (4/10)
29
Příklady (1/2) Př. Vytvořte knihovnu funkcí pro vý- počet plochy 2-D geometrických objektů (funkce sestavte pro obdélníka, elipsu a trojúhelník). double s_rect(double a, double b); double s_ell (double a, double b); double s_tri (double a, double b); Hlavičkový soubor knihovny areas2D.h
30
#include "areas2D.h" double s_rect(double a, double b) { return a*b;} double s_ell (double a, double b) { return 3.1415*a*b;} double s_tri (double a, double b) { return 0.5*a*b;} Knihovní funkce areas2D.cpp Příklad: BPC1E_Ex61.c + areas2D.c(h) Příklady (2/2)
31
Téma následující přednášky DĚKUJI ZA POZORNOST –Preprocesor –Standardní knihovny ANSI-C –Příklady
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.