4. Całe zadanie: Brenna w wyniki4.txt

Matura pokazowa marzec 2022 - Matura z informatyki: arkusze krok po kroku (Python)

Pełne rozwiązanie zadań 4.1-4.4 jednym programem na pliku `brenna.txt`: plik wyników `wyniki4.txt` i wykres do zadania 4.2.

rows = []  # (dzień, godzina, temperatura, opad)
with open("brenna.txt") as f:
    f.readline()  # wiersz nagłówkowy
    for line in f:
        moment, temp, precip = line.strip().split("\t")
        day, hour = moment.split()  # "01.01.2019 00:00"
        rows.append((day, hour, float(temp.replace(",", ".")), float(precip.replace(",", "."))))

# 4.1 najniższa i najwyższa temperatura każdego dnia, potem największa różnica
low, high = {}, {}
for day, hour, temp, precip in rows:
    low[day] = min(low.get(day, temp), temp)
    high[day] = max(high.get(day, temp), temp)
best_day, amplitude = "", -1
for day in high:
    if high[day] - low[day] > amplitude:
        best_day, amplitude = day, high[day] - low[day]
amplitude = round(amplitude, 1)

# 4.2 suma i liczba pomiarów dla każdej godziny doby (0 = 00:00, ..., 23 = 23:00)
total, count = {}, {}
for day, hour, temp, precip in rows:
    h = int(hour[:2])
    total[h] = total.get(h, 0) + temp
    count[h] = count.get(h, 0) + 1
averages = [round(total[h] / count[h], 2) for h in range(24)]

# 4.3 deszcz: temperatura i opad większe od zera; inny pomiar przerywa ciąg
best, best_start, best_end, best_sum = 0, "", "", 0
run, run_sum = 0, 0
for k, (day, hour, temp, precip) in enumerate(rows):
    if temp > 0 and precip > 0:
        run = run + 1
        run_sum = round(run_sum + precip, 1)
        if run > best:
            first = rows[k - run + 1]
            best, best_start, best_end, best_sum = run, first[0] + " " + first[1], day + " " + hour, run_sum
    else:
        run, run_sum = 0, 0

# 4.4 śnieg: temperatura <= 0 i opad > 0; deszcz zeruje sumę; suma > 4 cm = pługi w następnej godzinie
trips, per_day = 0, {}
snow, plough_next = 0, False
for day, hour, temp, precip in rows:
    if plough_next:  # godzina odśnieżania: jej opad pługi usuwają w tym samym cyklu
        plough_next = False
        trips = trips + 1
        per_day[day] = per_day.get(day, 0) + 1
        continue
    if temp > 0 and precip > 0:
        snow = 0
    elif temp <= 0 and precip > 0:
        snow = round(snow + precip, 1)
        if snow > 4:
            plough_next = True
            snow = 0
busiest = ""
for day in per_day:
    if busiest == "" or per_day[day] > per_day[busiest]:
        busiest = day

with open("wyniki4.txt", "w", encoding="utf-8") as out:
    print("4.1", best_day, amplitude, file=out)
    print("4.2", file=out)
    for h in range(24):
        print(h, f"{averages[h]:.2f}", file=out)
    print("4.3", best, best_start, best_end, best_sum, file=out)
    print("4.4", trips, busiest, per_day[busiest], file=out)

print(open("wyniki4.txt", encoding="utf-8").read())

import matplotlib.pyplot as plt

plt.plot(range(24), averages, marker="o")
plt.xticks(range(24))
plt.xlabel("godzina doby")
plt.ylabel("średnia temperatura [°C]")
plt.title("Średnia temperatura w kolejnych godzinach doby (Brenna, 2019)")
plt.grid(True)
plt.show()

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu Matura z informatyki: arkusze krok po kroku·Zaloguj się, aby zapisać postęp na koncie.