Umíte pascalsky - 30.lekce ...

Umíte pascalsky?
30.lekce
Vytisknout  

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

Řešit úkol Prohlídka hodnocení úkolu Dotazy,připomínky

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.