Zadanie 3
Matura z informatyki, maj 2025, poziom rozszerzony
Wymaganie: III.2, III.3 – pisanie programów przetwarzających pliki tekstowe i analizujących sekwencje danych; II.2 – geometria analityczna (długość odcinka).
Treść zadania
Zadanie 3. Dron
Tor lotu pewnego drona składa się z prostych odcinków. Lot rozpoczyna się w punkcie (0, 0) a kończy w punkcie (20000, 0). Dron poza startem i lądowaniem jest zawsze na wysokości większej od zera.
Plik dron.txt zawiera 100 wierszy, w których zapisano dane dotyczące ruchu drona. W każdym wierszu jest zapisana para liczb całkowitych rozdzielonych znakiem spacji. Pierwsza liczba oznacza przemieszczenie drona (odległość) w poziomie od ostatniej pozycji – jest to zawsze liczba dodatnia. Druga liczba oznacza przemieszczenie w pionie od ostatniej pozycji, jeśli druga liczba jest dodatnia, to dron wykonał ruch w górę, jeśli ujemna – w dół, a jeśli równa 0 – nie zmienił wysokości.
Przykład 1. Dla przykładowych danych:
3000 2000
2000 9000
5000 -7000
5000 4000
3000 6000
2000 -14000
lot można zilustrować na wykresie (od (0,0) → (3000,2000) → (5000,11000) – ALE w arkuszu wykres pokazuje punkty: (3000, 2000), (5000, 11000) – błąd interpretacji; tor mieści wartości: [3000, 2000], [5000, 11000], [10000, 4000] (po -7000), [15000, 8000], [18000, 14000], [20000, 0]).
gdzie:
- x – odległość w poziomie od punktu startowego
- y – wysokość (odległość w pionie od punktu startowego)
- [A, B] – umiesszczone w białe pary liczb oznaczają przemieszczenia drona odpowiednio w poziomie i w pionie.
Napisz program (lub kilka programów), który(-e) znajdzie(-dą) odpowiedzi do podanych zadań. Każdą odpowiedź zapisz w pliku wyniki3.txt i poprzedź ją numerem oznaczającym zadanie.
Do Twojej dyspozycji jest plik dron_przyklad.txt zawierający 10 wierszy danych w opisanej postaci. Odpowiedzi dla pliku dron_przyklad.txt są podane pod każdym zadaniem. Pamiętaj, że Twój program musi ostatecznie zadziałać dla pliku dron.txt zawierającym 100 wierszy danych.
Zadanie 3.1, 3.2, 3.3, 3.4 (typowe podzadania)
Typowe podzadania (na podstawie analogicznych arkuszy CKE):
- 3.1: ile razy dron wzniósł się wyżej niż pewna wartość / maksymalna osiągnięta wysokość
- 3.2: łączna długość lotu (suma długości odcinków = √(Δx² + Δy²))
- 3.3: średnia/skrajna wartość prędkości pionowej
- 3.4: zliczenie zmian kierunku (góra ↔ dół)
Źródło: arkusz CKE MINP-R0-100-2505. Otwórz oryginalny PDF
Rozwiązanie
Wczytanie danych i wyznaczenie pozycji (wspólne dla wszystkich podzadań):
import math
pozycje = [(0, 0)]
ruchy = []
with open("dron.txt") as f:
x, y = 0, 0
for linia in f:
dx, dy = map(int, linia.split())
x += dx
y += dy
pozycje.append((x, y))
ruchy.append((dx, dy))
3.1 – maksymalna wysokość:
print(max(y for _, y in pozycje))
3.2 – długość trasy:
dl = sum(math.sqrt(dx*dx + dy*dy) for dx, dy in ruchy)
print(round(dl, 2))
3.3 – liczba odcinków o kierunku poziomym (dy=0):
print(sum(1 for dx, dy in ruchy if dy == 0))
3.4 – liczba zmian kierunku pionowego (góra→dół lub dół→góra):
zmiany = 0
poprz_znak = 0
for dx, dy in ruchy:
if dy == 0:
continue
znak = 1 if dy > 0 else -1
if poprz_znak != 0 and znak != poprz_znak:
zmiany += 1
poprz_znak = znak
print(zmiany)
Każde podzadanie wymaga jednorazowego przejścia przez listę ruchy lub pozycje, co daje złożoność O(n).
Typowy błąd: zapominanie o stanie startowym (0, 0) lub o tym, że pierwsza liczba (Δx) jest zawsze dodatnia, a tylko druga (Δy) może być ujemna. Inny – obliczanie długości jako sumy |Δx| + |Δy| zamiast euklidesowej √(Δx² + Δy²). Przy zliczaniu zmian kierunku należy ignorować odcinki o Δy = 0 (lot poziomy nie zmienia kierunku pionowego).
Strona arkusza CKE z treścią zadania
Rozwiązanie krok po kroku
Wspólne wczytanie danych
Trasa drona to ciąg odcinków: każdy wiersz pliku to przyrosty (Δx, Δy). Iteracyjnie kumulujemy pozycję bieżącą, zaczynając od (0, 0). Wszystkie podzadania korzystają z tej samej listy pozycji/ruchów.
Maksymalna wysokość
To max po współrzędnej y wszystkich punktów łamanej.
Długość trasy
Suma długości odcinków: dla każdego ruchu (Δx, Δy) długość to √(Δx² + Δy²). Sumujemy po wszystkich 100 odcinkach.
Zliczanie zmian kierunku
Iterujemy po znakach Δy (pomijając Δy = 0). Zliczamy momenty, w których znak zmienia się względem poprzedniego niezerowego odcinka.
Rozumiesz, jak to rozwiązać?
Przećwicz podobne typy zadań w aplikacji
matury-online.pl ma tysiące zadań pogrupowanych po dziedzinach. Sprawdź, czy temat „dron, geometria, odcinki, parsowanie pliku, śledzenie pozycji, ekstrema funkcji" zrobisz samodzielnie.
Otwórz matury-online.pl