Jak se neztratit

Čím více člověk umí programovat, tím delší programy páchá. Začne to psaním krátkého prográmku, který něco dělá, pak ještě úprava, aby nějak vypadal a nakonec přídavek, aby to vůbec fungovalo. Tak se i jednoduchý program natáhne na mnoho řádků zdrojového textu. Poslední příklady budiž považovány za skvělý příklad.

Aby se programátor ve své práci vyznal, aby věděl, co dělá, je výhodné rozdělit program na části a psát jej jaksi „na přeskáčku". Tedy:

Jednoduchá ukázka:

Mám napsat program, který načte zvolený počet jmen z klávesnice a vypíše je na náhodná místa obrazovky.

Nejdřív se zeptá, kolik těch jmen bude. Pak tolikrát zopakuje jeden krok. Ten krok bude: načti jméno, zobraz jméno.

Program Jmena;
Begin
WriteLn('Dotaz na počet');
WriteLn('Opakování kroku');
End.

A teď to trochu vylepšit:

Program Jmena;
Var pocet: Integer;

Begin
WriteLn('Kolikrát opakovat?');
Readln( pocet );
For i:=1 to pocet do WriteLn('krok');
End.

A dále to rozvinout:

Program Jmena;
Var pocet: Integer;

Procedure Krok;
Begin
WriteLn('Načíst jméno...');
WriteLn('Vypsat jméno...');
End;

Begin
WriteLn('Kolikrát opakovat?');
Readln( pocet );
For i:=1 to pocet do Krok;
End.

Kurzívou jsou vyznačeny změny v programu.

Příklad:

V tomto příkladu půjde o „samostatnou práci podle přiloženého vzoru”.

Zadání:

Napsat program, který bude nabízet otázky testu. Uživatel na tyto otázky odpoví a nakonec se dozví hodnocení. Otázky jsou zadány v souboru na disku. Tento soubor je textový a má následující formát:

[Definice]
Nadpis testu
n
m
[Test]
1. Otázka číslo jedna
b a) odpověď Á
b b) odpověď Bé
...
[Hodnoceni]
min max Hodnocení pro toto rozmezí
min max Hodnocení pro další rozmezí
...

(Tučně psaný text znamená číslo, kurzíva volitelný text. Číslo n znamená počet otázek, číslo m počet odpovědí na každou otázky a b je počet bodů.)

Prázdné řádky a řádky, začínající středníkem, se nepočítají. Každá otázka, odpověď, nebo hodnocení se vejdou na jeden řádek a jsou dlouhé maximálně 250 znaků.

Rozbor zadání:

Ze zadání je možná jasné co má program dělat. Teď musíme rozhodnout jak to má dělat.

První pokus

Napíšeme program, který nic nedělá, jenom píše, co má dělat. A budeme se tvářit, jako že to skutečně dělá.

Program Test;
Begin
 WriteLn('Hlavička...');
 WriteLn('Načtení parametrů testu...');
 WriteLn('Opakované pokládání otázek...');
 WriteLn('Hodnocení...');
 WriteLn('Konec programu.');
End.

Vím, že je to směšné. Ale je to velmi dobrá cesta, jak programovat. Teď rozepíšeme program do procedur:

Program Test;

 Procedure Hlavicka;
  Begin
   WriteLn('Hlavička...');
  end;

 Procedure Parametry;
  Begin
   WriteLn('Načtení parametrů testu...');
  end;

 Procedure Otazky;
  Begin
   WriteLn('Opakované pokládání otázek...');
  end;

 Procedure Hodnoceni;
  Begin
   WriteLn('Hodnocení...');
  end;

 Procedure Konec;
  Begin
   WriteLn('Konec programu.');
  end;
Begin
  Hlavicka;
  Parametry;
  Otazky;
  Hodnoceni;
  Konec;
End.

Kurzívou psaný text už nebude potřeba měnit. Celý hlavní program je hotov! Teď už jenom ty ostatní drobnosti.

Začneme hlavičkou. Jednak je první, jednak je to nejjednodušší. Sem prostě doplňte co nejhezčí nadpis — fantazii se meze nekladou. Podobně můžete vyšperkovat proceduru Konec.

Nyní je na čase udělat něco s načítáním parametrů. Procedura Parametry se dá dále rozdělit na několik částí. Nejdříve přeskočí všechno až k řádku '[Definice]' Potom načte další tři řádky.

 Procedure Parametry;
  Begin
   WriteLn('Načtení parametrů testu...');
   WriteLn('-přeskočit až k [Definice]');
   WriteLn('-načíst nadpis');
   WriteLn('-načíst počet otázek');
   WriteLn('-načíst počet odpovědí');
   Nadpis:= 'Nadpis';	{Pouze pro testování !!!}
   Otazek:= 5;	{Test s pěti otázkami}
   Odpovedi:= 3;	{Každá otázka má tři odpovědi}
  end;

V této chvíli musíme zavést proměnné Nadpis, Otazek, Odpovedi v hlavním programu (před procedury).

Var
 Nadpis: String;
 Otazek, Odpovedi: Integer;

Další procedurou je procedura Otazky. Tu naprogramujeme trochu lépe. Program má číst otázky a odpovědi ze souboru. Vypíše je na obrazovku a čeká na odpověď uživatele. Přípravná „jakoby” procedura bude vypadat:

 Procedure Otazky;
  Var
   i, j: Integer;
  Begin
   WriteLn('Opakované pokládání otázek...');
   WriteLn('-Přeskočit až k [Hodnoceni]');
   For i:= 1 to Otazek do Begin
    WriteLn('- Otázka ', otazek );
    For j:=1 to Odpovedi do WriteLn('-- možnost ',j );
    WriteLn('- Zadání odpovědi');
   end;
  end;

Poslední nedopsanou procedurou je Hodnoceni. I to napíšeme nejdřív jenom „na oko”.

 Procedure Hodnoceni;
  Begin
   WriteLn('Hodnocení...');
   WriteLn('-Přeskočit až k [Hodnoceni]');
   WriteLn('-Do konce souboru:');
   WriteLn('-- načíst řádek');
   WriteLn('-- zjistit bodový rozsah');
   WriteLn('-- vytisknout hodnocení');
  end;

V této chvíli jsme dospěli do ideálního stavu: program sice nic nedělá, ale obsahuje už všechny podstatné části a navíc je bez chyb. Zbývá pouze dopsat „vnitřky" procedur. I to se bude dít postupně.

Začneme opět od začátku. Protože hlavička je hotová, je první na řadě procedura Parametry. Tady je její výpis — je to poslední procedura, kterou zveřejňuji v tomto příkladu:

 Procedure Parametry;
  Var
   F: Text;	{ Textový soubor }
   Radek: String;
   Pom: Integer;
  Begin
   WriteLn('Načtení parametrů testu...');
   Assign( F, 'PAS_11.Tst' );	{Jméno testu!!!}
   Reset( F );

   WriteLn('-přeskočit až k [Definice]');
   Repeat	{Opakuj..}
    Readln( F, Radek );
   Until EOF( F ) or( Radek='[Definice]' );

   WriteLn('-načíst nadpis');
   Readln( F, Nadpis );
   WriteLn('-načíst počet otázek');
   Readln( F, Radek );
   Val( Radek, Otazek, Pom );
   WriteLn('-načíst počet odpovědí');
   Readln( F, Radek );
   Val( Radek, Odpovedi, Pom );
  end;

Podobně je třeba upravit proceduru Otazky. Nejdříve tak, aby pouze vypisovala načtené řádky, později aby sbírala odpovědi a sčítala je.

Připomínám, že bodové hodnocení je na začátku řádku. To znamená, že každý načtený řádek je potřeba rozdělit na číslo (počet bodů) a ten zbytek (ukázat uživateli na obrazovku).

S hodnocením je to opět velmi podobné: každý řádek má na začátku dvě čísla — rozmezí bodů, pro které se má vytisknout na obrazovku.

Toť vše.


Test: Jste technický typ?
1. Délku nejsnáze změříte
a) příložníkem. (5)
b) krokem. (1)
c) metrem. (3)
2. Který z následujících výroků je vám nejbližší?
a) Elektřina je fyzikální jev, vznikající pohybem elektronů ve vodivém materiálu. (5)
b) Elektřina je užitečný nástroj, využívaný lidstvem od konce devatenáctého století. (3)
c) Elektřina je živel, číhající v zásuvce na nevinné oběti, které pak praští. (1)
3. Počítač používáte nejvíce
a) jako psací stroj. (3)
b) jako hrací automat. (2)
c) jako pořádně velkou kalkulačku. (5)
4. V autobuse zaslechnete slovní spojení „padesát herců”. Co si představíte?
a) Řadu padesáti osob (1)
b) Národní divadlo. (3)
c) Elektrickou zásuvku. (5)
5. Pořádáte mejdan. Pozvete přátele
a) telefonem (4)
b) osobně (2)
c) potrubní poštou (7)
6. Tento test vyplňujete
a) pokud možno pravdivě. (4)
b) jak by to mělo být. (1)
c) tak, aby to byla legrace. (1)

Vyhodnocení:
31 až 26
Jste skutečně technický typ, nebojím se dokonce říci technokrat. Moderní dobu očekáváte a těšíte se na ni. Vládnete veškeré blízké technice s nedbalou elegancí. Až vás to přejde, zjistíte možná, že svět se neskládá pouze ze samých vynálezů. Jenom převážně.
25 až 16
Nejste vyloženě technický typ. Snažíte se přiblížit co nejvíce lidem a jejich každodenním problémům. Snažte se dále, protože bez vás by lidem bylo stále hůř.
15 až 11
Potěším vás: s technikou nechcete mít nic společného. Nebo jen to nejnutnější. Mnohem lepší než technika je pro vás procházka vysokou trávou a pohled na osamělý měsíc na noční obloze. Nechť vám tato víra vydrží.
méně než 10
Uděláte nejlépe, když se vrátíte zpátky na svůj strom. Nebudete Lidstvu překážet a s trochou štěstí nebude Lidstvo překážet vám. Alespoň do doby, než se někdo rozhodne váš strom pokácet.