Čí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:
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.
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
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.
|
|