Zapis algorytmu — lista kroków, schemat blokowy i pseudokod
Zanim zaczniesz pisać, musisz wiedzieć, co napisać. Poznasz cztery sposoby zapisania pomysłu bez składni C#, a przy okazji nauczysz się czytać schematy blokowe z arkuszy egzaminacyjnych.
Czego się dziś nauczysz
- Wymienisz cechy, które musi mieć algorytm
- Zapiszesz algorytm jako ponumerowaną listę kroków z opisem danych i wyniku
- Odczytasz i narysujesz schemat blokowy z poprawnymi symbolami
- Zapiszesz algorytm w pseudokodzie niezwiązanym z żadnym językiem
- Ułożysz drzewo decyzyjne i sprawdzisz, czy przypadki są kompletne i rozłączne
Przygotowanie: lekcje 01–21. Przewidywany czas: 45–90 minut z zadaniami. Przykłady wymagają .NET 8 lub nowszego, z włączonymi ImplicitUsings i Nullable.
Algorytm to przepis, nie program
Do tej pory każdy pomysł zapisywałeś od razu w C#. To wygodne, dopóki pomysł jest prosty. Przy trudniejszym zadaniu składnia zaczyna przeszkadzać: zamiast myśleć o tym, co ma się wydarzyć, walczysz ze średnikami i nawiasami.
Algorytm to skończony, uporządkowany opis czynności prowadzących do rozwiązania zadania. Nie jest przypisany do żadnego języka — ten sam algorytm zapiszesz w C#, w Pythonie i na kartce.
| Cecha algorytmu | Co znaczy |
|---|---|
| skończoność | kończy się po skończonej liczbie kroków — dla każdych dopuszczalnych danych |
| określoność | każdy krok jest jednoznaczny; „mniej więcej podziel” nie jest krokiem |
| dane wejściowe | wiadomo, co algorytm dostaje i jakie wartości są dopuszczalne |
| wynik | wiadomo, co ma oddać — także w przypadkach szczególnych |
| uniwersalność | rozwiązuje całą klasę zadań, nie jeden konkretny przypadek |
| poprawność | dla poprawnych danych daje poprawny wynik; to trzeba uzasadnić, nie założyć |
Dlaczego to jest w podstawie programowej
Na egzaminie zawodowym w części pisemnej pojawiają się zadania z gotowym schematem blokowym do odczytania: „co wypisze algorytm dla n = 5″. W części praktycznej bywa polecenie zapisania algorytmu przed implementacją. Obu rzeczy nie da się zrobić „intuicyjnie” — trzeba znać symbole i zasady.
Lista kroków — najprostszy zapis
Lista kroków to ponumerowane zdania w języku naturalnym. Wystarczy kartka i to jest jej największa zaleta: zapisujesz pomysł szybciej, niż zdążyłbyś otworzyć edytor.
Algorytm: najwiekszy wspolny dzielnik dwoch liczb (Euklides)
Dane wejsciowe: a, b — liczby calkowite dodatnie
Wynik: NWD liczb a i b
Krok 1. Wczytaj a i b.
Krok 2. Jezeli b = 0, to przejdz do kroku 6.
Krok 3. Podstaw r <- reszta z dzielenia a przez b.
Krok 4. Podstaw a <- b, a nastepnie b <- r.
Krok 5. Wroc do kroku 2.
Krok 6. Wypisz a jako wynik.
Krok 7. Koniec.
- Kroki są ponumerowane — dzięki temu można się do nich odwołać („wróć do kroku 2″).
- Nad listą zapisujemy dane wejściowe i wynik. Bez tego nie wiadomo, czego algorytm oczekuje.
- Strzałka
<-oznacza podstawienie, a nie porównanie. Do porównania używamy znaku=. - Ostatni krok to zawsze Koniec.
Najczęstszy błąd w liście kroków
Krok „Powtarzaj, aż b będzie równe 0″ opisuje pętlę jednym zdaniem i wygląda dobrze — ale nie widać z niego, co dokładnie się powtarza i gdzie kończy się powtarzana część. Jeżeli używasz takiego skrótu, zaznacz zakres: „Powtarzaj kroki 3–4, dopóki b jest różne od 0″.
Schemat blokowy — rysunek zamiast zdań
Schemat blokowy pokazuje przebieg algorytmu jako figury połączone strzałkami. Każdy kształt ma ustalone znaczenie i nie wolno go używać dowolnie.
| Symbol | Nazwa | Znaczenie | Wejścia / wyjścia |
|---|---|---|---|
| owal | blok graniczny | START albo STOP | start: 0 wejść, 1 wyjście; stop: 1 wejście, 0 wyjść |
| równoległobok | blok wejścia-wyjścia | wczytanie danych albo wypisanie wyniku | 1 wejście, 1 wyjście |
| prostokąt | blok operacyjny | obliczenie, podstawienie wartości | 1 wejście, 1 wyjście |
| romb | blok decyzyjny | warunek logiczny | 1 wejście, 2 wyjścia: TAK i NIE |
| strzałka | połączenie | kolejność wykonywania | — |
Ten sam algorytm Euklidesa w postaci schematu:
┌───────────┐
│ START │
└─────┬─────┘
│
╔═══════▼═══════╗
║ wczytaj a, b ║ blok wejscia
╚═══════╤═══════╝
│
▼
╱───────╲
╱ b = 0 ╲ ────TAK────┐
╲ ? ╱ │
╲───────╱ │
│NIE │
┌───────▼───────┐ │
│ r <- a mod b │ │
└───────┬───────┘ │
┌───────▼───────┐ │
│ a <- b │ │
│ b <- r │ │
└───────┬───────┘ │
│ │
└────powrot───────┼──┐
│ │
╔═══════▼══╧════╗
║ wypisz a ║ blok wyjscia
╚═══════╤═══════╝
┌───▼───┐
│ STOP │
└───────┘
Trzy błędy, które od razu widać na schemacie
1. Romb z jednym wyjściem — warunek musi rozdzielać przebieg na dwie drogi. 2. Brak bloku STOP albo strzałka wychodząca ze STOP. 3. Obliczenie narysowane w rombie albo warunek w prostokącie — kształt jest częścią znaczenia, nie ozdobą.
Czym rysować
Na kartce wystarczy ołówek. Na komputerze: draw.io (darmowe, działa w przeglądarce), PapDesigner albo narzędzie do schematów w pakiecie biurowym. Na egzaminie pisemnym schematy czytasz, nie rysujesz — dlatego ważniejsze od estetyki jest to, żebyś umiał prześledzić gotowy schemat krok po kroku dla podanych danych.
Pseudokod — pomiędzy zdaniem a kodem
Pseudokod wygląda jak program, ale nie jest w żadnym języku. Pomija to, co nieistotne dla pomysłu — deklaracje typów, nawiasy klamrowe, średniki — a zachowuje strukturę: warunki, pętle, podstawienia.
funkcja NWD(a, b)
dopoki b <> 0 wykonuj
r <- a mod b
a <- b
b <- r
koniec dopoki
zwroc a
koniec funkcji
funkcja Silnia(n)
jezeli n <= 1 to
zwroc 1
w przeciwnym razie
zwroc n * Silnia(n - 1)
koniec jezeli
koniec funkcji
| W pseudokodzie | W C# |
|---|---|
<- | = (przypisanie) |
=, <> | ==, != (porównanie) |
jezeli … to … w przeciwnym razie | if … else |
dopoki … wykonuj | while |
dla i od 1 do n | for |
zwroc | return |
| wcięcia | nawiasy klamrowe |
Pseudokod to nie „C# z literówkami”
Zapis Console.WriteLine(a); w pseudokodzie jest błędem — to konkretny język i konkretna biblioteka. Napisz wypisz a. Sensem pseudokodu jest oderwanie pomysłu od narzędzia; jeśli przepisujesz C# bez średników, równie dobrze możesz od razu pisać program.
Drzewo decyzyjne — gdy warunków jest wiele
Kiedy wynik zależy od kilku warunków po kolei, schemat blokowy robi się długi i wąski. Drzewo decyzyjne pokazuje wszystkie możliwe odpowiedzi naraz — każda gałąź to jedna droga przez warunki, a liść to wynik.
liczba punktow
│
┌───────────┴───────────┐
>= 90? < 90?
│ │
[ celujacy ] ┌──────────┴──────────┐
>= 75? < 75?
│ │
[ bardzo dobry ] ┌───────────┴──────────┐
>= 50? < 50?
│ │
[ dostateczny ] [ niedostateczny ]
Drzewo od razu odpowiada na dwa pytania, o które łatwo się potknąć w kodzie: czy każda gałąź kończy się wynikiem (czy nie zapomniałem o jakimś przypadku) i czy gałęzie się nie nakładają (czy dla 90 punktów nie pasują dwie).
Kolejność warunków ma znaczenie
Zapisz drzewo od najostrzejszego warunku do najłagodniejszego, dokładnie tak jak w łańcuchu else if z lekcji 14. Gdybyś zaczął od >= 50, wynik „dostateczny” przechwyciłby także ucznia ze stu punktami — a na drzewie taki błąd widać, zanim napiszesz pierwszą linijkę.
Przykład: ten sam algorytm w czterech postaciach
Zadanie: sprawdzić, czy podany rok jest przestępny. Reguła: rok jest przestępny, gdy dzieli się przez 4, ale nie przez 100 — chyba że dzieli się przez 400.
1. Lista kroków
Dane wejsciowe: rok — liczba calkowita dodatnia
Wynik: informacja, czy rok jest przestepny
Krok 1. Wczytaj rok.
Krok 2. Jezeli rok mod 400 = 0, to przejdz do kroku 6.
Krok 3. Jezeli rok mod 100 = 0, to przejdz do kroku 7.
Krok 4. Jezeli rok mod 4 = 0, to przejdz do kroku 6.
Krok 5. Przejdz do kroku 7.
Krok 6. Wypisz "przestepny" i przejdz do kroku 8.
Krok 7. Wypisz "zwykly".
Krok 8. Koniec.
2. Schemat blokowy
┌───────┐ ╱────────────╲
│ START │ ╱ rok mod 100 ╲──TAK──> [ zwykly ]
└───┬───┘ ╲ = 0 ? ╱
│ ╲────────────╱
╔═══════▼═══════╗ ▲ NIE
║ wczytaj rok ║ │ ╱────────────╲
╚═══════╤═══════╝ └────────╱ rok mod 4 ╲──TAK──> [ przestepny ]
│ ╲ = 0 ? ╱
╱──────▼───────╲ ╲───────────╱
╱ rok mod 400 ╲──TAK──> [ przestepny ] │ NIE
╲ = 0 ? ╱ ▼
╲──────┬───────╱ [ zwykly ]
│ NIE
└──────> (do warunku rok mod 100)
3. Pseudokod
funkcja CzyPrzestepny(rok)
jezeli rok mod 400 = 0 to
zwroc prawda
jezeli rok mod 100 = 0 to
zwroc falsz
jezeli rok mod 4 = 0 to
zwroc prawda
zwroc falsz
koniec funkcji
4. Program w C#
class Program
{
static bool CzyPrzestepny(int rok)
{
if (rok % 400 == 0) return true;
if (rok % 100 == 0) return false;
if (rok % 4 == 0) return true;
return false;
}
static void Main()
{
int[] proby = { 2024, 1900, 2000, 2023 }; // tablice poznasz w nastepnej lekcji
Console.WriteLine($"2024: {CzyPrzestepny(2024)}");
Console.WriteLine($"1900: {CzyPrzestepny(1900)}");
Console.WriteLine($"2000: {CzyPrzestepny(2000)}");
Console.WriteLine($"2023: {CzyPrzestepny(2023)}");
}
}
2024: True
1900: False
2000: True
2023: False
Co dzieje się po kolei
- Wszystkie cztery zapisy opisują to samo. Różni je tylko szczegółowość i odbiorca: lista kroków dla człowieka, schemat dla oceny przebiegu, pseudokod dla programisty, C# dla komputera.
- Kolejność warunków jest tu kluczowa i widać ją w każdym zapisie: najpierw 400, potem 100, na końcu 4. Zamiana pierwszego z trzecim zepsuje rok 1900.
- Lista kroków musi używać skoków („przejdź do kroku 6″), bo nie ma w niej zagnieżdżania. Pseudokod ma
zwroc, więc skoki znikają — i to jest jego przewaga. - Rok 1900 to najlepszy przypadek testowy tego algorytmu: dzieli się przez 4 i przez 100, ale nie przez 400. Program, który go nie sprawdza, przechodzi testy i jest błędny.
Który zapis do czego
| Zapis | Mocna strona | Kiedy używać |
|---|---|---|
| Lista kroków | najszybszy do napisania, nie wymaga niczego poza kartką | pierwszy szkic pomysłu, tłumaczenie algorytmu komuś innemu |
| Schemat blokowy | widać przebieg i wszystkie rozgałęzienia naraz | dokumentacja, analiza cudzego algorytmu, zadania egzaminacyjne |
| Pseudokod | blisko kodu, a wciąż niezależny od języka | projekt przed implementacją, opis algorytmu w dokumentacji |
| Drzewo decyzyjne | pokazuje kompletność i rozłączność przypadków | klasyfikacja, wiele warunków, reguły biznesowe |
| Kod w C# | da się uruchomić | na końcu, gdy pomysł jest już zapisany |
Kolejność pracy, która oszczędza czas
Zapisz algorytm, prześledź go na kartce dla dwóch typowych i jednego brzegowego zestawu danych, dopiero potem pisz kod. Błąd w pomyśle znaleziony na kartce kosztuje minutę; ten sam błąd znaleziony po godzinie pisania kosztuje godzinę.
Na co uważać
| Zapis | Problem |
|---|---|
| Romb z jednym wyjściem | Warunek musi rozdzielać przebieg na TAK i NIE. Jedno wyjście oznacza, że to nie jest decyzja. |
Brak bloku STOP | Algorytm bez zakończenia nie spełnia warunku skończoności — a na egzaminie jest to błąd podstawowy. |
| Niepodpisane wyjścia rombu | Bez etykiet TAK i NIE schemat da się odczytać na dwa sposoby, czyli na żaden. |
Console.WriteLine w pseudokodzie | Pseudokod nie należy do żadnego języka. Napisz wypisz. |
| Brak opisu danych i wyniku | Nie wiadomo, co algorytm dostaje i co oddaje. To pierwsze, czego szuka oceniający. |
| Krok „oblicz wynik” | To nie jest krok, tylko nazwa całego zadania. Każdy krok musi być jednoznaczny i wykonalny. |
| Sprawdzenie tylko typowych danych | Prześledź algorytm także dla zera, wartości ujemnej i największego dopuszczalnego przypadku. |
Zadania
Weź schemat Euklidesa z tej lekcji i prześledź go na kartce dla a = 84, b = 36. Zapisz w tabeli wartości a, b i r po każdym obiegu. Sprawdź, ile obiegów wykonał algorytm.
Dla zadania „wczytaj liczbę i wypisz, czy jest parzysta” zapisz listę kroków, pseudokod i schemat blokowy. Dopiero potem napisz program i porównaj go ze swoim pseudokodem.
Zapisz w pseudokodzie algorytm liczący sumę cyfr liczby całkowitej dodatniej. Użyj pętli, operatorów mod i dzielenia całkowitego. Prześledź go dla 4738 i zapisz stan zmiennych po każdym obiegu, a potem zaimplementuj w C# i sprawdź, czy wyniki się zgadzają.
Firma nalicza koszt wysyłki: do 1 kg — 12 zł; do 5 kg — 18 zł; powyżej 5 kg — 18 zł plus 3 zł za każdy rozpoczęty kilogram ponad 5. Przesyłka pobraniowa kosztuje dodatkowo 5 zł. Narysuj drzewo decyzyjne, sprawdź, czy przypadki się nie nakładają, i dopiero potem napisz metodę decimal Koszt(double waga, bool pobranie).
Narysuj schemat blokowy algorytmu, który wypisuje tabliczkę mnożenia od 1 do 5. Zwróć uwagę na to, gdzie wraca strzałka pętli wewnętrznej, a gdzie zewnętrznej — to najczęstsze miejsce pomyłki. Zaimplementuj i porównaj wynik ze swoim schematem.
Prześledź podany schemat i odpowiedz, co wypisze dla n = 5, zanim napiszesz kod: START → wczytaj n → w <- 1 → i <- 1 → [i <= n ?] TAK → w <- w * i → i <- i + 1 → powrót do warunku; NIE → wypisz w → STOP. Nazwij ten algorytm, zapisz go w pseudokodzie i zaimplementuj w C#. Następnie odpowiedz, co algorytm wypisze dla n = 0, i oceń, czy to poprawny wynik.
Co trzeba zapamiętać
- Algorytm to opis czynności niezależny od języka programowania — musi być skończony, jednoznaczny i mieć określone dane oraz wynik.
- Lista kroków jest ponumerowana i zaczyna się od opisu danych wejściowych i wyniku.
- W schemacie blokowym kształt niesie znaczenie: owal graniczny, prostokąt operacja, romb decyzja z dwoma wyjściami, równoległobok wejście-wyjście.
- Pseudokod ma strukturę programu, ale nie należy do żadnego języka — nie ma w nim
Console.WriteLine. - Drzewo decyzyjne pokazuje, czy przypadki są kompletne i rozłączne.
- Zapisz algorytm i prześledź go na kartce, zanim napiszesz pierwszą linijkę kodu.
Dokumentacja: Microsoft Learn — temat tej lekcji.