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:

  1. Określenie problemu — co dokładnie mamy rozwiązać (specyfikacja: dane, wynik, warunki).
  2. Dobór modelu i pojęć — jak przedstawić sytuację: liczbami? listą? tabelą? (O reprezentacjach — cały dział 2.)
  3. Znalezienie rozwiązania — ułożenie przepisu, czyli algorytmu (jednostka 1.2).
  4. 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

  1. 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.

  1. 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$".

  1. 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.

Ucz się tej jednostki z asystentem