{"id":"informatyka-2015-maj-matura-rozszerzona/zad/5.2","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"5.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPrzeanalizuj dane i wybierz województwa, w których liczba kobiet w 2014 roku była większa niż w 2013 roku i jednocześnie liczba mężczyzn w 2014 roku była większa niż w 2013 roku. Podaj liczbę wszystkich takich województw w całym kraju oraz w każdym z regionów: A, B, C i D.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n- **Cały kraj: 19 województw**\n- Region A: **3**\n- Region B: **4**\n- Region C: **8**\n- Region D: **4**\n\n## Sposób 1 - filtr w Pythonie + groupby\n\n```python\nimport pandas as pd\n\ndf = pd.read_csv('kraina.txt', sep=';', header=None,\nnames=['nazwa', 'k2013', 'm2013', 'k2014', 'm2014'])\ndf['region'] = df['nazwa'].str[-1]\n\n# Warunek: kobiety 2014 > kobiety 2013 AND mężczyźni 2014 > mężczyźni 2013\nrosnace = df[(df['k2014'] > df['k2013']) & (df['m2014'] > df['m2013'])]\n\nprint('Razem:', len(rosnace)) # 19\nprint(rosnace.groupby('region').size())\n# A 3\n# B 4\n# C 8\n# D 4\n\n## Sposób 2 - arkusz kalkulacyjny\n\n**Krok 1: kolumna pomocnicza (H) - flaga rosnący**\n- H2: `=JEŻELI(I(D2>B2; E2>C2); 1; 0)` (D, E to 2014; B, C to 2013).\n- Skopiuj H2:H51.\n\n**Krok 2: suma flag**\n- Cały kraj: `=SUMA(H2:H51)` → **19**.\n- Region A: `=SUMA.JEŻELI(F2:F51; \"A\"; H2:H51)` → **3**.\n- Region B: 4, C: 8, D: 4.\n\n**Sposób alternatywny - Excel:**\n=LICZ.WARUNKI(F2:F51; \"A\"; D2:D51; \">\" & B2:B51; E2:E51; \">\" & C2:C51)\nUWAGA: LICZ.WARUNKI nie obsługuje porównań między kolumnami - lepiej kolumna pomocnicza.\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram WzrostLudnosci;\nvar\nf: TextFile;\nlinia, nazwa: String;\nk13, m13, k14, m14, razem: LongInt;\nregion: Char;\ncountA, countB, countC, countD: Integer;\npozycja: Integer;\nbegin\nAssignFile(f, 'kraina.txt');\nReset(f);\ncountA := 0; countB := 0; countC := 0; countD := 0; razem := 0;\nwhile not Eof(f) do\nbegin\nReadln(f, linia);\n// Parse: nazwa;k13;m13;k14;m14\npozycja := Pos(';', linia);\nnazwa := Copy(linia, 1, pozycja-1);\nregion := nazwa[Length(nazwa)];\nDelete(linia, 1, pozycja);\npozycja := Pos(';', linia); k13 := StrToInt(Copy(linia, 1, pozycja-1)); Delete(linia, 1, pozycja);\npozycja := Pos(';', linia); m13 := StrToInt(Copy(linia, 1, pozycja-1)); Delete(linia, 1, pozycja);\npozycja := Pos(';', linia); k14 := StrToInt(Copy(linia, 1, pozycja-1)); Delete(linia, 1, pozycja);\nm14 := StrToInt(linia);\nif (k14 > k13) and (m14 > m13) then\nbegin\nInc(razem);\ncase region of\n'A': Inc(countA);\n'B': Inc(countB);\n'C': Inc(countC);\n'D': Inc(countD);\nend;\nend;\nend;\nCloseFile(f);\nWriteln('Razem: ', razem); // 19\nWriteln('A: ', countA); // 3\nWriteln('B: ', countB); // 4\nWriteln('C: ', countC); // 8\nWriteln('D: ', countD); // 4\nend.\n\n## Reference informatyczny - filtrowanie z wieloma warunkami\n\n> Reference - Compound filter:\n> - **Pandas**: `df[(cond1) & (cond2)]` - AND. `df[(cond1) | (cond2)]` - OR.\n> - **SQL**: `WHERE cond1 AND cond2`.\n> - **Excel**: `=JEŻELI(I(c1; c2); 1; 0)` (I = AND), `=JEŻELI(LUB(c1; c2); 1; 0)` (LUB = OR).\n> - **Liczenie po grupach**: `groupby().size()`, `LICZ.JEŻELI`, `COUNT() GROUP BY`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.2, max 2 pkt):\n> - **2 pkt** - poprawne wszystkie liczby (cały kraj + A + B + C + D)\n> - **1 pkt** - poprawna tylko liczba całego kraju ALBO tylko liczby regionów\n> - **0 pkt** - niepełna lub błędna albo brak\n\n## Typowe pułapki\n\n- **Pomylenie kolejności kolumn**: w pliku k2013 jest PRZED m2013 - pomylenie kobiet z mężczyznami zaburzy wynik.\n- **Operator < zamiast >** - kobieta wzrosła znaczy 2014 > 2013, nie odwrotnie.\n- **OR zamiast AND** - warunek to JEDNOCZEŚNIE (oba muszą rosnąć), więc AND.\n- **Sumowanie 19 ≠ 3+4+8+4 = 19** - spójne, ale czasem uczniowie sumują źle.\n- **Wyodrębnienie regionu**: ostatni znak NAZWY, nie całej linii.\n\n## Złożoność obliczeniowa\n\n- Filtrowanie: O(N), gdzie N = 50 województw.\n- Liczenie po grupach: O(N).\n- **Całkowita: O(N)**.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2015 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 5.1.</p>\n<p>Przeanalizuj dane i wybierz województwa, w których liczba kobiet w 2014 roku była większa niż w 2013 roku i jednocześnie liczba mężczyzn w 2014 roku była większa niż w 2013 roku. Podaj liczbę wszystkich takich województw w całym kraju oraz w każdym z regionów: A, B, C i D.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<ul><li><strong>Cały kraj: 19 województw</strong></li><li>Region A: <strong>3</strong></li><li>Region B: <strong>4</strong></li><li>Region C: <strong>8</strong></li><li>Region D: <strong>4</strong></li></ul>\n<h4>Sposób 1 - filtr w Pythonie + groupby</h4>\n<p>```python<br>import pandas as pd</p>\n<p>df = pd.read_csv(&#x27;kraina.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;nazwa&#x27;, &#x27;k2013&#x27;, &#x27;m2013&#x27;, &#x27;k2014&#x27;, &#x27;m2014&#x27;])<br>df[&#x27;region&#x27;] = df[&#x27;nazwa&#x27;].str[-1]</p>\n<h3>Warunek: kobiety 2014 &gt; kobiety 2013 AND mężczyźni 2014 &gt; mężczyźni 2013</h3>\n<p>rosnace = df[(df[&#x27;k2014&#x27;] &gt; df[&#x27;k2013&#x27;]) &amp; (df[&#x27;m2014&#x27;] &gt; df[&#x27;m2013&#x27;])]</p>\n<p>print(&#x27;Razem:&#x27;, len(rosnace)) # 19<br>print(rosnace.groupby(&#x27;region&#x27;).size())</p>\n<h3>A 3</h3>\n<h3>B 4</h3>\n<h3>C 8</h3>\n<h3>D 4</h3>\n<h4>Sposób 2 - arkusz kalkulacyjny</h4>\n<p><strong>Krok 1: kolumna pomocnicza (H) - flaga rosnący</strong></p>\n<ul><li>H2: <code>=JEŻELI(I(D2&gt;B2; E2&gt;C2); 1; 0)</code> (D, E to 2014; B, C to 2013).</li><li>Skopiuj H2:H51.</li></ul>\n<p><strong>Krok 2: suma flag</strong></p>\n<ul><li>Cały kraj: <code>=SUMA(H2:H51)</code> → <strong>19</strong>.</li><li>Region A: <code>=SUMA.JEŻELI(F2:F51; &quot;A&quot;; H2:H51)</code> → <strong>3</strong>.</li><li>Region B: 4, C: 8, D: 4.</li></ul>\n<p><strong>Sposób alternatywny - Excel:</strong><br>=LICZ.WARUNKI(F2:F51; &quot;A&quot;; D2:D51; &quot;&gt;&quot; &amp; B2:B51; E2:E51; &quot;&gt;&quot; &amp; C2:C51)<br>UWAGA: LICZ.WARUNKI nie obsługuje porównań między kolumnami - lepiej kolumna pomocnicza.</p>\n<h4>Sposób 3 - Pascal</h4>\n<p>```pascal<br>program WzrostLudnosci;<br>var<br>f: TextFile;<br>linia, nazwa: String;<br>k13, m13, k14, m14, razem: LongInt;<br>region: Char;<br>countA, countB, countC, countD: Integer;<br>pozycja: Integer;<br>begin<br>AssignFile(f, &#x27;kraina.txt&#x27;);<br>Reset(f);<br>countA := 0; countB := 0; countC := 0; countD := 0; razem := 0;<br>while not Eof(f) do<br>begin<br>Readln(f, linia);<br>// Parse: nazwa;k13;m13;k14;m14<br>pozycja := Pos(&#x27;;&#x27;, linia);<br>nazwa := Copy(linia, 1, pozycja-1);<br>region := nazwa[Length(nazwa)];<br>Delete(linia, 1, pozycja);<br>pozycja := Pos(&#x27;;&#x27;, linia); k13 := StrToInt(Copy(linia, 1, pozycja-1)); Delete(linia, 1, pozycja);<br>pozycja := Pos(&#x27;;&#x27;, linia); m13 := StrToInt(Copy(linia, 1, pozycja-1)); Delete(linia, 1, pozycja);<br>pozycja := Pos(&#x27;;&#x27;, linia); k14 := StrToInt(Copy(linia, 1, pozycja-1)); Delete(linia, 1, pozycja);<br>m14 := StrToInt(linia);<br>if (k14 &gt; k13) and (m14 &gt; m13) then<br>begin<br>Inc(razem);<br>case region of<br>&#x27;A&#x27;: Inc(countA);<br>&#x27;B&#x27;: Inc(countB);<br>&#x27;C&#x27;: Inc(countC);<br>&#x27;D&#x27;: Inc(countD);<br>end;<br>end;<br>end;<br>CloseFile(f);<br>Writeln(&#x27;Razem: &#x27;, razem); // 19<br>Writeln(&#x27;A: &#x27;, countA); // 3<br>Writeln(&#x27;B: &#x27;, countB); // 4<br>Writeln(&#x27;C: &#x27;, countC); // 8<br>Writeln(&#x27;D: &#x27;, countD); // 4<br>end.</p>\n<h4>Reference informatyczny - filtrowanie z wieloma warunkami</h4>\n<blockquote>Reference - Compound filter:<br>- <strong>Pandas</strong>: <code>df[(cond1) &amp; (cond2)]</code> - AND. <code>df[(cond1) | (cond2)]</code> - OR.<br>- <strong>SQL</strong>: <code>WHERE cond1 AND cond2</code>.<br>- <strong>Excel</strong>: <code>=JEŻELI(I(c1; c2); 1; 0)</code> (I = AND), <code>=JEŻELI(LUB(c1; c2); 1; 0)</code> (LUB = OR).<br>- <strong>Liczenie po grupach</strong>: <code>groupby().size()</code>, <code>LICZ.JEŻELI</code>, <code>COUNT() GROUP BY</code>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.2, max 2 pkt):<br>- <strong>2 pkt</strong> - poprawne wszystkie liczby (cały kraj + A + B + C + D)<br>- <strong>1 pkt</strong> - poprawna tylko liczba całego kraju ALBO tylko liczby regionów<br>- <strong>0 pkt</strong> - niepełna lub błędna albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Pomylenie kolejności kolumn</strong>: w pliku k2013 jest PRZED m2013 - pomylenie kobiet z mężczyznami zaburzy wynik.</li><li><strong>Operator &lt; zamiast &gt;</strong> - kobieta wzrosła znaczy 2014 &gt; 2013, nie odwrotnie.</li><li><strong>OR zamiast AND</strong> - warunek to JEDNOCZEŚNIE (oba muszą rosnąć), więc AND.</li><li><strong>Sumowanie 19 ≠ 3+4+8+4 = 19</strong> - spójne, ale czasem uczniowie sumują źle.</li><li><strong>Wyodrębnienie regionu</strong>: ostatni znak NAZWY, nie całej linii.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Filtrowanie: O(N), gdzie N = 50 województw.</li><li>Liczenie po grupach: O(N).</li><li><strong>Całkowita: O(N)</strong>.</li></ul>"}]}