{"id":"informatyka-2016-maj-matura-rozszerzona/zad/5.3","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"5.3","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nW numerze PESEL zawarta jest informacja o płci osoby. Jeżeli przedostatnia cyfra numeru jest parzysta, to PESEL należy do kobiety, jeśli nieparzysta, to do mężczyzny.\n\nPodaj liczbę kobiet i liczbę mężczyzn wśród studentów.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Kobiety: 138, Mężczyźni: 192**\n\n## Sposób 1 - SQL\n\n**Idea:** PESEL ma 11 cyfr; przedostatnia to pozycja 10. Wyciągamy ją funkcją tekstową i sprawdzamy parzystość.\n\n```sql\nSELECT\nSUM(CASE WHEN CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 0 THEN 1 ELSE 0 END) AS kobiety,\nSUM(CASE WHEN CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 1 THEN 1 ELSE 0 END) AS mezczyzni\nFROM studenci;\n\n**Alternatywnie** (dwa osobne zapytania):\n```sql\nSELECT COUNT(*) FROM studenci\nWHERE CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 0; -- 138 kobiet\n\nSELECT COUNT(*) FROM studenci\nWHERE CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 1; -- 192 mężczyzn\n\n## Sposób 2 - Python\n\n```python\nkobiety = 0\nmezczyzni = 0\nwith open('studenci.txt', encoding='windows-1250') as f:\nnext(f) # header\nfor linia in f:\ncz = linia.strip().split('\\t')\nif len(cz) < 1:\ncontinue\npesel = cz[0]\nif len(pesel) >= 11:\nprzedostatnia = int(pesel[9]) # indeks 9 = 10. cyfra (od 1)\nif przedostatnia % 2 == 0:\nkobiety += 1\nelse:\nmezczyzni += 1\n\nprint(f\"Kobiety: {kobiety}\") # 138\nprint(f\"Mężczyźni: {mezczyzni}\") # 192\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. W kolumnie B (pomocniczej) wyciągamy 10. cyfrę: `=FRAGMENT.TEKSTU(A2; 10; 1)` (dla PESEL w A2).\n2. W kolumnie C sprawdzamy parzystość: `=JEŻELI(MOD(WARTOŚĆ(B2);2)=0; \"K\"; \"M\")`.\n3. Liczenie: `=LICZ.JEŻELI(C:C; \"K\")` → 138; `=LICZ.JEŻELI(C:C; \"M\")` → 192.\n\n## Reference informatyczny - struktura PESEL\n\n> Reference - Struktura numeru PESEL (11 cyfr):\n> - **Pozycje 1-2**: rok urodzenia (ostatnie 2 cyfry).\n> - **Pozycje 3-4**: miesiąc (z zakodowanym stuleciem: +20 dla 2000-2099, +40 dla 2100-2199, +80 dla 1800-1899).\n> - **Pozycje 5-6**: dzień.\n> - **Pozycje 7-10**: numer kolejny.\n> - **Pozycja 10**: cyfra **płci** - parzysta = kobieta, nieparzysta = mężczyzna.\n> - **Pozycja 11**: cyfra kontrolna.\n>\n> Reference - Wyciąganie n-tej cyfry stringa:\n> - **Python**: `pesel[9]` (indeks od 0), więc 10. cyfra (od 1) to `pesel[9]`.\n> - **SQL**: `SUBSTRING(pesel, 10, 1)` (indeks od 1).\n> - **C++**: `pesel[9]` (char, trzeba odjąć '0' żeby uzyskać int).\n> - **Pascal**: `Copy(pesel, 10, 1)` lub `pesel[10]`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.3, max 2 pkt):\n> - **2 pkt** - oba wyniki prawidłowe (kobiety 138, mężczyźni 192)\n> - **1 pkt** - jeden prawidłowy wynik\n> - **0 pkt** - błędna albo brak\n>\n> **Uwaga: W przypadku wyników (K=153, M=177) - 1 punkt** (typowa pomyłka cyfry na innej pozycji, np. 11. zamiast 10.).\n\n## Typowe pułapki\n\n- **Pomylenie pozycji** - przedostatnia z 11 = **pozycja 10**, NIE pozycja 11 (to cyfra kontrolna) ani 9.\n- **Indeksowanie od 0 vs od 1** - w Pythonie `pesel[9]` = 10. cyfra; w SQL `SUBSTRING(pesel, 10, 1)` = 10. cyfra. Pomyłka daje błędny wynik (153/177).\n- **Pomyłka parzystości** - parzysta cyfra (0, 2, 4, 6, 8) = **KOBIETA**. Nieparzysta (1, 3, 5, 7, 9) = mężczyzna.\n- **Niepoprawne kodowanie pliku** - Windows-1250 dla polskich znaków w nazwiskach.\n- **Wliczenie nagłówka jako rekordu** - odejmij 1 lub użyj `next(f)`.\n\n## Złożoność obliczeniowa\n\n- Wczytanie pliku: O(S) gdzie S = liczba studentów (~330).\n- Sprawdzenie cyfry: O(1).\n- **Łącznie: O(S).**","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 2016 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 5.1.</p>\n<p>W numerze PESEL zawarta jest informacja o płci osoby. Jeżeli przedostatnia cyfra numeru jest parzysta, to PESEL należy do kobiety, jeśli nieparzysta, to do mężczyzny.</p>\n<p>Podaj liczbę kobiet i liczbę mężczyzn wśród studentów.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Kobiety: 138, Mężczyźni: 192</strong></p>\n<h4>Sposób 1 - SQL</h4>\n<p><strong>Idea:</strong> PESEL ma 11 cyfr; przedostatnia to pozycja 10. Wyciągamy ją funkcją tekstową i sprawdzamy parzystość.</p>\n<p>```sql<br>SELECT<br>SUM(CASE WHEN CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 0 THEN 1 ELSE 0 END) AS kobiety,<br>SUM(CASE WHEN CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 1 THEN 1 ELSE 0 END) AS mezczyzni<br>FROM studenci;</p>\n<p><strong>Alternatywnie</strong> (dwa osobne zapytania):<br>```sql<br>SELECT COUNT(*) FROM studenci<br>WHERE CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 0; -- 138 kobiet</p>\n<p>SELECT COUNT(*) FROM studenci<br>WHERE CAST(SUBSTRING(pesel, 10, 1) AS INT) % 2 = 1; -- 192 mężczyzn</p>\n<h4>Sposób 2 - Python</h4>\n<p>```python<br>kobiety = 0<br>mezczyzni = 0<br>with open(&#x27;studenci.txt&#x27;, encoding=&#x27;windows-1250&#x27;) as f:<br>next(f) # header<br>for linia in f:<br>cz = linia.strip().split(&#x27;\\t&#x27;)<br>if len(cz) &lt; 1:<br>continue<br>pesel = cz[0]<br>if len(pesel) &gt;= 11:<br>przedostatnia = int(pesel[9]) # indeks 9 = 10. cyfra (od 1)<br>if przedostatnia % 2 == 0:<br>kobiety += 1<br>else:<br>mezczyzni += 1</p>\n<p>print(f&quot;Kobiety: {kobiety}&quot;) # 138<br>print(f&quot;Mężczyźni: {mezczyzni}&quot;) # 192</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<ol><li>W kolumnie B (pomocniczej) wyciągamy 10. cyfrę: <code>=FRAGMENT.TEKSTU(A2; 10; 1)</code> (dla PESEL w A2).</li><li>W kolumnie C sprawdzamy parzystość: <code>=JEŻELI(MOD(WARTOŚĆ(B2);2)=0; &quot;K&quot;; &quot;M&quot;)</code>.</li><li>Liczenie: <code>=LICZ.JEŻELI(C:C; &quot;K&quot;)</code> → 138; <code>=LICZ.JEŻELI(C:C; &quot;M&quot;)</code> → 192.</li></ol>\n<h4>Reference informatyczny - struktura PESEL</h4>\n<blockquote>Reference - Struktura numeru PESEL (11 cyfr):<br>- <strong>Pozycje 1-2</strong>: rok urodzenia (ostatnie 2 cyfry).<br>- <strong>Pozycje 3-4</strong>: miesiąc (z zakodowanym stuleciem: +20 dla 2000-2099, +40 dla 2100-2199, +80 dla 1800-1899).<br>- <strong>Pozycje 5-6</strong>: dzień.<br>- <strong>Pozycje 7-10</strong>: numer kolejny.<br>- <strong>Pozycja 10</strong>: cyfra <strong>płci</strong> - parzysta = kobieta, nieparzysta = mężczyzna.<br>- <strong>Pozycja 11</strong>: cyfra kontrolna.<br><br>Reference - Wyciąganie n-tej cyfry stringa:<br>- <strong>Python</strong>: <code>pesel[9]</code> (indeks od 0), więc 10. cyfra (od 1) to <code>pesel[9]</code>.<br>- <strong>SQL</strong>: <code>SUBSTRING(pesel, 10, 1)</code> (indeks od 1).<br>- <strong>C++</strong>: <code>pesel[9]</code> (char, trzeba odjąć &#x27;0&#x27; żeby uzyskać int).<br>- <strong>Pascal</strong>: <code>Copy(pesel, 10, 1)</code> lub <code>pesel[10]</code>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.3, max 2 pkt):<br>- <strong>2 pkt</strong> - oba wyniki prawidłowe (kobiety 138, mężczyźni 192)<br>- <strong>1 pkt</strong> - jeden prawidłowy wynik<br>- <strong>0 pkt</strong> - błędna albo brak<br><br><strong>Uwaga: W przypadku wyników (K=153, M=177) - 1 punkt</strong> (typowa pomyłka cyfry na innej pozycji, np. 11. zamiast 10.).</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Pomylenie pozycji</strong> - przedostatnia z 11 = <strong>pozycja 10</strong>, NIE pozycja 11 (to cyfra kontrolna) ani 9.</li><li><strong>Indeksowanie od 0 vs od 1</strong> - w Pythonie <code>pesel[9]</code> = 10. cyfra; w SQL <code>SUBSTRING(pesel, 10, 1)</code> = 10. cyfra. Pomyłka daje błędny wynik (153/177).</li><li><strong>Pomyłka parzystości</strong> - parzysta cyfra (0, 2, 4, 6, 8) = <strong>KOBIETA</strong>. Nieparzysta (1, 3, 5, 7, 9) = mężczyzna.</li><li><strong>Niepoprawne kodowanie pliku</strong> - Windows-1250 dla polskich znaków w nazwiskach.</li><li><strong>Wliczenie nagłówka jako rekordu</strong> - odejmij 1 lub użyj <code>next(f)</code>.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie pliku: O(S) gdzie S = liczba studentów (~330).</li><li>Sprawdzenie cyfry: O(1).</li><li><strong>Łącznie: O(S).</strong></li></ul>"}]}