Technikum Klasa I 45 minut PP: I.3 | s. 342

Lekcja 13: Sprawdzanie poprawnosci algorytmow dla przykladowych danych

Testowanie algorytmow, przypadki brzegowe, tabele sledzenia, debugowanie

📋 Podstawa programowa: I.3
algorytmydane testowesledzenietestowanie
00:00
Wprowadzenie
5 min
00:05
Teoria
18 min
00:23
Cwiczenia
17 min
00:40
Podsumowanie
5 min
📚

Teoria

Dlaczego sprawdzamy poprawnosc algorytmow?

Napisanie algorytmu to dopiero polowa sukcesu. Musimy upewnic sie, ze dziala on poprawnie dla wszystkich dopuszczalnych danych wejsciowych. Bledny algorytm moze dawac pozornie dobre wyniki dla niektorych danych, ale zawiesc w innych przypadkach. W profesjonalnym programowaniu bledy w algorytmach moga prowadzic do powaznyz konsekwencji - od strat finansowych po zagrozenie ludzkiego zycia (np. w systemach sterowania samolotami lub urzadzeniach medycznych).

Weryfikacja algorytmow jest kluczowa umiejetnoscia kazdego programisty. Istnieja rozne metody sprawdzania poprawnosci - od recznego sledzenia krokowego, przez testowanie na przykladowych danych, az po formalne dowody matematyczne. Na naszym poziomie skupimy sie na praktycznych metodach testowania, ktore pozwola nam skutecznie wykrywac bledy w algorytmach.

Cytat Dijkstry: "Testowanie moze wykazac obecnosc bledow, ale nigdy ich brak." - Edsger Dijkstra. Mimo to, systematyczne testowanie jest kluczowym narzedziem weryfikacji algorytmow i powinno byc stala czescia procesu programowania.

Metody sprawdzania poprawnosci

  1. Sledzenie krokowe (trace) - reczne wykonanie algorytmu krok po kroku, notujac wartosci wszystkich zmiennych po kazdej operacji. To podstawowa metoda weryfikacji.
  2. Testowanie na przykladowych danych - uruchomienie algorytmu dla wybranych danych i porownanie wynikow z oczekiwanymi wartosciami.
  3. Testowanie przypadkow brzegowych - sprawdzenie algorytmu dla danych ekstremalnych, granicznych i nietypowych.
  4. Analiza logiczna - rozumowanie dlaczego algorytm musi dac poprawny wynik w kazdym przypadku.

Przypadki brzegowe (edge cases)

Przypadki brzegowe to dane wejsciowe, ktore sa w jakis sposob specjalne lub ekstremalne. To wlasnie dla takich danych algorytmy najczesciej zawieraja bledy. Dobry programista zawsze testuje swoj algorytm na przypadkach brzegowych:

  • Pusta tablica lub tablica jednoelementowa (przy sortowaniu i wyszukiwaniu)
  • Liczba 0, 1, 2 (przy badaniu pierwszosci, silni, Fibonacciego)
  • Dwie identyczne liczby (przy obliczaniu NWD)
  • Liczby ujemne (czy algorytm poprawnie je obsluguje?)
  • Dane juz posortowane lub posortowane odwrotnie (przy sortowaniu)
  • Tablica z powtorzeniami (czy stabilnosc sortowania jest zachowana?)
  • Bardzo duze liczby (czy nie nastapi przepelnienie?)

Tabela sledzenia (trace table)

Tabela sledzenia to systematyczne narzedzie do recznego przesledzenia algorytmu. Tworzymy tabele z kolumnami dla kazdej zmiennej i wpisujemy ich wartosci po kazdym kroku algorytmu:

Przyklad: Sledzenie algorytmu silni dla n=4

ALGORYTM Silnia(n):        | Krok | i | wynik
  wynik = 1                |------|---|-------
  DLA i OD 1 DO n:        |  0   | - |   1
    wynik = wynik * i      |  1   | 1 |   1
  ZWROC wynik              |  2   | 2 |   2
                            |  3   | 3 |   6
                            |  4   | 4 |  24
                            | Wynik: 24 (4! = 24, OK)

Strategia testowania algorytmow

Aby skutecznie testowac algorytmy, nalezy przygotowac zestaw przypadkow testowych pokrywajacy rozne kategorie danych. Kazdy test powinien zawierac: dane wejsciowe, oczekiwany wynik i typ testu. Dobrze zaprojektowany zestaw testow powinien obejmowac cztery kategorie:

  1. Test typowy - dane "normalne", latwe do recznej weryfikacji
  2. Test brzegowy - przypadki specjalne (minimalne i maksymalne wartosci)
  3. Test negatywny - dane niepoprawne (czy algorytm je poprawnie odrzuci?)
  4. Test wydajnosciowy - duze dane (czy algorytm zakonczy sie w rozsadnym czasie?)

Przyklad: Testowanie algorytmu badania pierwszosci

ALGORYTM CzyPierwsza(n):
  JESLI n <= 1 ZWROC "NIE"
  JESLI n = 2 ZWROC "TAK"
  JESLI n MOD 2 = 0 ZWROC "NIE"
  DLA i OD 3 DO sqrt(n), KROK 2:
    JESLI n MOD i = 0 ZWROC "NIE"
  ZWROC "TAK"

Zestaw testow:
| Dane  | Oczekiwany | Typ testu     |
|-------|------------|---------------|
| n=0   | NIE        | brzegowy      |
| n=1   | NIE        | brzegowy      |
| n=2   | TAK        | brzegowy      |
| n=7   | TAK        | typowy        |
| n=25  | NIE        | typowy (5*5)  |
| n=97  | TAK        | duza pierwsza |
| n=-5  | NIE        | negatywny     |
✏️

Zadania

Latwe

Zadanie 1: Sledzenie krokowe - NWD Euklidesa

Wykonaj sledzenie krokowe algorytmu Euklidesa (wersja z MOD) dla danych: NWD(84, 36). Wypelnij tabele sledzenia z kolumnami: krok, a, b, r. Zweryfikuj wynik.

Latwe

Zadanie 2: Przypadki brzegowe - sortowanie

Sprawdz, czy algorytm sortowania przez wstawianie dziala poprawnie dla: a) tablica jednoelementowa [5], b) tablica juz posortowana [1,2,3,4], c) tablica posortowana odwrotnie [4,3,2,1], d) tablica z powtorzeniami [3,1,3,1,2].

Srednie

Zadanie 3: Znajdz blad w algorytmie

Algorytm szuka maksimum w tablicy, ale zawiera blad. Znajdz go i popraw: max = 0; DLA i OD 0 DO n-1: JESLI T[i] > max: max = T[i]; ZWROC max. Wskazowka: sprawdz dla tablicy [-3, -1, -5].

Trudne

Zadanie 4: Zaprojektuj kompletny zestaw testow

Zaprojektuj zestaw minimum 8 testow dla algorytmu szyfru Cezara. Dla kazdego testu podaj: dane wejsciowe, oczekiwany wynik, typ testu (typowy/brzegowy/negatywny). Uwzglednij zawijanie liter, klucz zerowy, pusty tekst i znaki specjalne.

🎥

Materialy wideo

R Language Course - 03 04 - Correlation and other statistical parameters of data sets
Jacek Matulewski
NAJSZYBSZY sposób do zostania DATA ANALYST
OSJE - Data Analyst | Data Engineer
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 12 Siatka godzinowa Lekcja 14: Srodowisko programistyczne →