{"id":"informatyka-2019-maj-matura-rozszerzona/zad/6.4","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"6.4","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nCeny wszystkich perfum marki Mou De Rosine z rodziny o nazwie „orientalno-drzewna” zostały obniżone o 15%. Podaj listę zawierającą wszystkie nazwy takich perfum i ich ceny po obniżce. Listę posortuj niemalejąco według ceny.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Perfumy marki Mou De Rosine z rodziny \"orientalno-drzewna\" po obniżce o 15%, posortowane niemalejąco:**\n\n| Nazwa | Nowa cena |\n| Ourn Boise | 141,95 |\n| Onou Back | 222,70 |\n| Pic An | 230,35 |\n| Nterl Bambola | 292,40 |\n| Ubilatio Champs | 381,65 |\n| Ibrary Ollec D'or | 489,60 |\n| Ate An | 544,85 |\n| Elov & Musc | 660,45 |\n\n8 perfum spełniających dwa warunki (marka = Mou De Rosine + rodzina = orientalno-drzewna). Cena po obniżce = cena_oryginalna × 0,85.\n\n## Sposób 1 - SQL (JOIN + filtr + obniżka)\n\n```sql\nSELECT p.nazwa_p, ROUND(p.cena * 0.85, 2) AS nowa_cena\nFROM perfumy p\nINNER JOIN marki m ON p.id_marki = m.id_marki\nWHERE m.nazwa_m = 'Mou De Rosine'\nAND p.rodzina_zapachow = 'orientalno-drzewna'\nORDER BY nowa_cena ASC;\n\n**Wynik:**\nOurn Boise 141.95\nOnou Back 222.70\nPic An 230.35\nNterl Bambola 292.40\nUbilatio Champs 381.65\nIbrary Ollec D'or 489.60\nAte An 544.85\nElov & Musc 660.45\n\n## Sposób 2 - Python\n\n```python\n# Wczytaj marki: nazwa -> id\nmarki = {}\nwith open('marki.txt', encoding='utf-8') as f:\nf.readline() # naglowek\nfor linia in f:\nidm, nazwa = linia.strip().split('\\t')\nmarki[nazwa] = idm\n\nid_mou = marki['Mou De Rosine']\n\n# Wczytaj perfumy, filtruj, oblicz nowa cena\nwynik = []\nwith open('perfumy.txt', encoding='utf-8') as f:\nf.readline()\nfor linia in f:\nidp, nazwa, idm, rodzina, cena = linia.strip().split('\\t')\nif idm == id_mou and rodzina == 'orientalno-drzewna':\nnowa = round(int(cena) * 0.85, 2)\nwynik.append((nazwa, nowa))\n\n# Sortuj niemalejaco po cenie\nwynik.sort(key=lambda x: x[1])\nfor nazwa, cena in wynik:\nprint(f'{nazwa:25} {cena}')\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Krok 1:** Zaimportuj 3 pliki. W kolumnie pomocniczej w perfumy.txt dodaj nazwę marki przez WYSZUKAJ.PIONOWO po id_marki.\n\n**Krok 2:** Filtruj:\n- nazwa_m = \"Mou De Rosine\"\n- rodzina_zapachow = \"orientalno-drzewna\"\n\n**Krok 3:** Dodaj kolumnę nowa_cena: `=cena * 0,85` (lub formuła `=ROUND(cena*0,85; 2)`).\n\n**Krok 4:** Sortuj rosnąco po nowa_cena.\n\n## Reference algorytmiczny - JOIN + filtr + obniżka\n\n> Reference - Procentowa obniżka ceny:\n> - Obniżka o p% → mnoż przez (100 - p)/100, tzn. obniżka 15% → mnoż przez 0,85.\n> - **NIE** dodawaj obniżki do ceny (zwiększyłbyś cenę).\n> - **NIE** odejmuj 15 od ceny (15 zł zamiast 15% - błąd zaokrąglenia jednostki).\n> - Zaokrąglenie do 2 miejsc dziesiętnych obowiązkowe (kasowy standard).\n>\n> Reference - Dwa filtry:\n> - `WHERE a AND b` (oba warunki muszą być prawdziwe).\n> - W Pythonie/Pascal: `if a and b: `.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.4, max 3 pkt):\n> - **3 pkt** - pełna prawidłowa odpowiedź (8 perfum, ceny po obniżce, sortowane niemalejąco).\n> - **2 pkt** - prawidłowo posortowana lista z poprawnymi cenami, ale bez jednego z kryteriów filtrowania (np. tylko marka LUB tylko rodzina).\n> - **2 pkt** - poprawna lista bez sortowania.\n> - **1 pkt** - lista z poprawnie obliczonymi cenami (ale błąd w filtrowaniu lub sortowaniu).\n> - **0 pkt** - błędna lub brak.\n\n## Typowe pułapki\n\n- **Mnożenie przez 0,15 zamiast 0,85** - daje wartość obniżki, NIE cenę po obniżce. Częsta pomyłka.\n- **Odejmowanie 15** zamiast mnożenia × 0,85 - błąd jednostki (procent vs liczba).\n- **Brak JOIN z marki** - zadanie wymaga nazwy marki, w perfumy.txt jest tylko id_marki. Filtrowanie po `nazwa_m = 'Mou De Rosine'` wymaga JOIN.\n- **Sortowanie ASC vs DESC** - \"niemalejąco\" = ASC (rosnąco). Niemalejąco oznacza, że kolejne wartości są ≥ poprzedniej.\n- **Zaokrąglenie do 2 miejsc** - klucz CKE pokazuje 141,95 (nie 141 czy 141,9523). ROUND(x, 2) obowiązkowy.\n- **Polskie znaki w nazwach** - \"Mou De Rosine\" musi być DOKŁADNIE jak w pliku (case-sensitive zwykle).\n- **Tylko jeden filtr** - częsty błąd 2 pkt zamiast 3 (filtruj BARDZO Mou De Rosine LUB tylko orientalno-drzewna).\n\n## Złożoność obliczeniowa\n\n- SQL z indeksami: O(N log N) sortowanie + O(N) filtrowanie.\n- Python: O(N + M) dwa przejścia + O(K log K) sortowanie, K = wynikowe wiersze.\n- **Całkowita: O(N log N)** dla typowej implementacji.","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>Kontekst - patrz zadanie 6.1.</p>\n<p>Ceny wszystkich perfum marki Mou De Rosine z rodziny o nazwie „orientalno-drzewna” zostały obniżone o 15%. Podaj listę zawierającą wszystkie nazwy takich perfum i ich ceny po obniżce. Listę posortuj niemalejąco według ceny.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Perfumy marki Mou De Rosine z rodziny &quot;orientalno-drzewna&quot; po obniżce o 15%, posortowane niemalejąco:</strong></p>\n<p>| Nazwa | Nowa cena |<br>| Ourn Boise | 141,95 |<br>| Onou Back | 222,70 |<br>| Pic An | 230,35 |<br>| Nterl Bambola | 292,40 |<br>| Ubilatio Champs | 381,65 |<br>| Ibrary Ollec D&#x27;or | 489,60 |<br>| Ate An | 544,85 |<br>| Elov &amp; Musc | 660,45 |</p>\n<p>8 perfum spełniających dwa warunki (marka = Mou De Rosine + rodzina = orientalno-drzewna). Cena po obniżce = cena_oryginalna × 0,85.</p>\n<h4>Sposób 1 - SQL (JOIN + filtr + obniżka)</h4>\n<p>```sql<br>SELECT p.nazwa_p, ROUND(p.cena * 0.85, 2) AS nowa_cena<br>FROM perfumy p<br>INNER JOIN marki m ON p.id_marki = m.id_marki<br>WHERE m.nazwa_m = &#x27;Mou De Rosine&#x27;<br>AND p.rodzina_zapachow = &#x27;orientalno-drzewna&#x27;<br>ORDER BY nowa_cena ASC;</p>\n<p><strong>Wynik:</strong><br>Ourn Boise 141.95<br>Onou Back 222.70<br>Pic An 230.35<br>Nterl Bambola 292.40<br>Ubilatio Champs 381.65<br>Ibrary Ollec D&#x27;or 489.60<br>Ate An 544.85<br>Elov &amp; Musc 660.45</p>\n<h4>Sposób 2 - Python</h4>\n<p>```python</p>\n<h3>Wczytaj marki: nazwa -&gt; id</h3>\n<p>marki = {}<br>with open(&#x27;marki.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.readline() # naglowek<br>for linia in f:<br>idm, nazwa = linia.strip().split(&#x27;\\t&#x27;)<br>marki[nazwa] = idm</p>\n<p>id_mou = marki[&#x27;Mou De Rosine&#x27;]</p>\n<h3>Wczytaj perfumy, filtruj, oblicz nowa cena</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>idp, nazwa, idm, rodzina, cena = linia.strip().split(&#x27;\\t&#x27;)<br>if idm == id_mou and rodzina == &#x27;orientalno-drzewna&#x27;:<br>nowa = round(int(cena) * 0.85, 2)<br>wynik.append((nazwa, nowa))</p>\n<h3>Sortuj niemalejaco po cenie</h3>\n<p>wynik.sort(key=lambda x: x[1])<br>for nazwa, cena in wynik:<br>print(f&#x27;{nazwa:25} {cena}&#x27;)</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<p><strong>Krok 1:</strong> Zaimportuj 3 pliki. W kolumnie pomocniczej w perfumy.txt dodaj nazwę marki przez WYSZUKAJ.PIONOWO po id_marki.</p>\n<p><strong>Krok 2:</strong> Filtruj:</p>\n<ul><li>nazwa_m = &quot;Mou De Rosine&quot;</li><li>rodzina_zapachow = &quot;orientalno-drzewna&quot;</li></ul>\n<p><strong>Krok 3:</strong> Dodaj kolumnę nowa_cena: <code>=cena * 0,85</code> (lub formuła <code>=ROUND(cena*0,85; 2)</code>).</p>\n<p><strong>Krok 4:</strong> Sortuj rosnąco po nowa_cena.</p>\n<h4>Reference algorytmiczny - JOIN + filtr + obniżka</h4>\n<blockquote>Reference - Procentowa obniżka ceny:<br>- Obniżka o p% → mnoż przez (100 - p)/100, tzn. obniżka 15% → mnoż przez 0,85.<br>- <strong>NIE</strong> dodawaj obniżki do ceny (zwiększyłbyś cenę).<br>- <strong>NIE</strong> odejmuj 15 od ceny (15 zł zamiast 15% - błąd zaokrąglenia jednostki).<br>- Zaokrąglenie do 2 miejsc dziesiętnych obowiązkowe (kasowy standard).<br><br>Reference - Dwa filtry:<br>- <code>WHERE a AND b</code> (oba warunki muszą być prawdziwe).<br>- W Pythonie/Pascal: <code>if a and b: </code>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.4, max 3 pkt):<br>- <strong>3 pkt</strong> - pełna prawidłowa odpowiedź (8 perfum, ceny po obniżce, sortowane niemalejąco).<br>- <strong>2 pkt</strong> - prawidłowo posortowana lista z poprawnymi cenami, ale bez jednego z kryteriów filtrowania (np. tylko marka LUB tylko rodzina).<br>- <strong>2 pkt</strong> - poprawna lista bez sortowania.<br>- <strong>1 pkt</strong> - lista z poprawnie obliczonymi cenami (ale błąd w filtrowaniu lub sortowaniu).<br>- <strong>0 pkt</strong> - błędna lub brak.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Mnożenie przez 0,15 zamiast 0,85</strong> - daje wartość obniżki, NIE cenę po obniżce. Częsta pomyłka.</li><li><strong>Odejmowanie 15</strong> zamiast mnożenia × 0,85 - błąd jednostki (procent vs liczba).</li><li><strong>Brak JOIN z marki</strong> - zadanie wymaga nazwy marki, w perfumy.txt jest tylko id_marki. Filtrowanie po <code>nazwa_m = &#x27;Mou De Rosine&#x27;</code> wymaga JOIN.</li><li><strong>Sortowanie ASC vs DESC</strong> - &quot;niemalejąco&quot; = ASC (rosnąco). Niemalejąco oznacza, że kolejne wartości są ≥ poprzedniej.</li><li><strong>Zaokrąglenie do 2 miejsc</strong> - klucz CKE pokazuje 141,95 (nie 141 czy 141,9523). ROUND(x, 2) obowiązkowy.</li><li><strong>Polskie znaki w nazwach</strong> - &quot;Mou De Rosine&quot; musi być DOKŁADNIE jak w pliku (case-sensitive zwykle).</li><li><strong>Tylko jeden filtr</strong> - częsty błąd 2 pkt zamiast 3 (filtruj BARDZO Mou De Rosine LUB tylko orientalno-drzewna).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>SQL z indeksami: O(N log N) sortowanie + O(N) filtrowanie.</li><li>Python: O(N + M) dwa przejścia + O(K log K) sortowanie, K = wynikowe wiersze.</li><li><strong>Całkowita: O(N log N)</strong> dla typowej implementacji.</li></ul>"}]}