{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.1","points":1,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 4. Słodzik\n\nFirma Słodzik zajmuje się sprzedażą cukru. W pliku cukier.txt znajdują się 2162 wiersze z danymi dotyczącymi sprzedaży w latach 2005-2014. W każdym wierszu podane są dane opisujące jedną transakcję sprzedaży, oddzielone pojedynczymi znakami tabulacji: data sprzedaży (rrrr-mm-dd), numer NIP klienta (13-znakowy tekst) i ilość sprzedanego cukru w kg (co najwyżej 3-cyfrowa liczba całkowita dodatnia). Transakcje są uporządkowane niemalejąco według daty.\n\nPrzykład:\n2005-01-01 | 872-13-44-365 | 10\n2005-01-04 | 369-43-03-176 | 2\n\nFirma Słodzik ustala cenę sprzedaży w złotych na początku roku. Ustalona cena obowiązuje przez cały rok. W pliku cennik.txt przedstawiono ceny sprzedaży 1 kg cukru ustalone przez firmę Słodzik w latach 2005-2014.\n\nPrzykład cennik:\n2005 | 2,00\n2006 | 2,05\n2007 | 2,09\n\nPodaj numery NIP trzech klientów, którzy w całym okresie 2005-2014 kupili łącznie najwięcej cukru. Dla każdego z tych klientów podaj łączną liczbę kilogramów zakupionego przez niego cukru.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n| NIP | Łączna liczba kg cukru |\n| **254-14-00-156** | **27 505** |\n| **847-48-41-699** | **26 955** |\n| **392-78-93-552** | **26 451** |\n\n## Sposób 1 - Python (agregacja słownikiem)\n\n```python\nfrom collections import defaultdict\n\nsumy = defaultdict(int)\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg = linia.strip().split('\\t')\nsumy[nip] += int(kg)\n\n# Trzech największych\ntop3 = sorted(sumy.items(), key=lambda x: -x[1])[:3]\nfor nip, kg in top3:\nprint(nip, kg)\n\nWynik:\n254-14-00-156 27505\n847-48-41-699 26955\n392-78-93-552 26451\n\n## Sposób 2 - SQL\n\nZakładając, że `cukier.txt` zaimportowano do tabeli `sprzedaz(data, nip, kg)`:\n\n```sql\nSELECT nip, SUM(kg) AS suma\nFROM sprzedaz\nGROUP BY nip\nORDER BY suma DESC\nLIMIT 3;\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. Wczytaj cukier.txt jako 3 kolumny: A (data), B (NIP), C (kg).\n2. Pobierz unikalne NIPy w kolumnę E (Data → Usuń duplikaty z B).\n3. W F2: `=SUMA.JEŻELI(B:B; E2; C:C)` - łączna suma kg per NIP.\n4. Posortuj E:F malejąco po F.\n5. Wynik: 3 pierwsze wiersze.\n\nAlternatywnie tabela przestawna: Wiersze = NIP, Wartości = SUMA kg → sortowanie malejące.\n\n## Sposób 4 - Pascal\n\n```pascal\nprogram Slodzik41;\nuses sysutils;\nvar\nf: TextFile;\ndata, nip: string;\nkg, i, j, n: LongInt;\nnipy: array[1 3000] of string;\nsumy: array[1 3000] of LongInt;\nfound: Boolean;\ntmpS: string; tmpL: LongInt;\nbegin\nn := 0;\nAssignFile(f, 'cukier.txt');\nReset(f);\nwhile not Eof(f) do\nbegin\nReadLn(f, data); // czyta cały wiersz, należy sparsować\n// [parsowanie split po tabulatorze omijam dla zwięzłości]\n// szukaj nip w tablicy; jeśli nie ma - dodaj\nend;\nCloseFile(f);\n// sortuj nipy malejąco po sumy (np. bubble)\n// wypisz pierwsze 3\nend.\n\n## Reference algorytmiczny - agregacja danych\n\n> Reference - agregacja grupowa (group by):\n> - W Python: `collections.defaultdict(int)` lub `collections.Counter` dla zliczeń.\n> - W SQL: `GROUP BY + agregat` (SUM, COUNT, AVG).\n> - W arkuszu: `SUMA.JEŻELI` lub tabela przestawna.\n> - Top-N: sortowanie malejąco i wzięcie pierwszych N.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.1, max 1 pkt):\n> - **1 pkt** - za podanie 3 NIPów Z prawidłowymi sumami kg\n> - **0 pkt** - odpowiedź niepełna lub błędna albo brak\n\n## Typowe pułapki\n\n- **Format separatora** - w pliku separator to **tabulacja (\\t)**, nie spacja czy przecinek. W Python `split('\\t')`.\n- **Kolejność sortowania** - sortuj malejąco po sumie kg, nie po NIP.\n- **Konwersja liczby kg** - kg to liczba całkowita, użyj `int(kg)` lub `parseInt`.\n- **Klucz CKE może mieć inny porządek** - kolejność trzech klientów w odpowiedzi może się różnić, ale wszystkie 3 NIPy i wartości muszą być poprawne.\n\n## Złożoność obliczeniowa\n\n- Pojedyncze przejście pliku + agregacja w słowniku: **O(n)**, gdzie n = liczba transakcji (2162).\n- Sortowanie unikalnych NIPów: O(k log k), gdzie k = liczba unikalnych klientów.","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 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 4. Słodzik</p>\n<p>Firma Słodzik zajmuje się sprzedażą cukru. W pliku cukier.txt znajdują się 2162 wiersze z danymi dotyczącymi sprzedaży w latach 2005-2014. W każdym wierszu podane są dane opisujące jedną transakcję sprzedaży, oddzielone pojedynczymi znakami tabulacji: data sprzedaży (rrrr-mm-dd), numer NIP klienta (13-znakowy tekst) i ilość sprzedanego cukru w kg (co najwyżej 3-cyfrowa liczba całkowita dodatnia). Transakcje są uporządkowane niemalejąco według daty.</p>\n<p>Przykład:<br>2005-01-01 | 872-13-44-365 | 10<br>2005-01-04 | 369-43-03-176 | 2</p>\n<p>Firma Słodzik ustala cenę sprzedaży w złotych na początku roku. Ustalona cena obowiązuje przez cały rok. W pliku cennik.txt przedstawiono ceny sprzedaży 1 kg cukru ustalone przez firmę Słodzik w latach 2005-2014.</p>\n<p>Przykład cennik:<br>2005 | 2,00<br>2006 | 2,05<br>2007 | 2,09</p>\n<p>Podaj numery NIP trzech klientów, którzy w całym okresie 2005-2014 kupili łącznie najwięcej cukru. Dla każdego z tych klientów podaj łączną liczbę kilogramów zakupionego przez niego cukru.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>| NIP | Łączna liczba kg cukru |<br>| <strong>254-14-00-156</strong> | <strong>27 505</strong> |<br>| <strong>847-48-41-699</strong> | <strong>26 955</strong> |<br>| <strong>392-78-93-552</strong> | <strong>26 451</strong> |</p>\n<h4>Sposób 1 - Python (agregacja słownikiem)</h4>\n<p>```python<br>from collections import defaultdict</p>\n<p>sumy = defaultdict(int)<br>with open(&#x27;cukier.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>for linia in f:<br>data, nip, kg = linia.strip().split(&#x27;\\t&#x27;)<br>sumy[nip] += int(kg)</p>\n<h3>Trzech największych</h3>\n<p>top3 = sorted(sumy.items(), key=lambda x: -x[1])[:3]<br>for nip, kg in top3:<br>print(nip, kg)</p>\n<p>Wynik:<br>254-14-00-156 27505<br>847-48-41-699 26955<br>392-78-93-552 26451</p>\n<h4>Sposób 2 - SQL</h4>\n<p>Zakładając, że <code>cukier.txt</code> zaimportowano do tabeli <code>sprzedaz(data, nip, kg)</code>:</p>\n<p>```sql<br>SELECT nip, SUM(kg) AS suma<br>FROM sprzedaz<br>GROUP BY nip<br>ORDER BY suma DESC<br>LIMIT 3;</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<ol><li>Wczytaj cukier.txt jako 3 kolumny: A (data), B (NIP), C (kg).</li><li>Pobierz unikalne NIPy w kolumnę E (Data → Usuń duplikaty z B).</li><li>W F2: <code>=SUMA.JEŻELI(B:B; E2; C:C)</code> - łączna suma kg per NIP.</li><li>Posortuj E:F malejąco po F.</li><li>Wynik: 3 pierwsze wiersze.</li></ol>\n<p>Alternatywnie tabela przestawna: Wiersze = NIP, Wartości = SUMA kg → sortowanie malejące.</p>\n<h4>Sposób 4 - Pascal</h4>\n<p>```pascal<br>program Slodzik41;<br>uses sysutils;<br>var<br>f: TextFile;<br>data, nip: string;<br>kg, i, j, n: LongInt;<br>nipy: array[1 3000] of string;<br>sumy: array[1 3000] of LongInt;<br>found: Boolean;<br>tmpS: string; tmpL: LongInt;<br>begin<br>n := 0;<br>AssignFile(f, &#x27;cukier.txt&#x27;);<br>Reset(f);<br>while not Eof(f) do<br>begin<br>ReadLn(f, data); // czyta cały wiersz, należy sparsować<br>// [parsowanie split po tabulatorze omijam dla zwięzłości]<br>// szukaj nip w tablicy; jeśli nie ma - dodaj<br>end;<br>CloseFile(f);<br>// sortuj nipy malejąco po sumy (np. bubble)<br>// wypisz pierwsze 3<br>end.</p>\n<h4>Reference algorytmiczny - agregacja danych</h4>\n<blockquote>Reference - agregacja grupowa (group by):<br>- W Python: <code>collections.defaultdict(int)</code> lub <code>collections.Counter</code> dla zliczeń.<br>- W SQL: <code>GROUP BY + agregat</code> (SUM, COUNT, AVG).<br>- W arkuszu: <code>SUMA.JEŻELI</code> lub tabela przestawna.<br>- Top-N: sortowanie malejąco i wzięcie pierwszych N.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.1, max 1 pkt):<br>- <strong>1 pkt</strong> - za podanie 3 NIPów Z prawidłowymi sumami kg<br>- <strong>0 pkt</strong> - odpowiedź niepełna lub błędna albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Format separatora</strong> - w pliku separator to <strong>tabulacja (\\t)</strong>, nie spacja czy przecinek. W Python <code>split(&#x27;\\t&#x27;)</code>.</li><li><strong>Kolejność sortowania</strong> - sortuj malejąco po sumie kg, nie po NIP.</li><li><strong>Konwersja liczby kg</strong> - kg to liczba całkowita, użyj <code>int(kg)</code> lub <code>parseInt</code>.</li><li><strong>Klucz CKE może mieć inny porządek</strong> - kolejność trzech klientów w odpowiedzi może się różnić, ale wszystkie 3 NIPy i wartości muszą być poprawne.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Pojedyncze przejście pliku + agregacja w słowniku: <strong>O(n)</strong>, gdzie n = liczba transakcji (2162).</li><li>Sortowanie unikalnych NIPów: O(k log k), gdzie k = liczba unikalnych klientów.</li></ul>"}]}