360 likes | 627 Views
Verze 2009.01. Funkce a struktura programu. 8. A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz. Agenda. Funkce Syntaxe Parametry a návratová hodnota Definice a deklarace funkce Funkce main() Rekurzivní funkce. Funkce.
E N D
Verze 2009.01 Funkce a struktura programu 8 A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz
Agenda • Funkce • Syntaxe • Parametry a návratová hodnota • Definice a deklarace funkce • Funkce main() • Rekurzivní funkce
Funkce • Umožňují rozkládat větší výpočetní úlohy na menší. • Základní prostředek strukturování programu. • Každý program se skládá z jedné nebo více funkcí. • Každá funkce musí mít návratovou hodnotu a může mít i více vstupních parametrů.
Knihovní funkce • Jazyk C obsahuje řadu již vytvořených funkcí. • Definice těchto funkcí umístěna v hlavičkových souborech a v knihovnách. • Funkce pro práci s terminálem a se soubory, matematické funkce, …. • Např. scanf(), printf(), sqrt(), …
Vytvoření vlastní funkce • Definice funkce: návratový_typ název_funkce(seznam_parametrů) { tělo (příkazy) funkce }
Parametry funkce • Parametry uvádíme do závorky za identifikátor funkce ve tvaru datový typ, mezera a identifikátor parametru • Počet parametrů funkce není omezen • V těle funkce k nim přistupujeme jako k proměnným s tím rozdílem, že hodnoty z nich můžeme pouze číst
Návratová hodnota • Hodnota, kterou vrací funkce. • Datový typ této hodnoty uvádíme v hlavičce funkce před identifikátorem funkce. • Př.: unsigned long faktorial(int n); nebo float obvod_kruhu(float r);
Návratová hodnota • Pro návrat z funkce slouží příkaz return, za kterým následuje návratová hodnota. • Př.: return vysledek; nebo return 0;
Příklad • Definice funkce - příklad: int soucet(int a, int b) { int x; x = a + b; return x; }
Příklad • Použití v programu: #include <stdio.h> int soucet(int a, int b) { int x; x = a + b; return x; } int main() { printf(″4 + 3 = %d″,soucet(4,3)); return 0; }
Funkce bez parametrů • Pokud funkce nemá žádné parametry, je možné ji zapsat dvěma způsoby: • Za identifikátorem funkce ponecháme prázdné závorky int zobraz_napovedu() { … příkazy … } • Do závorky uvedeme klíčové slovo void int zobraz_napovedu(void) { … příkazy … }
Funkce bez návratové hodnoty • V jazyce C funkce musí mít návratovou hodnotu. • Pokud chceme, aby funkce nevracela žádnou návratovou hodnotu, uvedeme místo datového typu návratové hodnoty typ void, potom již příkaz return neuvádíme!
Funkce bez návratové hodnoty • Správně void vypis_napovedu() { printf(″Napoveda″); } • Špatně vypis_napovedu() { printf(″Napoveda″); }
Výchozí návratová hodnota • Při definici funkce je možné neuvádět datový typ návratové hodnoty. • Pokud není uveden datový typ návratové hodnoty, použije se výchozí návratová hodnota – int
Definice funkce • Obsahuje hlavičku i tělo funkce • Hlavička funkce není ukončena středníkem
Deklarace funkce • Funkci deklarujeme pomocí funkčního prototypu. • Funkční prototyp obsahuje hlavičku funkce a je ukončen středníkem. • Deklarace dává překladači informaci o návratové hodnotě a parametrech funkce. • Bez použití deklarace by musela být definice funkce umístěna v kódu před voláním této funkce.
Deklarace funkce • Funkční prototyp: • Neúplný • Uvádíme pouze datové typy parametrů • Př.: double obsah_obdelniku (double, double);
Deklarace funkce • Funkční prototyp: • Úplný • Uvádíme datové typy i jména parametrů • Pro přehlednost programu vhodnější uvádět úplný funkční prototyp • Př.: double obsah_obdelniku (double a, double b);
Deklarace funkce #include <stdio.h> int main() { double s1 = 5.3; double s2 = 2.1; printf(″Obsah obdelniku je %f″, obsah_obdelniku(s1,s2)); return 0; } double obsah_obdelniku (double a, double b) { return a*b; }
Deklarace funkce #include <stdio.h> double obsah_obdelniku (double a, double b) { return a*b; } int main() { double s1 = 5.3; double s2 = 2.1; printf(″Obsah obdelniku je %f″, obsah_obdelniku(s1,s2)); return 0; }
Deklarace funkce #include <stdio.h> double obsah_obdelniku (double a, double b); int main() { double s1 = 5.3; double s2 = 2.1; printf(″Obsah obdelniku je %f″, obsah_obdelniku(s1,s2)); return 0; } double obsah_obdelniku (double a, double b) { return a*b; }
Deklarace funkce #include <stdio.h> double obsah_obdelniku (double, double); int main() { double s1 = 5.3; double s2 = 2.1; printf(″Obsah obdelniku je %f″, obsah_obdelniku(s1,s2)); return 0; } double obsah_obdelniku (double a, double b) { return a*b; }
Funkce main() • Hlavní funkce programu – volá se po spuštění programu • Návratová hodnota: • Datový typ int • Umožňuje identifikovat chyby v programu • Výchozí návratová hodnota 0 značí bezchybné ukončení programu
Funkce main() • Parametry funkce: • Slouží pro načítání parametrů příkazového řádku • Pokud nechceme načítat parametry, ponecháme závorku prázdnou nebo s klíčovým slovem void int main() { … return 0; }
Funkce main() • Načítání parametrů příkazového řádku: • Funkce main(): int main(int argc, char* argv[]) { … return 0; }
Funkce main() • int argc • Udává počet parametrů příkazového řádku • char* argv[] • Pole ukazatelů na tyto parametry (řetězce) • Hodnota argc je vždy větší nebo rovna 1 (1. parametrem, argv[0] ,je název spouštěného programu) • Př.: program.exe 2.87 34 text
Funkce main() #include <stdio.h> int main(int argc, char* argv[]) { if (argc == 1) { printf(″Program byl zavolan bez parametru\n″); } else { for(i = 0; i < argc; i++) { printf(″%s\n″,argv[i]); } } }
Funkce main() • Spuštění aplikace vypis.exe 2 text 1.3 soubor.txt argc … 5 argv[0] … obsah.exe argv[1] … 2 argv[2] … text argv[3] … 1.3 argv[4] … soubor.txt
Funkce main() #include <stdio.h> #include <stdlib.h> double obsah_obdelniku (double, double); int main(int argc, char* argv[]) { double s1 = atof(argv[1]); double s2 = atof(argv[2]); printf(″Obsah obdelniku je %f″, obsah_obdelniku(s1,s2)); return 0; } double obsah_obdelniku (double a, double b) { return a*b; }
Funkce main() • Spuštění aplikace obsah.exe 1.3 2.4 argc … 3 argv[0] … obsah.exe argv[1] … 1.3 argv[2] … 2.4
Rekurzivní funkce • Funkce, která volá sama sebe • Využití např. u funkce pro výpočet faktoriálu unsigned long faktorial(int n) { if (n == 0) return 1; else return (n*faktorial(n-1)); }
Rekurzivní funkce • Funkce pro výpočet faktoriálu opakovaně volá sama sebe a pokaždé sníží číslo, pro které se faktoriál počítá.
Rekurzivní funkce • Další možnost použití rekurzivní funkce • Výpočet mocniny int mocnina (int x, int n) { if(n == 0) return 1; else return x * mocnina(x, n - 1); }
Rekurzivní funkce • Další možnost použití rekurzivní funkce • Výpis souborů ve složce a podsložkách • Zavolá se funkce pro výpis souborů a složek. • Následně se tato funkce zavolá i pro všechny podsložky v dané složce
A1PRG-s 08. Funkce Děkuji za pozornost Ing. Michal Heczko heczko@fai.utb.cz 218/U3 Prezentace k dispozici na http://vyuka.fai.utb.cz