250 likes | 367 Views
Informatika I 9 . přednáška. RNDr. Jiří Dvořák, CSc. dvorak @uai.fme.vutbr.cz. Obsah přednášky. Vývoj programovacích technik Strukturované programování Modulární programování Objektově orientované programování. Vývoj programovacích technik. Strukturované programování
E N D
Informatika I9. přednáška RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
Obsah přednášky • Vývoj programovacích technik • Strukturované programování • Modulární programování • Objektově orientované programování Informatika I: přednáška 9
Vývoj programovacích technik • Strukturované programování • Modulární programování • Objektově orientované programování S tímto vývojem je spojeno: • zvyšování úrovně abstrakce • posilování principu ukrývání dat a implementačních detailů Cílem těchto technik je zefektivnit tvorbu programů a zajistit, že vytvořené programy budou mít jasnou a srozumitelnou strukturu a budou snadno ověřitelné a rozšiřitelné. Informatika I: přednáška 9
Strukturované programování Zásady a postupy strukturovaného programování: • postup shora dolů při tvorbě programu • používání doporučených datových a příkazových struktur • nepoužívání (resp. minimalizace používání) příkazu goto • členění programu do podprogramů • grafická úprava programu, zvýrazňující jeho strukturu • používání výstižných identifikátorů a účelných komentářů Informatika I: přednáška 9
Příkaz goto v Pascalu Příkaz goto (příkaz skoku) způsobí předání řízení na příkaz označený návěštím. ... gotonávěští; ... návěští: příkaz; ... Návěští je identifikátor nebo celé číslo bez znaménka od 0 do 9999 a musí být deklarováno v nejblíže nadřazeném bloku deklarací labelnávěští; Příkaz skoku i označený příkaz se musejí nacházet v témž bloku. To znamená, že nejsou možné skoky dovnitř bloku nebo ven z bloku. Označený příkaz může být prázdný a tudíž je možné návěštím označit také koncové end nějaké příkazové struktury. Informatika I: přednáška 9
Možnosti náhrady příkazu gotov Borland a Object Pascalu Použití příkazu goto je vhodné např. tehdy, když se jedná o ukončení procedury či programu skokem na konec příslušného bloku nebo o předčasné ukončení cyklu skokem na příkaz bezprostředně následující za příkazem cyklu. Pro tyto účely však existují následující náhrady: break Tento příkaz způsobí předčasné ukončení cyklu; výpočet pokračuje příkazem bezprostředně následujícím za příkazem cyklu. exit Tento příkaz způsobí ukončení právě prováděného programu nebo podprogramu (procedury nebo funkce). Informatika I: přednáška 9
Modulární programování Modulární programování spočívá v členění programu do programových modulů (jednotek), které jsou samostatně kompilovatelné. program moduly procedury a funkce . . . . . . Informatika I: přednáška 9
Struktura modulu • Jméno modulu • Rozhraní (interface) modulu • dovoz modulu • vývoz modulu • deklarace veřejných konstant, proměnných a typů • specifikace veřejných operací (procedur a funkcí) • Implementační část modulu • deklarace soukromých konstant, proměnných a typů • specifikace a implementace soukromých operací • implementace veřejných operací Informatika I: přednáška 9
Program používající programové jednotky program jméno_programu; uses seznam jmen jednotek; deklarace návěští; definice konstant; definice typů; deklarace proměnných; deklarace procedur a funkcí; begin příkaz1; příkaz2; . . . end. Pozn.: V Pascalu se moduly označují jako jednotky (units). Informatika I: přednáška 9
Struktura programové jednotky unit jméno_jednotky; interface uses seznam jmen jiných jednotek; veřejnédeklarace konstant, typů a proměnných; hlavičkyveřejných procedur a funkcí; implementation uses seznam jmen dalších jednotek; soukromé deklarace; implementace veřejných procedur a funkcí; begin inicializační příkazy; {tyto příkazy se provedou jednou před prvým použitím jednotky} end. Informatika I: přednáška 9
Jednotka pro práci s komplexními čísly unit KomplexniCisla; {Při definici operaci nad komplexnimi cisly se vyuziva toho, ze v Object Pascalu funkce mohou mit strukturovany typ} interface type TComplex=record Re,Im:real; end; function Hodnota(Re,Im:real):TComplex; {Slouzi pro nastaveni hodnoty komplexniho cisla} function Soucet(X,Y:TComplex):TComplex; function Rozdil(X,Y:TComplex):TComplex; function Soucin(X,Y:TComplex):TComplex; function Podil(X,Y:TComplex):TComplex; function Nasobek(A:real;X:TComplex):TComplex; {Vypocita soucin realneho a komplexniho cisla} function AbsHodn(X:TComplex):real; Informatika I: přednáška 9
procedure Cti(var X:TComplex); {Z klavesnice se cte realna a imaginarni slozka jako dvojice cisel typu real; cisla jsou oddelena mezerou a dvojice je ukoncena radkem.} procedure CtiTF(var T:TextFile; var X:TComplex); {Z textoveho souboru se cte realna a imaginarni slozka jako dvojice cisel typu real; cisla jsou oddelena mezerou a dvojice je ukoncena radkem.} procedure Pis(X:TComplex;PocZ,PocD:integer); {Komplexni cislo se vypise na obrazovku ve tvaru (Re,Im), pricemz se neprechazi na novy radek. PocZ je pocet znaku a PocD počet desetinnych mist. Je-li PocD zaporne, pouzije se semilogaritmicky tvar.} procedure PisTF(var T:TextFile; X:TComplex; PocZ,PocD:integer); {Kazde komplexni cislo se zapisuje do textoveho souboru na novy radek jako dvojice hodnot Re a Im oddelenych mezerou.PocZ a PocD mají stejny vyznam jako v predchozim pripade.} Informatika I: přednáška 9
implementation function Hodnota(Re,Im:real):TComplex; begin Hodnota.Re:=Re; Hodnota.Im:=Im; end; function Soucet(X,Y:TComplex):TComplex; begin Soucet.Re:=X.Re+Y.Re; Soucet.Im:=X.Im+Y.Im; end; function Rozdil(X,Y:TComplex):TComplex; begin Rozdil.Re:=X.Re-Y.Re; Rozdil.Im:=X.Im-Y.Im; end; function Soucin(X,Y:TComplex):TComplex; begin Soucin.Re:=X.Re*Y.Re-X.Im*Y.Im; Soucin.Im:=X.Re*Y.Im+X.Im*Y.Re; end; Informatika I: přednáška 9
function Podil(X,Y:TComplex):TComplex; var Pom:real; begin Pom:=sqr(Y.Re)+sqr(Y.Im); Podil.Re:=(X.Re*Y.Re+X.Im*Y.Im)/Pom; Podil.Im:=(X.Im*Y.Re-X.Re*Y.Im)/Pom; end; function Nasobek(A:real;X:TComplex):TComplex; begin Nasobek.Re:=A*X.Re; Nasobek.Im:=A*X.Im; end; function AbsHodn(X:TComplex):real; begin AbsHodn:=sqrt(sqr(X.Re)+sqr(X.Im)); end; procedure Cti(var X:TComplex); begin readln(X.Re,X.Im); end; Informatika I: přednáška 9
procedure CtiTF(var T:TextFile; var X:TComplex); begin readln(T,X.Re,X.Im); end; procedure Pis(X:TComplex;PocZ,PocD:integer); begin if PocD<0 then write('(',X.Re,',',X.Im,')') else write('(',X.Re:PocZ:PocD, ',',X.Im:PocZ:PocD,')'); end; procedure PisTF(var T:TextFile; X:TComplex; PocZ,PocD:integer); begin if PocD<0 then write(T,X.Re,' ',X.Im) else write(T,X.Re:PocZ:PocD, ' ',X.Im:PocZ:PocD); writeln; end; end. Informatika I: přednáška 9
Sečítání komplexních čísel program ScitaniKompCisel; {$APPTYPE CONSOLE} {Cisla se ctou z textoveho souboru a soucet se vypisuje na obrazovku} uses KomplexniCisla; var X,Suma:TComplex; Vstup:textfile; Jmeno:string; begin writeln('Zadej vstupni soubor'); readln(Jmeno); assignfile(Vstup,Jmeno); reset(Vstup); Informatika I: přednáška 9
Suma:=Hodnota(0,0); while not seekeof(Vstup) do begin CtiTF(Vstup,X); Suma:=Soucet(Suma,X); end; write('Soucet= '); Pis(Suma,8,2); writeln; closefile(Vstup); writeln('Stiskni Enter'); readln; end. Informatika I: přednáška 9
Objektově orientované programování Objektově orientované programování je přístup k tvorbě programů, založený na využití objektů a jejich vlastností. Zahrnuje analýzu problému, návrh struktury programu i způsob psaní programu. Základní pojmy: objekt, třída (objektový typ), posílání zpráv, zapouzdření, dědičnost, polymorfismus. Informatika I: přednáška 9
Objekt Objekt je programová struktura, obsahující jak data, tak metody, které s těmito daty pracují. Zapouzdření(encapsulation) znamená, že data objektu jsou přístupná pouze prostřednictvím metod tohoto objektu. metody data Informatika I: přednáška 9
Třída (class) Třídaje skupina objektů, které mají stejné vlastnosti (atributy, datové složky) a stejné chování (metody). Objekt, který patří do určité třídy, se nazývá instance této třídy. Atributy (datové složky): • atributy třídy • atributy instancí Metody: • metody třídy (např. konstruktor) • metody instancí (např. destruktor) Informatika I: přednáška 9
Dědičnost (inheritance) Od jedné třídy (bázové, rodičovské) můžeme odvodit třídu jinou (odvozenou, dceřinnou). Dceřinná třída (potomek) dědí všechny složky své rodičovské třídy (předka) a k nim může přidat svoje vlastní. Zděděné metody je možno předefinovat. Potomek může v programu vždy zastoupit předka (i nepřímého). Naopak to možné není. Dědičnost může být: • jednoduchá (třída má jednoho rodiče) • vícenásobná (třída má více rodičů) Informatika I: přednáška 9
Třídy, objekty a dědičnost M1 Třída T A1, A2 vytvoření instance Atributy: A1, A2 M2 Metody: M1, M2 odvození třídy M1 M3 Třída T1 (od T) A1, A2, A3 Atributy: A3 Metody: M1, M3 M2 Informatika I: přednáška 9
Skládání tříd a objektů m1 Třída T1 vytvoření instance a1, a2 Atributy: a1, a2 m3 m2 Metody: m1,m2,m3 M1 m1 Třída T2 a1, a2 Atributy: A typu T1 m3 m2 Metody: M1, M2 M2 Informatika I: přednáška 9
Posílání zpráv Objekty spolu komunikují tak, že si navzájem posílají zprávy. Obvykle to znamená, že jeden objekt (odesilatel zprávy) volá metodu jiného objektu (příjemce zprávy). Časná vazba(early binding): Příjemce zprávy je určen v okamžiku kompilace. Pozdní vazba (late binding): Příjemce zprávy je určen až za běhu programu. Pomocí pozdní vazby se realizuje polymorfismus(mnohotvarost). To znamená, že určitá metoda se může v různých kontextech chovat různě. Informatika I: přednáška 9
Jazyky pro OOP • Jazyky čistě objektové (Smalltalk, Actor, CLOS, … ) • Jazyky podporující OOP, ale umožňující programovat i neobjektově (Borland Pascal, Object Pascal, C++, … ) Informatika I: přednáška 9