Sprawdzanie przebiegu programu "krok-po-kroku" (debugging) oprac. Robert Tomaszewski >>>> Zadanie 1 Przepisz poniższy program: type TabS = array[1..10] of String[10]; var a, j: Byte; tab: TabS; function Check(const a:TabS; const rozmiar: Byte):Byte; var i, licznik: Byte; wyraz: String[10]; begin licznik:=0; for i:=1 to rozmiar do begin wyraz:=a[i]; if wyraz[1]=wyraz[Length(wyraz)] then Inc(licznik); end; Check:=licznik; end; begin Writeln('Ile wyrazow chcesz sprawdzic (<=10) ?'); readln(a); for j:=1 to a do begin writeln('Podaj wyraz ',j,': '); readln(tab[j]); end; Writeln('Tym samym znakiem konczy sie i zaczyna ',Check(tab,a),' wyraz(y/ow)'); end. Skompiluj do pamięci, usuń ewentualne błędy wykryte podczas kompilacji. Wybierz z menu głównego Debug -> Add watch... (Ctrl+F7). Dodaj do listy obserwowanych zmiennych następujące zmienne: a[i], licznik, a, tab[j]. Kolejne zmienne możesz dodawać klawiszem Insert (patrz na pasek podpowiedzi na dole ekranu!). Pomiędzy okienkami z programem oraz oknem Watches przechodzimy klawiszem lewy ALT+numer okienka. Zmiany położenia okna (Move) lub jego rozmiaru (Size) można dokonać z poziomu menu głównego Window. Po dodaniu zmiennych do okna Watches uruchom program do pracy krokowej: każdy krok klawiszem F7 (Run -> Trace into) lub F8 (Run -> Step over). Zaobserwuj różnice w obu przebiegach programu. Możesz dodać do listy Watches inne zmienne (lokalne/globalne). Pracę krokową kończymy Ctrl+F2 (Run -> Program reset). Teoria - typ rekordowy Typ rekordowy, podobnie jak typ tablicowy, zaliczamy do typów złożonych. Zmienna typu rekorodwego przechowuje w swojej strukturze kilka zmiennych (podobnie jak tablica) ALE w tym przypadku mogą to być zmienne różnych typów (odmiennie niż w tablicy!). Dostęp do zmiennych odbywa się na zasadzie dostępu do pól (a nie jak w przypadku tablic na zasadzie indeksacji). Przykład definicji i użycia typu rekordowego: type TOsoba = record imie, nazwisko: String[20]; {dwa pola typu String[20] każde} wiek: 0..100; {pole z wiekiem osoby, typ okrojony} plec: Char; {pole typu 'M' lub 'K'} end; var a: TOsoba; begin readln(a.imie);{wczytanie wartości do pola "imie" rekordu "a"} readln(a.nazwisko);{analogicznie jak wyżej} readln(a.wiek); readln(a.plec); end. Rekordy mogą - tak jak tablice - być parametrami funkcji/procedur. Ponadto można tworzyć tablice rekordów (pojedynczy element tablicy to rekord). Przykład tablicy rekordów type TOsoba = record imie, nazwisko: String[20]; {dwa pola typu String[20] każde} wiek: 0..100; {pole z wiekiem osoby, typ okrojony} plec: Char; {pole typu 'M' lub 'K'} end; TOsoby = array[1..100] of TOsoba; var a: TOsoby; i, x: Byte; begin readln(x); for i:=1 to x do begin readln(a[i].imie);{wczytanie wartości do pola "imie" rekordu "a[i]"} readln(a[i].nazwisko);{analogicznie jak wyżej} readln(a[i].wiek); readln(a[i].plec); end; end. >>>> Zadanie 2 Napisz program, który w tablicy rekordów przechowuje długości boków prostokątów (jeden rekord w tablicy dotyczy jednego prostokąta) a następnie w procedurze/funkcji oblicza pola prostokątów wyniki zapisując do tablicy liczb. Program najpierw pyta użytkownika ile prostokątów wprowadzić do tablicy, pobiera długości boków umieszczając je w tablicy rekordów, gotową tablicę przekazuje do funkcji/procedury, ta oblica pola i umieszcza wyniki w tablicy liczb. Główna zasada organizacji tablic: jeśli w tablicy rekordów na pozycji (indeksie) 3 są liczby 3 i 5 to w tablicy pól na pozycji (indeksie) 3 będzie liczba 15. Wskazówki dot. definicji typów: type TProst = record a, b: Real; end; TTabProst = array[1..100] of TProst; TTabPola = array[1..100] of Real; >>>> Zadanie 3 Zmodyfikuj zadanie 2 zamieniając tablicę liczb zawierającą pola prostokątów na tablicę rekordów zawierającą pola i obwody prostokątów. >>>> Zadanie domowe Sprawdz działanie instrukcji wiążącej "with". Sprawdz działanie procedur/funkcji operujących na tekstach (Stringach): Copy, Delete, Pos, Insert.