Programování v jazyce C – vytváření uživatelských funkcí
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Programování v jazyce C – vytváření uživatelských funkcíProgramování v jazyce C – vytváření uživatelských funkcí

 

Programování v jazyce C – vytváření uživatelských funkcí

Google       Google       27. 10. 2006       42 015×

Dnes si povíme něco o funkcích a o tom, jak může uživatel vytvářet své vlastní funkce, kterými může zjednoduššit a zprehlednit svůj program.

Reklama
Reklama

V jazyce C se každý, byť sebemenší program obsahuje alespoň jednu funkci. Jak jsme si již řekli a několikrát ukázali, jedná se o funkci main. Pokud při programování budeme (a že budeme) psát rozsáhlejší program, tak budeme potřebovat prostředek, který nám umožní na první pohled složitý problém rozložit do menších částí, a to z několika důvodů.

  • Uživatelské funkce lze volat opakovaně, tedy to, co jednou naprogramujeme, můžeme používat opakovaně.
  • Původně složitý problém můžeme rozdělit na množství dílčích úkonů, které již není problém naprogramovat, a takový kód je snáze udržovatelný.
  • Můžeme používat lokální proměnné, které jsou viditelné pouze v prostoru dané funkce, čímž se vyhneme problémům se jmény a takový kód může pracovat paralelně.

Úvodní pojmy

Ještě než si ukážeme několik možností, jak vytvářet naše vlastní funkce a jak je používat podíváme se na dva pojmy se kterými se setkáte. Jsou jimi deklarace a definice funkce.

  • Deklarací fce říkáme implementaci pouze to, že někde bude existovat funkce s daným názvem, návratovým typem a parametry.
  • Definicí fce rozumíme samoté „výkonné“ tělo, tedy kód, který daná funkce vykonává.

Nutno poznamenat, že deklaraci ve své podstatě používat nemusíme, ale potom narážíme na problém, že funkce musí být definována před svým prvním použitím, aby o ní překladač věděl. To může na první pohled vypadat jako samozřejmost, ale později, až budeme mít více funkcí, kde z jedné budeme volat druhou atp., se můžeme do problému tak zamotat, že deklarace pro nás bude vysvobozením.

Každá funkce v jazyce C je dána jednak svým názvem, chcete-li identifikátorem, návratovým typem a seznamem parametrů. Název funkce by měl být volen tak, aby hned z názvu bylo patrné, co funkce dělá. O návratovém typu jsme se již zmiňovali. Návratový typ určuje jakého typu bude výsledek, který od funkce získáme. Pokud se bude jednat o funkci pro provádění nějakého výpočtu, návratovým typem bude nepochybně číselná hodnota. abychom se nezabývali pouze teorií bude nejlepší ukázat si takovou jednoduchou funkci prakticky. V prvním příkladu uvedu pro srozumitelnost obsah celého zdrojového souboru, ale později budu uvádět pouze samostatné funkce.

#include 

void razitko(void) {

	printf("********\n");
	printf("* AHOJ *\n");
	printf("********\n");
}

int main() {

	razitko();

	return 0;
}

Toto je ukázka ukázka jednoduché funkce, která v sobě dělá pouze to, že vytiskne slovo AHOJ a rámeček, což pro nás není teď vůbec důležité. Na příkladu vidíme deklaraci jednoduché funkce, která se jmenuje razitko. Tato funkce má návratový typ void, který značí že funkce nevrací žádnou hodnotu. Její seznam parametrů je také prázdný, a proto nemůžeme provádění funkce nijak ovlivnit. Na tomto příkladu si ještě ukážeme, jaký je smysl deklarace. Příklad, tak jak je v tomto tvaru bude bez problému fungovat, ale problém nastane, pokud funkci razitko přesuneme, až za funci main. Pokusíme-li se program přeložit, skončí neúspěchem a obdržíme zprávu ve smyslu, že taková funkce neexistuje. Možností, jak tento problém řešit, je využití deklarace, kterou uvedeme před funkci main.

void razitko(void);

Nyní již překladač o existenci funkce razitko ví, a při přakladu nebude protestovat.

Aby bylo možno chování funkcí ovlivnit, případně pomocí nich zpracovávat nějaká data, můžeme je funkci předat pomocí parametrů. Počet parametrů je prakticky neomezený, ale měli bychom se řídit tím, že přespříliš parametrů nesvědčí o dobrém návrhu. Na následujícím příkladu si ukážeme příklad funkce na výpočet n-té mocniny celého čísla.

int mocnina(int n, long int x) {

	long int navrat = x;

	while(n > 1) {
		navrat = navrat * x;
		n--;
	}
	
	return navrat;
}

Pokud se podíváme na následující funkci, vidíme, že má jako návratový typ uveden int, tedy celé číslo, a přebírá dva parametry. Tyto parametry představují lokální proměnné, pro které je alokována paměť pokaždé, když dojde k zavolání funkce. Jednak je to parametr n, který říká o jakou mocninu se jedná, a druhý x, který představuje číslo, jehož mocninu chceme vypočítat. Výsledek výpočtu vrátíme volajícímu pomocí příkazu return. Použití námi definované funkce je jednoduché.

int x = mocnina(8, 2);  // cislo bude obsahovat 2^8 tj. 256

Tím jsme si ukázali nejjednodušší použití funkcí a ještě se podíváme na rekurzi, tedy případ, kdy funkce volá sebe samu. Rekurze jako možnost řešení některých problémů se dnes celkem často používá, ale mezi začátečníky není zrovna nejoblíbenější. Tato technika se využívá u problémů, které jsou ve své podstatě rekurzivní, jako je výpočet faktoriálu, třídění polí atp. K tomu, aby daný problém bylo možné řešit rekurzivně, musí splňovat následující podmínky:

  • Problém musí být řešitelný pomocí elementárních úkolů, které jsme schopni realizovat.
  • Musí být jasně patrné, kdy je daný problém vyřešen.

Jako obvyklý příklad na rekurzi se používá výpočet faktoriálu, ale touto technikou můžeme provést i výpočet n-té mocniny, kterou jsme před chvílí počítali iteračně pomocí cyklu.

int mocnina (int n, int x) {

	if(n > 1)
		return x * mocnina(n - 1, x);		
}

Tato funkce volá opakovaně sama sebe s tím, že pokaždé sníží hodnotu parametru n o jedničku. Postupně dochází k „zanořování“ a konec běhu algoritmu je dán podmínkou n > 1. Rekurzivní zpracování má samozřejmě také nevýhody, jako je vysoká paměťová náročnost, neboť pro každou instanci funkce dochází k alokaci dalších proměnných. Rekurzivní řešení problémů je téma na samostatný díl, proto se mu budeme v brzké době věnovat. Tím bych se chtěl také omluvit za dlouhé mezery mezi jednotlivými díly. Nyní již budou vycházet častěji.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Autor se věnuje programování v jazycích C/C++, GTK+ a Zajímá se o GNU/Linux. Mezi další zájmy patří scifi a četba.

Nové články

Obrázek ke článku Nový IT hráč na českém trhu

Nový IT hráč na českém trhu

V roce 2015 otevřela v Praze na Pankráci v budově City Tower své kanceláře společnost EPAM Systems (NYSE:EPAM), jejíž centrála se nachází v USA. Společnost byla založená v roce 1993 a od té doby prošla velkým vývojem a stále roste.

Reklama
Reklama
Obrázek ke článku České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace (CRA) pořádají druhý ročník CRA IoT Hackathonů. Zájemci z řad vývojářů a fanoušků moderních technologií mohou změřit své síly a během jediného dne sestrojit co nejzajímavější funkční prototyp zařízení, které bude komunikovat prostřednictvím sítě LoRa. CRA IoT Hackathony se letos uskuteční ve dvou fázích, na jaře a na podzim, v různých městech České republiky. Jarní běh se odstartuje 31. března v Brně a 7. dubna v Praze.

Obrázek ke článku Cloud computing je využíván stále intenzivněji

Cloud computing je využíván stále intenzivněji

Využívání cloud computingu nabývá na intenzitě. Jen v letošním roce vzroste podle analytiků trh se službami veřejného cloudu o 18 %, přičemž o téměř 37 % vzrostou služby typu IaaS. Růst o více než pětinu pak čeká služby poskytování softwaru formou služby, tedy SaaS. Aktuálním trendům v oblasti využívání cloudu se bude věnovat konference Cloud computing v praxi, která se koná 23. března. 2017 v pražském Kongresovém centru Vavruška na Karlově náměstí 5.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý