Informatika - Katedra informatiky na UPOL

doc. RNDr. Michal Krupka, Ph.D. Výuka Objektově orientované programování


Objektově orientované programování

Zimní semestr 2017/18

Na této stránce budu vyvěšovat informace k předmětu KMI/OOP.

Informace k předmětu ve Stagu.

Základní informace

Předmět je věnován principům objektového programování. Použitým programovacím jazykem je Common Lisp, použitým nástrojem prostředí LispWorks, Personal Edition, které je ke stažení na adrese www.lispworks.com. Studentům se doporučuje důkladně s tímto prostředím a jeho omezeními (platnými pro Personal Edition) seznámit. Učební text k předmětu (poznámky k přednášce) bude postupně doplňován, ke stažení je níže.

Přednášky a cvičení

  1. 20. září: Úvod, od Scheme k Lispu. Cvičení: seznámení s LispWorks.
  2. 27. září: Common Lisp: základní výbava.
  3. 4. října: Objekty a třídy. Kód: 03.lisp.
  4. 11. října: Zapouzdření, polymorfismus. Kód: 04.lisp. Příklady: 04_jp-flag.lisp, 04_bulls-eye.lisp.
  5. 18. října: Dědičnost. Kód: 05.lisp nová verze 19. října s doplněnou dokumentací. Příklady: 05_light.lisp, 05_flags.lisp, 05_bulls-eye.lisp, 05_bounds.lisp.
  6. 25. října: Zpětná volání. Kód: 06.lisp
  7. 1. listopadu: Princip vlastnění, události. Kód: 07.lisp. Příklady: 07_circle-window.lisp, 07_click-circle.lisp, 07_cwa.lisp. Je třeba stáhnout si novou verzi knihovny micro-graphics
  8. 8. listopadu: Rekapitulace událostí, vylepšení hlášení změn. Kód: 08.lisp. Příklady: 08_bulls-eye.lisp, 08_changes-window.lisp, 08_text-shape.lisp, 08_button.lisp, 08_polygon-editor.lisp.
  9. 15. listopadu: Prototypy 1. Kód: 09.lisp.
  10. 22. listopadu: Prototypy 2. Kód: 10_system.lisp, 10_basics.lisp.
  11. 29. listopadu: Více o CLOS. Kód: 11.lisp. Příklady: 11_text-shape.lisp, 11_button.lisp, 11_click-circle.lisp, 11_cwa.lisp, 11_changes-window.lisp, 11_polygon-editor.lisp. Pomocný soubor: 11_load.lisp.
  12. 6. prosince: Vícenásobná dědičnost. Experimentální kód: 12.zip. Příklady: 12_click-mixins.lisp, 12_highlight-mixin.lisp.

Průběžné výsledky studentů na cvičení: skupina M. Krupky, skupina R. Vyjídáčka.

Zadání zápočtových úkolů

Úkol 4

Termín odevzdání: k zápočtu

Vyřešte alespoň 7 úloh z kapitoly 10 nové verze textu. Pokud budete řešit úlohu 10.6, definujte alespoň dvě z vyjmenovaných operací.

Úlohy pošlete v jednom zdrojovém textu, řešení každé úlohy jasně označte jejím číslem. Pracujte s načtenými oběma zdrojovými soubory k přednášce. Pokud budete měnit samotný interpret (v příkladech, kde je to povoleno), dejte nové definice rovněž do svého souboru. V tomto případě warning o předefinování funkce nevadí.

U tohoto úkolu bude možnost opravy jen ve zcela výjimečných případech.

Úkol 3

Termín odevzdání: 5. prosince

Úloha 8.9 z textu (příklad s třídou inspector-window). Jako v minulém úkolu musí řešení obsahovat dokumentaci pro uživatele. Poznámky: přečtěte si pokyny k vypracování úkolů na této stránce. Zejména nijak neupravujte soubor 08.lisp ani žádný jiný. Máte povoleno přidávat nové metody existujícím třídám, ale i tyto definice dejte do svého souboru. Nepoužívejte globální proměnné. V této úloze je jiné řešení než pomocí globálních proměnných lepší.

Úkol 2

Termín odevzdání: 9. listopadu 14. listopadu

Definujte třídu semaphore, která bude potomkem třídy picture a jejíž instance budou simulovat dopravní semafor. Dále definujte třídu crossroads, která bude rovněž potomkem třídy picture a jejíž instance budou představovat obrázky křižovatky. Své řešení opatřete uživatelskou dokumentací ve stejném stylu jako je dokumentace v souborech 05_light.lisp a 05_bulls-eye.lisp. (Jelikož má jít o dokumentaci uživatelskou, dokumentujte pouze vlastnosti a zprávy určené uživateli.)

Požadavky na třídu semaphore:

  1. Světla semaforu budou instancemi třídy light ze souboru 05_light.lisp (viz výše).
  2. Semafor bude mít nastavitelnou vlastnost semaphore-type s možnými hodnotami (minimálně) :pedestrian a :vehicle.
  3. Instance třídy semaphore se budou vykreslovat jako jednoduchý obrázek semaforu (správný počet koleček v obdélníku).
  4. Semafor se může nacházet v jedné z několika fází, podle svého typu. Např. semafor pro vozidla bude mít čtyři fáze (červená, červená + oranžová, zelená, oranžová). Aktuální barvy světel semaforu musí odpovídat jeho fázi. Číslo fáze bude uložené v nastavitelné vlastnosti semaphore-phase. Počet fází bude uložen ve vlastnosti phase-count. Fáze se číslují od nuly.
  5. Pro přechod k následující fázi bude semafor implementovat metodu next-phase.

Požadavky na třídu crossroads:

  1. Vlastnost items bude nastavitelná uživatelem. Může obsahovat libovolné grafické objekty, z nichž některé mohou být semafory.
  2. Třída definuje vlastnost semaphores (jen ke čtení), která bude obsahovat seznam všech semaforů v křižovatce.
  3. Křižovatka se podobně jako semafor může nacházet v různých fázích. Jednotlivé fáze křižovatky se budou opět přepínat zprávou next-phase a budou uloženy ve vlastnosti crossroads-phase. Počet fází bude uložen ve vlastnosti phase-count.
  4. Fáze křižovatky určují, v jakých fázích jsou její semafory. To je zadáno nastavitelnou vlastností program, která obsahuje program semaforu. To je seznam seznamů. Jeho délka udává počet fází, i-tý podseznam programu určuje stav křižovatky v její i-té fázi. Každý podseznam má délku rovnou počtu semaforů v křižovatce a pro každý semafor obsahuje číslo jeho fáze. Příklad: pro křižovatku o třech semaforech a programem ((0 0 0) (0 1 0) (0 2 1)) platí, že je-li křižovatka ve fázi 2, je její první semafor ve fázi 0, druhý ve fázi 2 a třetí ve fázi 1.

Pracujte s načtenou knihovnou micro-graphics a načtenými soubory 05.lisp a 05_light.lisp.

Úkol 1

Termín odevzdání: 4. října

Implementujte knihovnu funkcí pro práci s rovinnými geometrickými útvary: body, kružnicemi a polygony. Vnitřní reprezentaci útvarů zvolte podle vlastního uvážení. Používejte pouze část Common Lispu uvedenou v kapitole 2 učebního textu.

Implementované útvary a funkce:

Bod (point)

Bod je dán dvěma kartézskými souřadnicemi. Funkce make-point, volána bez parametru, vytvoří nový bod o souřadnicích (0,0). Funkce x a y tyto souřadnice vrátí, funkce set-x a set-y je nastaví a jako výsledek vrátí bod:

(make-point) => point
(x point) => x-ová souřadnice bodu point
(y point) => y-ová souřadnice bodu point
(set-x point 3) => point , nastaví x-ovou souřadnici bodu na 3
(set-y point 4) => point , nastaví y-ovou souřadnici bodu na 3

Bod lze dále posouvat o daný vektor pomocí funkce move. Funkce přičte k souřadnicím bodu souřadnice vektoru a bod vrátí jako výsledek:

(move point dx dy) => point , posune bod o vektor (dx,dy)

Každý bod má barvu, která je vyjádřena svým názvem začínajícím dvojtečkou (:red, :yellow a podobně). Barvu lze zjišťovat funkcí color a nastavovat funkcí set-color podobně jako x-ové a y-ové souřadnice.

Všechny ostatní útvary musí rovněž jít posouvat funkcí move a zjišťovat a nastavovat jim barvu funkcemi color a nastavovat funkcí set-color. Počáteční barva nově vytvořených útvarů je :black.

Kružnice (circle)

Kružnice je dána středem a poloměrem. Vytváří se funkcí make-circle podobně jako bod. Nově vytvořená kružnice má střed o souřadnicích (0,0). K dispozici jsou dále funkce na zjištění středu (center) a na zjištění a nastavení poloměru (radius, set-radius). Funkce fungují obdobně jako funkce zjišťující a nastavující vlastnosti bodů. Funkce pro nastavení středu neexistuje, ale lze nastavovat souřadnice existujícího středu.

Jak bylo řečeno výše, pro kružnice fungují i funkce move, color a set-color.

Polygon

Polygon je útvar, který je dán seznamem bodů. Nový polygon se vytváří funkcí make-polygon a má tento seznam prázdný. K seznamu bodů lze přistupovat funkcemi items a set-items.

Jak bylo řečeno výše, pro polygony fungují i funkce move, color a set-color.

Pokyny k vypracování úkolů

Odkazy


Správce stránky: Michal Krupka