Struktura programu

Vše o vzniku programu již bylo objasněno a tak se můžeme věnovat čistě jen syntaxi jazyka C. V této kapitole na prvním jednoduchém příkladě osvětlím velkou spoustu nových věcí. Některé z nich se budou probírat později podrobněji. Pokud pochopíte věci vysvětlované v této kapitole, již se můžete začít považovat za programátory amatéry :-).

První program

Správně bych měl říkat první zdrojový kód, ale myslím, že říkat "program" není zase tak velký prohřešek. Tak mě za to nekamenujte. Však vy si z toho zdrojového kódu program vytvoříte.
Podívejte se tedy na něj. Následující kód můžete uložit do souboru s příponou .c (např. kod.c). Přípona .c je pro některé překladače (zvláště v Linuxu) povinná, někdy však ne a soubor se může jmenovat libovolně. Nevidím však jediný rozumný důvod, proč ji nepoužívat. Ve jménech souboru nepoužívejte českou diakritiku ani mezery!

/*------------------------------------------------*/
/* c04/kod.c                                      */

 /* Toto je libovolny komentar
  * v souboru kod.c           */


#include <stdio.h>              //standardni knihovna

int main(void)
{
    printf("Hello World\n");
    return 0;
}
/*------------------------------------------------*/

Pokud vidíte čísla na začátku řádků, tak ty nejsou součástí zdrojového kódu. Budu je však uvádět před každým zdrojovým kódem, abych se na ně mohl v textu odkazovat.

Všimněte si mezer, odsazování a konců řádků ve zdrojovém kódu a vůbec celkové úpravy. Bílé znaky, jako je mezera, tabulátor nebo znak nového řádku většinou ve zdrojovém kódu jazyka C nemají žádný význam. Odsazováním program pouze získá na přehlednosti a čitelnosti. Funkci main() byste mohli napsat do jednoho řádku, překladači to bude jedno.

#include <stdio.h>
int main(void){printf("Hello World\n");return 0;}

Posuďte sami, co je přehlednější. Konce řádků jsou důležité pouze pro direktivy začínající znakem # (čti „šarp“) a u komentářů začínajících dvěma lomítky (viz komentář //standardni knihovna), protože jejich konec je dán právě koncem řádku. Mezera musí zůstat i mezi int a main (a return a 0), aby se to neslilo do jednoho slova.

Na netu se dají najít 30 stránkové dokumenty o správném formátování zdrojového kódu v C. Pokud se je naučíte, riskujete, že až přijdete pracovat do nějaké firmy, dostanete úplně jiný 30 stránkový manuál ☺.

Komentáře

Tím nejjednodušším, co je v programu vidět, jsou komentáře. Vše co je mezi znaky /* a */ je komentář. V jazyce C++ se navíc považuje za komentář vše za dvěma lomítky // až do konce řádku. Většina moderních překladačů C také rozezná dvě lomítka jako komentář (mnohdy je překladač C a C++ jeden a ten samý program).

Až budete dělat větší programy, uvidíte jak je dobré mít správně okomentovaný zdrojový kód. Dobré komentáře vám pomohou se v kódu orientovat. Je dobré poznamenávat takové věci, jako třeba ... toto číslo musí být nezáporné z toho a toho důvodu .... Při změně programu v budoucnosti se tím vyvarujete chyb.

Knihovny

Existují takzvané standardní knihovny, což jsou knihovny dodávané s překladačem, a uživatelské knihovny, které si vytváří programátor sám. Hlavičkové soubory jsou soubory, v nichž jsou uloženy definice funkcí z knihovny.
Jejich přípona je většinou .h (jako header), ale není povinná (stejně jako .c). Pro C++ se někdy knihovny označují příponou .hpp.

Direktiva #include říká překladači, jaký hlavičkový soubor má načíst před překladem zdrojového kódu. Pokud je jméno v takovýchto lomených závorkách < >, pak se soubor hledá ve standardních adresářích. Které to jsou, to záleží na překladači.

Standardní knihovna stdio (která obsahuje funkci printf()) je tak notoricky používána, že některé překladače ani nevyžadují uvedení direktivy #include <stdio.h>. Přesto, v zájmu kompatibility, tuto direktivu používejte (pokud budete používat nějaké funkce z této knihovny).

Zkratka stdio = standard input output (knihovna pro standardní vstup a výstup)

Jména uživatelských hlavičkových souborů jsou uzavřeny ve dvojitých uvozovkách a hledají se v aktuálním adresáři. Například #include "kkk/knihovna.h" je soubor se jménem knihovna.h v podadresáři kkk/ aktuálního adresáře. Jak si vytvořit vlastní hlavičkový soubor vysvětlím později. Nejdříve se budete seznamovat se standardními knihovnami a funkcemi.

Funkce

Funkce

Funkce v C/C++

V příkladě jsou v programu dvě funkce. Funkce main() a funkce printf(). Funkce main() se ve zdrojáku definuje. To znamená, že se popisuje co tato funkce bude dělat (co je jejím obsahem). Funkce printf() se pouze volá, tj. chceme po ní, aby udělala to, co je dáno její definicí. Je to funkce definovaná v knihovně stdio.h a její definice způsobí vypsání textu na obrazovku.

Funkce má své jméno (main), návratovou hodnotu (int) a argumenty určené v závorkách za jménem funkce ((void)).
Návratová hodnota určuje, jaká data funkce vrátí při svém skončení (např. int je celé číslo). K čemu to je, to se dozvíte později.
Argumenty jsou pro změnu data, která funkce dostává ke zpracování. Hodnota void znamená „nic“, tedy v příkladu výše to znamená, že funkce main() žádné argumenty neočekává.
Návratová hodnota je vždy jen jedna a její typ se píše před jméno funkce. Argumenty se píší za jméno funkce do závorek a je-li jích více, oddělují se čárkou.

Funkce printf() dostává jako argument řetězec znaků (řetězce jsou vždy ve dvojitých uvozovkách), který pak vytiskne na obrazovku. Posloupnost znaků \n reprezentují nový řádek (ENTER, chcete-li).

Tělo funkce je všechno to, co je mezi složenými závorkami {}. Funkce se ukončuje klíčovým slovem return za kterým je návratová hodnota funkce (funkce main() vrací celé číslo (int), a to 0).

Funkce jsou poměrně složitou záležitostí a budu se jim ještě věnovat později podrobněji. Důležité je vědět, že funkce main() je speciální funkce, která je volána1) v programu jako první. Ve funkci main() pak můžete volat další funkce, dle libosti. Z toho také vyplývá, že funkci main() musí mít každý program, jinak by překladač nevěděl čím začít při provádění programu. Funkce main() má vždy návratovou hodnotu typu int (celé číslo).

Funkce printf()

Z toho přísunu nových informací můžete být dost zmateni. Hlavně proto, že jsem u spousty věcí říkal, že je proberu podrobněji později :-). Pokud jste se prokousali až sem, pak již máte vyhráno. Už víte, jak udělat program v jazyce C. Nejdříve začnete funkcí main(), protože ta se volá v programu jako první. Přidáte hlavičkové soubory knihoven pomocí #include, abyste mohli používat v nich nadefinované funkce a ty pak voláte ve funkci main().
Funkce main() skončí příkazem return. Pokud byste jej neuvedli, pravděpodobně byste program také přeložili, ale překladač by vás na tuto chybu upozornil varováním (v jazyce C, v jazyce C++ to chyba není a standard předpokládá return 0. Ach, ty standardy). Stejně tak by bylo odpustitelnou chybou, kdyby jste za jménem funkce main() do závorek nenapsali void ale nechali je prázdné. Překladač by si „void“ domyslel sám. Funkce main() může být buďto bez argumentů, nebo se dvěma speciálními argumenty, o kterých vám povím později :-).

Na závěr ukážu ještě jeden program a další využití funkce printf(). Funkce printf() má jako první argument textový řetězec. Ten může obsahovat speciální sekvence. Už jsme se s jednou setkali. Sekvence \n přesune kursor na nový řádek. Funkci printf(). později vysvětlím systematičtěji i se všemi speciálními znaky. Teď vám chci ukázat ještě dva, které se nám budou při výkladu hodit. První je %s. Za tento znak se dosadí textový řetězec, který je dalším argumentem funkce printf(). Druhý je %i, za který se dosadí celé číslo. Prostudujte si následující program a zkuste napsat vlastní.

/*------------------------------------------------*/
/* c04/kod2.c                                     */

#include <stdio.h>

int main(void)
{
    printf("1 + 1 = %i\n", 1 + 1);
    printf("%i + %i = %i\n", 1, -2, 1 + (-2));
    printf("%s\n", "Konec programu.");
    /* return ukonci program. */
    return 0;
    printf("Tohle se uz nezobrazi %s!\n");
}

/*------------------------------------------------*/

V příkladu jsou některé arugmenty funkce printf() výrazy. Například 1 + 1 je výraz použitý jako druhý argument při prvním volání funkce printf(). Prvním argumentem je řetězec, tedy vše v uvozovkách. Zatímco řetězec se nijak nezpracovává, výraz se vyhodnotí a až jeho výsledek (1 + 1 = 2) se stane argumentem funkce.

Všimněte si posledního volání funkce printf(). Je až za příkazem return a proto k jejímu volání v programu nedojde. Navíc obsahuje chybu. V řetězci je %s ale funkce nemá žádný další argument. Pokud by tato funkce byla volána, „sáhla“ by si kamsi do paměti pro neexistující řetězec. Buď by se vytiskly nějaké nesmysly, nebo by program skončil s chybou (neoprávněný přístup do paměti; program provedl nepovolenou operaci atp.). Takže si na to dávejte pozor. Na tuto chybu vás překladač nemusí upozornit, protože překladač zkontroluje jen to, že funkce printf() má mít jako první argument textový řetězec (a to má). Jelikož je tato chyba opravdu častá (a taky dost nebezpečná), dokáží moderní překladače tyto chyby odhalit, ale mnohdy se o to musí „požádat“ nějakým nastavením nebo přepínačem (třeba s překladačem gcc můžete použít přepínač -Wall).

A to je pro dnešek vše. Přečtěte si tuto kapitolu tolikrát, kolikrát bude potřeba, abyste zdrojový kód kod2.c celý pochopili. Zvykněte si na pojmy „volání funkce“, „definice funkce“, „argumenty funkce“ a „návratová hodnota funkce“. Určete všechny části zdrojového kódu, které se k těmto pojmům vztahují.

Prohlížení výstupu

Tak dobře, ještě to není vše. Často mi totiž lidi píšou, že po přeložení a spuštění programu jenom problikne okno a nic nevidí. Proto jsem se rozhodl napsat ještě tento dodatek.

Některé vývojové prostředí fungují tak, že otevřou okno pro výstup programu, spustí program a po jeho ukončení okno zase hned zavřou. Nemáte tak šanci stihnout výstup přečíst.

Existuje několik možností, jak tento problém vyřešit. Například nastavením tzv. breakpointů, nebo nastavením vývojového prostředí, aby okno po zkončení programu neuzavíral. To jsou ale věci, které se vývojové prostředí od vývojového prostředí liší. Jednodušší pro mě bude vám popstat třetí způsob:

Vložte na začátek souboru #include <stdlib.h> a před řádek s return vložte volání funkce system("pause");.

Knihovna <stdlib.h> deklaruje funkci system(). Tato funkce zavolá program pause2), který nedělá nic jiného, než že čeká až uživatel zmáčkne nějakou klávesu. Tím pádem program neskončí, dokud něco nestisknete a můžete si tak v klidu prohlédnout jeho výstup.

Další způsoby jak pozastavit výstup můžete najít na stránkách, kde popisuji použití jednotlivých vývojových prostředí.


1) „Voláním funkce“ se myslí provedení příkazů, které funkce obsahuje ve svém těle.

2) Program pause je dostupný jen na Windows. V Linuxu, předpokládám, budete vše dělat z příkazové řádky, takže vám okno nikam neuteče.

Komentář Hlášení chyby
Created: 29.8.2003
Last updated: 18.10.2014
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..