Jazyk C - funkcie: Rozdiel medzi revíziami
(8 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených) | |||
Riadok 55: | Riadok 55: | ||
*power(x,y); | *power(x,y); | ||
− | + | ;Parametre prenášané hodnotou: To znamená, že pri volaní funkcie (napr. abs(3) ) sa hodnota parametru funkcie skopíruje do novovytvorenej premennej (argumentu) / abs(int x=3) / danej funkcie. Takto sa prenášajú všetky argumenty (okrem výnimiek, a ak to neurčíme inak). Premenné vytvorené vo funkciách sú lokálne a po skončení funkcie zaniknú. Premenné definované v jednej funkcie nie sú viditeľné v inej funkcii (aj keď majú rovnaké meno). | |
− | |||
− | + | ;Parametre prenášané odkazom: Pri parametroch prenášaných odkazom je špecifické to, že pri volaní funkcie sa nekopírujú ich hodnoty, ale ich adresy (čo šetrí čas pri argumentoch s väčšími pamäťovými nárokmi). Dôsledok tejto zmeny je, že zmena hodnoty vo funkcii má za následok zmenu tejto premennej aj vo funkcii, z ktorej bola táto volaná. Upravme hlavičku funkcie abs, aby parameter x bol prenášaný odkazom: int abs(int &x); Operátor & (referencia) má význam adresy premennej. Premenné sa prenášajú odkazom, ak to určíme operandom &. Polia ako parametre funkcií sa prenášajú odkazom vždy (operátor & sa neuvádza). | |
− | |||
− | |||
− | Pri parametroch prenášaných odkazom je špecifické to, že pri volaní funkcie sa nekopírujú ich hodnoty, ale ich adresy (čo šetrí čas pri argumentoch s väčšími pamäťovými nárokmi). Dôsledok tejto zmeny je, že zmena hodnoty vo funkcii má za následok zmenu tejto premennej aj vo funkcii, z ktorej bola táto volaná. Upravme hlavičku funkcie abs, aby parameter x bol prenášaný odkazom: int abs(int &x); Operátor & (referencia) má význam adresy premennej. Premenné sa prenášajú odkazom, ak to určíme operandom &. Polia ako parametre funkcií sa prenášajú odkazom vždy (operátor & sa neuvádza). | ||
===Deklaracia funkcie=== | ===Deklaracia funkcie=== | ||
Riadok 81: | Riadok 77: | ||
<source lang="c" line> | <source lang="c" line> | ||
void Plocha(double dlzka, double sirka) //hlavička | void Plocha(double dlzka, double sirka) //hlavička | ||
− | { double plocha = dlzka*sirka; | + | { |
− | + | double plocha = dlzka*sirka; | |
− | + | printf("%f",plocha); //telo funkcie | |
+ | return; | ||
} | } | ||
</source> | </source> | ||
− | |||
− | |||
===Volanie funckie=== | ===Volanie funckie=== | ||
Riadok 94: | Riadok 89: | ||
*Ak funkcia nemá parametre, pri volaní sa uvádzajú len prázdne zátvorky ( ) | *Ak funkcia nemá parametre, pri volaní sa uvádzajú len prázdne zátvorky ( ) | ||
− | <source lang="c" | + | <source lang="c"> |
double a, b; | double a, b; | ||
printf("Zadaj dlzku a sirku obdlznika: "); | printf("Zadaj dlzku a sirku obdlznika: "); | ||
Riadok 100: | Riadok 95: | ||
Plocha(a, b); //volanie funkcie a odovzdanie dvoch argumentov | Plocha(a, b); //volanie funkcie a odovzdanie dvoch argumentov | ||
</source> | </source> | ||
− | |||
===Návratová hodnota=== | ===Návratová hodnota=== | ||
*Funkcie, ktoré vracajú nejakú hodnotu môžem priradiť k nejakej premennej: | *Funkcie, ktoré vracajú nejakú hodnotu môžem priradiť k nejakej premennej: | ||
− | + | <source lang="c"> | |
+ | int a; | ||
+ | a=abs(-5); | ||
+ | char c=getchar(); | ||
+ | </source> | ||
+ | |||
*Funkcie bez návratovej hodnoty nemôžem priraďovať. | *Funkcie bez návratovej hodnoty nemôžem priraďovať. | ||
− | + | <source lang="c"> | |
− | + | a=clrscr(); | |
+ | chyba: clrscr() nemá návratovú hodnotu | ||
+ | </source> | ||
*Správne použitie: clrscr(); | *Správne použitie: clrscr(); | ||
Riadok 114: | Riadok 115: | ||
<source lang="c" line> | <source lang="c" line> | ||
int abs(int x) | int abs(int x) | ||
− | { // telo funkcie | + | { |
− | if(x<0) | + | // telo funkcie |
− | return -x; | + | if(x<0) |
− | else | + | return -x; |
− | return x | + | else |
+ | return x | ||
} | } | ||
</source> | </source> | ||
Riadok 125: | Riadok 127: | ||
*telo funkcie obsahuje konkrétne príkazy | *telo funkcie obsahuje konkrétne príkazy | ||
*hodnotu, ktorú má funkcia vrátiť, špecifikujeme kľúčovým slovom return, za ktorým nasleduje hodnota, ktorú chceme vrátiť. V príklade, ak je x<0, funkcia vráti hodnotu, čo je vlastne -x (kde x<0), čiže výsledok bude +x. V opačnom prípade vráti x. | *hodnotu, ktorú má funkcia vrátiť, špecifikujeme kľúčovým slovom return, za ktorým nasleduje hodnota, ktorú chceme vrátiť. V príklade, ak je x<0, funkcia vráti hodnotu, čo je vlastne -x (kde x<0), čiže výsledok bude +x. V opačnom prípade vráti x. | ||
− | |||
==Funkcie bez návratovej hodnoty== | ==Funkcie bez návratovej hodnoty== | ||
Riadok 133: | Riadok 134: | ||
void hlasenie(int cislo_chyby) | void hlasenie(int cislo_chyby) | ||
{ | { | ||
− | switch(cislo_chyby) | + | switch(cislo_chyby) |
− | { | + | { |
− | case 0: printf("Ziadna chyba"); break; | + | case 0: printf("Ziadna chyba"); break; |
− | case 1: printf("Chybne vstupne hodnoty"); break; | + | case 1: printf("Chybne vstupne hodnoty"); break; |
− | case 2: printf("Chyba pocas vypoctu"); break; | + | case 2: printf("Chyba pocas vypoctu"); break; |
− | default: printf("Neznama chyba"); | + | default: printf("Neznama chyba"); |
− | } | + | } |
} | } | ||
</source> | </source> |
Aktuálna revízia z 15:47, 26. máj 2020
Učebné texty
Obsah
Funkcie
Funkcia je skupina príkazov, ktoré spoločne vykonávajú úlohu. Každý program C má najmenej jednu funkciu, ktorá je hlavná (), a všetky najvýznamnejšie programy môžu definovať ďalšie funkcie.
Kód môžete rozdeliť do samostatných funkcií. Ako rozdelíte svoj kód medzi rôzne funkcie, je len na vás, ale logicky je rozdelenie také, že každá funkcia vykonáva konkrétnu úlohu.
Deklarácia funkcie hovorí kompilátoru o názve funkcie, type návratu a parametroch. Definícia funkcie poskytuje skutočné telo funkcie.
Knižnica v štandardnom jazyku C poskytuje množstvo vstavaných funkcií, ktoré môže váš program zavolať. Napríklad strcat () spája dva reťazce, memcpy () na kopírovanie jedného miesta na iné miesto a mnoho ďalších funkcií.
Funkcia môže byť tiež označovaná ako metóda alebo čiastková rutina alebo postup atď.[1]
Definícia funkcie v programovaní C sa skladá z hlavičky funkcie a tela funkcie. Tu sú všetky časti funkcie -
Return Type - Funkcia môže vrátiť hodnotu. Return_type je typ údajov hodnoty, ktorú funkcia vracia. Niektoré funkcie vykonávajú požadované operácie bez vrátenia hodnoty. V tomto prípade je návratovým typom kľúčové slovo neplatné.
Názov funkcie - Toto je skutočný názov funkcie. Názov funkcie a zoznam parametrov spolu tvoria funkčný podpis.
Parametre - parameter je ako zástupný symbol. Po vyvolaní funkcie odovzdáte hodnotu parametru. Táto hodnota sa označuje ako skutočný parameter alebo argument. Zoznam parametrov sa týka typu, poradia a počtu parametrov funkcie. Parametre sú voliteľné; to znamená, že funkcia nesmie obsahovať žiadne parametre.
Telo funkcie - telo funkcie obsahuje súbor príkazov, ktoré definujú, čo funkcia robí.
Príkazy vo funkcií
Dovolené:
- Používanie akýchkoľvek príkazov
- Volanie iných funkcií
- Volanie samej seba(rekurzia)
Zakázané
- Definovanie funckie v tele inej funkcie
- Volanie funckie main
Doporučené
- Písať krátke, jednoúlohové, ľahko pochopitelné funkcie
- Veľké funkcie rozdeliť na vhodnom mieste
- Ak to nie je nutné funkcia nebude vypisovať na obrazovku
Parametre funkcie
Argumety: zoznam premenných uzatvorených v zátvorkách pri mene funkcie
- a=getchar();
- putchar(a);
- clrscr();
- abs(b);
- power(x,y);
- Parametre prenášané hodnotou
- To znamená, že pri volaní funkcie (napr. abs(3) ) sa hodnota parametru funkcie skopíruje do novovytvorenej premennej (argumentu) / abs(int x=3) / danej funkcie. Takto sa prenášajú všetky argumenty (okrem výnimiek, a ak to neurčíme inak). Premenné vytvorené vo funkciách sú lokálne a po skončení funkcie zaniknú. Premenné definované v jednej funkcie nie sú viditeľné v inej funkcii (aj keď majú rovnaké meno).
- Parametre prenášané odkazom
- Pri parametroch prenášaných odkazom je špecifické to, že pri volaní funkcie sa nekopírujú ich hodnoty, ale ich adresy (čo šetrí čas pri argumentoch s väčšími pamäťovými nárokmi). Dôsledok tejto zmeny je, že zmena hodnoty vo funkcii má za následok zmenu tejto premennej aj vo funkcii, z ktorej bola táto volaná. Upravme hlavičku funkcie abs, aby parameter x bol prenášaný odkazom: int abs(int &x); Operátor & (referencia) má význam adresy premennej. Premenné sa prenášajú odkazom, ak to určíme operandom &. Polia ako parametre funkcií sa prenášajú odkazom vždy (operátor & sa neuvádza).
Deklaracia funkcie
- Prototyp sa zapíše v súbore kde sa funkcia používa.
- Funkcia sa definuje pred jej prvým použitím (volaním). Definícia potom vystupuje aj ako deklarácia.
- Prototyp funkcie a jej definícia sa musia zhodovať v návratovom type, názve funkcie a type parametrov
- Názvy parametrov v deklarácii sú nepovinné a nemusia sa zhodovať s definíciou
Definícia funkcie
- Hlavička a telo funkcie
- Hlavička sa zhoduje s deklaráciou
- návratový typ, názov funkcie a zoznam parametrov
- nie je za ňou bodkočiarka!
- Telo začína a končí zloženou zátvorkou
- Príkazom return kdekoľvek v tele sa funkcia ukončí, pričom musí vrátiť hodnotu (okrem typu void)
1 void Plocha(double dlzka, double sirka) //hlavička
2 {
3 double plocha = dlzka*sirka;
4 printf("%f",plocha); //telo funkcie
5 return;
6 }
Volanie funckie
- Argumenty sú odovzdávané v rovnakom poradí ako sú parametre uvedené v deklarácii a definícii.
- Na názvoch argumentov nezáleží, odovzdáva sa len ich hodnota, dôležitý je typ.
- Ak funkcia nemá parametre, pri volaní sa uvádzajú len prázdne zátvorky ( )
double a, b;
printf("Zadaj dlzku a sirku obdlznika: ");
scanf("%lf %lf", &a, &b);
Plocha(a, b); //volanie funkcie a odovzdanie dvoch argumentov
Návratová hodnota
- Funkcie, ktoré vracajú nejakú hodnotu môžem priradiť k nejakej premennej:
int a;
a=abs(-5);
char c=getchar();
- Funkcie bez návratovej hodnoty nemôžem priraďovať.
a=clrscr();
chyba: clrscr() nemá návratovú hodnotu
- Správne použitie: clrscr();
Funkcie s návratovou hodnotou
Po skončení vykonávania funkcia vráti nejakú hodnotu, ktorú môžeme priradiť do premennej.
1 int abs(int x)
2 {
3 // telo funkcie
4 if(x<0)
5 return -x;
6 else
7 return x
8 }
- hlavička funkcie: typ návratovej hodnoty: int (celé číslo)
- argumenty: funkcia má jeden argument: x (x je celé číslo)
- telo funkcie obsahuje konkrétne príkazy
- hodnotu, ktorú má funkcia vrátiť, špecifikujeme kľúčovým slovom return, za ktorým nasleduje hodnota, ktorú chceme vrátiť. V príklade, ak je x<0, funkcia vráti hodnotu, čo je vlastne -x (kde x<0), čiže výsledok bude +x. V opačnom prípade vráti x.
Funkcie bez návratovej hodnoty
Tieto funkcie nič nevracajú. Ich návratový typ je void (prázdny).
1 void hlasenie(int cislo_chyby)
2 {
3 switch(cislo_chyby)
4 {
5 case 0: printf("Ziadna chyba"); break;
6 case 1: printf("Chybne vstupne hodnoty"); break;
7 case 2: printf("Chyba pocas vypoctu"); break;
8 default: printf("Neznama chyba");
9 }
10 }
Dana funkcia je bez návratovej hodnoty (void) a má jeden parameter: celé číslo cislo_chyby. Táto funkcia vypíše podľa hodnoty svojho parametra nejaké chybové hlásenie.
Použitie funkcií
1 void parne(int a); //Deklarácia funckie
2
3 int main()
4 {
5 parne(5); // použitie vlastnej funkcie v maine
6 }
7
8 void parne(int a) //Definícia funckie za hlavnou funkciou
9 {
10 if(a%2)
11 printf(“%d je neparne”,a);
12 else
13 printf(“%d je parne”,a);
14 }
Príklad na minimum
1 int min(int h1,int h2)
2 {
3 if (h1<h2)
4 return h1;
5 else
6 return h2;
7 }
8
9 int main()
10 {
11 int k=min(5,2);
12 printf("%d",k);
13 printf("%d",min(7,4));
14 int k2=min(min (7,8),k));
15 int k3=min(min(7,8),min(5,2)));
16 }