{"id":799,"date":"2019-02-12T13:59:11","date_gmt":"2019-02-12T12:59:11","guid":{"rendered":"https:\/\/www.kompikownia.pl\/?p=799"},"modified":"2019-02-25T16:59:57","modified_gmt":"2019-02-25T15:59:57","slug":"matura-z-informatyki-2018-zadanie-wega-c","status":"publish","type":"post","link":"https:\/\/www.kompikownia.pl\/index.php\/2019\/02\/12\/matura-z-informatyki-2018-zadanie-wega-c\/","title":{"rendered":"Matura z informatyki 2018 &#8211; zadanie WEGA (C++)"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">4<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span>\n<p>Postanowi\u0142em, \u017ce obok wpis\u00f3w na temat bardziej zaawansowanych zakamark\u00f3w j\u0119zyka C++ postaram si\u0119 przys\u0142u\u017cy\u0107 co nieco maturzystom. A w zwi\u0105zku z tym na blogu pojawi si\u0119 niebawem seria wpis\u00f3w, w kt\u00f3rych b\u0119dziemy analizowali zadania maturalne z ubieg\u0142ych lat. Na pierwszy ogie\u0144 p\u00f3jd\u0105 polecenia wymagaj\u0105ce programowania. J\u0119zykiem, w kt\u00f3rym b\u0119dziemy kodowali rozwi\u0105zania b\u0119dzie oczywi\u015bcie C++. Jest to j\u0119zyk prostszy, logiczniejszy i daj\u0105cy lepsz\u0105 podstaw\u0119 do nauki innych ni\u017c Python. Dlatego polecam w\u0142a\u015bnie C++ \ud83d\ude42 No ale sko\u0144czmy ju\u017c te dyrdyma\u0142y i przejd\u017amy do zadania na dzi\u015b \ud83d\ude42 <\/p>\n\n\n\n<p>Arkusz dost\u0119pny jest <strong><a href=\"https:\/\/cke.gov.pl\/images\/_EGZAMIN_MATURALNY_OD_2015\/Arkusze_egzaminacyjne\/2018\/formula_od_2015\/informatyka\/MIN-R2_1P-182.pdf\">tutaj<\/a><\/strong>. Odpowiedzi do niego natomiast: <strong><a href=\"https:\/\/www.cke.gov.pl\/images\/_EGZAMIN_MATURALNY_OD_2015\/Arkusze_egzaminacyjne\/2018\/formula_od_2015\/Zasady_oceniania\/MIN-R2_1P-182_zasady_oceniania.pdf\">tutaj<\/a><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie 4. WEGA &#8211; matura z informatyki 2018 CKE<\/h2>\n\n\n\n<p>W ramach projektu WEGA naukowcom uda\u0142o si\u0119 odczyta\u0107 sygna\u0142y radiowe pochodz\u0105ce z przestrzeni kosmicznej. Po wst\u0119pnej obr\u00f3bce zapisali je do pliku <strong><a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/sygnaly.txt\">sygnaly.txt<\/a><\/strong><\/p>\n\n\n\n<p>W pliku sygnaly.txt znajduje si\u0119 1000 wierszy. Ka\u017cdy wiersz zawiera jedno niepuste s\u0142owo z\u0142o\u017cone z wielkich liter alfabetu angielskiego. D\u0142ugo\u015b\u0107&nbsp;jednego s\u0142owa nie przekracza 100 znak\u00f3w. <\/p>\n\n\n\n<p>Napisz <strong>program(y)<\/strong> kt\u00f3re dadz\u0105 odpowiedzi do poni\u017cszych zada\u0144. Odpowiedzi zapisz w pliku wyniki4.txt, a ka\u017cd\u0105 odpowied\u017a poprzed\u017a numerem oznaczaj\u0105cym odpowiednie zadanie. <\/p>\n\n\n\n<p><strong>Uwaga:<\/strong>Plik <strong><a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/przyklad.txt\">przyk\u0142ad.txt<\/a><\/strong> zawiera dane przyk\u0142adowe spe\u0142niaj\u0105ce warunki zadania. Odpowiedzi dla danych z pliku przyk\u0142ad.txt s\u0105 podane pod pytaniami.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie 4.1 (0-3)<\/h3>\n\n\n\n<p>Naukowcy zauwa\u017cyli, \u017ce po z\u0142\u0105czeniu dziesi\u0105tych liter co czterdziestego s\u0142owa (zaczynaj\u0105c od s\u0142owa czterdziestego) otrzymamy pewne przes\u0142anie. Wypisz to przes\u0142anie.<\/p>\n\n\n\n<p><strong>Uwaga:<\/strong> Ka\u017cde co czterdzieste s\u0142owo ma co najmniej 10 znak\u00f3w. <\/p>\n\n\n\n<p>Dla danych z pliku przyk\u0142ad.txt wynikiem jest: NIECHCIMATURALEKKABEDZIE<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Rozwi\u0105zanie<\/h4>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/05571360c9a9d66b1db8726b169c5be1.js\"><\/script>\n\n\n\n<p>Jest to dosy\u0107 proste zadanie. Najtrudniejsz\u0105 cz\u0119\u015bci\u0105 jest napisanie funkcji, kt\u00f3ra odczytuje prawid\u0142owo dane z pliku. W kodzie powy\u017cej odpowiada za to readFile. Dane przechowujemy w vectorze przechowuj\u0105cym stringi. Jest to najwygodniejsza metoda. W linijkach 11-16 otwieramy plik i sprawdzamy, czy uda\u0142o nam si\u0119 go w\u0142a\u015bciwie otworzy\u0107. Linijki 17-21 to clue funkcji readFile. Odczytujemy plik linia po linii. Pojedyncz\u0105 lini\u0119 tekstu przechowujemy w zmiennej tymczasowej line typu string. Gdy odczytamy linijk\u0119 tekstu, dodajemy j\u0105 na koniec vectora readen. Na samym ko\u0144cu funkcji zwracamy ten vector.<\/p>\n\n\n\n<p>W mainie realizujemy natomiast to, o co nas poprosili tw\u00f3rcy zadania. W p\u0119tli for przechodzimy co czterdzieste s\u0142owo. Iterator p\u0119tli &#8211; zmienna i wynosi na pocz\u0105tku 39. Dlaczego? Poniewa\u017c w tre\u015bci zadania napisano, <em>zaczynaj\u0105c&nbsp;od&nbsp;s\u0142owa&nbsp;40.<\/em>W informatyce wszystko numerujemy od zera. Czterdziestym s\u0142owem b\u0119dzie wi\u0119c te znajduj\u0105ce si\u0119 pod indeksem nr 39. Z tego samego powodu zwi\u0119kszamy warto\u015b\u0107 zmiennej i za ka\u017cdym razem o 40. <\/p>\n\n\n\n<p>Co si\u0119 dzieje wewn\u0105trz p\u0119tli? Do zmiennej result typu string dodajemy dziesi\u0105t\u0105 liter\u0119 tego s\u0142owa. (czyli t\u0105 znajduj\u0105c\u0105 si\u0119 pod indeksem nr 9).<\/p>\n\n\n\n<p>I to by by\u0142o na tyle. Odpowied\u017a do zadania znajduje si\u0119 w zmiennej result. Mo\u017cemy j\u0105 wy\u015bwietli\u0107 (tak jak w kodzie powy\u017cej) lub zapisa\u0107 do pliku. Robimy to, co jest dla nas wygodniejsze. <\/p>\n\n\n\n<p>Mo\u017ce kolejne zadanie od CKE b\u0119dzie nieco ambitniejsze? Zobaczmy \ud83d\ude42 <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie 4.2 (0-4)<\/h2>\n\n\n\n<p>Znajd\u017a s\u0142owo, w kt\u00f3rym wyst\u0119puje najwi\u0119ksza liczba <strong>r\u00f3\u017cnych<\/strong> liter. Wypisz to s\u0142owo i liczb\u0119 wyst\u0119puj\u0105cych w nim r\u00f3\u017cnych liter. Je\u015bli s\u0142\u00f3w o najwi\u0119kszej liczbie r\u00f3\u017cnych liter jest wi\u0119cej ni\u017c&nbsp;jedno, wypisz pierwsze z nich pojawiaj\u0105ce si\u0119 w pliku z danymi. <\/p>\n\n\n\n<p>Dla danych z pliku przyk\u0142ad.txt wynikiem jest: AKLMNOPRSTWZA 12<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Rozwi\u0105zanie<\/h4>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/bd7686dea4d7536edb7d8cac27b05ee7.js\"><\/script>\n\n\n\n<p>Jakie pu\u0142apki teraz zastawi\u0142a na nas CKE? Funkcji readFile nie omawiam, gdy\u017c jest analogiczna jak w poprzednim zadaniu. Nic si\u0119 nie zmieni\u0142o. 95% pracy wykonywane jest w ramach funkcji getTheMostDifferentWords. Zwraca ona par\u0119, sk\u0142adaj\u0105c\u0105 si\u0119 ze stringa (nasz ci\u0105g znak\u00f3w) oraz inta (liczba r\u00f3\u017cni\u0105cych si\u0119&nbsp;liter). Funkcja zaczyna si\u0119 w linijce 35 definicj\u0105 pary, w kt\u00f3rej b\u0119dziemy przechowywali wynik.<\/p>\n\n\n\n<p>W linijce 36 widzimy p\u0119tl\u0119 typu for-each. Przegl\u0105da ona linijka po linijce wszystkie pobrane wcze\u015bniej dane. Aktualnie analizowana linijka znajduje si\u0119 w zmiennej word. <\/p>\n\n\n\n<p>Linijka 37 to tablica zmiennych typu bool. Przechowujemy w niej informacj\u0119 o tym, czy dana litera wyst\u0105pi\u0142a w analizowanym s\u0142owie. Wa\u017cne w tym momencie jest to, \u017ce zmienne lokalne maj\u0105 domy\u015blne warto\u015bci losowe. Powinni\u015bmy wi\u0119c wyzerowa\u0107 tablic\u0119, co robimy w kolejnym wierszu. <\/p>\n\n\n\n<p>W nast\u0119pnych dw\u00f3ch linijkach przechodzimy aktualnie analizowany wiersz tekstu, litera po literze. Ka\u017cd\u0105 napotkan\u0105&nbsp;liter\u0119 oznaczamy jako u\u017cywan\u0105 w tablicy exist. Mo\u017cesz zada\u0107 pytanie, dlaczego odejmujemy 'A&#8217;? Poniewa\u017c tekst, jak wiesz, przechowywany jest w komputerze w formie kodu ASCII. My natomiast potrzebujemy kodowania w formie A=0, B=1 &#8230; Z=25. Od kodu aktualnie analizowanej litery musimy wi\u0119c odj\u0105\u0107 liter\u0119 A.<\/p>\n\n\n\n<p>W linijce 42 wywo\u0142ujemy funkcj\u0119 calculateNumberOfDiffLetters. Jej definicja znajduje si\u0119 w linijkach 27-33. Na czym polega ta funkcja? Po prostu zliczamy, ile element\u00f3w w tablicy exists ma warto\u015b\u0107 true. Je\u015bli ta warto\u015b\u0107 jest wi\u0119ksza od aktualnej najwi\u0119kszej, przechowywanej w zmiennej theMostDifferent, to aktualizujemy warto\u015bci. W przeciwnym wypadku ko\u0144czymy obieg p\u0119tli.<\/p>\n\n\n\n<p>Co mo\u017cna powiedzie\u0107 o main? Nic specjalnego. Po prostu, wywo\u0142ujemy wcze\u015bniej utworzone funkcje, a nast\u0119pnie wypisujemy na ekran wynik. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie 4.3. (0-4)<\/h2>\n\n\n\n<p>W tym zadaniu rozwa\u017cmy odleg\u0142o\u015b\u0107 liter w alfabecie &#8211; np.: litery A i B s\u0105 od siebie oddalone o 1, A i E o 4, F &#8211; D o 2, a ka\u017cda litera od siebie samej oddalona jest o 0. Wypisz wszystkie s\u0142owa, w kt\u00f3rych ka\u017cde dwie litery oddalone s\u0105 od siebie w alfabecie co najwy\u017cej o 10. S\u0142owa wypisz w kolejno\u015bci wyst\u0119powania w pliku sygnaly.txt, po jednym w wierszu.<\/p>\n\n\n\n<p>Na przyk\u0142ad: CGECF jest takim s\u0142owem, ale ABEZA nie jest (odleg\u0142o\u015b\u0107 A-Z wynosi 25). <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/c27cca8cf8a60bd50317f436387f8df0.js\"><\/script>\n\n\n\n<p>Tym razem za rozwi\u0105zanie naszego zadania odpowiada funkcja selectWordsDiffLessThan10. Przeanalizujmy j\u0105 \ud83d\ude42 <\/p>\n\n\n\n<p>W linijce 29 stosujemy p\u0119tl\u0119 for-each. Przechodzimy vector przechowuj\u0105cy wszystkie odczytane z pliku s\u0142owa, przy czym aktualnie analizowane s\u0142owo znajduje si\u0119 w zmiennej word. <\/p>\n\n\n\n<p>W linijce 30 utworzyli\u015bmy zmienn\u0105 add typu bool. Za co ona odpowiada? Przechowujemy w niej informacj\u0119 o tym, czy dany wyraz spe\u0142nia warunki postawione przez CKE. Na samym pocz\u0105tku przyjmujemy, \u017ce wyraz spe\u0142nia warunki. A potem szukamy argument\u00f3w za tym, aby t\u0119 hipotez\u0119 obali\u0107 \ud83d\ude42 <\/p>\n\n\n\n<p>Linijka 31 i 32 to dwie p\u0119tle for. Dlaczego zastosowali\u015bmy akurat tak\u0105 konstrukcj\u0119? Bo musimy przeanalizowa\u0107 ka\u017cd\u0105 par\u0119 liter s\u0142owa. Pierwsza p\u0119tla przechodzi wszystkie litery s\u0142owa. Pierwsza p\u0119tla przechodzi ca\u0142y wiersz, wi\u0119c nasz\u0105 granic\u0105 jest rozmiar s\u0142owa.<\/p>\n\n\n\n<p>W drugiej p\u0119tli zaczynamy przechodzenie od i+1. Dlaczego? Mogliby\u015bmy zaczyna\u0107 od i=0. Program nadal generowa\u0142by prawid\u0142ow\u0105 odpowied\u017a. Jednak\u017ce wtedy sprawdzamy pary liter, kt\u00f3re ju\u017c zosta\u0142y zaakceptowane, co jest marnotrawieniem mocy procesora. Na przyk\u0142ad: skoro sprawdzili\u015bmy, \u017ce litery znajduj\u0105ce si\u0119 na pozycjach 1 i 3 spe\u0142niaj\u0105 warunki zadania, to tak samo b\u0119d\u0105 je spe\u0142nia\u0142y litery znajduj\u0105ce si\u0119 na pozycjach 3 i 1 (gdy\u017c to te same litery!). Skoro zaczynamy od i+1, to nasz\u0105 granic\u0105 b\u0119dzie rozmiar s\u0142owa-1. Dlaczego? Poniewa\u017c w inny wypadku wyszliby\u015bmy poza zakres tablicy. (Rozwa\u017c przypadek, kiedy zewn\u0119trzna p\u0119tla analizuje ostatni\u0105 liter\u0119 s\u0142owa). <\/p>\n\n\n\n<p>Linijka 33 clue rozwi\u0105zania problemu. Sprawdzamy, czy para liter spe\u0142nia warunek zadania. Wystarczy zwyk\u0142e odj\u0119cie kod\u00f3w liter. Mo\u017cesz si\u0119 zastanowi\u0107, po co funkcja abs? Z prostego powodu. Je\u015bli odejmiemy np.: Z od A, otrzymamy wynik dodatni. Lecz je\u015bli przeprowadzimy odejmowanie A-Z, wynik b\u0119dzie mia\u0142 przeciwny znak. Dla uproszczenia warunku lepiej zastosowa\u0107 funkcj\u0119 abs, kt\u00f3ra wyci\u0105ga nam warto\u015b\u0107 bezwzgl\u0119dn\u0105 z wyniku. <\/p>\n\n\n\n<p>Linijki 34 i 39 &#8211; po znalezieniu pierwszego s\u0142owa niespe\u0142niaj\u0105cego warunku przerywamy p\u0119tl\u0119. W linijce 41 dodajemy s\u0142owo do vectora wynikowego, oczywi\u015bcie pod warunkiem, \u017ce spe\u0142nia warunek. <\/p>\n\n\n\n<p>W funkcji main wywo\u0142ujemy utworzone funkcje w odpowiedniej kolejno\u015bci. Nast\u0119pnie wyprowadzamy wynik na ekran.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">I to koniec<\/h2>\n\n\n\n<p>Rozwi\u0105zali\u015bmy zadanie SEGA z ubieg\u0142orocznej (2018) matury. Zdobyli\u015bmy 11 punkt\u00f3w. Prawda, \u017ce nie by\u0142o \u017ale? \ud83d\ude42 Je\u015bli wpis ci si\u0119 podoba\u0142, przeprowadz\u0119 podobn\u0105 analiz\u0119 zada\u0144 z programowania z ubieg\u0142orocznych arkuszy. A nast\u0119pnie zaczniemy rozwi\u0105zywa\u0107 zadania z Excela i baz danych. <\/p>\n\n\n\n<p>Do zobaczenia \ud83d\ude42 \u017bycz\u0119 powodzenia na maturze \ud83d\ude42 <\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">4<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> Postanowi\u0142em, \u017ce obok wpis\u00f3w na temat bardziej zaawansowanych zakamark\u00f3w j\u0119zyka C++ postaram si\u0119 przys\u0142u\u017cy\u0107 co nieco maturzystom. A w zwi\u0105zku z tym na blogu pojawi si\u0119 niebawem seria wpis\u00f3w, w &#8230;<\/p>\n","protected":false},"author":1,"featured_media":835,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[31],"tags":[53,55,56,54],"_links":{"self":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/799"}],"collection":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/comments?post=799"}],"version-history":[{"count":35,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/799\/revisions"}],"predecessor-version":[{"id":2484,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/799\/revisions\/2484"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media\/835"}],"wp:attachment":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media?parent=799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/categories?post=799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/tags?post=799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}