{"id":907,"date":"2019-02-20T11:58:28","date_gmt":"2019-02-20T10:58:28","guid":{"rendered":"https:\/\/www.kompikownia.pl\/?p=907"},"modified":"2019-03-13T10:44:41","modified_gmt":"2019-03-13T09:44:41","slug":"matura-z-informatyki-2017-piksele-c","status":"publish","type":"post","link":"https:\/\/www.kompikownia.pl\/index.php\/2019\/02\/20\/matura-z-informatyki-2017-piksele-c\/","title":{"rendered":"Matura z informatyki 2017 &#8211; Piksele (C++)"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span>\n<p>Witajcie drodzy czytelnicy \ud83d\ude42 Kontynuujemy temat matur. Tym razem zajmiemy si\u0119 zadaniem &#8222;Piksele&#8221; sprzed dw\u00f3ch lat. Pami\u0119tam je dobrze gdy\u017c w\u0142a\u015bnie w 2017 r. sam zdawa\u0142em matur\u0119 z informatyki. Jest to jeden z egzamin\u00f3w, kt\u00f3ry wspominam najlepiej. Jedynie fizyka z (przedmiot\u00f3w rozszerzonych) pozwoli\u0142a mi na osi\u0105gni\u0119cie r\u00f3wnie dobrego wyniku. Gotowi? No to zaczynamy \ud83d\ude42 Rozwi\u0105\u017cmy zadanie piksele z matury 2017 \ud83d\ude42 <\/p>\n\n\n\n<p>Arkusz mo\u017cesz zobaczy\u0107 <a href=\"https:\/\/www.cke.edu.pl\/images\/_EGZAMIN_MATURALNY_OD_2015\/Arkusze_egzaminacyjne\/2017\/formula_od_2015\/informatyka\/MIN-R2_1P-172.pdf\">w tym miejscu<\/a>. Natomiast zasady oceniania <a href=\"https:\/\/www.cke.edu.pl\/images\/_EGZAMIN_MATURALNY_OD_2015\/Arkusze_egzaminacyjne\/2017\/formula_od_2015\/zasady_oceniania\/MMA-R1-N.pdf\">dost\u0119pne s\u0105 tutaj.<\/a> <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie 6. Piksele<\/h2>\n\n\n\n<p>W pliku <a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/dane.txt\">dane.txt<\/a> znajduje si\u0119 200 wierszy. Ka\u017cdy wiersz zawiera 320 liczb naturalnych z przedzia\u0142u od 0 do 255, oddzielonych znakami pojedynczego odst\u0119pu (spacjami). Przedstawiaj\u0105 one jasno\u015bci kolejnych pikseli czarno-bia\u0142ego obrazu o wymiarach 320 na 200 pikseli (od 0 &#8211; czarny do 255 &#8211; bia\u0142y). <\/p>\n\n\n\n<p>Napisz program(y) kt\u00f3ry(e) da(dz\u0105) odpowiedzi do poni\u017cszych zada\u0144. Odpowiedzi zapisz w pliku wyniki6.txt, a ka\u017cd\u0105 odpowied\u017a poprzed\u017a numerkiem oznaczaj\u0105cym odpowiednie zadanie. <\/p>\n\n\n\n<p><strong>Uwaga:<\/strong> plik <a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/przyklad-1.txt\">przyk\u0142ad.txt<\/a> zawiera dane przyk\u0142adowe spe\u0142niaj\u0105ce warunki zadania (obraz ma takie same rozmiary). Odpowiedzi dla danych z pliku przyk\u0142ad.txt podane s\u0105 pod poleceniami. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kod wsp\u00f3lny dla wszystkich zada\u0144<\/h3>\n\n\n\n<p>Cz\u0119\u015bci\u0105 wsp\u00f3ln\u0105&nbsp;dla ka\u017cdego zadania b\u0119dzie odczyt z pliku. Informacje powinni\u015bmy przechowywa\u0107 w tablicy dwuwymiarowej, o rozmiarach 200 na 320, przechowuj\u0105cej liczby ca\u0142kowite (int). W przeciwie\u0144stwie do rozwi\u0105zania u\u017cytego <a href=\"https:\/\/www.kompikownia.pl\/index.php\/2019\/02\/12\/matura-z-informatyki-2018-zadanie-wega-c\/\">w poprzednim artykule serii,&nbsp;<\/a> gdzie u\u017cyli\u015bmy getline&#8217;a, tym razem u\u017cyjemy zwyk\u0142ych strumieni. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">void<\/span> readFile<span class=\"br0\">&#40;<\/span>string filename,<span class=\"kw4\">int<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">320<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; fstream file<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; file.<span class=\"me1\">open<\/span><span class=\"br0\">&#40;<\/span>filename<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">!<\/span>file.<span class=\"me1\">is_open<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span><span class=\"st0\">&quot;Nie uda\u0142o si\u0119 otworzy\u0107 pliku przyklad.txt&quot;<\/span><span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">320<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file<span class=\"sy1\">&gt;&gt;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Zacznijmy od listy argument\u00f3w. Przekazujemy nazw\u0119 pliku, kt\u00f3ry chcemy otworzy\u0107 oraz int data[][320]. Co oznacza drugi argument? W\u0142a\u015bnie w taki spos\u00f3b przekazujemy tablic\u0119 dwuwymiarow\u0105 do funkcji. Mo\u017cemy (ale nie musimy) pomin\u0105\u0107&nbsp;jeden wymiar tablicy. <\/p>\n\n\n\n<p>Ale dlaczego przekazujemy tablic\u0119 jako argument? Przecie\u017c funkcja readFile ma stworzy\u0107 t\u0119 tablic\u0119&nbsp;i wype\u0142ni\u0107 j\u0105 liczbami z pliku. Nie pro\u015bciej by\u0142oby utworzy\u0107 j\u0105 jako zmienn\u0105 lokaln\u0105 a nast\u0119pnie zwr\u00f3ci\u0107 za pomoc\u0105 return (modyfikuj\u0105c wcze\u015bniej odpowiednio sygnatur\u0119 funkcji)? Ot\u00f3\u017c, takie co\u015b by nie zadzia\u0142a\u0142o. Dlaczego? Staro\u015bwiecka tablica w stylu C jest po prostu wska\u017anikiem na pierwszy element tej tablicy. Zwracaj\u0105c j\u0105 zwracaliby\u015bmy wska\u017anik na jej pierwszy element. Natomiast tre\u015b\u0107 zosta\u0142aby wykasowana wraz z zako\u0144czeniem dzia\u0142ania funkcji. Dlatego musimy przekaza\u0107 tablic\u0119 jako argument funkcji. Czy zmiany w tablicy b\u0119d\u0105 widoczne na zewn\u0105trz funkcji? Tak, gdy\u017c przekazujemy j\u0105 niejako &#8222;przez wska\u017anik&#8221;. Zmiany dokonywane s\u0105 na oryginale a nie na kopii danych. <\/p>\n\n\n\n<p>Wiersze 2-6 to standardowa obs\u0142uga operacji otworzenia pliku. Pr\u00f3bujemy otworzy\u0107 plik za pomoc\u0105 metody open. Nast\u0119pnie sprawdzamy, czy ta niezb\u0119dna dla maturzysty operacja powiod\u0142a si\u0119 czy nie. Sprawdzenia nie musimy wykonywa\u0107. Niemniej, dobrym zwyczajem jest zabezpieczanie si\u0119 przed ka\u017cd\u0105 kryzysow\u0105 sytuacj\u0105. U\u0142atwia to rozwi\u0105zywanie b\u0142\u0119d\u00f3w w sytuacji, kiedy aplikacja nie dzia\u0142a tak jak by\u015bmy tego chcieli.<\/p>\n\n\n\n<p>Za\u0142o\u017cenia postawione przez tw\u00f3rc\u0119 zadania mocno upraszczaj\u0105 operacj\u0119 w\u0142a\u015bciwego odczytu informacji z pliku. Istnieje 200 wierszy, a ka\u017cdy z nich zawiera 320 liczb (w dalszej cz\u0119\u015bci tekstu b\u0119dziemy je nazywali kolumnami) W celu odczytania danych wykorzystujemy dwie p\u0119tle for. P\u0119tla zewn\u0119trzna przechodzi po wierszach, natomiast wewn\u0119trzna po kolumnach. Do odczytywania kolejnych liczb najpro\u015bciej wykorzysta\u0107 strumie\u0144, kt\u00f3ry odwala za nas ca\u0142\u0105 brudn\u0105 robot\u0119 zwi\u0105zan\u0105 z konwersj\u0105&nbsp;odczytanej z pliku danej na odpowiedni rodzaj zmiennej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie 6.1 (0-2)<\/h3>\n\n\n\n<p>Podaj jasno\u015b\u0107 najja\u015bniejszego i jasno\u015b\u0107 najciemniejszego piksela.<\/p>\n\n\n\n<p>Dla danych z pliku <a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/przyklad-1.txt\">przyk\u0142ad.txt <\/a>wynikiem jest 255 (najja\u015bniejszy) i 0 (najciemniejszy). <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Rozwi\u0105zanie<\/h4>\n\n\n\n<p>Najprostsze rozwi\u0105zanie to po prostu znalezienie minimum i maksimum spo\u015br\u00f3d wszystkich pikseli.<\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">int<\/span> findMinPixel<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">200<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">320<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> min <span class=\"sy1\">=<\/span> <span class=\"nu0\">256<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">320<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>min<span class=\"sy1\">&gt;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> min<span class=\"sy1\">=<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> min<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Funkcja przedstawiona na powy\u017cszym listingu znajduje najmniejsz\u0105 warto\u015b\u0107 piksela. Na pocz\u0105tku widzimy zmienn\u0105 min. Jak\u0105 ona ma rol\u0119? B\u0119dziemy w niej przechowywa\u0107&nbsp;najmniejszy znaleziony element. Aby algorytm dzia\u0142a\u0142 prawid\u0142owo, zmienna min musi mie\u0107 na pocz\u0105tku warto\u015b\u0107 wi\u0119ksz\u0105 od jakiejkolwiek warto\u015bci kt\u00f3ra pojawi si\u0119 w przeszukiwanych danych. W linijkach 24 i 25 widzimy dwie p\u0119tle for. Jest to standardowe podej\u015bcie s\u0142u\u017c\u0105ce do przeszukiwania tablicy dwuwymiarowej. Najwa\u017cniejsz\u0105 cz\u0119\u015bci\u0105 algorytmu jest linijka 26. Sprawdzamy, czy aktualna warto\u015b\u0107 jest wi\u0119ksza od minimalnej. Je\u015bli tak, to ustawiamy nowe minimum. Na samym ko\u0144cu zwracamy to minimum z funkcji.<\/p>\n\n\n\n<p>Funkcja s\u0142u\u017c\u0105ca do wyszukiwania maksimum b\u0119dzie wygl\u0105da\u0142a analogicznie. Pe\u0142ne rozwi\u0105zanie znajduje si\u0119 poni\u017cej. Mo\u017cesz je rozwin\u0105\u0107, klikaj\u0105c odpowiedni przycisk. <\/p>\n\n\n<span class=\"collapseomatic \" id=\"id6a8508ae78a2b\"  tabindex=\"0\" title=\"Zadanie 6.1 - pe\u0142ne rozwi\u0105zanie\"    >Zadanie 6.1 - pe\u0142ne rozwi\u0105zanie<\/span><div id=\"target-id6a8508ae78a2b\" class=\"collapseomatic_content \">\n<script src=\"https:\/\/gist.github.com\/karol221-10\/ea0eb9d488dffa0d7f17361793376e62.js\"><\/script><br \/>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie 6.2 (0-2)<\/h3>\n\n\n\n<p>Podaj, ile wynosi najmniejsza liczba wierszy, kt\u00f3re nale\u017cy usun\u0105\u0107, \u017ceby obraz mia\u0142 pionow\u0105 o\u015b symetrii. Obraz ma pionow\u0105 o\u015b symetrii, je\u015bli w ka\u017cdym wierszu i-ty piksel od lewej strony przyjmuje t\u0119 sam\u0105 warto\u015b\u0107, co i-ty piksel od prawej strony, dla dowolnego 1&lt;=i&lt;=320.<\/p>\n\n\n\n<p>Dla danych z pliku <a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/przyklad-1.txt\">przyk\u0142ad.txt<\/a> wynikiem jest 3. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Rozwi\u0105zanie<\/h4>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">int<\/span> makeSimmetrical<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">320<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> minRowsToRemove <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw4\">bool<\/span> isRowSym <span class=\"sy1\">=<\/span> isRowSymmetrical<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">!<\/span>isRowSym<span class=\"br0\">&#41;<\/span> minRowsToRemove<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> minRowsToRemove<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Funkcj\u0105 odpowiadaj\u0105c\u0105 za rozwi\u0105zanie zadania jest makeSimmetrical. Przyjmujemy tylko jeden argument &#8211; tablic\u0119 dwuwymiarow\u0105 zawieraj\u0105c\u0105 piksele. W zmiennej lokalnej minRowsToRemove przechowujemy ilo\u015b\u0107 wierszy, kt\u00f3re musimy usun\u0105\u0107, aby obraz by\u0142 symetryczny. Na pocz\u0105tku warto\u015b\u0107 ta wynosi oczywi\u015bcie zero. <\/p>\n\n\n\n<p>W p\u0119tli for przechodzimy ca\u0142y obraz po wierszach. Dla ka\u017cdego wiersza wywo\u0142ujemy funkcj\u0119 isRowSymmetrical, kt\u00f3ra sprawdza czy wiersz jest symetryczny wg algorytmu, kt\u00f3ry om\u00f3wili\u015bmy na samym pocz\u0105tku. Je\u015bli wiersz nie jest symetryczny to powinni\u015bmy go usun\u0105\u0107. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">bool<\/span> isRowSymmetrical<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">159<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">160<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">while<\/span><span class=\"br0\">&#40;<\/span>i<span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"sy3\">&amp;&amp;<\/span> j<span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span><span class=\"nu0\">320<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span>data<span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">false<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; i<span class=\"sy2\">--<\/span><span class=\"sy4\">;<\/span> j<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">true<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Pomys\u0142 na napisanie funkcji isRowSymmetrical zosta\u0142 podany w poleceniu. Musimy sprawdza\u0107 kolejne liczby. Zaczynaj\u0105c od \u015brodka, idziemy jednocze\u015bnie do lewej i prawej kraw\u0119dzi. Tu kryje si\u0119 pu\u0142apka, na kt\u00f3rej mo\u017cna polec i \u0142atwo straci\u0107 2pkt. Jak wyznaczy\u0107&nbsp;\u015brodek? Mamy parzyst\u0105 ilo\u015b\u0107 liczb &#8211; 320. Jest to trudniejszy przypadek. \u015arodek b\u0119d\u0105 stanowi\u0142y dwie liczby. Jak znale\u017a\u0107 je w najprostszy spos\u00f3b? Oczywi\u015bcie &#8211; \u015bredni\u0105 arytmetyczn\u0105.<\/p>\n\n\n\n<p>Ale zaraz, daje nam ona wynik: (0+319)\/2=159.5. Jak wyznaczy\u0107 \u015brodkowe elementy? B\u0119d\u0105 to dwie liczby: element na kt\u00f3ry wskazuje \u015brednia (bez cz\u0119\u015bci u\u0142amkowej) oraz kolejny. Czyli podsumowuj\u0105c, \u015brodkiem naszego wiersza b\u0119d\u0105 piksele kryj\u0105ce si\u0119 pod indeksami 159 i 160. <\/p>\n\n\n\n<p>Zajmijmy si\u0119 teraz algorytmem. Zawarty jest on w linijkach 25-29. Je\u015bli elementy po lewej i prawej stronie tablicy s\u0105 r\u00f3\u017cne, to znaczy \u017ce wiersz nie jest symetryczny. W takim wypadku przerywamy p\u0119tl\u0119 i zwracamy fa\u0142sz. Je\u015bli wszystko nam si\u0119 zgadza kontynuujemy p\u0119tl\u0119 i sprawdzamy kolejne elementy. Robimy tak a\u017c do momentu, gdy dotrzemy z jednej strony do pocz\u0105tku, a z drugiej do ko\u0144ca wiersza.<\/p>\n\n\n\n<p>Warty zauwa\u017cenia jest fakt, \u017ce dla przyk\u0142adowych danych i nieprawid\u0142owych pocz\u0105tkowych warto\u015bci i i j program mo\u017ce zwr\u00f3ci\u0107 prawid\u0142owy wynik. Sprawd\u017a np.: jak zachowa si\u0119 aplikacja kiedy podasz i=158 i j=159. Dlatego uwa\u017cam to zadanie za mocno podchwytliwe. <\/p>\n\n\n\n<span class=\"collapseomatic \" id=\"id6a8508ae78a76\"  tabindex=\"0\" title=\"Zadanie 6.2 - pe\u0142ne rozwi\u0105zanie\"    >Zadanie 6.2 - pe\u0142ne rozwi\u0105zanie<\/span><div id=\"target-id6a8508ae78a76\" class=\"collapseomatic_content \">\n<script src=\"https:\/\/gist.github.com\/karol221-10\/df09ff5f1c9a071be1d6dcf4ddbab374.js\"><\/script>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie 6.3 (0-3)<\/h3>\n\n\n\n<p>S\u0105siednie piksele to takie, kt\u00f3re le\u017c\u0105 obok siebie w tym samym wierszu lub w tej samej kolumnie. Dwa s\u0105siednie piksele nazywamy kontrastuj\u0105cymi, je\u015bli ich warto\u015bci r\u00f3\u017cni\u0105 si\u0119 o wi\u0119cej ni\u017c 128. Podaj liczb\u0119 wszystkich takich pikseli, dla kt\u00f3rych istnieje przynajmniej jeden kontrastuj\u0105cy z nim s\u0105siedni piksel.<\/p>\n\n\n\n<p>Dla danych z pliku <a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/przyklad-1.txt\">przyklad.txt <\/a>wynikiem jest 5. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Rozwi\u0105zanie<\/strong><\/h4>\n\n\n\n<p>Na samym pocz\u0105tku napiszmy sobie kr\u00f3ciutk\u0105 funkcj\u0119 por\u00f3wnuj\u0105c\u0105 dwa piksele. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>22<br \/>23<br \/>24<br \/>25<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">bool<\/span> isPixelContrasting<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> pixel1,<span class=\"kw4\">int<\/span> pixel2<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">abs<\/span><span class=\"br0\">&#40;<\/span>pixel1<span class=\"sy2\">-<\/span>pixel2<span class=\"br0\">&#41;<\/span><span class=\"sy1\">&gt;<\/span><span class=\"nu0\">128<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">true<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">false<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Prawda, \u017ce nie ma tutaj nic trudnego? Funkcja isPixelContrasting zwraca true, je\u015bli piksele kontrastuj\u0105 ze sob\u0105 (zgodnie z tre\u015bci\u0105 zadania) lub false w przeciwnym wypadku. Dlaczego u\u017cyli\u015bmy abs? Poniewa\u017c musimy sobie w jaki\u015b&nbsp;spos\u00f3b poradzi\u0107 z ujemnymi warto\u015bciami. Nie wiemy, czy b\u0119dziemy odejmowali mniejszy piksel od wi\u0119kszego, czy na odwr\u00f3t. Dla nas wa\u017cna jest tylko i wy\u0142\u0105cznie r\u00f3\u017cnica mi\u0119dzy warto\u015bciami dw\u00f3ch r\u00f3\u017cnych liczb. Funkcja abs, kt\u00f3ra wyci\u0105ga warto\u015b\u0107&nbsp;bezwzgl\u0119dn\u0105 sprawdzi si\u0119 w tym miejscu idealnie. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">int<\/span> countContrastingPixels<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">320<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> contrastingPixels <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">320<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>i<span class=\"sy1\">&gt;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy3\">&amp;&amp;<\/span> isPixelContrasting<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"sy2\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span>,data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contrastingPixels<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">199<\/span> <span class=\"sy3\">&amp;&amp;<\/span> isPixelContrasting<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span>,data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contrastingPixels<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>j<span class=\"sy1\">&gt;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy3\">&amp;&amp;<\/span> isPixelContrasting<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"sy2\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span>,data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contrastingPixels<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">319<\/span> <span class=\"sy3\">&amp;&amp;<\/span> isPixelContrasting<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span>,data<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contrastingPixels<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> contrastingPixels<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Funkcja znajduj\u0105ca si\u0119 na listingu powy\u017cej realizuje kluczow\u0105 tre\u015b\u0107 zadania. Podobnie jak w poprzednim wyzwaniu, tak\u017ce i tutaj znajduje si\u0119 jeden kruczek. Mianowicie: musimy pami\u0119ta\u0107 o przypadkach brzegowych. Piksel kontrastuj\u0105cy mo\u017ce znajdowa\u0107 si\u0119 powy\u017cej, poni\u017cej, na lewo lub nad prawo od aktualnie analizowanego. Jednak\u017ce, co w sytuacji, kiedy analizujemy na przyk\u0142ad ten znajduj\u0105cy si\u0119 na pozycji [0,0]? Wtedy nie mo\u017cemy sprawdza\u0107 co jest powy\u017cej, gdy\u017c po prostu nic tam nie ma. W ten spos\u00f3b da si\u0119 jedynie doprowadzi\u0107 jedynie do powstania b\u0142\u0119dnego wyniku. Za sprawdzanie przypadk\u00f3w brzegowych odpowiadaj\u0105 cztery ify, znajduj\u0105ce si\u0119 w linijkach 30,33,36 i 39.<\/p>\n\n\n\n<p>Powstaje pytanie, czy nie jest b\u0142\u0119dem, \u017ce w tym samym ifie sprawdzamy czy wsp\u00f3\u0142rz\u0119dna ma odpowiedni\u0105 warto\u015b\u0107 oraz (jednocze\u015bnie) czy piksel nie jest kontrastuj\u0105cy? Oczywi\u015bcie, \u017ce nie! Dzieje si\u0119 tak dlatego, gdy\u017c aplikacja nie sprawdza drugiego warunku, je\u015bli pierwszy nie zosta\u0142 spe\u0142niony. Takie s\u0105 zasady dzia\u0142ania operatora AND (&amp;&amp;) w C\/C++. Upraszcza to nieco kod programu.<\/p>\n\n\n\n<p>Je\u015bli wsp\u00f3\u0142rz\u0119dne s\u0105 odpowiednie oraz piksel jest kontrastuj\u0105cy, to po prostu zwi\u0119kszamy ilo\u015b\u0107&nbsp;kontrastuj\u0105cych pikseli o 1. Na samym ko\u0144cu zwracamy obliczon\u0105 ilo\u015b\u0107 kontrastuj\u0105cych pikseli. Jest to jednocze\u015bnie nasza odpowied\u017a do zadania.<\/p>\n\n\n\n<p>Na dobr\u0105 spraw\u0119 mogliby\u015bmy te wszystkie cztery ify skr\u00f3ci\u0107 do jednego. Polecam prze\u0107wiczy\u0107 i ulepszy\u0107 ten program w ten spos\u00f3b \ud83d\ude42<\/p>\n\n\n<span class=\"collapseomatic \" id=\"id6a8508ae78a93\"  tabindex=\"0\" title=\"Zadanie 6.3 - kompletne rozwi\u0105zanie\"    >Zadanie 6.3 - kompletne rozwi\u0105zanie<\/span><div id=\"target-id6a8508ae78a93\" class=\"collapseomatic_content \">\n<script src=\"https:\/\/gist.github.com\/karol221-10\/6967ced98f52208a738d1015e030f289.js\"><\/script><br \/>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie 6.4 (0-4)<\/h3>\n\n\n\n<p>Podaj d\u0142ugo\u015b\u0107 najd\u0142u\u017cszej linii pionowej (czyli ci\u0105gu kolejnych pikseli w tej samej kolumnie obrazka), z\u0142o\u017conej z pikseli tej samej jasno\u015bci. <\/p>\n\n\n\n<p>Dla danych z pliku <a href=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/02\/przyklad-1.txt\">przyklad.txt<\/a> wynikiem jest 198. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Rozwi\u0105zanie<\/h4>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;height:415px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw4\">int<\/span> findLongestLine<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">320<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> longestLine <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">320<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw4\">int<\/span> longestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw4\">int<\/span> actLongestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"sy1\">==<\/span>data<span class=\"br0\">&#91;<\/span>j<span class=\"sy2\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> actLongestInColumn<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>longestInColumn<span class=\"sy1\">&lt;<\/span>actLongestInColumn<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longestInColumn <span class=\"sy1\">=<\/span> actLongestInColumn<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; actLongestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>longestLine<span class=\"sy1\">&lt;<\/span>longestInColumn<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longestLine <span class=\"sy1\">=<\/span> longestInColumn<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> longestLine<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Jest to zdecydowanie najd\u0142u\u017csza z funkcji, kt\u00f3re do tej pory omawiali\u015bmy. I jednocze\u015bnie jest najbardziej skomplikowana. Co tutaj w og\u00f3le si\u0119 dzieje? <\/p>\n\n\n\n<p>Naszym celem jest znalezienie najd\u0142u\u017cszych linii pionowych. Sugeruje to, \u017ce musimy przeszukiwa\u0107 obrazek w inny spos\u00f3b ni\u017c robili\u015bmy to dotychczas. W poprzednich zadaniach pierwsza, zewn\u0119trzna p\u0119tla for iterowa\u0142a po wierszach, a wewn\u0119trzna po kolumnach. W wypadku tego zadania taki spos\u00f3b by\u0142by niepoprawny. Musimy znajdowa\u0107 najd\u0142u\u017csze ci\u0105gi pikseli o tych samych jasno\u015bciach w liniach pionowych, co wymusza przechodzenie najpierw po kolumnach. Dla ka\u017cdej kolumny przechodzimy ca\u0142y obrazek od g\u00f3ry do do\u0142u, szukaj\u0105c ci\u0105g\u00f3w spe\u0142niaj\u0105cych warunki naszego zadania. <\/p>\n\n\n\n<p>Zmienna longestLine przechowuje najd\u0142u\u017cszy ci\u0105g pikseli o tej samej jasno\u015bci znaleziony do tej pory. Wewn\u0119trzna p\u0119tla for iteruj\u0105ca po wierszach ma dwie pomocnicze zmienne. longestInColumn oraz actLongestInColumn. Pierwsza pe\u0142ni zadanie podobne do longestLine. Przechowuje najd\u0142u\u017cszy do tej pory znaleziony ci\u0105g w kolumnie. actLongestInColumn wykorzystywane jest natomiast do znalezienia nowego, lepszego, d\u0142u\u017cszego ci\u0105gu.<\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">...<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"sy1\">==<\/span>data<span class=\"br0\">&#91;<\/span>j<span class=\"sy2\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> actLongestInColumn<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>longestInColumn<span class=\"sy1\">&lt;<\/span>actLongestInColumn<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longestInColumn <span class=\"sy1\">=<\/span> actLongestInColumn<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; actLongestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n...<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Skupmy si\u0119 na p\u0119tli przechodz\u0105cej obrazek z g\u00f3ry na d\u00f3\u0142. Sp\u00f3jrz na pierwszego ifa. Por\u00f3wnujemy aktualny piksel z tym znajduj\u0105cym si\u0119 jedno oczko wy\u017cej. Wyja\u015bnia to, dlaczego inicjujemy zmienn\u0105 j na 1 w p\u0119tli. Gdyby j by\u0142o r\u00f3wne zero, program dzia\u0142a\u0142by \u017ale dla pierwszego piksela. Pierwszy piksel le\u017c\u0105cy na wsp\u00f3\u0142rz\u0119dnych [0][i] by\u0142by por\u00f3wnywany z tym kt\u00f3ry znajduje si\u0119 na pozycji [-1][i] &#8211; takie por\u00f3wnanie musia\u0142oby sko\u0144czy\u0107 si\u0119 strasznie.<\/p>\n\n\n\n<p>Je\u015bli if jest prawdziwy, to znaczy \u017ce musimy zwi\u0119kszy\u0107 d\u0142ugo\u015b\u0107 ci\u0105gu o 1. Je\u015bli warunek nie jest spe\u0142niony, sprawdzamy czy aktualnie analizowany ci\u0105g jest wi\u0119kszy od znalezionego do tej pory. Je\u015bli tak, to nowy ci\u0105g staje si\u0119 najd\u0142u\u017cszym ci\u0105giem w kolumnie. Pami\u0119tajmy o tym, \u017ce bez wzgl\u0119du na wszystko musimy wyjedynkowa\u0107 zmienn\u0105 actLongestInColumn.<\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">...<br \/>\n<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">320<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw4\">int<\/span> longestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw4\">int<\/span> actLongestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> j <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span> j<span class=\"sy1\">&lt;<\/span><span class=\"nu0\">200<\/span><span class=\"sy4\">;<\/span>j<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;...<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>longestLine<span class=\"sy1\">&lt;<\/span>longestInColumn<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longestLine <span class=\"sy1\">=<\/span> longestInColumn<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longestInColumn <span class=\"sy1\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n....<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Sko\u0144czyli\u015bmy analizowanie pojedynczej linii pionowej. Teraz musimy sprawdzi\u0107, czy najd\u0142u\u017cszy ci\u0105g pikseli w tej obecnie analizowanej linii jest wi\u0119kszy od tego znalezionego do tej pory w wyniku analizy poprzednich linii pionowych. Analogicznie do algorytmu wyszukiwania maksimum zastosowanego w zadaniu 6.1 &#8211; je\u015bli tak, to nowa d\u0142ugo\u015b\u0107 staje si\u0119 now\u0105 najwi\u0119ksz\u0105. Je\u015bli nie &#8211; no c\u00f3\u017c, je\u015bli tylko si\u0119 da to musimy szuka\u0107 dalej \ud83d\ude42 <\/p>\n\n\n\n<p>W momencie gdy przeszukamy ca\u0142y obraz zmienna longestLine przechowuje wynik naszych oblicze\u0144, kt\u00f3ry zwracamy z funkcji. <\/p>\n\n\n<span class=\"collapseomatic \" id=\"id6a8508ae78aa8\"  tabindex=\"0\" title=\"Zadanie 6.4 - pe\u0142ne rozwi\u0105zanie\"    >Zadanie 6.4 - pe\u0142ne rozwi\u0105zanie<\/span><div id=\"target-id6a8508ae78aa8\" class=\"collapseomatic_content \">\n<script src=\"https:\/\/gist.github.com\/karol221-10\/fe4e43305d4412e01e6142728806d378.js\"><\/script><br \/>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Zadanie 6.4 &#8211; mo\u017cliwe do pope\u0142nienia b\u0142\u0119dy<\/h4>\n\n\n\n<p>W tym zadaniu mo\u017cna pope\u0142ni\u0107 kilka b\u0142\u0119d\u00f3w, kt\u00f3re mog\u0105 wypaczy\u0107 wynik.Przede wszystkim zwr\u00f3\u0107my uwag\u0119 na jedn\u0105 rzecz: Zmienne obliczaj\u0105ce najd\u0142u\u017cszy ci\u0105g maj\u0105 domy\u015blnie warto\u015b\u0107 1. Dlaczego? Poniewa\u017c samotny piksel o pewnej jasno\u015bci, otoczony takimi o innej jasno\u015bci nadal jest pojedynczym pikselem. Nadal jest ci\u0105giem pikseli o tej samej jasno\u015bci, tyle \u017ce o d\u0142ugo\u015bci 1.<\/p>\n\n\n\n<p>Jest jeszcze inny chochlik, kt\u00f3ry m\u00f3g\u0142 wkra\u015b\u0107 si\u0119 w nasz kod &#8211; zapomnienie o tym, \u017ce w jednej linii pionowej mo\u017ce by\u0107 kilka ci\u0105g\u00f3w pikseli o tej samej jasno\u015bci. Je\u015bli przerywaliby\u015bmy wyszukiwanie po znalezieniu pierwszego takiego ci\u0105gu, wynik by\u0142by nie poprawny i traciliby\u015bmy 4 pkt za &#8222;prawie&#8221; dobre (czyli z\u0142e &#8211; haha) rozwi\u0105zanie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sko\u0144czyli\u015bmy<\/h2>\n\n\n\n<p>Om\u00f3wili\u015bmy zadanie z programowania z matury Anno Domini 2017. Mam nadziej\u0119, \u017ce pomo\u017ce to tobie, drogi czytelniku, w lepszym przygotowaniu si\u0119 do egzaminu dojrza\u0142o\u015bci z tego przedmiotu \ud83d\ude42<\/p>\n\n\n\n<p>Je\u015bli masz jakie\u015b uwagi lub komentarze, pisz \ud83d\ude42 Przyjm\u0119 ka\u017cd\u0105 opini\u0119, je\u015bli tylko jest ona merytoryczna. <\/p>\n\n\n\n<p>Do zobaczenia i powodzenia \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\">2<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> Witajcie drodzy czytelnicy \ud83d\ude42 Kontynuujemy temat matur. Tym razem zajmiemy si\u0119 zadaniem &#8222;Piksele&#8221; sprzed dw\u00f3ch lat. Pami\u0119tam je dobrze gdy\u017c w\u0142a\u015bnie w 2017 r. sam zdawa\u0142em matur\u0119 z informatyki. Jest &#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,57,56,60,54],"_links":{"self":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/907"}],"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=907"}],"version-history":[{"count":79,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/907\/revisions"}],"predecessor-version":[{"id":994,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/907\/revisions\/994"}],"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=907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/categories?post=907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/tags?post=907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}