{"id":"informatyka-2015-maj-matura-rozszerzona/zad/6.1","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"6.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Zadanie 6. Formuła 1\n\nW plikach Kierowcy.txt, Wyscigi.txt, Wyniki.txt zgromadzono dane dotyczące wyścigów Formuły 1 z lat 2000-2012.\n\n**Kierowcy.txt** - Id_kierowcy, Nazwisko, Imie, Kraj.\nPrzykład: z10;Irvine;Eddie;Irlandia\n\n**Wyscigi.txt** - Id_wyscigu, Rok, GrandPrix.\nPrzykład: w20;2001;Brazylia\n\n**Wyniki.txt** - Id_kierowcy, Punkty, Id_wyscigu.\nPrzykład: z42;6;w7\n\nPodaj sezon i nazwę wyścigu Grand Prix, w którym Robert Kubica zdobył najwięcej punktów.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n| GrandPrix | Sezon |\n| **Australia** | **2010** |\n\n## Sposób 1 - SQL (3-tabelowe JOIN + ORDER BY DESC LIMIT 1)\n\n```sql\nSELECT w.GrandPrix, w.Rok AS Sezon, wn.Punkty\nFROM Wyniki wn\nINNER JOIN Kierowcy k ON wn.Id_kierowcy = k.Id_kierowcy\nINNER JOIN Wyscigi w ON wn.Id_wyscigu = w.Id_wyscigu\nWHERE k.Imie = 'Robert' AND k.Nazwisko = 'Kubica'\nORDER BY wn.Punkty DESC\nLIMIT 1;\n\n**Wynik:**\nGrandPrix: Australia\nSezon: 2010\nPunkty: 18 (lub inna max wartość)\n\n## Sposób 2 - Python (pandas)\n\n```python\nimport pandas as pd\n\nkierowcy = pd.read_csv('Kierowcy.txt', sep=';', header=None,\nnames=['Id_k', 'Nazwisko', 'Imie', 'Kraj'])\nwyscigi = pd.read_csv('Wyscigi.txt', sep=';', header=None,\nnames=['Id_w', 'Rok', 'GrandPrix'])\nwyniki = pd.read_csv('Wyniki.txt', sep=';', header=None,\nnames=['Id_k', 'Punkty', 'Id_w'])\n\n# Znajdź Roberta Kubicę\nkubica = kierowcy[(kierowcy['Imie'] == 'Robert') & (kierowcy['Nazwisko'] == 'Kubica')]\nid_kubica = kubica['Id_k'].iloc[0]\n\n# Wyniki Kubicy\nwyniki_kubica = wyniki[wyniki['Id_k'] == id_kubica]\n\n# JOIN z wyścigami\nwyniki_z_wyscigiem = wyniki_kubica.merge(wyscigi, on='Id_w')\n\n# Maksymalne punkty\nnajlepszy = wyniki_z_wyscigiem.loc[wyniki_z_wyscigiem['Punkty'].idxmax()]\nprint(f\"GrandPrix: {najlepszy['GrandPrix']}, Sezon: {najlepszy['Rok']}, Punkty: {najlepszy['Punkty']}\")\n# GrandPrix: Australia, Sezon: 2010\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Krok 1:** Wczytaj 3 pliki jako tabele (Kierowcy, Wyscigi, Wyniki).\n\n**Krok 2:** Znajdź Id_kierowcy Kubicy - `=WYSZUKAJ.PIONOWO(\"Kubica\"; Kierowcy!B:A; 0; FAŁSZ)` lub przez filtr.\n\n**Krok 3:** Filtruj Wyniki po Id_k Kubicy → zostają tylko jego wyniki.\n\n**Krok 4:** Znajdź wiersz z MAX Punkty: posortuj malejąco wg Punktów, pierwszy wiersz.\n\n**Krok 5:** JOIN z Wyscigi po Id_w → odczytaj GrandPrix i Rok.\n\n## Reference informatyczny - SQL JOIN\n\n> Reference - JOIN multiple tables:\n> - **INNER JOIN** - łączy tylko pasujące rekordy (klucz obcy = klucz główny).\n> - Trzy tabele: `FROM A JOIN B ON A.x = B.x JOIN C ON B.y = C.y`.\n> - **ORDER BY DESC LIMIT 1** = znajdź MAX.\n> - **Wzór ERD**: Wyniki to tabela skojarzeniowa (junction table) między Kierowcami a Wyścigami z dodatkową kolumną Punkty.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.1, max 2 pkt):\n> - **2 pkt** - poprawnie GrandPrix ORAZ Sezon\n> - **0 pkt** - niepełna lub błędna albo brak\n> - Nie przyznaje się 1 pkt.\n\n## Typowe pułapki\n\n- **Pomylenie kierunku JOIN** - Wyniki.Id_kierowcy = Kierowcy.Id_kierowcy (te same nazwy w obu tabelach).\n- **Wyszukiwanie po imieniu i nazwisku** - wymaga AND (oba warunki).\n- **MAX vs ORDER BY DESC LIMIT 1** - obie metody działają; w SQL `MAX(Punkty)` zwraca tylko wartość, nie wiersz.\n- **Wynik więcej niż 1 wiersz** - jeśli Kubica miałby remis w punktach w 2 wyścigach, zwracamy jeden (albo oba - klucz przyjmuje jedną odpowiedź).\n- **Daty 2000-2012** - Kubica rzeczywiście jeździł w F1 w 2006-2010.\n\n## Złożoność obliczeniowa\n\n- SQL z indeksami: O(log N) na każde JOIN.\n- Bez indeksów: O(N · M · K) (najgorszy przypadek).\n- Praktycznie: O(N) (małe pliki).","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>Zadanie 6. Formuła 1</p>\n<p>W plikach Kierowcy.txt, Wyscigi.txt, Wyniki.txt zgromadzono dane dotyczące wyścigów Formuły 1 z lat 2000-2012.</p>\n<p><strong>Kierowcy.txt</strong> - Id_kierowcy, Nazwisko, Imie, Kraj.<br>Przykład: z10;Irvine;Eddie;Irlandia</p>\n<p><strong>Wyscigi.txt</strong> - Id_wyscigu, Rok, GrandPrix.<br>Przykład: w20;2001;Brazylia</p>\n<p><strong>Wyniki.txt</strong> - Id_kierowcy, Punkty, Id_wyscigu.<br>Przykład: z42;6;w7</p>\n<p>Podaj sezon i nazwę wyścigu Grand Prix, w którym Robert Kubica zdobył najwięcej punktów.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>| GrandPrix | Sezon |<br>| <strong>Australia</strong> | <strong>2010</strong> |</p>\n<h4>Sposób 1 - SQL (3-tabelowe JOIN + ORDER BY DESC LIMIT 1)</h4>\n<p>```sql<br>SELECT w.GrandPrix, w.Rok AS Sezon, wn.Punkty<br>FROM Wyniki wn<br>INNER JOIN Kierowcy k ON wn.Id_kierowcy = k.Id_kierowcy<br>INNER JOIN Wyscigi w ON wn.Id_wyscigu = w.Id_wyscigu<br>WHERE k.Imie = &#x27;Robert&#x27; AND k.Nazwisko = &#x27;Kubica&#x27;<br>ORDER BY wn.Punkty DESC<br>LIMIT 1;</p>\n<p><strong>Wynik:</strong><br>GrandPrix: Australia<br>Sezon: 2010<br>Punkty: 18 (lub inna max wartość)</p>\n<h4>Sposób 2 - Python (pandas)</h4>\n<p>```python<br>import pandas as pd</p>\n<p>kierowcy = pd.read_csv(&#x27;Kierowcy.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;Id_k&#x27;, &#x27;Nazwisko&#x27;, &#x27;Imie&#x27;, &#x27;Kraj&#x27;])<br>wyscigi = pd.read_csv(&#x27;Wyscigi.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;Id_w&#x27;, &#x27;Rok&#x27;, &#x27;GrandPrix&#x27;])<br>wyniki = pd.read_csv(&#x27;Wyniki.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;Id_k&#x27;, &#x27;Punkty&#x27;, &#x27;Id_w&#x27;])</p>\n<h3>Znajdź Roberta Kubicę</h3>\n<p>kubica = kierowcy[(kierowcy[&#x27;Imie&#x27;] == &#x27;Robert&#x27;) &amp; (kierowcy[&#x27;Nazwisko&#x27;] == &#x27;Kubica&#x27;)]<br>id_kubica = kubica[&#x27;Id_k&#x27;].iloc[0]</p>\n<h3>Wyniki Kubicy</h3>\n<p>wyniki_kubica = wyniki[wyniki[&#x27;Id_k&#x27;] == id_kubica]</p>\n<h3>JOIN z wyścigami</h3>\n<p>wyniki_z_wyscigiem = wyniki_kubica.merge(wyscigi, on=&#x27;Id_w&#x27;)</p>\n<h3>Maksymalne punkty</h3>\n<p>najlepszy = wyniki_z_wyscigiem.loc[wyniki_z_wyscigiem[&#x27;Punkty&#x27;].idxmax()]<br>print(f&quot;GrandPrix: {najlepszy[&#x27;GrandPrix&#x27;]}, Sezon: {najlepszy[&#x27;Rok&#x27;]}, Punkty: {najlepszy[&#x27;Punkty&#x27;]}&quot;)</p>\n<h3>GrandPrix: Australia, Sezon: 2010</h3>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<p><strong>Krok 1:</strong> Wczytaj 3 pliki jako tabele (Kierowcy, Wyscigi, Wyniki).</p>\n<p><strong>Krok 2:</strong> Znajdź Id_kierowcy Kubicy - <code>=WYSZUKAJ.PIONOWO(&quot;Kubica&quot;; Kierowcy!B:A; 0; FAŁSZ)</code> lub przez filtr.</p>\n<p><strong>Krok 3:</strong> Filtruj Wyniki po Id_k Kubicy → zostają tylko jego wyniki.</p>\n<p><strong>Krok 4:</strong> Znajdź wiersz z MAX Punkty: posortuj malejąco wg Punktów, pierwszy wiersz.</p>\n<p><strong>Krok 5:</strong> JOIN z Wyscigi po Id_w → odczytaj GrandPrix i Rok.</p>\n<h4>Reference informatyczny - SQL JOIN</h4>\n<blockquote>Reference - JOIN multiple tables:<br>- <strong>INNER JOIN</strong> - łączy tylko pasujące rekordy (klucz obcy = klucz główny).<br>- Trzy tabele: <code>FROM A JOIN B ON A.x = B.x JOIN C ON B.y = C.y</code>.<br>- <strong>ORDER BY DESC LIMIT 1</strong> = znajdź MAX.<br>- <strong>Wzór ERD</strong>: Wyniki to tabela skojarzeniowa (junction table) między Kierowcami a Wyścigami z dodatkową kolumną Punkty.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.1, max 2 pkt):<br>- <strong>2 pkt</strong> - poprawnie GrandPrix ORAZ Sezon<br>- <strong>0 pkt</strong> - niepełna lub błędna albo brak<br>- Nie przyznaje się 1 pkt.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Pomylenie kierunku JOIN</strong> - Wyniki.Id_kierowcy = Kierowcy.Id_kierowcy (te same nazwy w obu tabelach).</li><li><strong>Wyszukiwanie po imieniu i nazwisku</strong> - wymaga AND (oba warunki).</li><li><strong>MAX vs ORDER BY DESC LIMIT 1</strong> - obie metody działają; w SQL <code>MAX(Punkty)</code> zwraca tylko wartość, nie wiersz.</li><li><strong>Wynik więcej niż 1 wiersz</strong> - jeśli Kubica miałby remis w punktach w 2 wyścigach, zwracamy jeden (albo oba - klucz przyjmuje jedną odpowiedź).</li><li><strong>Daty 2000-2012</strong> - Kubica rzeczywiście jeździł w F1 w 2006-2010.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>SQL z indeksami: O(log N) na każde JOIN.</li><li>Bez indeksów: O(N · M · K) (najgorszy przypadek).</li><li>Praktycznie: O(N) (małe pliki).</li></ul>"}]}