Informatyka · klasa 1 · rozszerzenie · lekcja 4

Programista kontra Haker — część 2

Najpierw czytasz kod, potem go układasz, a na końcu bronisz specyfikacją

1. Zasady gry

W parze jest programista i haker. Programista pisze program, haker szuka danych, na których ten program zawodzi. Do hakowania nie trzeba znać Pythona — wystarczy wiedzieć, co program powinien wypisać. W rundzie 2 role się odwracają.

co znalazł hakerpunkty dla hakera
Crash (program się wysypał) — kończy się czerwonym komunikatem o błędzie1
Cicha zła odpowiedź — program coś wypisał i jest to nieprawda2
Dane łamią warunek zapisany w specyfikacji programisty0
Koperta z podpowiedzią — haker bierze ją od nauczyciela, gdy utknie−1
Trzy reguły:
  1. Specyfikacja jest w komentarzu na górze pliku i powstaje przed atakiem. W trakcie ataku programista nie dotyka klawiatury, a haker nie zmienia w kodzie ani znaku — tylko uruchamia (Run) i wpisuje dane. Zmieniony kod = atak się nie liczy.
  2. Atak się liczy, gdy haker zapisze: dane · co wypisał program · co powinien wypisać.
  3. Ten sam rodzaj ataku liczy się raz (np. różne liczby ujemne to jeden atak).
Specyfikacja to Twoja tarcza — ale chroni tylko to, co w niej zapisane.

2. Pojęcia

Specyfikacja — dokładny opis tego, co program ma robić: co dostaje, czego wolno się spodziewać i co ma oddać. Pisze się ją przed kodem. Ma trzy części: dane, warunki na dane, wynik.
Dane (wejście) — to, co program dostaje od użytkownika, razem z typem: jedna liczba całkowita? dwie? tekst?
Wynik (wyjście) — to, co program ma wypisać. Dokładnie, łącznie ze słowami: „parzysta" czy „tak"?
Warunek wstępny — założenie o danych, które musi być spełnione, żeby program dał dobry wynik, np. „liczba zapisana cyframi". Jeśli użytkownik go złamie, to jego wina — ale tylko wtedy, gdy warunek jest zapisany. W grze: tarcza.
Program odporny — program, który sam radzi sobie z danymi, o które specyfikacja nie prosi zamiast zakładać, że dostanie „ładne" dane. Odpowiedzialność bierze program, nie użytkownik. W grze: pancerz.
Cicha zła odpowiedź — program się nie wysypuje, tylko wypisuje nieprawdę. Gorsza od crasha, bo nikt nie wie, że coś jest nie tak.
Typ danych — rodzaj wartości. int to liczba całkowita (7, -4, 0), str to tekst ("7", "abc"). input() zawsze daje str — dlatego "2" + "2" daje "22". Żeby dostać liczbę: int(input()).
Dane testowe — dane, dla których z góry wiesz, jaki ma wyjść wynik. Dobre dane testowe to takie, które mogą program obalić, a nie tylko potwierdzić, że działa.
Traceback (komunikat o błędzie) — czerwony tekst, gdy program się wysypie. Czytaj ostatnią linijkę: przed dwukropkiem jest typ błędu (np. ValueError), po dwukropku — co poszło nie tak.

3. Zadania

Zadanie 1

Co wypisze?

na lekcji

Oto program z poprzedniej lekcji. Najpierw zapisz, co Twoim zdaniem wypisze. Dopiero potem zobaczysz wynik na rzutniku.

# Dane: liczba całkowita n
# Wynik: napis "parzysta" albo "nieparzysta"
n = int(input("Podaj liczbę całkowitą: "))
if n % 2 == 0:
    print("parzysta")
else:
    print("nieparzysta")

n % 2 to reszta z dzielenia n przez 2. Idź po kodzie linijka po linijce: co jest w n? ile wynosi n % 2? do którego print trafi program?

wpisujęprzewidujęwyszło
4  
7  
0  
-3  
007  

A ten program? Tu nie ma int.

n = input("n = ")
print(n * 3)
wpisujęprzewidujęwyszło
2  
Zadanie 2

Rozsypanka — parzystość

haker, runda 1

Linijki programu z zadania 1 się pomieszały. Ułóż je tak, żeby program znowu działał. Plik: rozsypanka_parzystosc.

Jak to zrobić w PyCharmie: w oknie Project prawy przycisk na folderze → New → Python File → wpisz nazwę. Skopiuj kod poniżej i wklej do pliku. Linijkę przesuwasz tak: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓). Uruchamiasz: prawy przycisk w kodzie → Run. Czerwone IndentationError znaczy „jeszcze nie ułożone” — przesuwaj dalej.

# > ROZSYPANKA: linijki programu są pomieszane. Ułóż je w dobrej kolejności.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: prawy przycisk w kodzie → Run. Działa dla 4 i dla 7? Gotowe.
# Dane: liczba całkowita n
# Wynik: napis "parzysta" albo "nieparzysta"
    print("nieparzysta")
if n % 2 == 0:
    print("parzysta")
n = int(input("Podaj liczbę całkowitą: "))
else:

Działa dla 4 i dla 7? Zaznacz:

★ Trudniejsza wersja — jedna linijka jest tu zbędna i psuje program. Znajdź ją i usuń. Plik: rozsypanka_parzystosc_pulapka.

# > ROZSYPANKA ★: jedna linijka jest zbędna i psuje program. Znajdź ją i usuń.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: prawy przycisk w kodzie → Run. Działa dla 4 i dla 7 i pyta tylko raz? Gotowe.
# Dane: liczba całkowita n
# Wynik: napis "parzysta" albo "nieparzysta"
    print("nieparzysta")
n = input("Podaj liczbę całkowitą: ")
if n % 2 == 0:
    print("parzysta")
n = int(input("Podaj liczbę całkowitą: "))
else:

Która linijka była zbędna i dlaczego?

Zadanie 3

Haker — plan ataków

haker, runda 1

Kolega pisze program: dostaje trzy boki a, b, c i mówi, czy trójkąt jest prostokątny. Nie patrz w jego kod. Wymyśl trzy zestawy boków, na których program może się pomylić, i zapisz, co powinien wypisać.

Pomyśl: jaki trójkąt na pewno jest prostokątny (Pitagoras: 3² + 4² = 5²)? A jaki na pewno nie? Czy każde trzy liczby to w ogóle trójkąt?

abcco powinien wypisać
    
    
    
Zadanie 4

Haker — moje ataki

na lekcji

Program kolegi:   Rodzaj: X — crash (1 pkt), C — cicha zła odpowiedź (2 pkt), S — łamie jego specyfikację (0 pkt).

Atak 1 (5 minut)

daneprogram wypisałpowinien wypisaćrodzajpkt
     
     
     
     
     

Atak 2 — role odwrócone: atakujesz program, który kolega ułożył w rundzie 2 (3 minuty)

daneprogram wypisałpowinien wypisaćrodzajpkt
     
     
     

Moje punkty jako haker:   Punkty kolegi jako haker:   Pojedynek wygrał:

Zadanie 5

Trójkąt prostokątny

rundy 1 i 2

Program dostaje długości trzech boków a, b, c (liczby całkowite) i ma powiedzieć, czy trójkąt jest prostokątny. Pitagoras: a² + b² = c². W Pythonie kwadrat to a * a, równość to ==.

Programista (runda 1): napisz trojkat.py sam. Wzoruj się na parzystości z zadania 1.

Nie wiesz, jak zacząć? Kliknij — tu jest szkielet programu

Uzupełnij specyfikację i warunek w if. Resztę masz gotową.

# Dane: ...
# Warunki na dane: ...
# Wynik: ...
a = int(input("a = "))
b = int(input("b = "))
c = int(input("c = "))
if ____________________:
    print("prostokątny")
else:
    print("nie jest prostokątny")

Rozsypanka (runda 2): ułóż program z pomieszanych linijek. Plik: rozsypanka_trojkat. Sprawdź: 3 4 5 → prostokątny, 2 3 4 → nie jest prostokątny. Potem uzupełnij specyfikację na górze — to Twoja tarcza przed hakerem.

# > ROZSYPANKA: ułóż linijki programu w dobrej kolejności.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: Run dla 3 4 5 → prostokątny, dla 2 3 4 → nie jest prostokątny.
# > Potem uzupełnij specyfikację — to twoja tarcza przed hakerem.
# Dane: ...
# Warunki na dane: ...
# Wynik: ...
    print("nie jest prostokątny")
c = int(input("c = "))
if a * a + b * b == c * c:
a = int(input("a = "))
else:
    print("prostokątny")
b = int(input("b = "))

★ Trudniejsza wersja — jeden warunek jest zły. Znajdź go i usuń. Plik: rozsypanka_trojkat_pulapka.

# > ROZSYPANKA ★: jedna linijka jest zbędna — to zły warunek. Znajdź ją i usuń.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: Run dla 3 4 5 → prostokątny, dla 2 3 4 → nie jest prostokątny.
# > Potem uzupełnij specyfikację — to twoja tarcza przed hakerem.
# Dane: ...
# Warunki na dane: ...
# Wynik: ...
    print("nie jest prostokątny")
c = int(input("c = "))
if a + b == c:
if a * a + b * b == c * c:
a = int(input("a = "))
else:
    print("prostokątny")
b = int(input("b = "))

Specyfikacja — przepisz ją też jako komentarz (#) na górę pliku:

DaneWarunki na daneWynik
   

Runda 2 — co wybrałeś?

Zadanie 6

Czarna skrzynka

na lekcji

Program na rzutniku dostaje dwie liczby całkowite i wypisuje TAK albo NIE. Kodu nie widać. Dla 2 i 4 wypisuje TAK. Przepisuj z tablicy kolejne próby:

abwynik
24TAK
   
   
   
   
   
   
   

Moja reguła:

Która para obaliła moją pierwszą hipotezę?

Bilet wyjścia

Napisz specyfikację (bez kodu) programu, który podaje większą z dwóch liczb. Potem oddaj kartę sąsiadowi — ma 30 sekund na znalezienie dziury.

DaneWarunki na daneWynik
   

Dziura znaleziona przez sąsiada:

← Powrót do materiałów