# Informatyka — zadanie 6.4

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2019-05/zad/6.4
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2019 (rozszerzona)
- rok: 2019
- poziom: rozszerzona
- typ: open
- punkty: 3
- działy: Bazy danych

## Treść

Kontekst - patrz zadanie 6.1.

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.

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

**Perfumy marki Mou De Rosine z rodziny "orientalno-drzewna" po obniżce o 15%, posortowane niemalejąco:**

| Nazwa | Nowa cena |
| Ourn Boise | 141,95 |
| Onou Back | 222,70 |
| Pic An | 230,35 |
| Nterl Bambola | 292,40 |
| Ubilatio Champs | 381,65 |
| Ibrary Ollec D'or | 489,60 |
| Ate An | 544,85 |
| Elov & Musc | 660,45 |

8 perfum spełniających dwa warunki (marka = Mou De Rosine + rodzina = orientalno-drzewna). Cena po obniżce = cena_oryginalna × 0,85.

## Sposób 1 - SQL (JOIN + filtr + obniżka)

```sql
SELECT p.nazwa_p, ROUND(p.cena * 0.85, 2) AS nowa_cena
FROM perfumy p
INNER JOIN marki m ON p.id_marki = m.id_marki
WHERE m.nazwa_m = 'Mou De Rosine'
AND p.rodzina_zapachow = 'orientalno-drzewna'
ORDER BY nowa_cena ASC;

**Wynik:**
Ourn Boise 141.95
Onou Back 222.70
Pic An 230.35
Nterl Bambola 292.40
Ubilatio Champs 381.65
Ibrary Ollec D'or 489.60
Ate An 544.85
Elov & Musc 660.45

## Sposób 2 - Python

```python
# Wczytaj marki: nazwa -> id
marki = {}
with open('marki.txt', encoding='utf-8') as f:
f.readline() # naglowek
for linia in f:
idm, nazwa = linia.strip().split('\t')
marki[nazwa] = idm

id_mou = marki['Mou De Rosine']

# Wczytaj perfumy, filtruj, oblicz nowa cena
wynik = []
with open('perfumy.txt', encoding='utf-8') as f:
f.readline()
for linia in f:
idp, nazwa, idm, rodzina, cena = linia.strip().split('\t')
if idm == id_mou and rodzina == 'orientalno-drzewna':
nowa = round(int(cena) * 0.85, 2)
wynik.append((nazwa, nowa))

# Sortuj niemalejaco po cenie
wynik.sort(key=lambda x: x[1])
for nazwa, cena in wynik:
print(f'{nazwa:25} {cena}')

## Sposób 3 - arkusz kalkulacyjny

**Krok 1:** Zaimportuj 3 pliki. W kolumnie pomocniczej w perfumy.txt dodaj nazwę marki przez WYSZUKAJ.PIONOWO po id_marki.

**Krok 2:** Filtruj:
- nazwa_m = "Mou De Rosine"
- rodzina_zapachow = "orientalno-drzewna"

**Krok 3:** Dodaj kolumnę nowa_cena: `=cena * 0,85` (lub formuła `=ROUND(cena*0,85; 2)`).

**Krok 4:** Sortuj rosnąco po nowa_cena.

## Reference algorytmiczny - JOIN + filtr + obniżka

> Reference - Procentowa obniżka ceny:
> - Obniżka o p% → mnoż przez (100 - p)/100, tzn. obniżka 15% → mnoż przez 0,85.
> - **NIE** dodawaj obniżki do ceny (zwiększyłbyś cenę).
> - **NIE** odejmuj 15 od ceny (15 zł zamiast 15% - błąd zaokrąglenia jednostki).
> - Zaokrąglenie do 2 miejsc dziesiętnych obowiązkowe (kasowy standard).
>
> Reference - Dwa filtry:
> - `WHERE a AND b` (oba warunki muszą być prawdziwe).
> - W Pythonie/Pascal: `if a and b: `.

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.4, max 3 pkt):
> - **3 pkt** - pełna prawidłowa odpowiedź (8 perfum, ceny po obniżce, sortowane niemalejąco).
> - **2 pkt** - prawidłowo posortowana lista z poprawnymi cenami, ale bez jednego z kryteriów filtrowania (np. tylko marka LUB tylko rodzina).
> - **2 pkt** - poprawna lista bez sortowania.
> - **1 pkt** - lista z poprawnie obliczonymi cenami (ale błąd w filtrowaniu lub sortowaniu).
> - **0 pkt** - błędna lub brak.

## Typowe pułapki

- **Mnożenie przez 0,15 zamiast 0,85** - daje wartość obniżki, NIE cenę po obniżce. Częsta pomyłka.
- **Odejmowanie 15** zamiast mnożenia × 0,85 - błąd jednostki (procent vs liczba).
- **Brak JOIN z marki** - zadanie wymaga nazwy marki, w perfumy.txt jest tylko id_marki. Filtrowanie po `nazwa_m = 'Mou De Rosine'` wymaga JOIN.
- **Sortowanie ASC vs DESC** - "niemalejąco" = ASC (rosnąco). Niemalejąco oznacza, że kolejne wartości są ≥ poprzedniej.
- **Zaokrąglenie do 2 miejsc** - klucz CKE pokazuje 141,95 (nie 141 czy 141,9523). ROUND(x, 2) obowiązkowy.
- **Polskie znaki w nazwach** - "Mou De Rosine" musi być DOKŁADNIE jak w pliku (case-sensitive zwykle).
- **Tylko jeden filtr** - częsty błąd 2 pkt zamiast 3 (filtruj BARDZO Mou De Rosine LUB tylko orientalno-drzewna).

## Złożoność obliczeniowa

- SQL z indeksami: O(N log N) sortowanie + O(N) filtrowanie.
- Python: O(N + M) dwa przejścia + O(K log K) sortowanie, K = wynikowe wiersze.
- **Całkowita: O(N log N)** dla typowej implementacji.

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2019-05/zad/6.4)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2019-05%2Fzad%2F6.4)

## Podobne zadania

- [Zadanie 6.4](https://matura.lol/question/informatyka-2019-maj-matura-rozszerzona-2/zad/6.4) — Kontekst - patrz zadanie 6.1. Ceny wszystkich perfum marki Mou De Rosine z rodziny o nazwie „orientalno-drzewna” zostały obniżone o 15%. Podaj listę zawierającą
- [Zadanie 6.2](https://matura.lol/question/informatyka-2026-czerwiec-matura-stara-rozszerzona-2/zad/6.2) — Zadanie 6.2. (0-2) Wyszukaj ucznia, który otrzymał najwięcej ocen celujących (6). Podaj identyfikator tego ucznia, identyfikator jego klasy oraz liczbę ocen cel
- [Zadanie 7.1](https://matura.lol/question/informatyka-2023-maj-matura-rozszerzona/zad/7.1) — Zadanie 6. Gry planszowe Pewien serwis internetowy prowadzi ranking gier planszowych. Baza serwisu została zapisana w trzech plikach. Plik gry.txt zawiera infor
- [Zadanie 13.1](https://matura.lol/question/informator-maturalny-informatyka-2023/zad/13.1) — Zadanie 13.1. (0-2) Podaj nazwy pięciu aktywności najczęściej realizowanych przez pracowników oraz dla każdej z nich zapisz liczbę realizacji tej aktywności. Od

_Ostatnia aktualizacja danych: 2026-10-03_
