Informatika - Katedra informatiky na UPOL

doc. RNDr. Michal Krupka, Ph.D. Výuka Paradigmata programování 2 (kombinované studium)


KMI/YPP2 - Paradigmata programování 2

Letní semestr 2017/18

Informace k předmětu na Portálu UP.

Základní informace k předmětu

Předmět je věnován principům objektového programování. Použitým programovacím jazykem bude Common Lisp ve vývojovém prostředí LispWorks, Personal Edition. Studentům se doporučuje důkladně s tímto prostředím a jeho omezeními (platnými pro Personal Edition) seznámit.

Základní literaturou k předmětu je učební text Objektově orientované programování, kapitoly 1–8.

Požadavky na studenty

Průběžné výsledky studentů (chráněno heslem, sdělím na dotaz)

Během semestru studenti vypracují čtyři úkoly, zadávané postupně v následujících termínech:

ÚkolZadáníOdevzdání
1.15. února13. března
2.1. března3. dubna
3.15. března24. dubna
4.5. dubnasplnit do zápisu ke zkoušce

Zadání úkolů budou zveřejňována na této stránce a diskutována během přednášek a případně na konzultacích. Řešení je třeba poslat mailem na adresu vyučujícího nejpozději ve stanovený termín odevzdání. Úkol bude vždy uznán nebo vrácen k dopracování. Splnění úkolů je nutnou podmínkou k připuštění ke standardní zkoušce. Pokud někdo tuto podmínku nesplní, bude mít obtížnější zkouškové zadání.

Témata přednášek

Zadání úkolů

Úkol 4

Termín zadání: 5. dubna, úkol splnit před přihlášením ke zkoušce

Úloha 8.10 z textu (příklad s třídou inspector-window). Jako v minulém úkolu musí řešení obsahovat dokumentaci pro uživatele.

Úkol 3

Termín zadání: 15. března, termín odevzdání: 24. dubna

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.
  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 2

Termín zadání: 1. března, termín odevzdání: 3. dubna

Podobně jako v příkladech ve 4. kapitole verze textu definujte funkci make-my-picture, která vytvoří nějaký obrázek. Obrázek musí obsahovat alespoň jednu instanci každé ze tříd circle, picture, polygon a musí používat alespoň čtyři ze zpráv set-color, set-thickness, set-filledp, move, rotate, scale. Měla by akceptovat alespoň jeden parametr, který ovlivní nějaký netriviální aspekt obrázku (podobně jako např. funkce make-bulls-eye z příkladu 4.6.7). Vytvoření a vykreslení obrázku se pak provede postupným vyhodnocením výrazů

(setf w (make-instance 'window))
(setf p (make-my-picture ... ))
(set-shape w p)
(redraw w)

Pracujte s načtenou knihovnou micro-graphics a souborem 04.lisp.

Úkol 1

Termín zadání: 15. února, termín odevzdání: 13. března

Implementujte knihovnu funkcí pro práci s rovinnými geometrickými útvary: body, kružnicemi, polygony a obrázky. 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í tentýž 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 4

Bod lze dále posouvat o daný vektor pomocí funkce move. Funkce přičte k souřadnicím bodu souřadnice vektoru a tentýž 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. Počáteční barva nově vytvořených bodů je :black.

Všechny ostatní útvary musí rovněž jít posouvat funkcí move, zjišťovat jim barvu funkcí color a nastavovat funkcí set-color. Počáteční barva nově vytvořených útvarů je :black. Význam barvy útvaru nijak neinterpretujte. Jde jen o to, aby byl údaj o barvě v útvaru uložen.

Kružnice (circle)

Kružnice je dána středem a poloměrem. Střed kružnice je bod (tj. hodnota vytvořená funkcí make-point), poloměr kladné číslo. Kružnice se vytváří funkcí make-circle bez parametru 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 (funkcemi set-x a set-y aplikovanými na střed kruhu).

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ů – vrcholů polygonu. Nový polygon se vytváří funkcí make-polygon a má tento seznam prázdný. K seznamu vrcholů lze přistupovat funkcemi items a set-items. Funkce items má tedy jeden parametr a vrací seznam vrcholů, funkce set-items má dva parametry (polygon a seznam vrcholů) a vrací polygon.

Jak bylo řečeno výše, pro polygony fungují i funkce move, color a set-color. Barva polygonu je údaj uložený v polygonu a nijak nesouvisí s barvami jeho vrcholů.

Obrázek (picture)

Obrázek je útvar, který je dán seznamem libovolných jiných útvarů (tedy bodů, kružnic, polygonů, případně dalších obrázků). Technicky funguje velmi podobně jako polygon. Nový obrázek se vytváří funkcí make-picture a má seznam podobrázků prázdný. K seznamu podobrázků lze přistupovat funkcemi items a set-items. Funkce items má tedy jeden parametr a vrací seznam geometrických útvarů, funkce set-items má dva parametry (obrázek a seznam geometrických útvarů) a vrací obrázek.

Jak bylo řečeno výše, pro obrázky fungují i funkce move, color a set-color. Barva obrázku je údaj uložený v obrázku a nijak nesouvisí s barvami podobrázků.

Pokyny k vypracování úkolů

  • Při opakovaném řešení úkolu zahrňte do mailu veškerou naši předchozí korespondenci o úkolu, ať vidím své připomínky.
  • Řešení nepište přímo do mailu, vždy je připojte jako soubor s příponou .lisp. Soubor musí mít v názvu vaše jméno a číslo úkolu.
  • Zdrojový kód musí obsahovat pouze definice (tedy výrazy defun, defvar, defclass, defmethod a podobně). Jeho vyhodnocení by nikdy nemělo vést k vyhodnocení testovacích výrazů. Ty uvádějte pouze jako komentář (uvozený znaky #| a |#).
  • Zdrojový soubor musí být samostatný a musí obsahovat jen vaše řešení. Needitujte soubory, které dostáváte ode mě. Zdrojové soubory knihovny micro-graphics i zdrojové soubory k jednotlivým kapitolám textu musí zůstat beze změny, ke svému řešení je nepřikládejte.
  • Soubor musí jít zkompilovat bez jediné chyby a warningu. (Kompilace se provádí volbou Compile Buffer z menu, lišty, nebo klávesovou zkratkou.)
  • Kromě faktické správnosti musí úkol splňovat i základní stylové požadavky na program napsaný v Lispu. (Velbloudí notace, podtržítka v názvech funkcí, závorky na samostatném řádku apod. nejsou povoleny. Názvy predikátů končí na p, nikoli na otazník jako ve Scheme, řádky musí být správně odsazovány atd.)
  • Pokud soubor není psán v čistém ASCII, musí být uložen v kódování UTF-8 (kódování nově vytvářených a otvíraných souborů lze nastavit v předvolbách; LispWorks nijak nemodifikuje kódování už existujících souborů).

Informace k průběhu zkoušky

Týden před každým termínem zkoušky bude zveřejněno zadání pro daný termín. Zadání bude mít praktický charakter, bude obnášet vytvoření programu a zpracování dokumentace. Obsahem a rozsahem bude podobné zadání čtvrtého úkolu. Každý student přijde ke zkoušce s vypracovaným řešením. Řešení nemusí být kompletní. Průběh zkoušky:

  • Předvedení funkčnosti přineseného řešení a průvodní dokumentace.
  • Diskuse nad řešením. Student bude navrhovat způsob úprav programu podle požadavků zkoušejícího.
  • Zodpovězení teoretických otázek souvisejících s řešením.

Studenti, kteří nesplnili průběžné požadavky během semestru (čtyři úlohy), dostanou obtížnější zadání.

Odkazy


Správce stránky: Michal Krupka