Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.54 KB | None | 0 0
  1. Zbliżają się święta Bożego Narodzenia a wraz z nimi strojenie choinki. Rodzina
  2. Kowalskich właśnie wprowadziła się do nowego mieszkania i chciałaby ozdobić
  3. w nim drzewko świąteczne. Potrzebują wszystkiego: świerku, bombek, lampek... Jan
  4. Kowalski dysponuje pewną kwotą na ten cel. Jego żona Marysia i ich córka Ada
  5. umówiły się, że będą ubierać choinkę. Podekscytowana Ada bardzo lubi przebywać
  6. w otoczeniu choinki, dotykając bombek i bawiąc się światełkami. Przebieg
  7. wydarzeń reprezentuje poniższy kod:
  8.  
  9. === ChristmasTree.cc ===
  10.  
  11. #include <iostream>
  12. #include <memory>
  13. #include "helper.h"
  14. #include "decoration.h"
  15. #include "person.h"
  16.  
  17. using namespace std;
  18.  
  19. int main()
  20. {
  21. // Rodzina Kowalskich...
  22. auto John = make_shared<Adult>("Jan", Price(1000));
  23. auto Mary = make_shared<Adult>("Marysia");
  24. auto Ada = make_shared<Child>("Ada");
  25.  
  26. // ... chciała mieć świąteczne drzewko...
  27. ChristmasTree tree("Christmas tree");
  28.  
  29. // ... więc postanowiła kupić świeży świerk...
  30. auto spruce = make_shared<Tree>("Fresh spruce", Price(300), Date(18, 8, 10));
  31.  
  32. // ... i różne ozdoby,
  33. // światełka za 150 zł
  34. auto lights = make_shared<Lights>("Bright colorful lights withs 100 LEDs",
  35. Price(150));
  36. // i kilka bombek.
  37. auto glassBall1 = make_shared<GlassBall>("Glass ball in shape of snowman",
  38. Price(10));
  39. auto glassBall2 = make_shared<GlassBall>("Glass ball with Christmas tree",
  40. Price(15));
  41. auto glassBall3 = make_shared<GlassBall>("Glass ball with presents",
  42. Price(15));
  43.  
  44. // Za zakupy odpowiedzialny jest Jan. Żona i córka obserwują pojawianie się
  45. // ozdób:
  46. tree.attachObserver(Mary);
  47. tree.attachObserver(Ada);
  48.  
  49. // Podczas gdy Marysia z Adą ozdabiają drzewko...
  50. tree.addDecoration(spruce);
  51. tree.addDecoration(lights);
  52. tree.addDecoration(glassBall1);
  53. tree.addDecoration(glassBall2);
  54. tree.addDecoration(glassBall3);
  55.  
  56. // Jan płaci rachunek kurierowi.
  57. auto savings0 = John->getSavings();
  58. for (auto& x : tree) {
  59. John->buyDecoration(*x);
  60. }
  61. auto savings1 = John->getSavings();
  62. cout << "Savings before: " << savings0 << " and after: " << savings1 << ".\n";
  63.  
  64. // Drzewko ozdobione. Rachunek zapłacony. Od tego momentu startuje zegar.
  65. for (auto& time = currentDate();
  66. time < Date(24, 18, 0);
  67. ++time) {
  68. // Ada bawi się ozdobami choinkowymi o losowych porach (również nocą)...
  69. if (randomNumber() % 200 == 0) {
  70. cout << time << "\n";
  71. for (auto& x : tree) {
  72. // ... przyglądając się i manipulując losowo wybranymi ozdobami.
  73. if (randomNumber() % 4 == 0) {
  74. x->doOperation(cout);
  75. }
  76. }
  77. }
  78. }
  79. }
  80.  
  81. = Koniec pliku =
  82.  
  83. Wynik działania programu uzyskany na maszynie students jest następujący (należy
  84. zauważyć, że wynik jest deterministyczny, gdyż funkcja randomNumber generuje
  85. deterministyczny ciąg liczb):
  86.  
  87. === Standardowe wyjście (ChristmasTree.out) ===
  88.  
  89. We have new decoration!
  90. Total cost is 300 PLN.
  91. Wow!
  92. Fresh spruce: 100% of tree covered with needles
  93. We have new decoration!
  94. Total cost is 450 PLN.
  95. Wow!
  96. Bright colorful lights withs 100 LEDs: constant
  97. We have new decoration!
  98. Total cost is 460 PLN.
  99. Wow!
  100. Glass ball in shape of snowman: OK
  101. We have new decoration!
  102. Total cost is 475 PLN.
  103. Wow!
  104. Glass ball with Christmas tree: OK
  105. We have new decoration!
  106. Total cost is 490 PLN.
  107. Wow!
  108. Glass ball with presents: broken
  109. Savings before: 1000 PLN and after: 510 PLN.
  110. December, 18, 17:37
  111. Bright colorful lights withs 100 LEDs: blinking
  112. Glass ball with Christmas tree: OK
  113. Glass ball with presents: broken
  114. December, 18, 18:08
  115. Bright colorful lights withs 100 LEDs: off
  116. Glass ball with presents: broken
  117. December, 18, 20:26
  118. Fresh spruce: 100% of tree covered with needles
  119. Bright colorful lights withs 100 LEDs: constant
  120. Glass ball with Christmas tree: OK
  121. December, 18, 22:41
  122. Glass ball with presents: broken
  123. December, 19, 1:55
  124. December, 19, 2:02
  125. December, 19, 2:49
  126. December, 19, 4:35
  127. December, 19, 5:46
  128. December, 19, 9:48
  129. December, 19, 12:16
  130. Bright colorful lights withs 100 LEDs: blinking
  131. December, 19, 12:32
  132. Glass ball with Christmas tree: OK
  133. Glass ball with presents: broken
  134. December, 19, 15:09
  135. December, 20, 4:01
  136. Glass ball in shape of snowman: OK
  137. December, 20, 9:40
  138. Bright colorful lights withs 100 LEDs: off
  139. Glass ball with Christmas tree: OK
  140. December, 20, 20:31
  141. December, 20, 22:04
  142. Fresh spruce: 97% of tree covered with needles
  143. Glass ball with presents: broken
  144. December, 20, 23:50
  145. Bright colorful lights withs 100 LEDs: constant
  146. December, 21, 4:46
  147. Bright colorful lights withs 100 LEDs: blinking
  148. December, 21, 15:41
  149. Glass ball in shape of snowman: OK
  150. December, 21, 17:10
  151. Glass ball with Christmas tree: OK
  152. December, 21, 20:05
  153. Glass ball with presents: broken
  154. December, 21, 22:44
  155. December, 22, 5:46
  156. Glass ball with presents: broken
  157. December, 22, 11:18
  158. Glass ball with presents: broken
  159. December, 22, 17:04
  160. Fresh spruce: 94% of tree covered with needles
  161. Glass ball with Christmas tree: OK
  162. Glass ball with presents: broken
  163. December, 22, 17:39
  164. Fresh spruce: 94% of tree covered with needles
  165. Glass ball with Christmas tree: OK
  166. Glass ball with presents: broken
  167. December, 22, 20:07
  168. December, 23, 6:23
  169. Bright colorful lights withs 100 LEDs: off
  170. December, 23, 8:18
  171. Fresh spruce: 93% of tree covered with needles
  172. December, 23, 11:29
  173. Glass ball in shape of snowman: broken
  174. December, 23, 11:55
  175. Glass ball in shape of snowman: broken
  176. Glass ball with Christmas tree: OK
  177. Glass ball with presents: broken
  178. December, 23, 13:36
  179. Fresh spruce: 93% of tree covered with needles
  180. Glass ball in shape of snowman: broken
  181. Glass ball with Christmas tree: OK
  182. December, 23, 14:24
  183. Glass ball with presents: broken
  184. December, 23, 17:19
  185. Fresh spruce: 93% of tree covered with needles
  186. Glass ball with Christmas tree: OK
  187. December, 23, 21:46
  188. Bright colorful lights withs 100 LEDs: constant
  189. Glass ball with Christmas tree: OK
  190. Glass ball with presents: broken
  191. December, 24, 5:40
  192. Glass ball with presents: broken
  193. December, 24, 9:25
  194. December, 24, 9:41
  195. December, 24, 9:49
  196. December, 24, 11:12
  197. December, 24, 12:37
  198. December, 24, 15:26
  199. Fresh spruce: 91% of tree covered with needles
  200. December, 24, 16:01
  201. Bright colorful lights withs 100 LEDs: blinking
  202. December, 24, 16:39
  203. Glass ball in shape of snowman: broken
  204. December, 24, 16:59
  205. December, 24, 17:38
  206. Bright colorful lights withs 100 LEDs: off
  207.  
  208. = Koniec pliku =
  209.  
  210. Państwa zadaniem będzie napisanie odpowiednich funkcji i klas i zawarcie ich
  211. w plikach helper.h, helper.cc, decoration.h, decoration.cc, person.h oraz
  212. person.cc.
  213.  
  214. === Plik helper.h oraz helper.cc ===
  215.  
  216. W tych plikach należy umieścić pomocnicze fragmenty kodu. Powinny się tam
  217. znaleźć następujące rzeczy.
  218.  
  219. Funkcja randomNumber będąca interfejsem do generatora liczb losowych
  220. std::uniform_int_distribution i zwracająca liczby typu int z przedziału
  221. [0, std::numeric_limits<int>::max()]. Funkcja powinna wykorzystywać
  222. std::mersenne_twister_engine zainicjowane liczbą 0.
  223.  
  224. Klasa Price odpowiadająca za obsługę kwot pieniężnych. Klasa ta powinna mieć:
  225. * konstruktor jednoargumentowy przyjmujący wartość typu int oznaczającą kwotę
  226. w PLN (pełne złotówki, bez groszy), który może też pełnić rolę konstruktora
  227. domyślnego z domyślną wartością 0
  228. * operatory +, -=, <, których działanie jest zgodne z powszechnymi oczekiwaniami
  229. wobec tych operatorów
  230. * operator wypisania kwoty do strumienia << (format komunikatu powinien być
  231. zgodny z wyżej podanym przykładowym wyjściem programu, a więc postaci typu
  232. "1234 PLN")
  233.  
  234. Klasa Date odpowiadająca za obsługę dat wraz z godziną (czas) ograniczonych do
  235. miesiąca grudzień. Klasa ta powinna mieć:
  236. * konstruktor trójargumentowy przyjmujący wartości typu int oznaczających dzień,
  237. godzinę i minutę
  238. * operator preinkrementacji zwiększający czas o jedną minutę
  239. * dwuargumentowy operator - zwracający wartość typu int równą różnicy czasów
  240. w minutach
  241. * operator < porównujący dwa obiekty typu Date
  242. * operator wypisania do strumienia << (format komunikatu powinien być zgodny
  243. z wyżej podanym przykładowym wyjściem programu, a więc postaci typu
  244. "December, 20, 13:04")
  245.  
  246. Funkcja currentDate zwracająca bieżący czas symulacji. Symulacja zaczyna się
  247. 18.12.2017 o godzinie 16:00 i kończy 24.12.2017 o godzinie 18:00.
  248.  
  249. === Plik person.h oraz person.cc ===
  250.  
  251. W tych plikach należy umieścić definicje klasa Adult oraz Child. Obydwie klasy
  252. powinny mieć metodę getName zwracającą imię osoby typu std::string.
  253.  
  254. Klasa Adult powinna mieć ponadto:
  255. * konstruktor dwuargumentowy zgodny z wyżej wymienionym przykładem; drugi
  256. argument konstruktora powinien być obiektem typu Price reprezentującym
  257. oszczędności z przeznaczeniem na cele świąteczne i powinien mieć wartość
  258. domyślną zerową
  259. * metodę buyDecoration, która zmniejsza poziom oszczędności danej osoby o kwotę
  260. zakupu dekoracji świątecznej
  261. * metodę getSavings zwracającą obiekt typu Price informującą o bieżącym poziomie
  262. oszczędności osoby
  263.  
  264. Klasa Child powinna mieć konstruktor jednoargumentowy zgodny z wyżej wymienionym
  265. przykładem.
  266.  
  267. W naszym zadaniu tylko osoby dorosłe mogą mieć oszczędności i dokonywać zakupów.
  268.  
  269. === Plik decoration.h oraz decoration.cc ===
  270.  
  271. W tych plikach należy umieścić definicje klas GlassBall, Lights oraz Tree
  272. będące ozdobami świątecznymi. Każda z tych klas powinna mieć konstruktor
  273. przyjmujący nazwę ozdoby (std::string) i cenę (Price). W przypadku Tree trzecim
  274. argumentem konstruktora powinna być data ścięcia drzewka. Ponadto każda z tych
  275. klas powinna mieć:
  276. * metodę getName zwracającą obiekt typu std::string z nazwą ozdoby
  277. * metodę getPrice zwracającą obiekt typu Price z ceną ozdoby
  278. * metodę doOperation wypisującą do strumienia std::ostream napis
  279. charakterystyczny dla danej ozdoby
  280. Metoda doOperation różni się od klasy do klasy. W przypadku:
  281. * klasy GlassBall tłucze bombkę z prawdopodobieństwem 25% i wypisuje do
  282. strumienia informację o stanie bombki: OK/broken
  283. * klasy Lights przełącza cyklicznie światełka na jeden z dostępnych trybów pracy
  284. i wypisuje do strumienia informację o stanie światełek: off/constant/blinking
  285. * klasy Tree oblicza poziom pokrycia drzewka igłami z użyciem jakiegoś modelu
  286. i wypisuje do strumienia wynik w procentach (model należy zaproponować
  287. samodzielnie i może być dowolny, tzn. nie musi być realny; jedyny wymóg jest
  288. taki, aby drzewko z upływem czasu traciło igły)
  289.  
  290. Ponadto należy zdefiniować klasę ChristmasTree będąca kompozytem ozdób. Klasa ta
  291. powinna mieć:
  292. * metodę doOperation wywołującą metody doOperation wszystkich ozdób należących
  293. do kompozytu
  294. * metodę getPrice zwracającą obiekt typu Price z całkowitą ceną wszystkich
  295. ozdób należących do kompozytu
  296. * metodę addDecoration umożliwiającą dodanie do kompozytu nowej ozdoby poprzez
  297. wskaźnik shared_ptr
  298. * metodę removeDecoration umożliwiającą usunięcie z kompozytu ozdoby poprzez
  299. iterator
  300. * metody begin oraz end zwracające iteratory "non-const" do pierwszego elementu
  301. w kompozycie oraz do elementu "jeden-za-ostatnim" (kompozyt traktujemy tu jak
  302. kontener)
  303. * metodę attachObserver umożliwiającą dołączenie obserwatora choinki poprzez
  304. wskaźnik shared_ptr
  305. * metodę detachObserver umożliwiającą odłączenie obserwatora choinki poprzez
  306. iterator
  307. * metodę notify informującą obserwatorów o zmianach jej stanu (dodanie nowej
  308. dekoracji, tzn. obiektów klasy Tree, GlassBall, Lights)
  309. W realizacji klasy ChristmasTree należy wykorzystać wzorce projektowe kompozyt
  310. i obserwator.
  311.  
  312. Obiekt klasy Child w powyższym przykładzie na notyfikację reaguje poprzez
  313. wypisanie do strumienia komunikatu "Wow!" oraz wykonanie operacji doOperation
  314. na ostatnio dodanej dekoracji. Obiekt klasy Adult reaguje poprzez wypisanie do
  315. strumienia komunikatu "We have new decoration!" oraz komunikatu
  316. "Total cost is n PLN.", gdzie n oznacza cenę wszystkich dodanych do choinki
  317. dekoracji (włącznie z drzewkiem-świerkiem).
  318.  
  319. === Uwagi ===
  320.  
  321. * Nie wszystkie klasy wymagane do zaimplementowania tego zadania są podane
  322. w treści. Należy samodzielnie zaproponować niewyspecyfikowane klasy tak, aby
  323. spełnić wymogi wzorców projektowych kompozyt i obserwator.
  324. * Metody klas wymienione w treści zadania powinny być zaimplementowane
  325. w odpowiednim miejscu (tzn. w klasie bazowej lub pochodnej) zgodnie z wymogami
  326. podanych wzorców.
  327. * Wszystkie klasy niepodane w treści zadania powinny mieć konstruktory
  328. niemożliwe do wywołania z poziomu funkcji main.
  329.  
  330. === Rozwiązanie ===
  331.  
  332. Rozwiązanie powinno być zawarte w plikach:
  333. * decoration.h
  334. * decoration.cc
  335. * helper.h
  336. * helper.cc
  337. * person.h
  338. * person.cc
  339. które należy umieścić w repozytorium w katalogu
  340.  
  341. grupaN/zadanie6/ab123456+cd123456
  342.  
  343. lub
  344.  
  345. grupaN/zadanie6/ab123456+cd123456+ef123456
  346.  
  347. gdzie N jest numerem grupy, a ab123456, cd123456, ef123456 są identyfikatorami
  348. członków zespołu umieszczającego to rozwiązanie.
  349. Katalog z rozwiązaniem nie powinien zawierać innych plików, ale może zawierać
  350. podkatalog private, gdzie można umieszczać różne pliki, np. swoje testy. Pliki
  351. umieszczone w tym podkatalogu nie będą oceniane.
  352.  
  353. === Udanych Świąt życzą ===
  354. === Prowadzący JNP1 ===
  355.  
  356.  
  357. /\
  358. * -- *
  359. * /\
  360. * / \ * *
  361. * ---- *
  362. * /\ *
  363. * / \
  364. * / \ *
  365. * ------
  366. || *
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement