Kurs programování "C" část 3.

©=37,/=92,}=123,(=91,)=93

i definice znaku procenta, obráceného lomítka, levé složené závorky, levé a pravé lomené závorky.

Podmínky a cykly II.

Pro potřeby volby z více než dvou variant je jazyk "C" vybaven větvícím příkazem SWITCH. Je samozřejmě možné vkládat obyčejné podmínky do sebe, ale tím se stávají programy značně nepřehledné. Maximální počet úrovní vnoření do sebe bude také omezen daným překladačem jazyka.

Funkci "přepínače" je možné přirovnat k basicovskému příkazu ON (výraz) GOTO X1,X2,X3..., ale jeho možnosti jsou větší. Předně nenastává hazardní stav, není-li vstupní hodnota v předpokládaném rozsahu, další výhodou je, že řídící výraz není omezen jen na čísla.

Podobné konstrukce jsou běžné ve strukturovaně zaměřených programovacích systémech, i když pod jinými jmény. Příkladem je příkaz DO CASE u známých databázových systémů podobné DBASEIII.

Syntaxe příkazu SWITCH v Céčku:

 /*  větvení programu  */

    switch()
    }
     case :
       příkaz;
       příkaz;
       break;
     case :
       příkaz;
       příkaz;
       break;
     default:
       příkaz;
       příkaz;
    }

Za samotným příkazem se opět nepíše středník! Jeho vstupní výraz může být libovolný podle syntaxe jazyka "C". Jednotlivé možnosti jsou ošetřeny návěstími CASE. Jejich argumenty mohou být jen konstantního typu, jako jsou čísla INT a znakové proměnné char. Přípustné jsou i výrazy, jejichž výsledkem je konstantní hodnota. Za návěstím s argumentem se píše dvojtečka.

Následují příkazy, které se mají vykonávat v případě splnění rovnosti zadaného argumentu se vstupní hodnotou. Tyto netvoří blok podle pravidel jazyka. Proto při provedení posleního uvedeného příkazu bez zábran progrm přechází na vykonávání příkazů za následujícím návěstím. Zabránit tomu lze pomocí příkazu break, který ukončí právě prováděný blok, což je právě teď celý príkaz switch. Možný je i příkaz return, k němuž se dostaneme později.

Někdy je potřebné nechat provádět příkazy za následujícími návěstími, ale pozor na přehlednost. Byl by to například případ řízení menu shodně malými i velkými písmeny. Protože taková podmínka zapsat jako argument nelze, použijí se dvě návěstí za sebou, jedno s malým písmenem, druhé s velkým.

Za úplně posledním příkazem se break logicky uvádět nemusí, ale příručky to doporučují, pro případ pozdějšího rozšiřování switch. POZOR - pro naše C se uvádět musí !

Návěstí default: označuje příkazy, které se mají provádět v případě, že vstupní hodnota nevyhovuje žádné volbě case:. Není povinné, při jeho nepoužití se v případě nesplnění žádné podmínky neprovede nic.

Příkaz switch je uveden ve zdrojovém výpisu stejnojmenného programu. Celek tvoří vymyšlené ukázkové menu. Rozhodování o větvení je na základě přečteného znaku z klávesnice. Platné znaky jsou za návestími uzavřeny do apostrofů. Takový tvar vyjadřuje ASCI kód daného znaku. Je to naštěstí to samo číslo, které vyplivne funkce getchar(), takže program skutečně funguje.

Pozorní programátoři si všimnou, že je docela zbytečně deklarovaná a používaná proměnná a.

Zkompilovaný program se po vykonání vrací správně do DOSu, ale při spuštění pouze systémem Q-MEG nefunguje poslední volba v menu. Někdy se dějí prostě věci neuvěřitelné.

Zatím nemám přesnou představu, jak by fungovalo skutečné menu. Pokud by mělo být jako hlavní, muselo by být asi "natažené" přes celý program, který by byl rozkouskovaný mezi návěstí. Pak by vznikl nepřehledný chaos. Nebo spíše by se jeho části nadefinovaly jako funkce, což by přispělo ke zkrácení zápisu menu.

Druhým uvedeným výpisem programu je řešení hlavolamu z minulého čísla. Převod jsem opět uskutečnil analogicky ke tvaru programu v BASICu, aniž bych znal jeho skutečnou činnost. Je také opět doplněn zkompilovanou verzí.

V jeho výpisu se objevuje nový příkaz continue. Působí okamžité skončení právě prováděného průběhu cyklu, čili přeskočí zbytek příkazů do konce těla cyklu. Po vyhodnocení podmínky cyklus započne nový průběh, nebo ukončí svoji činnost. Je to prostě analogické k příkazu NEXT x, který může být vyvoláván v BASICu také kdykoliv během provádění těla cyklu.

V původním řešení hlavolamu v BASICu je uváděno volání všech tří příkazů NEXT od vnořených cyklů. Trochu jsem měl v tom nejdříve zmatek, ale zpřehlední se to představou těchto příkazů na řádcích pod sebou. Ony se popravdě nevykonají naráz, protože po prvním NEXT se začne znovu provádět nejvnitřnější cyklus, teprve po jeho skončení dojde řada na vyšší úroveň, čili další v pořadí.

Proto v Céčkovém programu stačí příkaz continue jeden, jelikož je třeba násilně přerušovat pouze nejvnořenější cyklus.

Tematika jazyka "C" je opět doplněna článkem a programem amigisty Jirky. Nyní jde ale o výpis určený pro verze jazyka na vyšších počítačích. K jeho rozboru se vrátím později, až probereme více rysů jazyka. Jeho zaměření se stejně tohoto kursu netýká obsahově, společný je pouze programovací jazyk.

Zatím jsme nezkoumali, jestli by tento program mohl vůbec fungovat i na malém ATARI, samotný způsob přenosu dat by chodit samozřejmě měl.


V příští části proberu další druhy cyklů, jakožto standartní příkazy jazyka, bude ale také načase zabývat se našimi vlastními funkcemi vstupů a výstupů, ať můžeme začít zkoušet "funkční" programy.

-ZB-