Jste zde

Programování v jazyce C - 1. Úvod

Tento kurs si klade za cíl seznámit posluchače se základy programovacího jazyka C, o němž se autor

domnívá, že patří k základním znalostem informatika. Obsah textu však představuje jen základní pojmy jazyka. Teprve

ve cvičeních a zejména soustavným používáním jazyka se student dostane ze stadia pasivní znalosti syntaxe k

aktivnímu použití jazyka.

Tento text byl napsán v roce 1994 pro studenty informatiky Fakulty elektrotechniky a informatiky VŠB-TU Ostrava. Kurs si klade za cíl seznámit posluchače se základy programovacího jazyka C, o němž se autor domnívá, že patří k základním znalostem informatika. Obsah textu však představuje jen základní pojmy jazyka. Teprve ve cvičeních a zejména soustavným používáním jazyka se student dostane ze stadia pasivní znalosti syntaxe k aktivnímu použití jazyka.

1.1. Historický úvod a normy jazyka
1.2. První program v jazyce C
1.3. Jednoduchý vstup a výstup

Programovací jazyk C je všeobecně použitelný programovací jazyk známý svou efektivitou, ekonomií a přenositelností. Tato charakteristika jej předurčuje pro prakticky všechny oblasti programování. Obzvláště užitečným je C v systémovém programování, protože umožňuje psaní rychlých, kompaktních programů, které jsou snadno adaptovatelné pro jiné systémy. Dobře napsaný C program je často stejně rychlý jako program napsaný v assembleru. Navíc je ovšem čitelnější a snadněji udržovatelný.

C je pružný jazyk, který ponechává řadu programátorských rozhodnutí na nás. Vnucuje v podstatě jen některá omezení, například konverzi typů. C nám tedy umožňuje snadno vytvářet programy. Abychom ovšem správně věděli, jak se program bude chovat, musíme C dobře poznat. K tomu nám může posloužit předkládané skriptum.

Jazyk C byl navržen jako poměrně malý jazyk, kombinující efektivitu a výkonnost. C v sobě neobsahuje funkce pro provádění vstupu a výstupu, alokaci paměti, práci s obrazovkou a řízení procesů. Pro tyto funkce sahá programátor do systémových knihoven. Díky tomu se můžeme rozhodnout, použijeme-li funkce ze standardních knihoven, nebo napíšeme variantu speciálně pro naše potřeby. Tento návrh pomáhá oddělit vlastnosti jazyka od vlastností spojených s konkrétním procesorem, architekturou, ... . V C tak můžeme snadněji psát přenositelné programy.

1.1. Historický úvod a normy jazyka

Jazyk C vytvořil v Bellových laboratořích AT&T Denis Ritchie. Záměrem bylo napsat jazyk pro snadnou a přenositelnou implementaci Unixu. Na tomto přenosu (Unixu již existujícího pro PDP-7) se dále podíleli Brian Kernighan a Ken Thompson. Všichni tři tedy "byli u toho".

Jazyk C vznikl jako systémový jazyk pro systémové programátory. Po řadu let byla faktickou normou jazyka bible C - kniha Programovací jazyk C autorů K&R. V tomto C bylo možno provádět nejrůznější finty, které ovšem činily zdrojový text značně nečitelným. Nicméně s postupem času se s C a Unixem seznamovali studenti na vysokých školách, odcházeli do praxe a začali používat C i v jiných než systémových oblastech. Uživatelé přirozeně požadovali, aby C bylo nejen mocným prostředkem (tím bylo od svého vzniku), ale i bezpečným a přehledným jazykem. Postupně se upouštělo od fint1. Rovněž vznikl trend vedoucí k normalizaci jazyka. Teprve pak se totiž může jazyk opravdu všeobecně rozšířit.

ANSI2 norma jazyka C definuje moderní vyšší programovací jazyk všeobecného použití. Shodný standard definuje ISO3. Proto se někdy uvádí toto spojení jako ANSI/ISO norma. ANSI jazyk C je bezpečnější, a navíc často umožňuje (byť jako archaismy) převzetí zdrojových textů vyvořených ve stylu K&R. Překladače, díky normalizaci jazyka, nabízí řada nezávislých producentů programového vybavení. Podstatné je, že C nabízí prakticky na všech technických platformách. Budeme-li ANSI normu C dodržovat, máme velkou šanci, že budeme schopni přenést zdrojový text na jiný stroj (s jiným procesorem i OS), program přeložit, spojit s knihovnami a spustit. Rozhodně by neměly vyvstat neřešitelné problémy.

ANSI C je navrženo tak, že kodifikuje existující praktiky. Většina zdrojových textů, napsaných před vydáním normy, je novými překladači akceptována. Přesto je ANSI C novým jazykem:

  • Přidává některé vlastnosti, jako například prototypy funkcí. Opravuje tím některé nedostatky K&R definice jazyka C.
  • Přehodnocuje konfliktní praktiky, jako například rozdílná pravidla pro redeklaraci datových objektů.
  • Vyjasňuje dvojznačnosti, například je-li zakázáno překrytí datových objektů zpracovávaných knihovní funkcí.

S postupem doby se nezastavila ani teorie programování. Jestliže C umožňuje psát programy modulárně, dnešní trend vyžaduje i podporu objektového přístupu. V roce 1986 publikoval Stroustrup knihu The C++ Programming Language. Počátkem 90. let pak byl i tento jazyk normalizován. Jedná se o objektové rozšíření jazyka C. Proto čas, který C věnujeme, v případě dalšího zájmu o C++ bohatě zúročíme.

1.2. První program v jazyce C

Abychom mohli začít s C co nejrychleji experimentovat, pokusíme se ve zbytku kapitoly ukázat nejdůležitější jazykové konstrukce. Nebudeme si činit nároky na úplnost jejich objasnění či definice. Tuto úlohu splníme v dalších kapitolách. Zde nám půjde spíše o vytvoření základní představy o tom, jak program v C vypadá, případně jak použijeme jednoduchý vstup a výstup.

Každý program v C musí obsahovat alespoň jednu funkci. Ta jediná nepostradatelná funkce se musí jmenovat main. V dalším textu budeme pro zřetelné odlišení jmen funkcí od ostatních identifikátorů používat kulaté závorky. Každý C program tedy obsahuje funkci main(), kterou vykonává při svém spuštění.

Funkce v C má deklarován typ návratové hodnoty a může mít argumenty různých typů. C disponuje datovými typy plně postačujícími pro běžné použití. Pokud to je užitečné, můžeme definovat vlastní nové datové typy. Návratovou hodnotu funkce určuje return příkaz.

Další součásti programu si popíšeme na příkladu. Jistě by nám chybělo, kdybychom jako první program napsali něco jiného než klasické "Hello, world".

/************************/
/* hello.c              */
/* rychly zacatek       */
/************************/
#include 
int main(void)
{
printf("Hello, world.n");
return 0;
} /* main */

O nepostradatelnosti funkce main() již víme. Její argument void nám říká, že jí nepředáváme žádné argumenty. Úvodní int určuje celočíselný typ návratové hodnoty. Tělo funkce je vymezeno složenými závorkami {}. Funkce printf() umožňuje formátovaný výstup. Ještě ji v této kapitole použijeme. Zde zobrazí pozdrav na monitoru.

Ve zdrojovém textu jsou ještě komentáře. Jsou vymezeny dvojicí /* a */. Vše, co se mezi těmito znaky nachází, je komentář. Komentáře budeme v našich programech používat zejména pro zvýšení čitelnosti programu.

Zbývá nám příkaz preprocesoru, začleňující hlavičkový soubor: #include . Zatím jen tolik, že obsahuje všechny údaje potřebné pro správné použití funkce printf().

Tento zdrojový text musíme nyní přeložit překladačem jazyka C. Překladač musí mít k dispozici i začleněný hlavičkový soubor4. Pokud jsme se nedopustili žádné chyby, získáme přeložený tvar, a kněmu musíme připojit kód související s výstupem. Je uložen ve standardních knihovnách. Spojovací program se jmenuje linker; často se volá příkazem link. Teprve po spojení modulů a připojení knihovních funkcí můžeme spustit proveditelný tvar našeho prvního zdrojového textu v jazyce C. Teď je jistě zřejmé, proč začínáme tak jednoduchým programem.

V tomto učebním textu nebudeme popisovat podrobněji konfiguraci překladače. Ta je totiž závislá nejen na operačním systému a jeho uživatelském nastavení, ale i na firemních verzích překladačů a podpůrných programů.

1.3. Jednoduchý vstup a výstup

První program nám umožnil zvládnout překlad zdrojového textu. Teď si ukážeme některé číselné datové typy a jednoduchý vstup a výstup dat. Naším úkolem je načíst celočíselnou a racionální hodnotu a zobrazit výsledek jednoduchého početního výkonu, který s těmito hodnotami provedeme.

/******************************/
/*simpleio.c                  */
/* jednoduchy vstup a vystup  */
/******************************/
#include 
int main(void)
{
int i, j;
float x, y;
printf("zadej dve cela cisla: n");
scanf("%d %d", &i, &j);
printf("zadej racionalni cislo: n");
scanf("%f", &x);
printf("%5d + %5d = %5dn", i, j, i+j);
y = i * x;
printf("%d * %f = %fn", i, x, y);
return 0;
} /* main */
zadej dve cela cisla:
4 6
zadej racionalni cislo:
8.9
4 +     6 =    10
4 * 8.900000 = 35.599998

Začátek programu je stejný jako v předchozím případu. V těle funkce main() dále vytvoříme dvě celočíselné int proměnné i, j a pak dvě racionální float proměnné x, y. Poté pomocí známého výstupu printf() zobrazíme výzvu. Na následujícím řádku pomocí formátovaného vstupu načteme dvě celočíselné hodnoty:

scanf("%d %d", &i, &j); 

Hodnoty načítáme do proměnných i a j. Nesmíme před ně ovšem zapomenout umístit adresový operátor &. Ve formátovacím řetězci musíme pro celočíselnou hodnotu umístit %d. Obdobně čteme i racionální hodnotu, pak je formát %f.

Při formátovaném výstupu používáme stejné formátovací symboly. Navíc můžeme přidat i další specifikace formátu. Podrobněji se formátům vstupu a výstupu budeme věnovat v kapitole Vstup a výstup. V příkladu vidíme i přiřazení výsledku do proměnné. Navíc se jedná o smíšený výraz. Jeden z operandů je typu int, druhý float. Výsledek je přiřazen proměnné typu float.

Možný chod programu máme zobrazen v rámečku. Číselné hodnoty, které zadáváme, můžeme oddělit nejen klávesou Enter, ale i mezerou či tabelátorem. Výsledek násobení racionální hodnoty vidíme zaokrouhlený, což vzniklo omezeným rozsahem platných míst při uložení hodnoty ve vnitřním tvaru.

První seznámení s C máme za sebou. Další výklad povedeme systematičteji.


1 Zřejmě bychom mohli hovořit o nestandardních a nepřenositelných obratech.
2 ANSI je American National Standard Institute.
3 ISO je International Standards Organisation.
4 Musíme mu popsat, kde je tento hlavičkový soubor umístěn.

RNDr. Petr Šaloun, Ph.D.
petr.saloun@ vsb.cz

DOWNLOAD & Odkazy

Hodnocení článku: