Zapisywanie algorytmów za pomocą pseudokodu

Poznaliśmy metodę zapisywania algorytmów za pomocą schematów blokowychPqfiWgaRoschematów blokowych oraz listy krokówP1F9R2YOQlisty kroków. Pseudokod, czyli kolejny sposób zapisu, ma podobną strukturę, jednak pomijane są w nim kwestie semantycznesemantykasemantyczne oraz składnioweskładniaskładniowe na rzecz prostoty i czytelności.

Pseudokod przypomina języki programowania – można go więc konwertować na kod. Należy przy tym pamiętać, że pseudokod powinien być pisany bez wskazania na konkretny język. Można w nim stosować formuły matematyczne lub zdania w języku naturalnym, jeśli nie zaburza to czytelności.

Pseudokod nie ma jednego standardu zapisu – zazwyczaj korzysta się ze składni, która opiera się na składni istniejących języków programowania. W tym e‑materiale posłużymy się zapisem, który pojawia się w arkuszach maturalnych.

Ważne!

Wszystkie formy zapisu pseudokodu (z wyjątkiem tablic) przedstawione w tym materiale, są zaczerpnięte ze sprawozdania z egzaminu maturalnego Centralnej Komisji Egzaminacyjnej

Wprowadzanie zmiennych

W pseudokodzie nie deklaruje się zmiennych i nie alokuje się jawnie żadnej pamięci, dlatego nowe zmienne mogą pojawiać się bez wcześniejszych zapowiedzi.

W arkuszach maturalnych przypisanie oznaczone jest odwróconą strzałką. Zdarza się też zapis przypisania za pomocą dwukropka i znaku równości.

Przykład 1
Linia 1. wprowadź a. Linia 2. b ← 2 minus a.

Operatory arytmetyczne, relacyjne, logiczne, wartości logiczne

W pseudokodzie możliwe jest zapisywanie operacji arytmetycznych. W tym celu stosuje się następujące operatory arytmetyczne:

  • + operator dodawania,

  • - operator odejmowania,

  • * operator mnożenia,

  • / operator dzielenia,

  • div dzielenie liczb całkowitych,

  • mod dzielenie modulo (reszta z dzielenia), wyłącznie dla liczb całkowitych.

Operatorami porównania (relacyjnymi) używanymi przy zapisie pseudokodu są:

  • < logiczny operator relacji między dwoma wyrażeniami, zwraca wartość prawdziwą, gdy wartość wyrażenia po lewej stronie operatora jest mniejsza od wartości wyrażenia po jego prawej stronie,

  • > logiczny operator relacji między dwoma wartościami, zwraca wartość prawdziwą, gdy wartość po lewej stronie operatora jest większa od wartości po jego prawej stronie,

  • logiczny operator relacji między dwoma wartościami, zwraca wartość prawdziwą, gdy wartość wyrażenia po lewej stronie operatora jest mniejsza lub równa wartości wyrażenia po jego prawej stronie,

  • logiczny operator relacji między dwoma wartościami, zwraca wartość prawdziwą, gdy wartość wyrażenia po lewej stronie operatora jest większa lub równa wartości wyrażenia po jego prawej stronie,

  • = logiczny operator relacji między dwoma wartościami, zwraca wartość prawdziwą, gdy wartości wyrażeń po obu jego stronach są sobie równe,

  • logiczny operator relacji między dwoma wartościami, zwraca wartość prawdziwą, gdy wartości wyrażeń po obu jego stronach są różne od siebie.

Operatory logiczne używane są przy zapisie pseudokodu w formie słów:

  • i – iloczyn logiczny, zwraca wartość prawdziwą, gdy wyrażenia po obu stronach tego operatora są prawdziwe,

  • lub – suma logiczna, zwraca wartość prawdziwą, gdy prawdziwe jest co najmniej jedno z wyrażeń, na których użyto operatora,

  • jest/nie jest – operatory pozwalające na tworzenie wyrażenia, często wykorzystywane są do określenia stanu wyrażenia razem z wartościami logicznymi lub do tworzenia warunków opartych na stanie obiektu.

Wartości logiczne używane w pseudokodzie:

  • prawda – wartość logiczna określająca prawdziwość zdania logicznego,

  • fałsz – wartość logiczna określająca fałszywość zdania logicznego.

Instrukcje warunkowe

Podstawowe słowa kluczowe używane w pseudokodzie przy zapisie instrukcji warunkowych:

  • jeżeli – odpowiednik if w językach programowania,

  • w przeciwnym wypadku – odpowiednik else w językach programowania.

Słowo kluczowe jeżeli sprawia, że blok kodu, który następuje po tym słowie, będzie wykonany raz, jeżeli warunek występujący po tym słowie będzie spełniony.

Przykład 2
Linia 1. kropka kropka kropka. Linia 2. jeżeli a zamknij nawias ostrokątny b wykonuj. Linia 3. wypisz cudzysłów początek bloku cudzysłów. Linia 4. wypisz cudzysłów a większe od b cudzysłów. Linia 5. wypisz cudzysłów koniec bloku cudzysłów.

Wcięcia w linijkach 3‑5 wyznaczają zakres bloku, który podporządkowany jest słowu kluczowemu jeżeli. Kod tam się znajdujący zostanie wykonany, jeśli będzie spełniony warunek przy słowie kluczowym.

Zwrot w przeciwnym wypadku oznacza alternatywę dla kodu wykonywanego w przypadku spełnienia warunku zapisanego przy słowie kluczowym jeżeli. Jest wykonywany w przypadku niespełnienia tego warunku. Analogicznie jak instrukcja else jest umieszczana po instrukcji if, tak instrukcja w przeciwnym razie musi być umieszczona w instrukcji jeżeli.

Przykład 3
Linia 1. kropka kropka kropka. Linia 2. jeżeli a zamknij nawias ostrokątny b. Linia 3. wypisz cudzysłów początek bloku cudzysłów. Linia 4. wypisz cudzysłów a większe od b cudzysłów. Linia 5. wypisz cudzysłów koniec bloku cudzysłów. Linia 6. w przeciwnym razie. Linia 7. wypisz cudzysłów początek bloku cudzysłów. Linia 8. wypisz cudzysłów a nie większe od b cudzysłów. Linia 9. wypisz cudzysłów koniec bloku cudzysłów.

Wcięcia w linijkach 3‑5 wyznaczają zakres bloku, który podporządkowany jest słowu kluczowemu jeżeli. Kod tam się znajdujący zostanie wykonany, jeśli spełniono warunek przy słowie kluczowym.

Wcięcia w linijkach 7‑9 wyznaczają zakres bloku, który podporządkowany jest zwrotowi w przeciwnym razie. Kod ten zostanie wykonany, gdy nie będzie spełniony warunek po słowie kluczowym jeżeli.

Instrukcje warunkowe, zgodnie z nazwą, sugerują zawieranie warunku, od którego zależy ich wykonanie. Te warunki to zdania logiczne, wykorzystujące operatory porównania i operatory logiczne.

Pętle

Pętla jest to konstrukcja pozwalająca na cykliczne wykonywanie zawartego w niej fragmentu kodu, tak długo jak długo spełniony jest zawarty w niej warunek. W pseudokodzie podstawowymi słowami występującymi przy zapisie pętli są:

  • dopóki – instrukcja powtarzania, odpowiednik polecenia while w językach programowania, w połączeniu z warunkiem i słowem kluczowym wykonaj pozwala na powtarzalne wykonywanie sparowanego z nim kodu, tak długo jak długo spełniony jest warunek,

  • wykonuj – instrukcja powtarzania, może być wykorzystana jak polecenie do w językach programowania, wraz ze słowem kluczowym dopóki i warunkiem pozwala na zapisanie pętli odpowiadającej pętli do ... while w językach programowania; instrukcja służy do sygnalizowania, jaki fragment kodu jest zawarty w pętli,

  • dla – instrukcja iteracji, słowo kluczowe do stworzenia pętli odpowiadającej pętli for w językach programowania, pozwala na wykonanie zawartego w pętli kodu określoną liczbę razy.

Słowo kluczowe dopóki powoduje, że blok, który po nim następuje, będzie wykonywany, dopóki warunek zapisany po słowie kluczowym pozostaje spełniony.

Przykład 4
Linia 1. kropka kropka kropka. Linia 2. dopóki a zamknij nawias ostrokątny b wykonuj. Linia 3. wypisz cudzysłów początek bloku cudzysłów. Linia 4. wypisz cudzysłów a większe od b cudzysłów. Linia 5. wypisz cudzysłów koniec bloku cudzysłów.

Wcięcia w linijkach 3‑5 wyznaczają zakres bloku kodu, który podporządkowany jest słowu kluczowemu dopóki i który będzie wykonywany tak długo, jak długo pozostanie spełniony warunek podany w tej konstrukcji.

Słowo kluczowe wykonuj może być wykorzystane do stworzenia kolejnego rodzaju pętli, która zawsze wykona się co najmniej raz i będzie powtarzana tak długo, jak długo będzie spełniony warunek (w językach programowania to pętla do ... while). Jej konstrukcja jest podobna do poprzedniej z przedstawianych pętli, jednak blok kodu znajduje się między słowami kluczowymi wykonuj oraz dopóki.

Przykład 5
Linia 1. kropka kropka kropka. Linia 2. wykonuj. Linia 3. wypisz cudzysłów a większe od b cudzysłów. Linia 4. a ← a minus b. Linia 5. dopóki a zamknij nawias ostrokątny b.

Blok kodu zawarty w pętli (linie 3‑4) zawsze wykona się co najmniej raz, niezależnie od wartości logicznej zawartego w niej warunku. Od spełnienia warunku zależeć będą kolejne powtórzenia pętli

Słowo kluczowe dla pozwala na stworzenie pętli pozwalającej na powtórzenie zawartego w niej kodu określoną liczbę razy (pętla for w językach programowania). Pętla ta zamiast warunku zawiera zmienną, której przypisujemy dozwolony zakres wartości i ustalamy, w jaki sposób ma zmieniać swoje wartości (np. rosnąć o 1, wzrastać dwukrotnie i tak dalej). Warto zwrócić uwagę, że w instrukcji dla wartość przypisujemy znakiem =.

Przykład 6
Linia 1. kropka kropka kropka. Linia 2. dla n znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek k wykonuj. Linia 3. wypisz n.

Funkcje

Kolejną istotną notacjąNotacjanotacją jest sposób zapisu funkcji. Funkcje i procedury to wydzielone części programu wykonujące jakieś operacje, które mogą zostać wywołane podczas działania programu. Mogą one przyjmować argumenty i zwracać wartości. W pseudokodzie będziemy je zapisywać następująco:

Linia 1. funkcja nazwa otwórz nawias okrągły argument1 przecinek argument2 kropka kropka kropka kropka przecinek argumentN zamknij nawias okrągły otwórz nawias ostrokątny span aria minus label znak równości cudzysłów dwukropek cudzysłów role znak równości cudzysłów math cudzysłów data minus editor minus tag znak równości cudzysłów latex cudzysłów data minus editor minus latex znak równości cudzysłów dwukropek cudzysłów zamknij nawias ostrokątny otwórz nawias ostrokątny script type znak równości cudzysłów math prawy ukośnik tex cudzysłów zamknij nawias ostrokątny dwukropek otwórz nawias ostrokątny prawy ukośnik script zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik span zamknij nawias ostrokątny. Linia 2. kropka kropka kropka kropka. Linia 3. zwróc kropka kropka kropka.

W miejsce elementu nazwa wpisujemy nazwę funkcji, której chcemy użyć. Argumentów może być nieskończenie wiele – taka notacja stanowi alternatywę dla pisania wprowadź a, wprowadź b, wprowadź.... Oto przykładowa funkcja zapisana w pseudokodzie:

Linia 1. funkcja przykład otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły dwukropek. Linia 2. jeźeli a zamknij nawias ostrokątny b. Linia 3. zwróć c. Linia 4. w przeciwnym razie. Linia 5. zwróć b.

Załóżmy, że jej argumentami są liczby naturalne:

Linia 1. a znak równości 1. Linia 2. b znak równości 2. Linia 3. c znak równości 3.

Funkcję wywołamy następująco:

Linia 1. funkcja przykład otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły dwukropek. Linia 2. jeźeli a zamknij nawias ostrokątny b. Linia 3. zwróć c. Linia 4. w przeciwnym razie. Linia 5. zwróć b. Linia 7. przykład otwórz nawias okrągły 1 przecinek 2 przecinek 3 zamknij nawias okrągły.

W pierwszym kroku sprawdzamy, czy 1 jest większe od 2. Nie jest, więc pomijamy instrukcję zawartą w linijce 3.

Od razu przechodzimy do linijek 4 oraz 5, zwracamy zatem liczbę 2.

Tablice

Tablica jest to kontener przechowujący dane tego samego typu, w których dane dostępne są za pomocą indeksów, najczęściej przyjmujące wartości liczbowe. Zapisując pseudokod przy nazwie tablicy w nawiasach kwadratowych, musimy zapisać zakres indeksów, czyli od jakiego indeksu zaczyna się numeracja elementów tablicy i na jakim się kończy. Odczyt elementu z tablicy zapisujemy w postaci nazwy tablicy i wybranego indeksu w nawiasach kwadratowych.

W pseudokodzie indeksy tablicy zazwyczaj zaczynają się od 1, ale coraz częściej numeruje się od 0, co jest zgodne z językami programowania, których wykorzystanie jest dopuszczone na egzaminie maturalnym.

Linia 1. tablica otwórz nawias kwadratowy 1 kropka kropka 200 zamknij nawias kwadratowy. Linia 2. wypisz tablica otwórz nawias kwadratowy 8 zamknij nawias kwadratowy.

W ten sam sposób można też w pseudokodzie zapisać inne struktury o dostępie swobodnym, w razie potrzeby zastępując indeks wybranym kluczem.

Ważne!

Konstrukcje przedstawione są zgodnie ze sprawozdaniem z egzaminu maturalnego sporządzonym przez CKE, jednak nie są to wszystkie polecenia potrzebne do zapisania bardziej złożonych algorytmów. Problem ten jest rozwiązywany dzięki temu, że w pseudokodzie rezygnuje się ze ścisłych reguł składniowych i zezwala na opisywanie bardziej skomplikowanych instrukcji (które nie zostały przedstawione w tym e‑materiale) oraz kroków algorytmów w języku naturalnym.

Przykłady

Potrafimy już zapisać algorytmy za pomocą listy kroków oraz schematu blokowego, pora więc na przeprowadzenie ich konwersji do pseudokodu.

Algorytm liniowy

Zapoznajmy się ze specyfikacją algorytmuspecyfikacja algorytmuspecyfikacją algorytmu, który oblicza czas potrzebny na pokonanie drogi s2 na podstawie tego, ile czasu (t1) zajęło pokonanie drogi s1.

Zakładamy, że droga pokonywana jest z taką samą prędkością.

Specyfikacja problemu:

Dane:

  • t1 – liczba rzeczywista; czas przebycia poprzedniej drogi wyrażony w godzinach

  • s1 – liczba rzeczywista; długość wcześniejszej drogi wyrażona w kilometrach

  • s2 – liczba rzeczywista; długość drogi wyrażona w kilometrach

Wynik:

  • t2 – liczba rzeczywista; czas przebycia drogi wyrażony w godzinach

Gdy podamy niezbędne dane, musimy obliczyć prędkość, z jaką poruszano się przy pokonywaniu drogi s1. Prędkość obliczamy, dzieląc pokonaną drogę przez czas potrzebny na jej pokonanie. Korzystamy tu ze wzoru na prędkość:

V = st

gdzie:

  • V to prędkość wyrażona w kilometrach na godzinę

  • t to czas wyrażony w godzinach

  • s to długość drogi wyrażona w kilometrach

Przekształcamy ten wzór, aby uzyskać wzór na czas potrzebny na pokonanie danej drogi:

 t= sV

Podstawiamy odpowiednie wartości do wzoru i obliczamy wynik.

Lista kroków

  1. Podaj t1.

  2. Podaj s1.

  3. Podaj s2.

  4. Przypisz zmiennej V wynik dzielenia s1 przez t1.

  5. Przypisz zmiennej t2 wynik dzielenia s2 przez V.

  6. Wyświetl wartość zmiennej t2.

  7. Zakończ działanie algorytmu.

Pseudokod

Linia 1. wprowadź t1. Linia 2. wprowadź s1. Linia 3. wprowadź s2. Linia 4. V ← s1 prawy ukośnik t1. Linia 5. t2 ← s2 prawy ukośnik V. Linia 6. wypisz t2.

Algorytm rozgałęziony

Zapoznajmy się ze specyfikacją algorytmu sprawdzającego, czy dana liczba jest liczbą dodatnią.

Specyfikacja problemu:

Dane:

  • liczba – liczba rzeczywista

Wynik:

  • komunikat Liczba nie jest dodatnia lub Liczba jest dodatnia

Ważne!

Zakładamy, że 0 nie jest liczbą dodatnią.

Schemat blokowy

R1doNdda8bkZ2
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Pseudokod

Linia 1. wprowadź liczba. Linia 2. jeżeli liczba zamknij nawias ostrokątny 0. Linia 3. wypisz cudzysłów Liczba jest dodatnia cudzysłów. Linia 4. w przeciwnym razie. Linia 5. wypisz cudzysłów Liczba nie jest dodatnia cudzysłów.

Algorytm z pętlą

Zapoznajmy się z przykładowym algorytmem obliczania sumy liczb naturalnych w danym przedziale. Zakładamy, że liczba1 jest mniejsza od liczba2.

Specyfikacja problemu:

Dane:

  • liczba1 – liczba naturalna; początek przedziału; liczba1 < liczba2

  • liczba2 – liczba naturalna; koniec przedziału; liczba2 > liczba1

Wynik:

  • suma – liczba naturalna; suma liczb naturalnych w danym przedziale

Lista kroków

  1. Podaj liczba1.

  2. Podaj liczba2.

  3. Przypisz zmiennej i wartość liczba1.

  4. Przypisz zmiennej suma wartość liczba1.

  5. Zwiększ wartość zmiennej i o 1.

  6. Dodaj do zmiennej suma wartość zmiennej i.

  7. Jeżeli:

    • i jest równa liczba2

      • przejdź do kroku 8.

    • i jest różna od liczba2

      • wróć do kroku 5.

  8. Wyświetl wartość zmiennej suma.

  9. Zakończ działanie algorytmu.

Pseudokod

Linia 1. wprowadź liczba1. Linia 2. wprowadź liczba2. Linia 3. i ← liczba1. Linia 4. suma ← liczba1. Linia 6. dopóki i wykrzyknik znak równości liczba2. Linia 7. i ← i plus 1. Linia 8. suma ← suma plus i. Linia 10. wypisz suma.

Algorytm z tablicą

Zapoznajmy się z przykładowym algorytmem sortującym liczby przechowywane w tablicy niemalejąco. Algorytm wykorzystuje również pętle i instrukcje warunkowe. Więcej o tym algorytmie możesz przeczytać w materiale dotyczącym sortowania bąbelkowegoPCfvfjgLkbąbelkowego.

Specyfikacja problemu:

Dane:

  • n – liczba naturalna; liczba elementów tablicy tablica

  • tablican-elementowa tablica nieposortowanych liczb rzeczywistych

Wynik:

  • tablican-elementowa tablica posortowanych niemalejąco liczb rzeczywistych

Pseudokod

Linia 1. n ← 200. Linia 2. tablica otwórz nawias kwadratowy 1 kropka kropka n zamknij nawias kwadratowy. Linia 4. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 5. dla j znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek n minus otwórz nawias okrągły i minus 1 zamknij nawias okrągły wykonuj. Linia 6. jeżeli tablica otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy zamknij nawias ostrokątny tablica otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 7. tymczasowy ← tablica otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy. Linia 8. tablica otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy ← tablica otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 9. tablica otwórz nawias kwadratowy j zamknij nawias kwadratowy ← tymczasowy. Linia 11. wypisz tablica.

Słownik

funkcja i procedura
funkcja i procedura

inaczej podprogram, czyli ciąg instrukcji zawartych w bloku, który może być wielokrotnie wykorzystywany w różnych miejscach programu; funkcja zwyczajowo zwraca wartość, a procedura nie zwraca

notacja
notacja

ustalony sposób zapisu

semantyka
semantyka

dziedzina nauki zajmująca się znaczeniem wyrazów oraz badaniem związków zachodzących między wyrażeniami języka a przedmiotami, do których się odnoszą

składnia
składnia

nauka zajmująca się budową wypowiedzeń (zdań); bada funkcje elementów zdania i zależności między nimi

specyfikacja algorytmu
specyfikacja algorytmu

(specyfikacja problemu) opisanie problemu przez podanie danych, z których korzysta algorytm oraz określenie wyniku, który ma być efektem działania algorytmu