{"id":"informatyka-2019-maj-matura-rozszerzona/zad/6.1","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"6.1","points":1,"ptype":"open","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Zadanie 6. Perfumeria DlaWas\n\nW plikach: marki.txt, perfumy.txt, sklad.txt opisana jest oferta perfumerii „DlaWas”. W perfumerii dostępne są perfumy różnych marek. Perfumy składają się z kilku składników. Zestaw składników decyduje, do jakiej rodziny zapachów należą perfumy.\nPierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól. Dane w każdym wierszu oddzielone są znakiem tabulacji.\n\n**marki.txt** - pola: id_marki (identyfikator marki), nazwa_m (nazwa marki).\nPrzykład:\nid_marki | nazwa_m\nm_1 | Mou De Rosine\nm_2 | Mou&Bob\n\n**perfumy.txt** - pola: id_perfum, nazwa_p, id_marki, rodzina_zapachow (nazwa rodziny zapachów), cena (cena perfum).\nPrzykład:\nid_perfum | nazwa_p | id_marki | rodzina_zapachow | cena\np_1 | Ythde | m_1 | orientalna | 241\np_2 | Ythsas | m_1 | kwiatowa | 738\n\n**sklad.txt** - pola: id_perfum, nazwa_skladnika.\nPrzykład:\nid_perfum | nazwa_skladnika\np_1 | chryzantema\np_1 | kwiat irysa\n\nZa pomocą dostępnych narzędzi informatycznych podaj odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wyniki6.txt, a każdą z nich poprzedź numerem odpowiedniego zadania.\n\nPodaj listę wszystkich nazw perfum, których jednym ze składników jest „absolut jasminu”.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Lista nazw perfum z \"absolut jasminu\" jako składnikiem:**\nOyal Priather\nOlogne D'oud\nUelques FleuE\n\n(Dokładnie 3 perfumy. Nazwy zgodne z kluczem CKE - pochodzą z plików dostarczonych w arkuszu.)\n\n## Sposób 1 - SQL (najprostsze rozwiązanie)\n\n```sql\nSELECT DISTINCT p.nazwa_p\nFROM perfumy p\nINNER JOIN sklad s ON p.id_perfum = s.id_perfum\nWHERE s.nazwa_skladnika = 'absolut jasminu';\n\n## Sposób 2 - Python\n\n```python\n# Wczytaj składniki\nperfumy_z_jasminem = set()\nwith open('sklad.txt', encoding='utf-8') as f:\nf.readline() # nagłówek\nfor linia in f:\nid_perfum, nazwa_skl = linia.strip().split('\\t')\nif nazwa_skl == 'absolut jasminu':\nperfumy_z_jasminem.add(id_perfum)\n\n# Znajdź nazwy perfum\nwynik = []\nwith open('perfumy.txt', encoding='utf-8') as f:\nf.readline()\nfor linia in f:\npola = linia.strip().split('\\t')\nid_p, nazwa, id_m, rodzina, cena = pola\nif id_p in perfumy_z_jasminem:\nwynik.append(nazwa)\n\nfor n in wynik:\nprint(n)\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Krok 1:** w pliku sklad.txt filtruj `nazwa_skladnika = \"absolut jasminu\"` → otrzymasz listę id_perfum.\n\n**Krok 2:** WYSZUKAJ.PIONOWO każdego id_perfum w perfumy.txt aby uzyskać nazwa_p.\n\nLub jedna formuła (jeśli sklad.txt ma id_perfum w A, nazwa w B):\n=WYSZUKAJ.PIONOWO(A2; perfumy.txt!A:B; 2; 0)\nDla każdego wiersza gdzie B = \"absolut jasminu\".\n\nAlternatywnie tabela przestawna z filtrowaniem po nazwa_skladnika.\n\n## Reference informatyczny - JOIN z filtrem\n\n> Reference - INNER JOIN w SQL:\n> - Łączy wiersze z dwóch tabel po wspólnym kluczu.\n> - Tylko wiersze, które pasują w obu tabelach.\n> - `ON p.id_perfum = s.id_perfum` - warunek złączenia.\n>\n> Reference - DISTINCT:\n> - Usuwa duplikaty z wyniku.\n> - Tutaj nie ma duplikatów (każdy id_perfum występuje raz w perfumy.txt), ale dla pewności.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.1, max 1 pkt):\n> - **1 pkt** - pełna poprawna odpowiedź (3 nazwy)\n> - **0 pkt** - błędna lub brak\n\n## Typowe pułapki\n\n- **Wyszukiwanie po `LIKE '%jasmin%'` zamiast `= 'absolut jasminu'`** - może dać dodatkowe składniki typu \"olejek jasminowy\".\n- **Polskie znaki** - \"jasminu\" vs \"jaśminu\" - sprawdź dokładną pisownię w danych.\n- **JOIN po złym kluczu** - id_perfum vs id_marki.\n- **Pominięcie tabeli sklad.txt** - bez niej nie ma jak znaleźć perfum po składniku.\n\n## Złożoność obliczeniowa\n\n- SQL z indeksem na nazwa_skladnika: **O(log n)** dla wyszukiwania + O(k) dla join, k = wynikowe wiersze.\n- Bez indeksów: O(n × m).\n- Pamięć: O(k) dla zbioru id_perfum.","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 2019 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 6. Perfumeria DlaWas</p>\n<p>W plikach: marki.txt, perfumy.txt, sklad.txt opisana jest oferta perfumerii „DlaWas”. W perfumerii dostępne są perfumy różnych marek. Perfumy składają się z kilku składników. Zestaw składników decyduje, do jakiej rodziny zapachów należą perfumy.<br>Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól. Dane w każdym wierszu oddzielone są znakiem tabulacji.</p>\n<p><strong>marki.txt</strong> - pola: id_marki (identyfikator marki), nazwa_m (nazwa marki).<br>Przykład:<br>id_marki | nazwa_m<br>m_1 | Mou De Rosine<br>m_2 | Mou&amp;Bob</p>\n<p><strong>perfumy.txt</strong> - pola: id_perfum, nazwa_p, id_marki, rodzina_zapachow (nazwa rodziny zapachów), cena (cena perfum).<br>Przykład:<br>id_perfum | nazwa_p | id_marki | rodzina_zapachow | cena<br>p_1 | Ythde | m_1 | orientalna | 241<br>p_2 | Ythsas | m_1 | kwiatowa | 738</p>\n<p><strong>sklad.txt</strong> - pola: id_perfum, nazwa_skladnika.<br>Przykład:<br>id_perfum | nazwa_skladnika<br>p_1 | chryzantema<br>p_1 | kwiat irysa</p>\n<p>Za pomocą dostępnych narzędzi informatycznych podaj odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wyniki6.txt, a każdą z nich poprzedź numerem odpowiedniego zadania.</p>\n<p>Podaj listę wszystkich nazw perfum, których jednym ze składników jest „absolut jasminu”.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Lista nazw perfum z &quot;absolut jasminu&quot; jako składnikiem:</strong><br>Oyal Priather<br>Ologne D&#x27;oud<br>Uelques FleuE</p>\n<p>(Dokładnie 3 perfumy. Nazwy zgodne z kluczem CKE - pochodzą z plików dostarczonych w arkuszu.)</p>\n<h4>Sposób 1 - SQL (najprostsze rozwiązanie)</h4>\n<p>```sql<br>SELECT DISTINCT p.nazwa_p<br>FROM perfumy p<br>INNER JOIN sklad s ON p.id_perfum = s.id_perfum<br>WHERE s.nazwa_skladnika = &#x27;absolut jasminu&#x27;;</p>\n<h4>Sposób 2 - Python</h4>\n<p>```python</p>\n<h3>Wczytaj składniki</h3>\n<p>perfumy_z_jasminem = set()<br>with open(&#x27;sklad.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.readline() # nagłówek<br>for linia in f:<br>id_perfum, nazwa_skl = linia.strip().split(&#x27;\\t&#x27;)<br>if nazwa_skl == &#x27;absolut jasminu&#x27;:<br>perfumy_z_jasminem.add(id_perfum)</p>\n<h3>Znajdź nazwy perfum</h3>\n<p>wynik = []<br>with open(&#x27;perfumy.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.readline()<br>for linia in f:<br>pola = linia.strip().split(&#x27;\\t&#x27;)<br>id_p, nazwa, id_m, rodzina, cena = pola<br>if id_p in perfumy_z_jasminem:<br>wynik.append(nazwa)</p>\n<p>for n in wynik:<br>print(n)</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<p><strong>Krok 1:</strong> w pliku sklad.txt filtruj <code>nazwa_skladnika = &quot;absolut jasminu&quot;</code> → otrzymasz listę id_perfum.</p>\n<p><strong>Krok 2:</strong> WYSZUKAJ.PIONOWO każdego id_perfum w perfumy.txt aby uzyskać nazwa_p.</p>\n<p>Lub jedna formuła (jeśli sklad.txt ma id_perfum w A, nazwa w B):<br>=WYSZUKAJ.PIONOWO(A2; perfumy.txt!A:B; 2; 0)<br>Dla każdego wiersza gdzie B = &quot;absolut jasminu&quot;.</p>\n<p>Alternatywnie tabela przestawna z filtrowaniem po nazwa_skladnika.</p>\n<h4>Reference informatyczny - JOIN z filtrem</h4>\n<blockquote>Reference - INNER JOIN w SQL:<br>- Łączy wiersze z dwóch tabel po wspólnym kluczu.<br>- Tylko wiersze, które pasują w obu tabelach.<br>- <code>ON p.id_perfum = s.id_perfum</code> - warunek złączenia.<br><br>Reference - DISTINCT:<br>- Usuwa duplikaty z wyniku.<br>- Tutaj nie ma duplikatów (każdy id_perfum występuje raz w perfumy.txt), ale dla pewności.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.1, max 1 pkt):<br>- <strong>1 pkt</strong> - pełna poprawna odpowiedź (3 nazwy)<br>- <strong>0 pkt</strong> - błędna lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Wyszukiwanie po <code>LIKE &#x27;%jasmin%&#x27;</code> zamiast <code>= &#x27;absolut jasminu&#x27;</code></strong> - może dać dodatkowe składniki typu &quot;olejek jasminowy&quot;.</li><li><strong>Polskie znaki</strong> - &quot;jasminu&quot; vs &quot;jaśminu&quot; - sprawdź dokładną pisownię w danych.</li><li><strong>JOIN po złym kluczu</strong> - id_perfum vs id_marki.</li><li><strong>Pominięcie tabeli sklad.txt</strong> - bez niej nie ma jak znaleźć perfum po składniku.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>SQL z indeksem na nazwa_skladnika: <strong>O(log n)</strong> dla wyszukiwania + O(k) dla join, k = wynikowe wiersze.</li><li>Bez indeksów: O(n × m).</li><li>Pamięć: O(k) dla zbioru id_perfum.</li></ul>"}]}