Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

public:pb161_fall14_cviko04_494841 [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
 +====== Cvičení 04 ======
 +===== Úvod do cvičení =====
 +Na dnešnom cvičení budeme pokračovať v projekte z minulého cvičenia. Cvičenie bude zamerané najmä na dynamickú alokáciu, ktorú využijeme napr. na pridávanie a odoberanie domov v susedstve, simíkov a miestností v dome a predmetov v miestnosti. Stiahnite si [[https://​www.fi.muni.cz/​~xklucar/​_tmp/​pb161/​pb161-cv04.zip|archív]] s predpripravnými súbormi. ​
  
 +<note warning>​Súbory ''​objects.cpp'',​ ''​objects.h'',​ ''​sim.cpp'',​ ''​sim.h'',​ ''​simneeds.cpp''​ a ''​simneeds.h''​ prepíšte vašimi súbormi z minulého cvičenia, prípadne použite vzorové súbory dostupné na stránke minulého cvičenia.
 +</​note>​
 +===== Predstavenie hierarchie =====
 +Pripomenutie z minulého cvičenia:
 +
 +Základom pre našu hru je susedstvo (''​class Neighborhood''​),​ v ktorom sa nachádzajú domy (''​class House''​). V domoch sa nachádzajú miestnosti (''​class Room''​) a bývajú tam simíci (''​class Sim''​),​ ktorí majú svoje potreby (''​class SimNeeds''​). Simík sa môže presúvať medzi jednotlivými miestnosťami;​ na jednoduché zapamätanie miestnosti, v ktorej sa simík nachádza, je možné použiť priloženú triedu (''​class SimRoomMap''​). V miestnosti sa nachádzajú rozličné predmety. Pre jednoduchosť uvážime len 3 druhy predmetov (posteľ -- ''​class Bed'',​ počítač -- ''​class Computer''​ a obraz -- ''​class Painting''​). Uvedené triedy majú spoločného abstraktného predka -- ''​class HouseholdItem''​. Táto trieda obsahuje dva atribúty typu ''​bool''​ -- ''​isInteractive''​ a ''​isDecorative''​. Prvý z nich je nastavený na ''​true'',​ ak ide o predmet, s ktorým môže simík interagovať. Druhý je nastavený na ''​true'',​ ak ide o predmet, ktorý má dekoratívny účel -- "​skrášľuje"​ miestnosť (predmet môže byť interaktívny aj dekoratívny zároveň). ​
 +
 +Triedy ''​House'',​ ''​Room'',​ ''​Sim''​ a ''​HouseholdItem''​ sú potomkami abstraktnej triedy ''​IObject''​. Vďaka tomu si môžete pomocou triedy ''​ListOfObjects''​ pamätať zoznamy domov, miestností,​ simíkov a predmetov, do ktorých môžete jednoducho pridávať nové prvky a odoberať existujúce.
 +
 +<note tip>Ak to uznáte za vhodné, môžete si do ľubovoľnej triedy hierarchie pridať pomocné metódy a atribúty.</​note>​
 +
 +===== První úkol - StringArrayWrapper =====
 +Pri interakcii s objektom v miestnosti môže mať simík na výber viacero spôsobov, ako s predmetom interagovať. Každá interakcia je popísaná reťazcom (parameter pre metódu ''​HouseholdItem::​interact''​). Aby sme mohli zistiť, aké interakcie sú aktuálne dostupné, obsahuje trieda ''​HouseholdItem''​ metódu ''​getListOfInteractions''​. Tá vráti zoznam resp. pole možných interakcií,​ zabalené do inštancie triedy ''​StringArrayWrapper''​. Táto trieda obsahuje dynamicky alokované pole reťazcov, ktoré je automaticky uvoľnené pri zavolaní deštruktoru triedy.
 +
 +<note warning>​V praxi existujú aj lepšie alternatívy ako náš ''​StringArrayWrapper''​ -- napr. kontajner ''​std::​vector''​ (bude sa preberať neskôr počas semestra). Berte preto prosím triedu ako ukážku dynamickej alokácie, nie ako niečo, čo by sa často využívalo.</​note>​
 +
 +==== Zadání úkolu ====
 +V súboroch ''​stringarraywrapper.h''​ a ''​stringarraywrapper.cpp''​ je pre vás časť kódu pripravená. Doplňte nižšie uvedené metódy:
 +
 +  * Konštruktor s parametrom ''​size_t n''​ dynamicky (pomocou ''​new''​) naalokuje na pointer ''​arr''​ pole ''​n''​ stringov. Parameter ''​n''​ bude mať nastavenú predvolenú hodnotu 0.
 +  * Deštruktor uvoľní všetku pamäť, ktorú si trieda alokovala.
 +  * Metóda ''​size_t size() const''​ vráti aktuálnu veľkosť poľa ''​arr''​.
 +  * Kopírovací konštruktor a operátor =, ktoré dostanú konštantnú referenciu na objekt ''​other''​ a vytvoria jeho **hlbokú** kópiu. Trieda obsahuje implementáciu operátora [], tzn. na prístup k i-temu reťazcu u ''​other''​ stačí napísať ''​other[i]''​.
 +
 +<note important>​Dajte si pozor na správnu implementáciu operátora =. Pre bližšie informácie a tipy si môžete prečítať [[http://​courses.cms.caltech.edu/​cs11/​material/​cpp/​donnie/​cpp-ops.html|článok]].</​note>​
 +
 +Pridajte ďalej implementáciu metódy ''​ StringArrayWrapper getListOfInteractions() const;''​ do tried ''​Bed''​ a ''​Computer'':​
 +  * U triedy ''​Bed''​ sú možné interakcie ''​Sleep''​ a ''​Relax''​.
 +  * U triedy ''​Computer''​ je nutné rozlíšiť,​ či je počítač zapnutý alebo vypnutý. Ak je počítač vypnutý, jedinou možnou interakciou je ''​Turn on''​. Ak je zapnutý, možné interakcie sú ''​Play games'',​ ''​Visit social network''​ a ''​Turn off''​.
 +
 +<note important>​Vašu implementáciu si otestuje pod valgrindom. Unit testy sú dodané v súbore ''​stringarraywrapper_tests.cpp''​ (cieľ stringarraywrapper_tests).</​note>​
 +
 +===== Druhý úkol - class Room =====
 +Trieda ''​Room''​ slúži na reprezentáciu miestnosti, v ktorej sa nachádzajú predmety. Vašou úlohou bude doplniť implementáciu v súboroch ''​room.cpp''​ a ''​room.h''​. Časť kódu je už pripravená.
 +==== Zadání úkolu ====
 +Implementujte nasledujúce metódy:
 +  * ''​getObjects()''​ -- konštantná metóda, ktorá vráti konštantnú referenciu na zoznam predmetov v miestnosti (atribút ''​objects''​)
 +  * ''​int getAverageBeauty() const'',​ ktorá vráti priemernú krásu **dekoratívnych** predmetov v miestnosti. (Priemer stačí počítať ako celočíselné delenie ''​sum/​count''​. Ak sa v miestnosti žiaden dekoratívny predmet nenachádza,​ metóda vráti 0.)
 +  * ''​void addObject(string type, string id, unsigned price)''​ -- predvolená hodnota parametru ''​price''​ bude 0. Ak je ''​type''​ rovné niektorému z reťazcou ''​Painting'',​ ''​Bed''​ alebo ''​Computer'',​ pridá do zoznamu predmetov v miestnosti nový dynamicky alokovaný predmet príslušného typu. Ako ''​id''​ sa použije parameter metódy (u obrazu sa ako cena použije parameter ''​price''​).
 +  * ''​void removeObject(unsigned position)''​ -- ak zadaná pozícia nepredstavuje validnú pozíciu v zozname ''​objects'',​ metóda neurobí nič. V opačnom prípade odstráni zo zoznamu ''​objects''​ objekt na príslušnej pozícii a uvoľní pamäť, ktorú tento objekt používal.
 +  * Deštruktor,​ ktorý uvoľní všetku pamäť, ktorú si trieda dynamicky alokovala (dynamická alokácia prebieha len v metóde ''​addObject''​).
 +
 +<note important>​Otestujte si vaše riešenie pod valgrindom -- testy sú v súbore ''​room_tests.cpp''​ (cieľ room_tests).</​note>​
 +
 +
 +===== Třetí úkol - doplnenie metód pre prácu s pamäťou =====
 +Poslednou úlohou je doplniť metódy pre prácu s dynamicky alokovanou pamäťou v triedach ''​House''​ a ''​Neighborhood''​.
 +
 +
 +==== Zadání úkolu ====
 +''​class Neighborhood''​ (súbory ''​neighborhood.cpp''​ a ''​neighborhood.h''​):​
 +  * Implementujte metódu ''​void addHouse(string id, unsigned n)'',​ ktorá do zoznamu domov (atribút ''​houses''​) pridá nový, dynamicky alokovaný dom so zadaným ''​id''​ a počiatočným počtom miestností ''​n''​ (viď konštruktor triedy ''​House''​)
 +  * Implementujte metódu ''​void removeHouse(unsigned position)''​. Ak zadaná pozícia nepredstavuje validnú pozíciu v zozname ''​houses'',​ metóda neurobí nič. V opačnom prípade odstráni zo zoznamu ''​houses''​ objekt na príslušnej pozícii a uvoľní pamäť, ktorú tento objekt používal.
 +  * Implementuje deštruktor,​ ktorý uvoľní všetku pamäť, ktorú si trieda dynamicky alokovala (dynamická alokácia prebieha len v metóde ''​addHouse''​).
 +
 +''​class House''​ (súbory ''​house.cpp''​ a ''​house.h''​):​
 +  * Implementujte metódu ''​removeRoom(unsigned position)''​ analogicky k ''​removeHouse''​. Všetkých simíkov, ktorí sa v miestnosti nachádzali (atribút ''​simroom''​ a metóda ''​getSimRoom''​) ale presuňte do miestnosti (metóda ''​moveSimToRoom''​) na ktorú (po odstránení) ukazuje ''​rooms[0]''​. (Ak v dome už žiadna miestnosť nie je, nastavte simíkom miestnosť na ''​NULL''​).
 +  * Implementuje deštruktor,​ ktorý uvoľní všetku pamäť, ktorú si trieda dynamicky alokovala. Dynamická alokácia prebieha v metódach ''​addRoom''​ a ''​createSim''​ (tieto metódy sú už implementované).
 +
 +<note important>​Nakoľko sú uvedené metódy pomerne jednoduché a z veľkej časti podobné metódam, ktoré ste implementovali v triede ''​Room'',​ nie sú k tejto úlohe pripravené žiadne unit testy. Môžete si samozrejme pripraviť vlastné. Vaše riešenie si tiež môžete otestovať pomocou interaktívneho textového menu -- cieľ play_game. Nezabudnite program spustiť pod valgrindom.</​note>​
 +
 +===== Vzorové řešení =====
 +[[https://​www.fi.muni.cz/​~xklucar/​_tmp/​pb161/​pb161-cv04-solution.zip|Vzorové riešenie]]
 +
 +--- //Cvičenie pripravil Marek Klučár. Ak v zadaní alebo vzorovom riešení objavíte nejaké nedostatky/​chyby,​ píšte prosím na <​klucar@mail.muni.cz>//​
QR Code
QR Code public:pb161_fall14_cviko04_494841 (generated for current page)