Jazyk C - funkcie: Rozdiel medzi revíziami

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
 
(15 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 2: Riadok 2:
 
[[Kategória:Informatika]]
 
[[Kategória:Informatika]]
 
{{Skripta_ZI}}
 
{{Skripta_ZI}}
 +
__TOC__
 
==Funkcie==
 
==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.
 
'''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.
Riadok 43: Riadok 44:
 
*Ak to nie je nutné funkcia nebude vypisovať na obrazovku
 
*Ak to nie je nutné funkcia nebude vypisovať na obrazovku
  
===Funkcia Void===
 
Funkcia Void,tiež nazývaná bezhodnotvé nenávratové funkcie, sa používajú rovnako ako funkcie vracajúce hodnoty, s výnimkou typov neplatných návratov nevracajú hodnotu, keď je funkcia vykonaná. Funkcia void plní svoju úlohu a potom vracia kontrolu volajúcemu. Volanie neplatnej funkcie je samostatný príkaz.
 
  
*void : (prázdny) funkcia nevracia žiadnu hodnotu.
 
*() : funkcia nemá žiadne parametre (žiadne vstupné premenné)
 
*Ukončenie funkcie (nepovinné): return
 
 
<source lang="c" line>
 
void pozdrav()
 
{ printf("\nAhoj, pozdravujem ta.\n");
 
}
 
void pracuj()
 
{
 
int i;
 
printf(“Napis cele cislo: ");
 
scanf(“%d“,&i);
 
printf(“Napisal si: %d\n",i);
 
}
 
void koniec()
 
{ printf(“To je vsetko.\n");
 
}
 
void main()
 
{
 
pozdrav();
 
pracuj();
 
koniec();
 
printf(“%d“,i);
 
}
 
</source>
 
  
  
Riadok 82: 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:
 
*Zoznam parametrov/argumentov (vstupných
 
premenných) funkcie v tvare: (typ1 meno1, typ2 meno 2, ..., typ_n meno_n)
 
*Typ: typ premennej: int, char, float, double,...
 
*Meno: názov premennej
 
*Tieto premenné sú lokálne premenné danej funkcie a nadobudnú hodnoty pri zavolaní funkcie
 
  
  
'''Funkcie s parametrami (bez návratovej hodnoty)'''
+
;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 zavolaní funkcie sa:
 
*Odložia všetky lokálne premenné z miesta volania do stacku
 
*Pri spustení funkcie sa vytvoria nové premenné, ich hodnota sa nastaví podľa hodnoty premennej z miesta, odkiaľ sa funkcia volá
 
*Parametre sú prenášané hodnotou
 
*Po skončení funkcie sa všetky lokálne premenné zmažú.  
 
 
 
  
 
===Deklaracia funkcie===
 
===Deklaracia funkcie===
Riadok 117: 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;   
+
{  
printf("%f",plocha);           //telo funkcie
+
    double plocha = dlzka*sirka;   
return;
+
    printf("%f",plocha);               //telo funkcie
 +
    return;
 
}
 
}
 
</source>
 
</source>
 
 
  
 
===Volanie funckie===
 
===Volanie funckie===
Riadok 130: 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" line>
+
<source lang="c">
 
double a, b;
 
double a, b;
 
printf("Zadaj dlzku a sirku obdlznika: ");
 
printf("Zadaj dlzku a sirku obdlznika: ");
Riadok 136: Riadok 95:
 
Plocha(a, b); //volanie funkcie a odovzdanie dvoch argumentov
 
Plocha(a, b); //volanie funkcie a odovzdanie dvoch argumentov
 
</source>
 
</source>
 
 
===Parameter funckie===
 
Parametre prenášané hodnotou
 
*Pri ich použití sa vo funkcii vytvoria nové premenné a do nich sa skopírujú hodnoty parametrov
 
*Parametre prenášané odkazom
 
*Nevytvára kópia hodnôt premenných, ale vytvorí sa odkaz na premenné (odovzdáva sa adresa premenných).
 
*V oboch prípadoch tieto lokálne premenné pri ukončení funkcie zaniknú.
 
 
  
 
===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:
  int a; a=abs(-5); char c=getchar();
+
<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ť.
  a=clrscr();
+
<source lang="c">
chyba: clrscr() nemá návratovú hodnotu
+
a=clrscr();
 +
chyba: clrscr() nemá návratovú hodnotu
 +
</source>
 
*Správne použitie: clrscr();
 
*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.
 +
<source lang="c" line>
 +
int abs(int x)
 +
{
 +
    // telo funkcie
 +
    if(x<0)
 +
        return -x;
 +
    else
 +
        return x
 +
}
 +
</source>
 +
*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).
  
===Použitie funkcií===
+
<source lang="c" line>
 +
void hlasenie(int cislo_chyby)
 +
{
 +
    switch(cislo_chyby)
 +
    {
 +
        case 0: printf("Ziadna chyba"); break;
 +
        case 1: printf("Chybne vstupne hodnoty"); break;
 +
        case 2: printf("Chyba pocas vypoctu"); break;
 +
        default: printf("Neznama chyba");
 +
    }
 +
}
 +
</source>
 +
 
 +
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í==
 
<source lang="c" line>
 
<source lang="c" line>
 
void parne(int a); //Deklarácia funckie
 
void parne(int a); //Deklarácia funckie
 +
 
int main()
 
int main()
 
{
 
{
parne(5); // použitie vlastnej funkcie v maine
+
    parne(5); // použitie vlastnej funkcie v maine
 
}
 
}
 +
 
void parne(int a) //Definícia funckie za hlavnou funkciou
 
void parne(int a) //Definícia funckie za hlavnou funkciou
 
{
 
{
if(a%2)
+
    if(a%2)
printf(“%d je neparne”,a);
+
        printf(“%d je neparne”,a);
else
+
    else
printf(“%d je parne”,a);
+
        printf(“%d je parne”,a);
 
}
 
}
 
</source>
 
</source>
Riadok 176: Riadok 169:
 
int min(int h1,int h2)
 
int min(int h1,int h2)
 
{
 
{
if (h1<h2)
+
    if (h1<h2)
return h1;
+
        return h1;
else
+
    else
return h2;
+
        return h2;
 
}
 
}
 +
 
int main()
 
int main()
 
{
 
{
int k=min(5,2);
+
    int k=min(5,2);
printf("%d",k);
+
    printf("%d",k);
printf("%d",min(7,4));
+
    printf("%d",min(7,4));
int k2=min(min (7,8),k));
+
    int k2=min(min (7,8),k));
int k3=min(min(7,8),min(5,2)));
+
    int k3=min(min(7,8),min(5,2)));
 
}
 
}
 
</source>
 
</source>
  
 
+
==Referencie==
==Odkazy==
 

Aktuálna revízia z 15:47, 26. máj 2020


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 }

Referencie