Co to znaczy „rozwiązać problem"
🎯 Po co Ci to?
Kolega prosi: „napisz mi program, który znajdzie najlepszy bilet na pociąg". Siadasz i… nie ruszasz z miejsca. Najlepszy — czyli jaki? Najtańszy? Najszybszy? Bez przesiadek? A co, jeśli takiego połączenia w ogóle nie ma — program ma milczeć, przeprosić, zaproponować inny dzień? Zanim padnie jakakolwiek linijka kodu, ktoś musi rozstrzygnąć te pytania. W informatyce to rozstrzyganie ma swoją nazwę i swoją technikę — i jest pierwszym etapem każdego rozwiązania.
✅ Czego się nauczysz
Po tej jednostce potrafisz:
- rozpisać problem na dane, wynik i warunki (czyli zbudować specyfikację);
- wymienić etapy myślenia komputacyjnego i wskazać je w konkretnym zadaniu;
- wyjaśnić, dlaczego „komputer zrobi, co każesz, a nie co chcesz" to nie żart, tylko zasada pracy.
📘 Wyjaśnienie
Zacznij od czegoś, co wygląda banalnie.
💭 Pomyśl: Zadanie brzmi: „program ma sprawdzić, czy uczeń zdał sprawdzian". Jakie pytania musisz zadać, zanim da się to napisać? Wypisz przynajmniej trzy.
Sprawdź odpowiedź
Na przykład: Od ilu punktów jest „zdane" — i czy ten próg jest zawsze taki sam, czy podaje go nauczyciel? Co dostaję na wejściu — liczbę punktów, procent, listę odpowiedzi? Co ma być wynikiem — słowo „zdał/nie zdał", ocena, a może jedno i drugie? Co zrobić z danymi bez sensu, np. 130% albo −5 punktów? Każde z tych pytań zmienia program, który powstanie.
Wszystkie te pytania krążą wokół trzech rzeczy. Co dostaję (dane wejściowe), co mam oddać (wynik) i jakie reguły łączą jedno z drugim (warunki). Odpowiedź na nie, spisana wprost, to specyfikacja problemu.
📐 DEFINICJA — specyfikacja problemu: precyzyjny opis, co jest daną (co dostajemy i z jakiego zakresu), co jest wynikiem (co dokładnie mamy zwrócić) oraz jaki warunek wiąże wynik z danymi.
Po ludzku: umowa między zamawiającym a wykonawcą — spisana tak, że nie ma o co się kłócić. Czym NIE jest: opisem, JAK rozwiązać problem. Specyfikacja mówi tylko, CO ma być zrobione; sposób to następny etap.
Przykład dojrzałej specyfikacji dla naszego sprawdzianu:
- Dane: liczba całkowita $p$ — punkty ucznia, $0 \le p \le 100$; liczba całkowita $t$ — próg zdawalności, $0 \le t \le 100$.
- Wynik: słowo „zdał", gdy $p \ge t$; słowo „nie zdał" w przeciwnym razie.
Zwróć uwagę na zapis $0 \le p \le 100$. To nie ozdoba — to granica odpowiedzialności. Program obiecuje sensowną odpowiedź tylko dla danych z tego zakresu; jeśli ktoś poda $p = 130$, umowa jest zerwana i wolno nam np. zgłosić błąd. Bez tej granicy musiałbyś przewidzieć wszystko, a „wszystko" to najkrótsza droga do programu, który nie powstanie nigdy.
Etapy myślenia komputacyjnego. Specyfikacja to pierwszy krok dłuższej drogi, którą przechodzi każde informatyczne rozwiązanie — od gry mobilnej po system bankowy:
- Określenie problemu — co dokładnie mamy rozwiązać (specyfikacja: dane, wynik, warunki).
- Dobór modelu i pojęć — jak przedstawić sytuację: liczbami? listą? tabelą? (O reprezentacjach — cały dział 2.)
- Znalezienie rozwiązania — ułożenie przepisu, czyli algorytmu (jednostka 1.2).
- Zaprogramowanie i testowanie — zapis przepisu w języku zrozumiałym dla maszyny i sprawdzenie go na danych (dział 3).
Ta kolejność nie jest biurokracją. Błąd w etapie 1 kosztuje najdrożej: możesz bezbłędnie zaprogramować nie ten problem. W firmach informatycznych mówi się, że godzina rozmowy o specyfikacji oszczędza tydzień poprawiania kodu.
💭 Pomyśl: Ułóż specyfikację problemu: „sprawdź, czy dany rok jest przestępny". Zanim zajrzysz — przypomnij sobie (albo poszukaj w pamięci z geografii), że reguła ma wyjątki.
Sprawdź odpowiedź
Dane: liczba całkowita $r$ — numer roku, $r \ge 1582$ (kalendarz gregoriański obowiązuje od 1582). Wynik: „tak", jeśli rok jest przestępny, „nie" w przeciwnym razie. Warunek: rok jest przestępny, gdy dzieli się przez 4, chyba że dzieli się przez 100 — wtedy nie jest, chyba że dzieli się przez 400 — wtedy jednak jest. Rok 2000: przestępny (dzieli się przez 400). Rok 1900: nieprzestępny (dzieli się przez 100, ale nie przez 400). Zauważ, jak dużo pracy wykonało samo doprecyzowanie warunku — algorytm niemal wypadnie z niego sam.
⚠️ Uwaga, pułapka
„Program ma działać dla dowolnych danych" — tak NIE wygląda specyfikacja. Dowolnych, czyli jakich? Ujemnych? Ułamkowych? Pustych? Zawodowi programiści najwięcej błędów znajdują właśnie na brzegach zakresu danych: zero, wartość największa, pusta lista. Dobra specyfikacja mówi o brzegach wprost.
🌍 Powiązania
Specyfikacja to informatyczny kuzyn rzeczy, które znasz skądinąd: regulaminu konkursu (kto może wystartować, co trzeba oddać, jak liczone są punkty), umowy o dzieło, a nawet zadania tekstowego z matematyki — „dane/szukane" z podstawówki to była mała specyfikacja. Różnica: w informatyce nieprecyzyjność nie kończy się dyskusją, tylko błędnym programem.
🛠️ Teraz Ty
Ułóż specyfikacje (dane + wynik + warunki, z zakresami!) dla trzech problemów: (a) „znajdź największą z trzech liczb", (b) „policz średnią ocen ucznia", (c) „sprawdź, czy hasło jest wystarczająco silne". W (c) sam podejmij decyzje projektowe (ile znaków? jakie rodzaje znaków?) — i zapisz je wprost. Bez komputera: wystarczy kartka; to ćwiczenie z precyzji, nie z pisania kodu.
📐 Definicje tej lekcji
- Specyfikacja problemu — precyzyjny opis danych (z zakresami), wyniku i warunków, które je łączą.
- Myślenie komputacyjne — sposób rozwiązywania problemów etapami: określenie problemu → model i pojęcia → rozwiązanie (algorytm) → zaprogramowanie i testowanie.
📌 Najważniejsze w pigułce
- Komputer wykonuje polecenia, nie intencje — dlatego problem trzeba opisać ostro, zanim zacznie się go rozwiązywać.
- Specyfikacja = dane + wynik + warunki; zakresy danych to granica odpowiedzialności programu.
- Najdroższe błędy powstają w etapie określania problemu, nie w kodzie.
🎒 Zadania
- Klient mówi: „chcę program, który poleca film na wieczór". Wypisz pięć pytań doprecyzowujących, które zadasz przed napisaniem specyfikacji.
Wskazówka i odpowiedź
Przykładowe: Z jakiej puli filmów wybieramy (własna lista? cały internet)? Co znaczy „poleca" — jeden tytuł czy ranking? Na jakiej podstawie (gatunek, oceny, co użytkownik już widział)? Co, gdy nic nie pasuje? Czy dwa wywołania z rzędu mogą zwrócić to samo? Sedno: każde pytanie zamienia mglistą prośbę w decyzję, którą da się zapisać w specyfikacji.
- Wskaż błąd w specyfikacji: „Dane: liczba $n$. Wynik: pierwiastek z $n$."
Wskazówka i odpowiedź
Co najmniej trzy braki: nie podano zakresu ($n$ ujemne? pierwiastek nie istnieje w liczbach rzeczywistych), nie podano rodzaju liczby (całkowita? rzeczywista?), nie powiedziano, jak dokładny ma być wynik ($\sqrt{2}$ ma nieskończone rozwinięcie — ile cyfr zwracamy?). Poprawiona wersja mogłaby brzmieć: „Dane: liczba rzeczywista $n \ge 0$. Wynik: liczba $w \ge 0$ taka, że $|w^2 - n| < 0{,}0001$".
- Rozpisz na cztery etapy myślenia komputacyjnego problem: „ułóż plan sprzątania mieszkania dla trzech współlokatorów, sprawiedliwy w skali miesiąca". (Tak, to problem informatyczny — spróbuj.)
Wskazówka i odpowiedź
(1) Określenie problemu: dane — lista zadań (z uciążliwością?), lista osób, liczba tygodni; wynik — przydział zadań do osób na każdy tydzień; warunek — suma uciążliwości na osobę możliwie równa, nikt nie robi tego samego dwa tygodnie z rzędu. (2) Model: tabela tygodnie × zadania, uciążliwość jako liczba punktów. (3) Rozwiązanie: np. co tydzień przydzielaj najcięższe wolne zadanie osobie z najmniejszą sumą punktów (poznasz to później jako podejście zachłanne). (4) Zaprogramowanie i testy: sprawdź na 4 tygodniach, spójrz na sumy punktów — czy są bliskie sobie?
🔍 Sprawdź, czy umiesz
- Wyjaśnić koledze różnicę między „co program ma zrobić" a „jak program ma to zrobić".
- Podać przykład danych brzegowych dla problemu „policz średnią z listy ocen".
- Wymienić cztery etapy myślenia komputacyjnego z pamięci — i wskazać, który jest najdroższy w naprawie.