{"id":"informatyka-2016-maj-matura-rozszerzona/zad/5.2","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"5.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPodaj średnią liczbę osób zameldowanych w jednym pokoju. Wynik zaokrąglij do 4 miejsc po przecinku.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Średnia liczba osób zameldowanych w jednym pokoju: 4,7101**\n\n## Sposób 1 - SQL\n\n**Idea:** średnia = (liczba zameldowań) / (liczba różnych pokoi).\n\n```sql\nSELECT ROUND(\n1.0 * COUNT(pesel) / COUNT(DISTINCT id_pok),\n4\n) AS srednia\nFROM meldunek;\n\nAlbo dwa zapytania:\n```sql\nSELECT COUNT(*) FROM meldunek; -- 325 (liczba osób zameldowanych)\nSELECT COUNT(DISTINCT id_pok) FROM meldunek; -- 69 (liczba pokoi)\n\n**Średnia = 325 / 69 ≈ 4,7101449 ** → po zaokrągleniu do 4 miejsc: **4,7101**.\n\n## Sposób 2 - Python\n\n```python\nosoby = []\npokoje = set()\nwith open('meldunek.txt', encoding='windows-1250') as f:\nnext(f) # header\nfor linia in f:\ncz = linia.strip().split('\\t')\nif len(cz) >= 2:\npesel, id_pok = cz[0], cz[1]\nosoby.append(pesel)\npokoje.add(id_pok)\n\nsrednia = len(osoby) / len(pokoje)\nprint(f\"{srednia:.4f}\") # 4.7101\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. Otwórz meldunek.txt jako arkusz.\n2. Liczba osób = `=ILE.NIEPUSTYCH(A:A) - 1` (minus nagłówek). Tu: 325.\n3. Liczba pokoi = `=ILE.NIEPUSTYCH.UNIKATOWYCH(B2:B326)` lub przez tabelę przestawną z `id_pok` jako wiersze. Tu: 69.\n4. Średnia = `=ZAOKR(325/69; 4)` → **4,7101**.\n\n## Reference informatyczny - funkcje agregujące w SQL\n\n> Reference - Agregacja:\n> - `COUNT(*)` - liczba WSZYSTKICH rekordów.\n> - `COUNT(kol)` - liczba rekordów gdzie kol NIE jest NULL.\n> - `COUNT(DISTINCT kol)` - liczba **różnych** wartości kol.\n> - `AVG(kol)` - średnia (DLA wartości liczbowych, ignoruje NULL).\n> - **Ostrożność**: `AVG(COUNT(pesel))` nie zadziała bez podzapytania, bo COUNT już agreguje.\n>\n> Reference - Średnia ważona vs zwykła:\n> - **Zwykła średnia liczby osób na pokój** = `liczba_osob_zameldowanych / liczba_pokoi`.\n> - Można też policzyć średnią z grupowych liczników: `SELECT AVG(c) FROM (SELECT COUNT(*) AS c FROM meldunek GROUP BY id_pok)` - daje **ten sam wynik**, gdyby każdy pokój miał >=1 osobę.\n>\n> Reference - Zaokrąglenie:\n> - SQL: `ROUND(x, 4)` (zwykle).\n> - Python: `round(x, 4)` lub `f\"{x:.4f}\"` dla wyświetlania.\n> - W arkuszu: `=ZAOKR(x; 4)`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.2, max 2 pkt):\n> - **2 pkt** - prawidłowy wynik z zaokrągleniem **4,7101**\n> - **1 pkt** - wynik BEZ prawidłowego zaokrąglenia (4,7101449275 lub 4,71) ALBO licząc na 70 pokojach (4,6429)\n> - **0 pkt** - błędna albo brak\n\n**WAŻNE - pułapka pokoi:** Niektórzy uczniowie wykorzystują pokoje z innych źródeł i otrzymują 70 pokoi (zamiast 69). To częsta pomyłka - dotyczy to studentów z pokojem 0 lub z pokojem spoza miasteczka.\n\n## Typowe pułapki\n\n- **Zaokrąglenie do 2 miejsc** (4,71) zamiast 4 (4,7101) - strata 1 pkt.\n- **Liczba pokoi z błędem** - sprawdź `COUNT(DISTINCT id_pok)`, nie po prostu max id_pok.\n- **Dzielenie całkowite** w Python 2 lub C++ - `325/69 = 4` (int), nie 4.71. Użyj `1.0 * 325 / 69` lub `from future import division`.\n- **Wliczenie nagłówka** do liczenia osób - minus 1 lub `next(f)` na początku.\n- **Pomyłka tabeli** - meldunek.txt ma kolumny PESEL i id_pok, a NIE imię/nazwisko (te są w studenci.txt).\n\n## Złożoność obliczeniowa\n\n- Wczytanie meldunek.txt: O(M) gdzie M = liczba zameldowań (~325).\n- Liczenie unikalnych pokoi (set): O(M) amortyzowane.\n- **Łącznie: O(M).**","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>Podaj średnią liczbę osób zameldowanych w jednym pokoju. Wynik zaokrąglij do 4 miejsc po przecinku.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Średnia liczba osób zameldowanych w jednym pokoju: 4,7101</strong></p>\n<h4>Sposób 1 - SQL</h4>\n<p><strong>Idea:</strong> średnia = (liczba zameldowań) / (liczba różnych pokoi).</p>\n<p>```sql<br>SELECT ROUND(<br>1.0 * COUNT(pesel) / COUNT(DISTINCT id_pok),<br>4<br>) AS srednia<br>FROM meldunek;</p>\n<p>Albo dwa zapytania:<br>```sql<br>SELECT COUNT(*) FROM meldunek; -- 325 (liczba osób zameldowanych)<br>SELECT COUNT(DISTINCT id_pok) FROM meldunek; -- 69 (liczba pokoi)</p>\n<p><strong>Średnia = 325 / 69 ≈ 4,7101449 </strong> → po zaokrągleniu do 4 miejsc: <strong>4,7101</strong>.</p>\n<h4>Sposób 2 - Python</h4>\n<p>```python<br>osoby = []<br>pokoje = set()<br>with open(&#x27;meldunek.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) &gt;= 2:<br>pesel, id_pok = cz[0], cz[1]<br>osoby.append(pesel)<br>pokoje.add(id_pok)</p>\n<p>srednia = len(osoby) / len(pokoje)<br>print(f&quot;{srednia:.4f}&quot;) # 4.7101</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<ol><li>Otwórz meldunek.txt jako arkusz.</li><li>Liczba osób = <code>=ILE.NIEPUSTYCH(A:A) - 1</code> (minus nagłówek). Tu: 325.</li><li>Liczba pokoi = <code>=ILE.NIEPUSTYCH.UNIKATOWYCH(B2:B326)</code> lub przez tabelę przestawną z <code>id_pok</code> jako wiersze. Tu: 69.</li><li>Średnia = <code>=ZAOKR(325/69; 4)</code> → <strong>4,7101</strong>.</li></ol>\n<h4>Reference informatyczny - funkcje agregujące w SQL</h4>\n<blockquote>Reference - Agregacja:<br>- <code>COUNT(*)</code> - liczba WSZYSTKICH rekordów.<br>- <code>COUNT(kol)</code> - liczba rekordów gdzie kol NIE jest NULL.<br>- <code>COUNT(DISTINCT kol)</code> - liczba <strong>różnych</strong> wartości kol.<br>- <code>AVG(kol)</code> - średnia (DLA wartości liczbowych, ignoruje NULL).<br>- <strong>Ostrożność</strong>: <code>AVG(COUNT(pesel))</code> nie zadziała bez podzapytania, bo COUNT już agreguje.<br><br>Reference - Średnia ważona vs zwykła:<br>- <strong>Zwykła średnia liczby osób na pokój</strong> = <code>liczba_osob_zameldowanych / liczba_pokoi</code>.<br>- Można też policzyć średnią z grupowych liczników: <code>SELECT AVG(c) FROM (SELECT COUNT(*) AS c FROM meldunek GROUP BY id_pok)</code> - daje <strong>ten sam wynik</strong>, gdyby każdy pokój miał &gt;=1 osobę.<br><br>Reference - Zaokrąglenie:<br>- SQL: <code>ROUND(x, 4)</code> (zwykle).<br>- Python: <code>round(x, 4)</code> lub <code>f&quot;{x:.4f}&quot;</code> dla wyświetlania.<br>- W arkuszu: <code>=ZAOKR(x; 4)</code>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.2, max 2 pkt):<br>- <strong>2 pkt</strong> - prawidłowy wynik z zaokrągleniem <strong>4,7101</strong><br>- <strong>1 pkt</strong> - wynik BEZ prawidłowego zaokrąglenia (4,7101449275 lub 4,71) ALBO licząc na 70 pokojach (4,6429)<br>- <strong>0 pkt</strong> - błędna albo brak</blockquote>\n<p><strong>WAŻNE - pułapka pokoi:</strong> Niektórzy uczniowie wykorzystują pokoje z innych źródeł i otrzymują 70 pokoi (zamiast 69). To częsta pomyłka - dotyczy to studentów z pokojem 0 lub z pokojem spoza miasteczka.</p>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Zaokrąglenie do 2 miejsc</strong> (4,71) zamiast 4 (4,7101) - strata 1 pkt.</li><li><strong>Liczba pokoi z błędem</strong> - sprawdź <code>COUNT(DISTINCT id_pok)</code>, nie po prostu max id_pok.</li><li><strong>Dzielenie całkowite</strong> w Python 2 lub C++ - <code>325/69 = 4</code> (int), nie 4.71. Użyj <code>1.0 * 325 / 69</code> lub <code>from future import division</code>.</li><li><strong>Wliczenie nagłówka</strong> do liczenia osób - minus 1 lub <code>next(f)</code> na początku.</li><li><strong>Pomyłka tabeli</strong> - meldunek.txt ma kolumny PESEL i id_pok, a NIE imię/nazwisko (te są w studenci.txt).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie meldunek.txt: O(M) gdzie M = liczba zameldowań (~325).</li><li>Liczenie unikalnych pokoi (set): O(M) amortyzowane.</li><li><strong>Łącznie: O(M).</strong></li></ul>"}]}