# Informatyka — zadanie 4.2

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

- arkusz: Informatyka · Matura · maj 2017 (rozszerzona)
- rok: 2017
- poziom: rozszerzona
- typ: open
- punkty: 2
- działy: Programowanie i algorytmika

## Treść

Kontekst - patrz zadanie 4.1.

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.

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

## Poprawna odpowiedź

**Łączny przychód: 643 267,07 zł**

Zestawienie roczne:

| Rok | Przychód |
| 2005 | 54 032,00 |
| 2006 | 55 813,30 |
| 2007 | 66 294,80 |
| 2008 | 78 524,45 |
| 2009 | 65 527,32 |
| 2010 | 68 294,10 |
| 2011 | 52 311,60 |
| 2012 | 60 696,00 |
| 2013 | 63 090,18 |
| 2014 | 78 683,32 |
| **RAZEM** | **643 267,07** |

## Sposób 1 - Python

```python
# Wczytaj cennik (rok → cena/kg)
cennik = {}
with open('cennik.txt', encoding='utf-8') as f:
for linia in f:
rok, cena = linia.strip().split('\t')
cennik[int(rok)] = float(cena.replace(',', '.'))

# Wczytaj transakcje i mnóż przez cenę za rok
laczny = 0.0
per_rok = {r: 0.0 for r in range(2005, 2015)}
with open('cukier.txt', encoding='utf-8') as f:
for linia in f:
data, nip, kg = linia.strip().split('\t')
rok = int(data[:4])
przychod = int(kg) * cennik[rok]
laczny += przychod
per_rok[rok] += przychod

for r in sorted(per_rok):
print(r, round(per_rok[r], 2))
print('RAZEM:', round(laczny, 2))
# RAZEM: 643267.07

## Sposób 2 - arkusz kalkulacyjny

1. **cennik.txt** zaimportuj do osobnej tabeli: A=Rok, B=Cena (zamień przecinek na kropkę dziesiętną).
2. **cukier.txt** zaimportuj: A=Data, B=NIP, C=Kg.
3. Dodaj kolumnę D: `=WARTOŚĆ(LEWY(A2; 4))` - wyciągnięcie roku z daty.
4. Dodaj kolumnę E: `=WYSZUKAJ.PIONOWO(D2; cennik!$A$2:$B$11; 2; FAŁSZ) * C2` - przychód jednej transakcji.
5. Suma kolumny E daje **643267,07 zł**.

Alternatywnie tabela przestawna z polem obliczanym `kg * cena_z_cennika_per_rok`.

## Sposób 3 - Pascal

```pascal
program Slodzik42;
uses sysutils;
var
f, fc: TextFile;
rok, kg: LongInt;
cena, przychod, laczny: Real;
data, nip, line: string;
cennikRok: array[2005 2014] of Real;
i: Integer;
begin
AssignFile(fc, 'cennik.txt');
Reset(fc);
while not Eof(fc) do
begin
ReadLn(fc, line); // np. "2005\t2,00"
rok := StrToInt(Copy(line, 1, 4));
cena := StrToFloat(Copy(line, 6, Length(line))); // z przecinkiem
cennikRok[rok] := cena;
end;
CloseFile(fc);

laczny := 0;
AssignFile(f, 'cukier.txt');
Reset(f);
while not Eof(f) do
begin
ReadLn(f, line); // "data\tNIP\tkg"
// parsowanie split tabulacją (omijam dla zwięzłości)
rok := StrToInt(Copy(line, 1, 4));
// wyciągnij kg z końca
przychod := kg * cennikRok[rok];
laczny := laczny + przychod;
end;
CloseFile(f);
WriteLn('Łączny przychód: ', laczny:0:2); // 643267.07
end.

## Sposób 4 - C++

```cpp
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <sstream>
using namespace std;

int main() {
map<int, double> cennik;
ifstream fc("cennik.txt");
int rok;
string cenaS;
while (fc >> rok >> cenaS) {
for (auto& c : cenaS) if (c == ',') c = '.';
cennik[rok] = stod(cenaS);
}

double laczny = 0;
ifstream f("cukier.txt");
string data, nip;
int kg;
while (f >> data >> nip >> kg) {
int r = stoi(data.substr(0, 4));
laczny += kg * cennik[r];
}
cout.precision(2);
cout << fixed << laczny << endl; // 643267.07
return 0;
}

## Reference algorytmiczny - join danych

> Reference - łączenie danych z dwóch źródeł (lookup):
> - W Python: słownik `cennik[rok] = cena` - O(1) wyszukiwanie.
> - W SQL: JOIN po roku.
> - W arkuszu: WYSZUKAJ.PIONOWO (VLOOKUP).
> - Konwersja "2,00" → 2.0: zamień przecinek na kropkę, potem `float()`.
> - Wydobycie roku z daty: `data[:4]` w Python, `LEWY(A; 4)` w arkuszu, `Copy(s, 1, 4)` w Pascal.

## Schemat oceniania CKE

> Klucz CKE (zadanie 4.2, max 2 pkt):
> - **2 pkt** - łączny przychód **643 267,07 zł**
> - **1 pkt** - poprawne zestawienie przychodów w poszczególnych latach (wartości roczne) ale błędna suma
> - **0 pkt** - inna błędna odpowiedź albo brak

## Typowe pułapki

- **Separator dziesiętny** - w cenniku format polski („2,00"), trzeba zamienić na kropkę przed konwersją do float.
- **Format daty** - wystarczy pierwsze 4 znaki dla wydobycia roku, nie potrzeba parsować całej daty.
- **Sumowanie zmiennoprzecinkowe** - przy dodawaniu ~2000 liczb mogą wystąpić drobne błędy zaokrąglenia; finalnie zaokrąglić do 2 miejsc po przecinku.
- **Pomyłka cennika** - cena obowiązuje przez cały rok, więc grupowanie po roku z daty transakcji.

## Złożoność obliczeniowa

- Wczytanie cennika: O(10) - stała.
- Pojedyncze przejście transakcji + lookup w słowniku: **O(n)**, gdzie n = liczba transakcji (2162).
- Łączna złożoność: **O(n)**.

## Linki

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

## Podobne zadania

- [Zadanie 2.1](https://matura.lol/question/informatyka-2025-czerwiec-matura-stara-rozszerzona/zad/2.1) — Zadanie 2.1. (0-3) Uzupełnij tabelę - wpisz w ostatniej kolumnie wynik funkcji f(a, b) dla podanych wartości argumentów a i b. a b f(a, b) 42 2 4 125 103 104 Mi
- [Zadanie 4.3](https://matura.lol/question/informatyka-2017-czerwiec-matura-rozszerzona-2/zad/4.3) — Zadanie 4.3. (0-3) Znajdź najbardziej oddalone od siebie punkty. Podaj współrzędne znalezionych punktów oraz odległość między nimi zaokrągloną do liczby całkowi
- [Zadanie 7.3](https://matura.lol/question/informatyka-2025-czerwiec-matura-rozszerzona/zad/7.3) — Zadanie 7.3. (0-2) Codziennie w godzinach 10:00-12:00 emeryci otrzymują 10% rabatu na wszystkie usługi. Rabat przysługuje, gdy usługa rozpoczęła się w godzinach
- [Zadanie 5.2](https://matura.lol/question/informatyka-2021-maj-matura-rozszerzona-2/zad/5.2) — Kontekst zadania 5 (Wodociągi) - patrz zadanie 5.1. Dla każdej dzielnicy podaj całkowite roczne zużycie wody przez jej wszystkich mieszkańców.

_Ostatnia aktualizacja danych: 2026-10-03_
