Strukturované programování
S rozvojem programátorských technik byly hledány zásady a metody, které by zefektivnily a zrychlily tvorbu programů.
Dnes mluvíme o tzv. strukturovaném programování, modulárním programování a objektově orientovaném programování.
Strukturované programování vychází ze zásady strukturalizace algoritmů a datových struktur. Mezi jeho základní zásady patří:
1. | Program vytváříme jako soustavu, složenou z jednodušších částí,
které nazveme moduly. V podstatě jde o jakési schéma: úkol ---> podúlohy ---> procedury ---> program.
|
2. | Moduly se navrhují jako relativně samostatné.
Přesně definovaná úloha jednotlivých modulů, jednoduchá vazba na okolí. |
3. | Moduly si předávají vzájemně co nejméně dat.
Lokální data nesmí být přístupná jiným modulům, data pro komunikaci s okolím nejlépe jako parametry.
| 4. | Moduly se vzájemně volají jen jako celky.
Modul má jediný vstup a jediný výstup. Skoky doprostřed modulu nejsou dovoleny.
Volání jiného modulu uprostřed modulu je možné, ale návrat za místo volání.
|
5. | Programy se vytváří postupným rozkladem modulů shora dolů - postupným
zjemňováním.
Navrhneme modul, který zachycuje hlavní myšlenku algoritmu v pseudojazyku podle našich potřeb. Může se odvolávat na
moduly řešící dílčí úkoly, třebaže je zatím nemáme rozpracované. Tyto moduly rozkládáme na jednodušší a
rozpracováváme tak dlouho, až budou vyjádřeny ve zvoleném programovacím jazyku.
|
6. | Při rozkladu používáme struktur, do kterých je dobře vidět - jsou přehledné:
sekvence, selekce, cyklus
|
7. | Udržujeme pořádek v datech. Z jednoduchých datových typů vytváříme strukturované datové typy (pole, záznam, soubor).
Čím lepší je přehled o datech a charakteru odpovídajících operací s nimi, tím menší je pravděpodobnost vzniku chyby.
|
8. | Moduly vyšší úrovně jsou navrhovány před moduly nižší úrovně. Stejně tak se
snažíme i na počítači realizovat nejdříve vyšší (dosud nerozepsané pseudopříkazy jsou chápány jako volání triviálních procedur,
které simulují nějakou zjednodušenou odpověď - umožňuje testování (ladění) na počítači ještě před dokončením celého
programu).
|
9. | Dobrá přehlednost a možnost popsat funkce jednotlivých částí.
Každý modul opatříme poznámkou, charakterizující jeho funkci.. Používáme techniku odsazení (identace) - moduly nižší
úrovně více vpravo, stejné úrovně pod sebou.
|
Modulární programování
Modulární programování je založeno na myšlence rozděl a panuj.
Vytvářený program rozdělíme (dekomposice) do jednotlivých částí - modulů (v TP se nazývá jednotka, unit), které řeší jednotlivé dílčí problémy.
Každý modul obsahuje:
A. |
veřejnou část - (navenek viditelná) obsahuje:
- seznam deklarací vyvážených entit
definice toho (konstanty, proměnné, typy, funkce, procedury, vnořené moduly), co modul umožňuje využívat mimo (vně) modulu
- seznam deklarací dovážených entit
definice toho, co modul dováží pro své vlastní využití
|
B. |
soukromou část - (pro ostatní moduly skrytá část)
- soukromá lokální deklarace programových entit
- zdrojové texty procedur a funkcí
|
C. |
výkonná část - (inicializační část)
- algoritmus počáteční inicializace modulu (může být prázdná)
|
Modul vytváří kolem sebe určité hranice, přes které dochází k předávání programových entit. Zároveň s
dělením na moduly je třeba definovat mezimodulové rozhraní - vymezení vzájemých vazeb a spolupráce mezi moduly.
Deklarace unitu:
unit <jméno>
interface
uses <seznam dovážených modulů>
<vývozní seznam programových entit>
implementation
uses <seznam dovážených modulů pro soukromou část>
<deklarace lokálních programových entit>
begin
<algoritmus inicializace>
end
Dovážet lze pouze celý modul. Dovozem modulu se stávají využitelnými všechny programové entity, které dovážený modul exportuje.
Soubor, ve kterém je jednotka uložena, se musí jmenovat stejně jako tato jednotka (s příponou .pas).
Moduly mohou být samostatně překládány - přeložená jednotka má příponu .TPU - a pak připojeny k programům, které ji využívají.
Výhody:
- zvýšení přehlednosti programu
- rozdělení práce mezi více uživatelů
- zvýšení rychlosti kompilace programu
V TP jsou například tyto standardní jednotky:
CRT - zlepšení práce s klávesnicí a obrazovkou
DOS - čas, datum
PRINTER - práce s tiskárnou
GRAPH - grafické příkazy
Příklad
Vytvořte unit Melody, usnadňující tvorbu tónů a pomlk. Melody využijte v programu Hraj, který
zahraje koledu Narodil se Kristus Pán nebo melodii zadanou z klávwesnice podle volby uživatele.
Procedůra pro generaci tónu by stačila jedna, např. Ton(vyska, delka), ale výhodnější pro zápis a přehlednost
programu je rozlišit procedury podle délky tónu - Pulka, Ctvrtka, Osmina atd.
Jednotka Melody může vypadat takto:
unit
Melody; |
|
|
interface
|
|
{toto lze z jednotky Melody využívat}
|
const c=260;d=292;e=328;f=348;g=391;
a=439;b=465;h=493;c1=522;d1=586;
procedure Pulka(vyska:integer);
procedure Ctvrtka(vyska:integer);
procedure Osmina(vyska:integer);
procedure Pausa;
|
|
{definice tónů stupnice C dur}
{zahraje půlový tón}
{zahraje čtvrťový tón}
{zahraje osminový tón}
{pomlka}
|
implementation
|
|
{zdrojové texty procedur}
|
uses crt;
procedure Pulka;
begin
Sound(vyska);
Delay(1000);
Nosound;
end;
procedure Ctvrtka;
begin
Sound(vyska);
Delay(500);
Nosound;
end;
procedure Osmina;
begin
Sound(vyska);
Delay(250);
Nosound;
end;
procedure Pausa;
begin
Delay(500);
end;
|
|
{zde již parametry nemusí být}
{zahraje půlový tón dané výšky}
{hraje danou dobu - mikrosek.}
{ukončení zvuk.výstupu}
{zde již parametry nemusí být}
{zahraje čtvrťový tón dané výšky}
{hraje danou dobu - mikrosek.}
{ukončení zvuk.výstupu}
{zde již parametry nemusí být}
{zahraje osminový tón dané výšky}
{hraje danou dobu - mikrosek.}
{ukončení zvuk.výstupu}
{zde již parametry nemusí být}
{danou dobu nehraje}
|
begin
|
|
Nosound;
|
|
{inicialixace jednotky}
|
end.
|
|
Soubor uložíme pod názvem Melody.pas a zkompilujeme na disk (vytvoří se MELODY.TPU).
Potom se můžeme pustit do programu Hraj.
Program Hraj může vypadat takto:
program
Hraj; |
|
|
uses Melody,Crt;
var ton,volba:char;
|
|
{připojení jednotky Melody a Crt}
{globální proměnné}
|
procedure Narodil_se;
begin
|
|
|
Ctvrtka(f); Osmina(f); Osmina(g); Ctvrtka(a); Ctvrtka(h);
Ctvrtka(c1); Ctvrtka(c1);Pulka(c1);Ctvrtka(h); Ctvrtka(c1);
Pulka(d1); Pulka(c1); Pausa; Ctvrtka(c1); Ctvrtka(c1);
Ctvrtka(b); Ctvrtka(b); Ctvrtka(a); Ctvrtka(a); Pulka(g);
Ctvrtka(a); Ctvrtka(b); Ctvrtka(a); Ctvrtka(g); Pulka(f); Pausa;
Ctvrtka(a); Ctvrtka(g); Ctvrtka(a); Ctvrtka(b); Pulka(c1);
Pulka(f); Ctvrtka(a); Ctvrtka(g); Ctvrtka(a); Ctvrtka(b);
Pulka(c1); Pulka(f); Pulka(f); Pulka(d1); Ctvrtka(c1);
Ctvrtka(b); Ctvrtka(a); Ctvrtka(g); Pulka(f);
|
|
{zahraje postupně tóny koledy}
{Narodil se Kristus Pán}
|
end;
| | |
|
procedure Hraj_klavesu(ktery_ton:char);
begin
|
|
|
case ktery_ton of
'c': Ctvrtka(c);
'd': Ctvrtka(d);
'e': Ctvrtka(e);
'f': Ctvrtka(f);
'g': Ctvrtka(g);
'a': Ctvrtka(a);
'h': Ctvrtka(h);
else write(' ton ', ktery_ton, ' neznam ');
end;
|
|
{zahraje čtvrťový tón, jehož jméno}
{udáva stisknutá klávesa nebo}
{napíše zprávu, že tento tón nezná}
|
end;
| | |
|
Begin
| |
|
repeat
clrscr;
writeln('Program zahraje:');
writeln('1 - koledu Narodil se Kristus Pan');
writeln('2 - tony zadane z klavesnice');
writeln('0 - konec');
write('Tvoje volba: ');readln(volba);
case volba of
'1': Narodil_se;
'2': begin
writeln('stiskni klavesu s nazvem tonu (konec ... 0)');
repeat
ton:=readkey;
write(ton);
Hraj_klavesu(ton);
until ton='0'
end;
'0':
end;
until volba='0'
|
|
{opakuje}
{nabídka programu}
{zadáni volby}
{Narodil se Kristus Pán}
{návod}
{opakuje}
{zjistí stisknutou klávesu}
{napíše jméno tónu}
{zahraje tón}
{hraní končí nulou}
{program končí nulou}
|
End. |
| |
|
Domácí úkol:
A) Vytvořte jednotku Kombi pro výpočet faktoriálu a kombinačního čísla. Pak jednotky využijte v programu
Pascal, který napíše zadaný řádek Pascalova trojúhelníka.
B) Vytvořte program Klavir, ktery umožňuje zahrát melodii na dvou řadách klávesnice
jako na klavíru užitím jednotky Melody2. Vyjděte z toho, že tón C má výšku 260 a každý následující zvýšený o půtón získáme vynásobením
dvanáctou odmocnonou ze 2 a zokrouhlením na celé číslo (Cis má tedy výšku 275).
On-line účast na řešení úkolu
Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen
jednou). Volbou Hodnocení
si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy,
Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím.
|