{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nPrzychód z pojedynczej sprzedaży to cena sprzedaży pomnożona przez liczbę kilogramów sprzedanego cukru. Oblicz łączny przychód firmy Słodzik w latach 2005-2014.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Łączny przychód: 643 267,07 zł**\n\nZestawienie roczne:\n\n| Rok | Przychód |\n| 2005 | 54 032,00 |\n| 2006 | 55 813,30 |\n| 2007 | 66 294,80 |\n| 2008 | 78 524,45 |\n| 2009 | 65 527,32 |\n| 2010 | 68 294,10 |\n| 2011 | 52 311,60 |\n| 2012 | 60 696,00 |\n| 2013 | 63 090,18 |\n| 2014 | 78 683,32 |\n| **RAZEM** | **643 267,07** |\n\n## Sposób 1 - Python\n\n```python\n# Wczytaj cennik (rok → cena/kg)\ncennik = {}\nwith open('cennik.txt', encoding='utf-8') as f:\nfor linia in f:\nrok, cena = linia.strip().split('\\t')\ncennik[int(rok)] = float(cena.replace(',', '.'))\n\n# Wczytaj transakcje i mnóż przez cenę za rok\nlaczny = 0.0\nper_rok = {r: 0.0 for r in range(2005, 2015)}\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg = linia.strip().split('\\t')\nrok = int(data[:4])\nprzychod = int(kg) * cennik[rok]\nlaczny += przychod\nper_rok[rok] += przychod\n\nfor r in sorted(per_rok):\nprint(r, round(per_rok[r], 2))\nprint('RAZEM:', round(laczny, 2))\n# RAZEM: 643267.07\n\n## Sposób 2 - arkusz kalkulacyjny\n\n1. **cennik.txt** zaimportuj do osobnej tabeli: A=Rok, B=Cena (zamień przecinek na kropkę dziesiętną).\n2. **cukier.txt** zaimportuj: A=Data, B=NIP, C=Kg.\n3. Dodaj kolumnę D: `=WARTOŚĆ(LEWY(A2; 4))` - wyciągnięcie roku z daty.\n4. Dodaj kolumnę E: `=WYSZUKAJ.PIONOWO(D2; cennik!$A$2:$B$11; 2; FAŁSZ) * C2` - przychód jednej transakcji.\n5. Suma kolumny E daje **643267,07 zł**.\n\nAlternatywnie tabela przestawna z polem obliczanym `kg * cena_z_cennika_per_rok`.\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram Slodzik42;\nuses sysutils;\nvar\nf, fc: TextFile;\nrok, kg: LongInt;\ncena, przychod, laczny: Real;\ndata, nip, line: string;\ncennikRok: array[2005 2014] of Real;\ni: Integer;\nbegin\nAssignFile(fc, 'cennik.txt');\nReset(fc);\nwhile not Eof(fc) do\nbegin\nReadLn(fc, line); // np. \"2005\\t2,00\"\nrok := StrToInt(Copy(line, 1, 4));\ncena := StrToFloat(Copy(line, 6, Length(line))); // z przecinkiem\ncennikRok[rok] := cena;\nend;\nCloseFile(fc);\n\nlaczny := 0;\nAssignFile(f, 'cukier.txt');\nReset(f);\nwhile not Eof(f) do\nbegin\nReadLn(f, line); // \"data\\tNIP\\tkg\"\n// parsowanie split tabulacją (omijam dla zwięzłości)\nrok := StrToInt(Copy(line, 1, 4));\n// wyciągnij kg z końca\nprzychod := kg * cennikRok[rok];\nlaczny := laczny + przychod;\nend;\nCloseFile(f);\nWriteLn('Łączny przychód: ', laczny:0:2); // 643267.07\nend.\n\n## Sposób 4 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <map>\n#include <string>\n#include <sstream>\nusing namespace std;\n\nint main() {\nmap<int, double> cennik;\nifstream fc(\"cennik.txt\");\nint rok;\nstring cenaS;\nwhile (fc >> rok >> cenaS) {\nfor (auto& c : cenaS) if (c == ',') c = '.';\ncennik[rok] = stod(cenaS);\n}\n\ndouble laczny = 0;\nifstream f(\"cukier.txt\");\nstring data, nip;\nint kg;\nwhile (f >> data >> nip >> kg) {\nint r = stoi(data.substr(0, 4));\nlaczny += kg * cennik[r];\n}\ncout.precision(2);\ncout << fixed << laczny << endl; // 643267.07\nreturn 0;\n}\n\n## Reference algorytmiczny - join danych\n\n> Reference - łączenie danych z dwóch źródeł (lookup):\n> - W Python: słownik `cennik[rok] = cena` - O(1) wyszukiwanie.\n> - W SQL: JOIN po roku.\n> - W arkuszu: WYSZUKAJ.PIONOWO (VLOOKUP).\n> - Konwersja \"2,00\" → 2.0: zamień przecinek na kropkę, potem `float()`.\n> - Wydobycie roku z daty: `data[:4]` w Python, `LEWY(A; 4)` w arkuszu, `Copy(s, 1, 4)` w Pascal.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.2, max 2 pkt):\n> - **2 pkt** - łączny przychód **643 267,07 zł**\n> - **1 pkt** - poprawne zestawienie przychodów w poszczególnych latach (wartości roczne) ale błędna suma\n> - **0 pkt** - inna błędna odpowiedź albo brak\n\n## Typowe pułapki\n\n- **Separator dziesiętny** - w cenniku format polski („2,00\"), trzeba zamienić na kropkę przed konwersją do float.\n- **Format daty** - wystarczy pierwsze 4 znaki dla wydobycia roku, nie potrzeba parsować całej daty.\n- **Sumowanie zmiennoprzecinkowe** - przy dodawaniu ~2000 liczb mogą wystąpić drobne błędy zaokrąglenia; finalnie zaokrąglić do 2 miejsc po przecinku.\n- **Pomyłka cennika** - cena obowiązuje przez cały rok, więc grupowanie po roku z daty transakcji.\n\n## Złożoność obliczeniowa\n\n- Wczytanie cennika: O(10) - stała.\n- Pojedyncze przejście transakcji + lookup w słowniku: **O(n)**, gdzie n = liczba transakcji (2162).\n- Łączna złożoność: **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 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 4.1.</p>\n<p>Przychód z pojedynczej sprzedaży to cena sprzedaży pomnożona przez liczbę kilogramów sprzedanego cukru. Oblicz łączny przychód firmy Słodzik w latach 2005-2014.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Łączny przychód: 643 267,07 zł</strong></p>\n<p>Zestawienie roczne:</p>\n<p>| Rok | Przychód |<br>| 2005 | 54 032,00 |<br>| 2006 | 55 813,30 |<br>| 2007 | 66 294,80 |<br>| 2008 | 78 524,45 |<br>| 2009 | 65 527,32 |<br>| 2010 | 68 294,10 |<br>| 2011 | 52 311,60 |<br>| 2012 | 60 696,00 |<br>| 2013 | 63 090,18 |<br>| 2014 | 78 683,32 |<br>| <strong>RAZEM</strong> | <strong>643 267,07</strong> |</p>\n<h4>Sposób 1 - Python</h4>\n<p>```python</p>\n<h3>Wczytaj cennik (rok → cena/kg)</h3>\n<p>cennik = {}<br>with open(&#x27;cennik.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>for linia in f:<br>rok, cena = linia.strip().split(&#x27;\\t&#x27;)<br>cennik[int(rok)] = float(cena.replace(&#x27;,&#x27;, &#x27;.&#x27;))</p>\n<h3>Wczytaj transakcje i mnóż przez cenę za rok</h3>\n<p>laczny = 0.0<br>per_rok = {r: 0.0 for r in range(2005, 2015)}<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>rok = int(data[:4])<br>przychod = int(kg) * cennik[rok]<br>laczny += przychod<br>per_rok[rok] += przychod</p>\n<p>for r in sorted(per_rok):<br>print(r, round(per_rok[r], 2))<br>print(&#x27;RAZEM:&#x27;, round(laczny, 2))</p>\n<h3>RAZEM: 643267.07</h3>\n<h4>Sposób 2 - arkusz kalkulacyjny</h4>\n<ol><li><strong>cennik.txt</strong> zaimportuj do osobnej tabeli: A=Rok, B=Cena (zamień przecinek na kropkę dziesiętną).</li><li><strong>cukier.txt</strong> zaimportuj: A=Data, B=NIP, C=Kg.</li><li>Dodaj kolumnę D: <code>=WARTOŚĆ(LEWY(A2; 4))</code> - wyciągnięcie roku z daty.</li><li>Dodaj kolumnę E: <code>=WYSZUKAJ.PIONOWO(D2; cennik!<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"inline\"><mrow><mi>A</mi></mrow></math>2:<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"inline\"><mrow><mi>B</mi></mrow></math>11; 2; FAŁSZ) * C2</code> - przychód jednej transakcji.</li><li>Suma kolumny E daje <strong>643267,07 zł</strong>.</li></ol>\n<p>Alternatywnie tabela przestawna z polem obliczanym <code>kg * cena_z_cennika_per_rok</code>.</p>\n<h4>Sposób 3 - Pascal</h4>\n<p>```pascal<br>program Slodzik42;<br>uses sysutils;<br>var<br>f, fc: TextFile;<br>rok, kg: LongInt;<br>cena, przychod, laczny: Real;<br>data, nip, line: string;<br>cennikRok: array[2005 2014] of Real;<br>i: Integer;<br>begin<br>AssignFile(fc, &#x27;cennik.txt&#x27;);<br>Reset(fc);<br>while not Eof(fc) do<br>begin<br>ReadLn(fc, line); // np. &quot;2005\\t2,00&quot;<br>rok := StrToInt(Copy(line, 1, 4));<br>cena := StrToFloat(Copy(line, 6, Length(line))); // z przecinkiem<br>cennikRok[rok] := cena;<br>end;<br>CloseFile(fc);</p>\n<p>laczny := 0;<br>AssignFile(f, &#x27;cukier.txt&#x27;);<br>Reset(f);<br>while not Eof(f) do<br>begin<br>ReadLn(f, line); // &quot;data\\tNIP\\tkg&quot;<br>// parsowanie split tabulacją (omijam dla zwięzłości)<br>rok := StrToInt(Copy(line, 1, 4));<br>// wyciągnij kg z końca<br>przychod := kg * cennikRok[rok];<br>laczny := laczny + przychod;<br>end;<br>CloseFile(f);<br>WriteLn(&#x27;Łączny przychód: &#x27;, laczny:0:2); // 643267.07<br>end.</p>\n<h4>Sposób 4 - C++</h4>\n<p>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;map&gt;<br>#include &lt;string&gt;<br>#include &lt;sstream&gt;<br>using namespace std;</p>\n<p>int main() {<br>map&lt;int, double&gt; cennik;<br>ifstream fc(&quot;cennik.txt&quot;);<br>int rok;<br>string cenaS;<br>while (fc &gt;&gt; rok &gt;&gt; cenaS) {<br>for (auto&amp; c : cenaS) if (c == &#x27;,&#x27;) c = &#x27;.&#x27;;<br>cennik[rok] = stod(cenaS);<br>}</p>\n<p>double laczny = 0;<br>ifstream f(&quot;cukier.txt&quot;);<br>string data, nip;<br>int kg;<br>while (f &gt;&gt; data &gt;&gt; nip &gt;&gt; kg) {<br>int r = stoi(data.substr(0, 4));<br>laczny += kg * cennik[r];<br>}<br>cout.precision(2);<br>cout &lt;&lt; fixed &lt;&lt; laczny &lt;&lt; endl; // 643267.07<br>return 0;<br>}</p>\n<h4>Reference algorytmiczny - join danych</h4>\n<blockquote>Reference - łączenie danych z dwóch źródeł (lookup):<br>- W Python: słownik <code>cennik[rok] = cena</code> - O(1) wyszukiwanie.<br>- W SQL: JOIN po roku.<br>- W arkuszu: WYSZUKAJ.PIONOWO (VLOOKUP).<br>- Konwersja &quot;2,00&quot; → 2.0: zamień przecinek na kropkę, potem <code>float()</code>.<br>- Wydobycie roku z daty: <code>data[:4]</code> w Python, <code>LEWY(A; 4)</code> w arkuszu, <code>Copy(s, 1, 4)</code> w Pascal.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.2, max 2 pkt):<br>- <strong>2 pkt</strong> - łączny przychód <strong>643 267,07 zł</strong><br>- <strong>1 pkt</strong> - poprawne zestawienie przychodów w poszczególnych latach (wartości roczne) ale błędna suma<br>- <strong>0 pkt</strong> - inna błędna odpowiedź albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Separator dziesiętny</strong> - w cenniku format polski („2,00&quot;), trzeba zamienić na kropkę przed konwersją do float.</li><li><strong>Format daty</strong> - wystarczy pierwsze 4 znaki dla wydobycia roku, nie potrzeba parsować całej daty.</li><li><strong>Sumowanie zmiennoprzecinkowe</strong> - przy dodawaniu ~2000 liczb mogą wystąpić drobne błędy zaokrąglenia; finalnie zaokrąglić do 2 miejsc po przecinku.</li><li><strong>Pomyłka cennika</strong> - cena obowiązuje przez cały rok, więc grupowanie po roku z daty transakcji.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie cennika: O(10) - stała.</li><li>Pojedyncze przejście transakcji + lookup w słowniku: <strong>O(n)</strong>, gdzie n = liczba transakcji (2162).</li><li>Łączna złożoność: <strong>O(n)</strong>.</li></ul>"}]}