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

Do časopisu či magazínu zabývajícího se počítači obsahově patří kurs programování pro začátečníky, nebo alespoň nějaké rady a příklady z této oblasti. Co se týká pokročilých, těm jsou určeny speciální publikace. Takové ovšem na malé ATARI u nás nejsou, také kolik existuje profesionálních programátorů, že ? (pro 8-bity myslím)

Uvažovali jsme, co podnikneme v této věci my, redakce FLOPU. Ani jeden z nás dvou není žádným lektorem i když druhý redaktor umí programovat ve strojáku a jeden čas vedl na naší škole počítačový kroužek. Naše situace je typu "kde vzít kurs a nekrást".

Podívejme se na nabízené možnosti. V první řadě je to samozřejmě BASIC. V druhé řadě TURBOBASIC. Pro tyto programovací jazyky vyšla řada příruček různých kvalit. Zájemci mají také možnost využít všeobecných příruček a učit se upravováním uváděných příkladů do ATARI BASICU. Uvedl bych zde velmi zajímavou knihu "BASIC u mikropočítačů" z roku 1998. Obsahuje množství příkladů hlavně z matematických odvětví. Používá se zde ale hodně vyšší matematika, je to tedy kniha již pro ty pokročilé, zejména studenty VŠ nebo zájemce o matematiku.

Celkově si myslím, že zájemce o tento jazyk má informací dostatek. Budeme však uvádět krátké řešení příkladů (např. nová rubrika hlavolamy).

Dalšími interprety BASICU, k nimž existují manuály nebo vůbec nic, se ani nemám chuť zabývat.

Podle svého přesvědčení bych pro malý počítač doporučil programování ve strojovém jazyce za pomoci vhodného assembleru. S ním je možné psát optimálně krátké programy a mít celý systém pod kontrolou. Řada efektů ani jinak naprogramovat nejde. Práce s ním je však dosti složitá a zdlouhavá a tak se hodí jen pro vážné zájemce. Běžným pokusníkům v BASICu je dobrá možnost dávat krátké jednoúčelové rutinky do svých programů pomocí funkce USR nebo efekty s rolováním a barvami do přerušení.

Naše redakce nemá k dispozici žádný použitelný kurs programování ve strojovém jazyce, budeme se však snažit získávat nějaké krátké ukázky a uvádět je i s popisem vysvětlujícím co s nimi.

Z ostatních jazyků jsou nejvíce popularizované PASCAL a ACTION!. Na oba bylo vydáno několik různých příruček opět různé kvality. Mimo to pro disketáře jsou dostupné kursy programování právě v těchto jazycích vydávané v rámci disketových magazínů v Německu. Z těchto důvodů se těmito jazyky nehodláme zabývat, protože by to mohlo připomínat nošení dříví do lesa. Nějaké výhody ovšem mají. PASCAL je zajímavý pro studenty, kteří jej mají přímo jako učební předmět. ACTION! je zase jazyk psaný pro malé ATARI a umožňuje zřejmě dělat i zajímavé programy. Viděl jsem jednoduchý tetris, který byl publikovaný v polském časopise Bajtek a nezabíral mnoho místa. Přesto po opsání bývalým členem našeho Atari klubu fungoval. Zařadit by jej asi němělo smysl, protože kvalita samozřejmě nedosahuje známého "Warszaw tetrisu", ale bude-li zájem, zkusíme vyhledat původní zdrojový text, do kterého bude možné vrtat a upravovat si jej podle libosti a schopností.

Další jazyky se mi zdají pro osmibitové počítače spíše exotické. Podle článku v nějakém Atari zpravodaji mají pro náš počítač existovat "všechny" vyšší jazyky kromě PROLOGU. Snad právě proto jsem záviděl spectristům, že jej mají i s manuálem a zdálo se mi přitažlivé programovat "logicky". Méně mě již trápilo, že ne všechny další jazyky se v naší republice objevily. Pokusím se vzpomenout na ty, které jsem viděl alespoň jako program s názvem, třeba nefungující.

LOGO je výukový program složitější, ale v principu stejný jako KAREL, který je myslím československým produktem. Je to interpret, běžně dostupný, nepracoval mi ale na kazetě pod TOSem. Vyšla pro něj tlustá příručka jako pražská příloha a dále méně využitelný seznam příkazů. V časopise ELEKTRONIKA vycházel jeden čas kurs zaměřený na tento jazyk. Zájemci tedy mají opět dost možností.

Jazyk FORTH byl před několika lety popularizovaný v časopise Amatérské radio. Mezi ataristy koluje několik jeho verzí, ale nikdy jsem jej neviděl fungovat nebo v činnosti. Po čase jsem získal příručku vydanou v Ostravě, ale to jsem se zabýval jinými věcmi. Navíc neznám nikoho, třeba na PC, kdo by s tímto jazykem dělal.

K jazyku LISP byl zveřejněn krátký seznam příkazů. Zájemce o programování by asi musel něco o něm již znát, aby se v jeho verzi na ATARI pokusil programovat. Donedávna jsem neznal žádného takového, ale při pročítání tohoto textu externí spolupracovník Radek mě obohatil novými informacemi. Seznámení s jazyky PROLOG a LISP má přímo v osnovách na své škole. LISP pro Atari zkoušel jen zadáváním jednotlivých funkcí, jak je znal ze školy a podle jeho vyjádření to celkem chodilo. Celý napsaný program nezkoušel a je otázka, jestli to kazetová turboverze vůbec umožňuje.

Pokud jsem vynechal nějaký existující jazyk pro náš počítač, či snad někdo z vás programuje v nějakém exotickém a neznámém jazyce, ozvěte se.

Nyní se konečně dostáváme k vybranému jazyku "C". Tedy proč právě tato zvláštnost, která se mi ještě na začátku roku jevila jako čirá magie ? A navíc pravděpodobně v něm nebude reálné napsat nějaký skutečně užitečný program.

Jeden z mých důvodů je čistě osobní. Zvolil jsem si tento jazyk pro programování na svém velkém ATARI ST, protože na stroják si na něm netroufám. Na ST je "C" rozšířený a já znám programátory na PC, kteří v něm dělají a jedním z nich je přímo zamněstnanec firmy FLOPu. Od něj jsem již začal informace čerpat. Na ST mi ale chybí česká příručka, zatím co na malé ATARI ji mám, zvolil jsem tedy postup předchozí přípravy v programování. Později se budu učit samotné ovládání programu na ST, které s programováním vlastně nemá nic společného.

Teď je již jistě každému jasné, že nemám připravený žádný kvalitní kurs, ale prostě budu předkládat svoje vlastní zkušenosti s učením se jazyku. Bude to třeba trochu neuspořádané, ale zato by uváděné jednoduché příklady měl pochopit každý zájemce.

Ale zpět k těm důvodům. Jazyk by mohl být zajímavý pro studenty oborů, kde se jím zabývají povinně a rádi by se doma prakticky pocvičili. Nedělám si ale iluze o počtu takových zájemců, protože v dnešní době jsou obvykle i středoškoláci vybaveni počítači PC. Zbývá poslední důvod pro širokou veřejnost a ten je "prostě si to zkusit". Tak jako většina majitelů ATARI si zkouší programovat v BASICU, ale málokdo vytvoří skutečně používaný rozsáhlý program, tak si může každý disketář, či alespoň majitel rozšíření jazyk "C" ochutnat. Je to správná divočina, protože například samotná kompilace je dvoufázová. Na tuto práci by byl dobrý alespoň malý ramdisk 130 XE, protože je nutné vytvořit zdrojový text nějakým textovým editorem, nahrát první kompilační program a vytvořit meziprodukt, nahrát druhý kompilační program zvaný linker a vytvořit konečný spustitelný program s využitím dalších nutných souborů pro linkování. Oproti PASCALu větší dřina, ale radost je pak také úměrně větší. (když to funguje)

Pro účely kursu zatím budeme používat DEEP BLUE "C", protože na něj vyšel český manuál. Viděl jsem kdysi dávno nějaké diskety s údajně jinou verzí "C", ale nic mi to bez manuálu neřeklo. Upozorňuji, že toho "našeho" Céčka koluje i vadná verze, u níž má jeden z důležitých souborů menší počet sektorů, než má být. Proto následuje výpis adresáře funkční verze.

* DOS     SYS 037      DOS 2.5
* DUP     SYS 042
* DBC     OBJ 017      knihovna
* CLINK   COM 087      linker
* CC      COM 182      kompilátor
* PMG     C   015
* PMG     CCC 011
* GRAPHICSC   023
* GRAPHICSCCC 010
* AIO     C   034
* AIO     CCC 020      funkce I/O
* X       C   009
* BOUNCE  CCC 013
* BOUNCE  COM 050
* MEDITC  ECF 001
* BOUNCE  C   012
* X       LNK 001
* X       CCC 009
* X       COM 048
* PRINTF  C   021
* PRINTF  CCC 018      funkce PRINTF
* BOUNCE  LNK 001
* DOC     000 057
* DOC     001 057
* DOC     002 056
* DOC     003 057
* DOC     004 045
* FONT    SET 009
* DOC     COM 041
* RAMDISK COM 009      běžný k DOSu 2.5
018 FREE SECTORS

Při zkouškách s několika DOSy jsem zjistil, že kompilátor funguje s BIBODOSem ale linker ne, s FLOP DOSEM nefunguje nic. Ověřena je práce se standartním DOSem 2.5. Další DOSy jsem nezkoušel, jako třeba SPARTADOS, pod nímž "C" fungovat má. Pro nás je důležité, že FLOP DOS je nepoužitelný, proto bude nutné uváděné příklady si překopírovat na jinou disketu a pak s nimi pracovat. Z výpisu originální diskety je vidět, že je na ní více souborů, totiž je plná. Důležité jsou vlastní kompilátory a knihovny. Tyto doporučuji překopírovat na pracovní disketu, protože se používají ke zlinkování.

V textu našeho kursu se bude hovořit i o standartních rysech céčka s poukazy na odlišnosti Atari verze, protože mimo jiné je záměrem kursu se nenásilnou formou trochu vzdělat, ať se nestydíme před majiteli PC a jiných 16 bitů. Uváděné příklady, i když budou přispůsobeny naší verzi, nebude ale také možné bez úpravy spouštět. Čapek má pozměněné důležité standartní ASCII znaky, takže jej není možné použít jako editor zdrojových textů programů. Funkční výpisy programů budou ve zvláštních souborech s koncovkami .C (extendery). Připravovat je budu pomocí volně šiřitelného SPEEDSCRIPTu, protože jej znám. Klidně můžete ale používat jakýkoliv editor pracující se standartními kódy ASCII. Ke dnešní úvodní části je přiložen i zkompilovaný soubor .CCC a zlinkovaný .COM - tyto si od příště budete vytvářet sami.

Jazyk "C" je zásadně vytvořen pro strukturované programování. Později vznikly verze pro objektové programování, kterýžto výraz neumím vysvětlit. Nevadí - nebude to pro naše malinké "C" aktuální. Holý jazyk má jen několik málo příkazů - podmínku, tři druhy cyklů, nějaké pomocné příkazy a zcela základní matematické operace. Všechno ostatní je odděleně v knihovnách funkcí, které se do výsledného programu zahrnou při zlinkování. Knihovny jsou standartně dodávané a také vytvářené uživatelem jak se mu zlíbí.

Vytvořený program, nebo spíše jeho zdrojový text je tvořen zápisy funkcí, které samozřejmě můžou být vnořené do sebe. Následuje krátký text programu, který pouze tiskne nějaké věci na obrazovku. V BASICu by se pro tento účel použil příkaz PRINT, kombinovaný popřípadě s POSITION.

  #include
  main()
  }
   printf("Maly tisk na obrazovku./n");
  }

Text programu začíná příkazy INCLUDE, které uvádějí knihovny funkcí použité v programu. Zde je nutné zařadit knihovnu obsahující funkce pro vstup a výstup z důvodu použití funkce PRINF. Soubor STDIO.H je textový soubor, který danými konvencemi deklaruje funkci a způsob jejího použití. Kompilátor tak může při překladu kontrolovat správnost použití funkce v programu, například druh a rozsah proměnných. V programu pro naši verzi tento způsob není použitý. Viděl jsem také na PC v produktu BORLAND možnost nepoužití INCLUDE, ale tím vznikají pouze nevýhody zrušením možnosti okamžité kontroly.

Dále následuje hlavní funkce MAIN(). Je v každém programu povinná, protože se jedná o vlastní program. Za názvem funkce jsou v kulatých závorkách uvedeny parametry funkce. Protože hlavní funkce parametry nepoužívá, jsou závorky prázdné. Podle pravidel syntaxe musí být však uvedeny.

Vlastní tělo funkce je uzavřeno ve složených závorkách. Protože Čapek má levou závorku zrušenou, použil jsem i na začátku pravou, ale být to tak nemá. V uvedeném příkladu se tělo funce skládá jen z jednoho příkazového řádku, kterým je volání funkce PRINTF().

Tato funkce má v kulatých závorkách uvedený svůj parametr. V nejjednodušším případě je to řetězec textů uzavřený v uvozovkách. Na jeho konci je uvedený řídící znak pro odřádkování, čili LF. Skládá se z obráceného lomítka a malého n. Opět jsem narazil na problém s Čapkem, že nemám k dispozici obrácené lomítko. Použil jsem v příkladu lomítko normální, ale je to nouzové řešení. Jinak správně by měl ještě následovat řídící kód pro návrat na začátek řádku, který se zapisuje obráceným lomítkem a malým r. Učebnice "Od BASICu k Céčku" jej však nepoužívá a ve verzi pro ATARI nastává návrat na začátek řádku automaticky při odřádkování.

Pokud je potřeba tisknout obrácené lomítko nebo uvozovky, provede se to zdvojením lomítka či lomítkem s uvozovkami. Funkce PRINTF umožňuje tisknout složité texty nebo čísla nastavením masky pro tisk. V učebnici se hovoří o formátování tisku.

Maska pro tisk je první výraz v kulatých závorkách uzavřený uvozovkami. Obsahuje běžné textové znaky, již známé kódy pro odřádkování a nejdůležitější jsou povely pro vkládání číselných i textových proměnných nebo výrazů. Tyto řídící povely se skládají ze znaku procenta a dalších blíže určujících znaků. Malé písmenko s označuje textový výraz, d je desítkové číslo, x je číslo hexadecimální. U čísel může být vyjádřen i povolený počet míst k tisku a znaménkem minus zarovnávání zleva. Protože mi opět chybí znaménko procenta v Čapkovi, neuvádím v textu tyto příklady. Jsou uvedeny v příkladu zdrojového textu programu připraveného pro ATARI verzi s názvem PRINT.C

Je v něm také použita funkce getchar(), hlavně z důvodu zastavení tisku na obrazovku. Program sestávající ze samých funkcí printf() by proběhl tak rychle, že by výsledek ani nebyl pozorovatelný. Bohužel funkci scanf(), popsanou v příručce jako protiklad funkci printf(), jsem v knihovnách pro ATARI nenašel. Spokojil jsem se s jakousi málo vysvětlenou getchar(), která má číst jeden znak z klávesnice. Pracuje ale i pro čtení číselné proměnné, kdy dodá zřejmě kód stisknuté klávesy.

Tuto funkci je samozřemně možné vložit všude tam, kde se očekává textový výraz.

printf(".s.s/n","vloz znak",getchar());

První výraz v uvozovkách je maska pro tisk. Znak procenta je nahražen tečkou, obrácené lomítko obyčejným. V masce je předepsán tisk dvou textových výrazů a příkaz pro přechod na nový řádek. Další parametry jsou oddělovány čárkami. První textový výraz je text uvedený v uvozovkách, druhý je funkce getchar(). Kód pro odřádkování může být uveden i ve druhém parametru - textu uzavřeném uvozovkami, ale nemůže nikdy stát vně uvozovek.

Stejně bude fungovat i tento divoký zápis:

       printf(".s",c=getchar())

Zde se nejprve přiřadí výsledek funkce proměnné c a její obsah se vytiskne na předepsané pozici. Výsledek vypadá úplně stějně jako použitím předchozího příkladu.

Jinak se tato funkce chová dosti podivně, používá například klávesový buffer, který běžně DOS 2.5 nemá. Považuje také RETURN za platný znak, takže jsem vždy zadal dva znaky - chtěný a odesílací. Proto doporučuji při zkouškách zkompilovaného programu zkusit si zadávat samotné "returny" a tak přehledněji sledovat chování programu. Doporučuji také dopsat na vhodná místa kódy pro odřádkování, ať se zlepší tvar tisku.

V přiloženém programu se také již vyskytují proměnné. Sledujte následující příklad:

main()
}
  int i;
  char c;
  i = 10;
  c=getchar();
 printf(".s text a číslo: .d/n",c,i);
}

Veškeré proměnné musí být před použitím nadeklarovány. Srovnejte s dimenzací řetězců v BASICu. Deklarace se provádí na začátku těla funkce. Proměnné jsou tím připraveny pro použití v dané funkci. Ve funkci vnořené můžou být deklarované proměnné stejného názvu, aniž by se navzájem ovlivňovaly.

Deklarace celočíselných proměnných se provádí příkazem int následovaným seznamem názvů, textové proměnné se deklarují příkazem char.

Příkladu je použito naplnění celočíselné proměnné číslem stejným způsobem, jaký známe v BASICu. Řetězcová proměnná takto naplnit nelze! Maska pro tisk obsahuje příkaz pro umístění textového výrazu, přímý text, příkaz pro tisk desítkového výrazu. Užitými parametry jsou textová a celočíselná proměnná. Na místě obou proměnných by mohl být text v uvozovkách a číslo bez uvozovek.

ATARI verze používá místo složených závorek dvojce znaků - string (dolar) následovaný kulatými závorkami. Na začátku levou, na konci pravou. Tato věc je v příručce napsána chybně, správný způsob jsem zjistil prohlídku hotových příkladů.

Moje nejčastější chyby byly vynechání středníku, uvozovek a kulatých závorek. Při vynechání středníku označí kompilátor velký výskyt chyb v následujícím řádku, protože jej bude považovat za pokračování předchozího.

Postup kompilace:

V našem případě obsahuje tento text:

print
aio
printf
dbc.obj

První je zkompilovaný soubor PRINT.CCC, další dva jsou dodané knihovny též s extendery .CCC a poslední je základní výjonná strojáková knihovna. Zde je uvedený i extender, protože není z hlediska linkeru standartní .CCC

Linkovací program má název CLINK.COM a po jeho spuštění je nutné nejdříve zadat stiskem L volbu linkování a pak teprve název souboru.

Jako příloha ke dnešní části kursu jazyka "C" je uveden i kompletní hotový program. Lze jej spustit i FLOP DOSem, ale komplikovaněji. Po příkazu LOA se pouze načte, spustit se musí dalším příkazem RUN. U dosu 2.5 se spustí rovnou, taktéž i třeba z menu operačního systému Q-MEG.

Doporučuji vytisknout si zdrojový text programu na papír a pak sledovat, co vlastně dělá.