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.

C# schemat blokowy pseudokod lista kroków 50 min
CEL LEKCJI

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.

TEORIA

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 algorytmuCo 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ściowewiadomo, co algorytm dostaje i jakie wartości są dopuszczalne
wynikwiadomo, 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.

TEORIA

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.

lista kroków
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″.

TEORIA

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.

SymbolNazwaZnaczenieWejścia / wyjścia
owalblok granicznySTART albo STOPstart: 0 wejść, 1 wyjście; stop: 1 wejście, 0 wyjść
równoległobokblok wejścia-wyjściawczytanie danych albo wypisanie wyniku1 wejście, 1 wyjście
prostokątblok operacyjnyobliczenie, podstawienie wartości1 wejście, 1 wyjście
rombblok decyzyjnywarunek logiczny1 wejście, 2 wyjścia: TAK i NIE
strzałkapołączeniekolejność wykonywania—

Ten sam algorytm Euklidesa w postaci schematu:

schemat blokowy
┌───────────┐
            │   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.

TEORIA

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.

pseudokod
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 pseudokodzieW C#
<-= (przypisanie)
=, <>==, != (porównanie)
jezeli … to … w przeciwnym razieif … else
dopoki … wykonujwhile
dla i od 1 do nfor
zwrocreturn
wcięcianawiasy 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.

TEORIA

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.

drzewo decyzyjne
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

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

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

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

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#

Program.cs
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)}");
    }
}
wynik w konsoli
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.
ELEMENTY WBUDOWANE

Który zapis do czego

ZapisMocna stronaKiedy używać
Lista krokównajszybszy do napisania, nie wymaga niczego poza kartkąpierwszy szkic pomysłu, tłumaczenie algorytmu komuś innemu
Schemat blokowywidać przebieg i wszystkie rozgałęzienia narazdokumentacja, analiza cudzego algorytmu, zadania egzaminacyjne
Pseudokodblisko kodu, a wciąż niezależny od językaprojekt przed implementacją, opis algorytmu w dokumentacji
Drzewo decyzyjnepokazuje kompletność i rozłączność przypadkówklasyfikacja, 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ę.

CZĘSTE BŁĘDY

Na co uważać

ZapisProblem
Romb z jednym wyjściemWarunek musi rozdzielać przebieg na TAK i NIE. Jedno wyjście oznacza, że to nie jest decyzja.
Brak bloku STOPAlgorytm bez zakończenia nie spełnia warunku skończoności — a na egzaminie jest to błąd podstawowy.
Niepodpisane wyjścia rombuBez etykiet TAK i NIE schemat da się odczytać na dwa sposoby, czyli na żaden.
Console.WriteLine w pseudokodziePseudokod nie należy do żadnego języka. Napisz wypisz.
Brak opisu danych i wynikuNie 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 danychPrześledź algorytm także dla zera, wartości ujemnej i największego dopuszczalnego przypadku.
ZADANIA

Zadania

ZAD 1Przeczytaj cudzy schemat★☆☆

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.

ZAD 2Trzy zapisy jednego zadania★☆☆

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.

ZAD 3Suma cyfr★★☆

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

ZAD 4Drzewo dla przesyłki★★☆

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

ZAD 5Schemat z pętlą zagnieżdżoną★★☆

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.

ZAD 6Od schematu do programu★★★

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.

PODSUMOWANIE

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.