LEKCJA 5 - úíCZENIE TABLIC I REKORD╙W, P╩TLA "FOR"

a poprzedniej lekcji nauczy│e╢ siΩ podstaw u┐ywania tablic i rekord≤w. Dzisiaj spr≤bujemy stworzyµ ma│▒ "bazΩ danych", kt≤ra bΩdzie w stanie przechowywaµ w pamiΩci komputera informacje na temat kilku os≤b. Program ma jednak znaczenie czysto dydaktyczne, bo nie bΩdzie m≤g│ zapisaµ tych danych na dysk. Lekcja ma na celu m. in. utrwalenie wiadomo╢ci poznanych ostatnio.

Skoro program ma przechowywaµ informacje na temat grupy os≤b, to warto zaprojektowaµ typ rekordowy, reprezentuj▒cy jedn▒ osobΩ. Na razie to nic nowego - robili╢my to ju┐ ostatnio i dzisiaj wykorzystamy typ "czlowiek" z poprzedniej lekcji. Baza danych jednak nie mo┐e polegaµ na tym, ┐e dane o ka┐dej osobie bΩd▒ przechowywane w osobnych zmiennych. Ostatnio powiedzieli╢my sobie, ┐e takiego "grupowania" wielu informacji mo┐na dokonaµ za pomoc▒ tablic. Tworzyli╢my tablice zawieraj▒ce elementy typu "integer". Jednak typ rekordowy, mimo ┐e tworzony przez nas a nie dostΩpny "od razu" w pascalu, jest przecie┐ takim samym typem jak ka┐dy inny. Z tego powodu warto nasz▒ bazΩ skonstruowaµ w ten spos≤b, aby tablica zawiera│a rekordy. Za│≤┐my, ┐e na pocz▒tek tablica ta bΩdzie zawiera│a 5 element≤w, indeksowanych od 1 do 5.

program baza1;
type 
czlowiek = record
imie: string[20];
nazw: string[30];
wiek: byte;
rok: word;
end;
var
tab: array[1..5] of czlowiek;
begin
end.

Wiesz, jak siΩ odwo│ywaµ do konkretnych element≤w tablicy i p≤l rekord≤w, ale mo┐e zastanawiasz siΩ, jak post▒piµ, gdy rekordy s▒ elementami tablicy? Zastan≤wmy siΩ nad tym. W programie bΩdziemy siΩ odwo│ywaµ bezpo╢rednio do zmiennej tablicowej "tablica". Po jej nazwie oczywi╢cie stawiamy nawiasy kwadratowe, a w nich numer interesuj▒cego nas indeksu. Jest to po prostu numer osoby, o kt≤rej informacje chcemy odczytaµ lub zapisaµ. Je╢li siΩ zastanowisz, to dojdziesz do wniosku, ┐e np. zapis "tab[1]" oznacza co╢ analogicznego do zwyk│ej zmiennej rekordowej. Jest to prawda. W zwi▒zku z tym poprawny jest zapis: "tab[1].imie", "tab[1].nazw" itd. W ten spos≤b mo┐na czytaµ lub zapisywaµ dane o konkretnej osobie. Aby to lepiej zrozumieµ, przeanalizuj poni┐szy program. Zastan≤w siΩ, czy wiesz, co on robi.

program baza2;
type 
czlowiek = record
imie: string[20];
nazw: string[30];
wiek: byte;
rok: word;
end;
var
tab: array[1..5] of czlowiek;
begin
writeln('Podaj imie:');
readln(tab[1].imie);
writeln('Podaj nazwisko:');
readln(tab[1].nazw);
writeln('Podaj wiek:');
readln(tab[1].wiek);
writeln('Podaj rok urodzenia:');
readln(tab[1].rok);
writeln('Podaj imie:');
readln(tab[2].imie);
writeln('Podaj nazwisko:');
readln(tab[2].nazw);
writeln('Podaj wiek:');
readln(tab[2].wiek);
writeln('Podaj rok urodzenia:');
readln(tab[2].rok);
writeln('Podaj imie:');
readln(tab[3].imie);
writeln('Podaj nazwisko:');
readln(tab[3].nazw);
writeln('Podaj wiek:');
readln(tab[3].wiek);
writeln('Podaj rok urodzenia:');
readln(tab[3].rok);
writeln('Podaj imie:');
readln(tab[4].imie);
writeln('Podaj nazwisko:');
readln(tab[4].nazw);
writeln('Podaj wiek:');
readln(tab[4].wiek);
writeln('Podaj rok urodzenia:');
readln(tab[4].rok);
writeln('Podaj imie:');
readln(tab[5].imie);
writeln('Podaj nazwisko:');
readln(tab[5].nazw);
writeln('Podaj wiek:');
readln(tab[5].wiek);
writeln('Podaj rok urodzenia:');
readln(tab[5].rok);
end.

Zapewne domy╢lasz siΩ, ┐e program zbiera od jego u┐ytkownika informacje na temat kolejnych os≤b, kt≤re s▒ nastΩpnie umieszczane w bazie. My╢lΩ, ┐e rozbudowanie go w taki spos≤b, aby nastΩpnie wy╢wietla│ on zebrane dane, nie jest dla Ciebie problemem. Potraktuj to jako zadanie domowe utrwalaj▒ce zdobyte umiejΩtno╢ci.

Wyobra╝ sobie teraz, ┐e masz stworzyµ program, kt≤ry bΩdzie mia│ pobraµ od jego u┐ytkownika nie 5, ale na przyk│ad 10000 informacji na temat pracownik≤w wielkiej firmy. W takiej sytuacji nie by│oby rozs▒dne pisanie kilkudziesiΩciu tysiΩcy linii kodu potrzebnych do konwersacji z u┐ytkownikiem. Zauwa┐, ┐e przy wczytywaniu informacji o kolejnych osobach zmienia siΩ tylko numer indeksu w tablicy. Poza tym wykonuje siΩ cyklicznie te same operacje. W programowaniu instnieje mechanizm, kt≤ry pozwala na wykonywanie takich operacji. Mechanizmem tym s▒ pΩtle. PΩtla jest to taki mechanizm, kt≤ry pozwala na wykonywanie pewnego fragmentu programu tak d│ugo, jak nie jest spe│niony warunek zako±czenia tego fragmentu programu. W pascalu s▒ trzy rodzaje pΩtli. Dzisiaj poznasz tylko jeden z nich - pΩtlΩ "for", kt≤ra jest szczeg≤lnie przydatna przy wype│nianiu tablicy. Nasz program wczytywa│by informacje do bazy przy pomocy pΩtli w nastΩpuj▒cy spos≤b:

program baza_petle;
type
czlowiek = record
imie: string[20];
nazw: string[30];
wiek: byte;
rok: word;
end;
var
tab: array[1..5] of czlowiek;
i: integer;
begin
for i:=1 to 5 do begin
writeln('Podaj imiΩ:');
readln(tab[i].imie);
writeln('Podaj nazwisko:');
readln(tab[i].nazw);
writeln('Podaj wiek:');
readln(tab[i].wiek);
writeln('Podaj rok urodzenia:');
readln(tab[i].rok);
end;
end.

W zaprezentowanym programie jest naprawdΩ sporo nowych element≤w. Najpierw wyja╢niam budowΩ pΩtli. Pierwsze s│owo - "for" - to s│owo kluczowe sygnalizuj▒ce, ┐e w tym miejscu bΩdzie pΩtla. Po nim nastΩpuje od razu inicjacja zmiennej steruj▒cej pΩtl▒ "for". Ka┐da pΩtla for ma swoj▒ zmienn▒ steruj▒c▒. Mo┐esz na razie przyj▒µ, ┐e jest to po prostu licznik wykonywanych pΩtli. Przedtem tak▒ zmienn▒ trzeba zadeklarowaµ identycznie jak ka┐d▒ inn▒ zmienn▒ ca│kowit▒ (musi byµ ca│kowita). PΩtla "for" ma to do siebie, ┐e w ka┐dym cyklu jej wykonania zmienna steruj▒ca (czyli "i" w naszym przypadku) zostaje automatycznie zwiΩkszona o 1. Po instrukcji inicjacji (nie jest w tym przypadku zako±czona ╢rednikiem, poniewa┐ jest elementem czego╢ wiΩkszego) stawiamy s│owo kluczowe "to" a po nim liczbΩ bΩd▒c▒ "ogranicznikiem" pΩtli. Po "ograniczniku stawiamy s│owo kluczowe "do" (ang. wykonuj) i nastΩpnie jedn▒ instrukcjΩ, kt≤ra bΩdzie wykonywana w pΩtli. Na przyk│ad zapis "for i:=1 to 10 do writeln('Hej');" oznacza, ┐e pΩtla wykona siΩ 10 razy, a zmienna steruj▒ca "i" bΩdzie w ka┐dej pΩtli zwiΩkszana o 1. Instrukcja wykonywana w ka┐dej pΩtli to wy╢wietlenie na ekranie napisu "Hej". Zmienna steruj▒ca nie musi byµ inicjowana akurat warto╢ci▒ 1, na przyk│ad zapis "for i:=7 to 10 do writeln('Hej')" znaczy, ┐e pΩtla wykona siΩ 4 razy. W kolejnych wykonaniach pΩtli warto╢µ zmiennej steruj▒cej "i" bΩdzie wynosiµ 7,8,9,10. Wa┐ne jest, aby "ogranicznik" pΩtli nie by│ mniejszy od pocz▒tkowej warto╢ci zmiennej steruj▒cej.

Jak ju┐ powiedzia│em, po s│owie "do" musi byµ jedna instrukcja. W naszym przyk│adzie jest ich wiele i s▒ one ujΩte w blok "begin...end". Wyja╢nienie jest proste. ObjΩcie jakiego╢ fragmentu programu s│owami "begin...end" to dzia│anie powoduj▒ce, ┐e dla kompilatora taki fragment bΩdzie traktowany jako jedna instrukcja! DziΩki temu w naszej pΩtli mo┐e siΩ powtarzaµ d│u┐szy fragment programu. KonstrukcjΩ "begin...end" nazywa siΩ instrukcj▒ grupuj▒c▒.

Jak widzisz, w obrΩbie pΩtli zmiennej "i" mo┐na u┐ywaµ np. do indeksowania tablicy. Jest to bardzo u┐yteczne. Wa┐ne jest natomiast, aby nigdy nie zmieniaµ jej warto╢ci w obrΩbie pΩtli w│asnorΩcznie. Mo┐e to robiµ tylko program!!! Zmienn▒ t▒ mo┐emy manipulowaµ co najwy┐ej poza obrΩbem pΩtli, gdzie mo┐emy j▒ ju┐ wykorzystaµ do czego╢ zupe│nie innego.

ZdajΩ sobie sprawΩ, ┐e to spora dawka wiedzy jak na jeden raz. Je╢li masz k│opoty ze zrozumieniem jakiego╢ zagadnienia, nie przejmuj siΩ. Nie rezygnuj jednak z pr≤b. Zrozumienie mechanizmu pΩtli "for" mo┐e byµ dla Ciebie teraz trudne, a nat│ok s│≤w kluczowych i regu│y kieruj▒ce ich u┐yciem bardzo mΩcz▒ce, ale pΩtle s▒ bardzo wa┐ne i potrzebne. W nastΩpnej lekcji poznasz inne ich rodzaje (ale my╢lΩ, ┐e bΩdzie to lekcja prostsza).

ZapamiΩtaj:

  1. rekordy mog▒ byµ elementami tablicy
  2. w celu automatyzacji cyklicznie wykonywanych czynno╢ci u┐ywamy pΩtli
  3. pΩtla "for" musi mieµ ca│kowit▒ zmienn▒ staruj▒c▒
  4. wiele instrukcji mo┐na zgrupowaµ w jedn▒ s│owami "begin...end" i traktowaµ je jako jedn▒ instrukcjΩ


Baner reklamowy: