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!
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.
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
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 pause
2), 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.