Problem trenera: najdłuższy skok z nieznanej liczby prób
Wartownik, czyli umówiona liczba kończąca wczytywanie
Lista kroków i tabela, w której sprawdzamy algorytm na kartce
Program „Najdłuższy skok” i wcięcie, od którego zależy wszystko
Podręcznik: s. 128–132.
Rozgrzewka · 3 minuty
Pierwiastek i moduł math
Wracamy do testu pierwszości z poprzedniej lekcji.
Sprawdzając, czy liczba jest pierwsza, dzieliliście ją tylko do pierwiastka kwadratowego z niej. Dlaczego dalej już nie trzeba?
Skąd program bierze funkcję sqrt i co trzeba dopisać na początku pliku, żeby dało się jej użyć?
Ulepszona wersja testu pomijała liczby parzyste. Co dzięki temu zyskiwała?
podręcznik s. 124–126 i dodatek 8, s. 227
Część 1 · Problem
Ile skoków? Nie wiadomo z góry
Trener skoku w dal mierzy na treningu długości kolejnych skoków zawodnika i wpisuje wyniki na bieżąco do programu. Program ma na zakończenie treningu pokazać długość najdłuższego skoku. Wyniki podajemy w metrach, z dokładnością do 0,01 metra, czyli do jednego centymetra.
Nikt nie wie, ile skoków zawodnik wykona. Nawet jeśli trener zaplanuje jakąś liczbę, część skoków będzie spalona i nie wejdzie do obliczeń.
Specyfikacja. Dane: ciąg liczb nieujemnych, zapisanych z dokładnością do 0,01, zakończony liczbą 0. Wynik: największa z podanych liczb. Ciąg to układ liczb, w którym występują one w określonej kolejności.
Jednostki są dla programisty ważne, bo od nich zależy typ danych. Te same skoki podane w centymetrach byłyby liczbami całkowitymi, a podane w metrach są ułamkami.
Podręcznik Informatyka na czasie 2, s. 128–129 (9.1 Szukamy największej liczby, opis zadania, ramka „Specyfikacja”, ramka „Warto wiedzieć” o jednostkach, ramka „Dobra rada” o ciągu)
Część 1 · Wartownik
Umówiona liczba, która kończy wczytywanie
Skąd program ma wiedzieć, że trening się skończył? Trener wpisuje liczbę 0. Ta liczba nie jest wynikiem żadnego skoku, tylko znakiem końca danych.
Wartownik (angielskie sentinel) to specjalna wartość wskazująca koniec ciągu wczytywanych wartości. Musi być unikatowa, żeby nie dało się jej pomylić z danymi użytkownika. Jak hasło kończące zapisy na wycieczkę: nikt się nie nazywa „koniec zgłoszeń”.
Ciekawostka. W angielskich tekstach ta sama wartość ma jeszcze cztery inne nazwy: flag value, trip value, rogue value i signal value.
Podręcznik Informatyka na czasie 2, s. 129 (9.1 Szukamy największej liczby, ramka „Warto wiedzieć” o wartowniku) · ciekawostka: en.wikipedia.org/wiki/Sentinel_value
Część 1 · Porównywanie parami
Komputer widzi tylko dwie liczby naraz
Komputer nie potrafi jednocześnie porównywać wielu liczb, nawet gdyby miał je wszystkie w pamięci. Pracuje sekwencyjnie, czyli krok po kroku, i w jednej operacji bierze pod uwagę tylko dwie liczby. Pozostałe są dla niego niedostępne.
Podręcznik Informatyka na czasie 2, s. 129 (9.1 Szukamy największej liczby, schemat „Jak widzi komputer?”)
Część 2 · Lista kroków
Pięć kroków i dwa z nich w pętli
Porównujemy parami: pierwszy skok z drugim, dłuższy z nich z trzecim, dłuższy z nich z czwartym i tak dalej. Dzięki temu program zapamiętuje tylko dwie wartości: liczbę właśnie podaną i największą z dotychczasowych.
Podręcznik Informatyka na czasie 2, s. 130 (9.1 Szukamy największej liczby, lista kroków algorytmu wyznaczania największej liczby z ciągu)
Część 2 · Symulacja
Sprawdzamy algorytm na kartce
Maksimum
Wczytana liczba
Czy różna od 0?
Czy większa od maksimum?
0
6,20
tak
tak
6,20
6,23
tak
tak
6,23
6,34
tak
tak
6,34
6,30
tak
nie
6,34
6,41
tak
tak
Maksimum
Wczytana liczba
Czy różna od 0?
Czy większa od maksimum?
6,41
6,14
tak
nie
6,41
6,34
tak
nie
6,41
6,27
tak
nie
6,41
6,10
tak
nie
6,41
0
nie
–
Pogrubiony wiersz z lewej to moment wczytania liczby 6,41: jest różna od 0 i większa od 6,34, więc staje się nowym maksimum. Kolejne liczby są od niej mniejsze, dlatego po podaniu 0 wynikiem jest 6,41.
Podręcznik Informatyka na czasie 2, s. 130–131 (9.1 Szukamy największej liczby, tabela 9.1 „Działanie algorytmu wyznaczania największej liczby”)
Część 3 · Program
Najdłuższy skok: kod i wynik
1. biggest = 0
2.
3. print("Podaj kolejne długości skoków:")
4. a = float(input())
5.
6. while a != 0:
7. if a > biggest:
8. biggest = a
9. a = float(input())
10.
11. print("\nNajdłuższy skok:", biggest, "m")
Podaj kolejne długości skoków:
6.20
6.23
6.34
6.30
6.41
6.14
6.34
6.27
6.10
0
Najdłuższy skok: 6.41 m
>>>
Funkcja float z wierszy 4. i 9. przechowuje liczbę z klawiatury jako wymierną. W a siedzi ostatnia wczytana liczba, w biggest największa z dotychczasowych, a \n przenosi kursor do nowego wiersza. Liczby ułamkowe podaje się z kropką zamiast przecinka.
Podręcznik Informatyka na czasie 2, s. 131–132 (9.1 Szukamy największej liczby, kod źródłowy programu „Najdłuższy skok”, rys. 9.2 „Wywołanie programu Najdłuższy skok”, ramki „Warto wiedzieć”)
Część 3 · Wcięcie
Wiersz 9. stoi na poziomie if
To jest sedno algorytmu. Wiersz 9. jest wcięty tak samo jak wiersz 7., więc należy do pętli while, a nie do if. Nowa liczba wczytuje się po każdym skoku, także słabszym od rekordu.
Dobra rada z podręcznika. Porównując liczby typu float, używajcie <, > i != zamiast <=, >= i ==: takie liczby są zapisywane w przybliżeniu i równość potrafi nie wyjść.
Podręcznik Informatyka na czasie 2, s. 131–132 (9.1 Szukamy największej liczby, listing programu i omówienie wierszy 6.–9., ramka „Dobra rada” o operatorach porównania)
Ćwiczenie · na kartce · 12 minut
Ćwiczenie: tabela i najkrótszy skok
Podpisz kartkę i przepisz nagłówek tabeli z prawej.
Wypełnij ją dla ciągu skoków: 5,80; 6,05; 5,92; 6,11; 5,74; 0. Jeden wiersz na jedną wczytaną liczbę.
Pod tabelą napisz, co zmienić w programie ze slajdu 8, żeby wypisywał najkrótszy skok. Podaj numery wierszy i nową treść.
Dla szybszych: ćwiczenie 1 ze s. 131. Co się stanie, jeśli zamienimy miejscami kroki 3 i 4?
Po dziewięciu minutach zamiana kartek w parach. Dla chętnych (dom): kod ze slajdu 8, uruchomiony kilka razy dla różnych danych (ćwiczenie 2 ze s. 132).
Podręcznik Informatyka na czasie 2, s. 130–132 (tabela 9.1, ćwiczenie 1 ze s. 131, ćwiczenie 2 ze s. 132)
Część 3 · Pytania kontrolne
Trzy pytania na koniec
Czym jest wartownik i dlaczego w zadaniu o skokach jest nim akurat 0?
Dlaczego program zapamiętuje tylko dwie liczby, a nie wszystkie podane skoki?
Do której instrukcji należy wiersz 9. programu „Najdłuższy skok” i co by się stało, gdyby był wcięty o jeden poziom głębiej?
Podręcznik Informatyka na czasie 2, s. 128–132 (9.1 Szukamy największej liczby)
Część 3 · Podsumowanie
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Zmienna biggest i porównanie z rekordem
Tak samo działa tablica wyników na zawodach: system trzyma jeden najlepszy rezultat i porównuje z nim każdą nową próbę.
nadal w użyciu
Jeden przebieg przez dane, bez pamiętania historii
Serwis liczący statystyki na żywo trzyma tylko aktualne maksimum i nową wartość, więc działa tak samo szybko przy tysiącu i przy milionie odczytów.
nadal w użyciu
Wartownik 0 kończący wczytywanie
W formularzach i plikach koniec danych zgłasza samo źródło. Wartownik został tam, gdzie danych nie da się z góry policzyć.
zastępowane
float do liczb z przecinkiem
Przy pieniądzach zamiast float używa się typu dziesiętnego albo liczy w groszach, bo przybliżenia potrafią zgubić grosz.
zmienione
biggest = 0 jako wartość startowa
Gotowe funkcje szukające maksimum startują od pierwszego elementu, a dla pustego zbioru zgłaszają błąd zamiast zera.