Kursu programowania w Turbo Pascalu cz.2.
 

   Ostatnio by│a mowa m.in. o sta│ych. Nie wspomnia│em jednak o nadawaniu pocz▒tkowych warto╢ci zmiennym, co jest zbli┐one do sta│ych. Sp≤jrzcie poni┐ej:

const liczba :integer =10;

   Jest to zapis podobny do zapisu deklaruj▒cego jak▒╢ sta│▒. Jednak w tym wypadku "liczba" nie jest sta│▒, ale zmienn▒. Zapis ten daje nam tΩ mo┐liwo╢µ, ┐e zmienna "liczba" ju┐ na pocz▒tku bΩdzie mia│a ┐▒dan▒ przez nas warto╢µ. Zamiast gdzie╢ w programie nadawaµ jej warto╢µ 10 mo┐emy uczyniµ to deklaruj▒c to na pocz▒tku. Og≤lny zapis:

const zmienna :typ = warto╢µ;

   Teraz poznamy pΩtle. S▒ to rzeczy tak wa┐ne jak tabliczka mno┐enia w matematyce wiΩc dobrze uwa┐ajcie! Bez nich napisanie nawet prostego programu by│oby niemo┐liwe!

   Sp≤jrzcie na poni┐szy program:

===============
program program021;

uses crt;

begin;
clrscr;
writeln('To zdanie zostalo wypisane na ekran!');
writeln('To zdanie zostalo wypisane na ekran!');
writeln('To zdanie zostalo wypisane na ekran!');
writeln('To zdanie zostalo wypisane na ekran!');
writeln('To zdanie zostalo wypisane na ekran!');
writeln('To zdanie zostalo wypisane na ekran!');
repeat until keypressed;
end.
===============

   Ten oto pro╢ciutki program wypisuje nam 6 razy pewne zdanie. A co gdyby╢my sobie za┐yczyli wypisanie tego zdania 20 razy? No c≤┐ mogliby╢my skopiowaµ linijkΩ "writeln('To zdanie (...)');" tyle razy ile by╢my chcieli i po k│opocie. Ale co╢ jest tu nie tak. To nie na tym chyba ma to polegaµ. Oczywi╢cie, ┐e nie.

   Popatrzcie na poni┐szy program:

===============
program program022;

uses crt;

var i:byte;

begin;
clrscr;
for i:=1 to 20 do
writeln('To zdanie zostalo wypisane na ekran!');
repeat until keypressed;
end.
===============

   Program ten wypisuje 20 razy poprzednie zdanie. W programie tym zosta│a u┐yta pierwsza z poznawanych pΩtli: FOR (czyt. for:)), jest to tzw. pΩtla iteracyjna. Postaµ tej pΩtli jest nastΩpuj▒ca:

for zmienna:=warto╢µ1 to warto╢µ2 do akcja

   gdzie zmienna musi byµ typu ca│kowitego (porz▒dkowego) czyli word, byte, integer itp.

   Prze╢led╝my dzia│anie tej pΩtli krok po kroku:
1.Zmiennej zostaje nadana pewna warto╢µ (u nas 1);
2.Wykonuje siΩ instrukcja podana po s│owie "d"o (u nas writeln(...));
3.Program sprawdza czy zmienna=warto╢c2, je╢li tak to pΩtla ko±czy siΩ, w przeciwnym wypadku program zwiΩksza warto╢µ zmiennej o 1 i wraca do pkt2. I tak w k≤│ko a┐ zmienna osi▒gnie warto╢µ2.
Zauwa┐my, ┐e aby pΩtla siΩ kiedy╢ sko±czy│a musi byµ spe│niony warunek warto╢µ1<=warto╢µ2.

   Teraz nasuwa siΩ problem czy pΩtla ta mo┐e wykonywaµ tylko 1 instrukcjΩ? Oczywi╢cie, ┐e nie. Sp≤jrzcie na poni┐szy przyk│ad:

For i:=1 to 20 do
begin;
writeln('Heheh');
writeln('Hehehe2');
end;

   Ka┐de instrukcje zawarte miΩdzy begin i end traktujemy jako jedn▒ instrukjce i nazywamy j▒ instrukjc▒ z│o┐on▒. A wiΩc w powy┐szej pΩtli zostanie wypisane "heheh" potem "hehehe2" i tak 20 razy (miΩdzy beginem a end mog▒ byµ dowolne procedury i funkcje!). Zauwa┐my jednak, ┐e ko±cz▒c instrukcjΩ z│o┐on▒ ko±czymy j▒ end-em ze ╢rednikiem a nie z kropk▒! End z kropk▒ oznacza koniec programu, a ko±czyµ program mo┐na tylko jeden raz.

   Instrukcja FOR ma tak┐e drug▒ postaµ.

for zmienna:=warto╢µ1 downto warto╢µ2 do akcja

   R≤┐nica jest tak, ┐e w po ka┐dym wykonaniu siΩ instrukcji "akcja" zmienna "zmienna" zostanie pomniejszona o 1. A wiΩc aby ta pΩtla siΩ kiedy╢ sko±czy│a warto╢µ1>=warto╢c2.

   UWAGA: je╢li kiedy╢ zapΩtlicie przez przypadek (lub specjalnie:)) sw≤j program to naci╢nijcie kombinacje klawiszy: CTRL+PauseBreak. Spowoduje to przerwanie wykonywanego programu.

   Wracaj▒c do pΩtli for chcia│bym zaznaczyµ, ┐e pocz▒tkowa jak i ko±cowa warto╢µ nie musi byµ przekazywana przez liczbΩ, mo┐e to byµ tak┐e zmienna czy sta│a. Dla lepszego zrozumienia popatrz ni┐ej:

===============
program program023;

uses crt;

var i,ile:byte;

begin;
clrscr;
write('Ile razy mam wypisac zdanie? (podaj liczbe z zakresu 0..255:');
readln(ile);
clrscr;
for i:=1 to ile do {1}
writeln('Zdanie zostalo wypisane!');
writeln('Wypisywanie zakonczone!');
repeat until keypressed;
end.
===============

   {1}Jak widzimy pΩtla for nie wykona siΩ z g≤ry okre╢lon▒ ilo╢µ razy. Zmienna ile mog│aby byµ r≤wnie┐ sta│▒. To samo dotyczy siΩ warto╢ci1, kt≤ra mo┐e byµ przekazywana przez liczbΩ, zmienn▒ albo sta│▒.

   Ma│a rada. Raczej unikajcie jakichkolwiek zmian warto╢ci zmiennej, kt≤rej u┐ywacie w pΩtli for, gdy┐ mog│oby to spowodowaµ zapΩtlenie. Chodzi to o kombinacje takie jak:

for i:=1 to 20 do
begin;
(...);
i:=i+x;{1}
end;

   {1}Po prostu nie zmieniajcie warto╢ci zmiennej (w tym wypadku "i").

   Oto kilka pΩtli, kt≤re nigdy siΩ nie ko±cz▒ (je╢li chcesz siΩ przekonaµ, ┐e tak naprawdΩ jest to pamiΩtaj o kombinacji CTRL+PauseBreak).

I. for i:=1 to 100 do
begin;
write('Hello');
i:=101;
end;

II. for i:=1 to 100 do
begin;
write('Hello');
i:=i-1;
end;

   UWAGA: je╢li podczas dzia│ania tej pΩtli naci╢niemy wspominan▒ kombinacjΩ klawiszy to program zatrzyma siΩ i zostanie pod╢wietlona ta linijka kt≤ra siΩ w│a╢nie wykonywa│a (oczywi╢cie je╢li uruchomili╢my program w ╢rodowisku pascal-a). Gdyby╢my w tej chwili nacisnΩli CTRL+F9 to program nie uruchomi siΩ na nowo, lecz bΩdzie kontynuowa│ od tego miejsca na kt≤rym sko±czy│. Aby uruchomiµ gog od nowa nale┐y skompilowaµ go nowo (ALT+F9- pod╢wietlenie zniknie).

   Powiedzia│em, ┐e nie powinni╢my zmieniaµ warto╢ci zmiennej, ale nie powiedzia│em, ┐e nie mo┐emy u┐ywaµ jej do czego innego! Sp≤jrz poni┐ej:

===============
program program024;

uses crt;

var i,ile:integer;

begin;
clrscr;
write('Podaj ilosc liczb:');
readln(ile);
clrscr;
write('Oto kolejne liczby calkowite:');
for i:=1 to ile do
write(i,', ');
repeat until keypressed;
end.
===============

   W niedalekiej przysz│o╢ci bΩdziemy korzystaµ z tej w│asno╢ci, ┐e warto╢µ zmiennej "i" zmienia swoj▒ warto╢µ o 1.

   A teraz ma│e zadanie.

Zad1.
Napisz program korzystaj▒c z pΩtli for, kt≤ry bΩdzie oblicza│ sumΩ liczb. Ilo╢µ liczb ma byµ wczytywana z klawiatury.

Oto moje rozwi▒zanie:

===============
program program025;

uses crt;

var suma,liczba,i,ile:integer;

begin;
clrscr;
write('Podaj ilosc liczb:');
readln(ile);
suma:=0;{1}
for i:=1 to ile do
begin;
write('Podaj ',i,' liczbe:');
readln(liczba);
suma:=suma+liczba;
end;
clrscr;
write('Suma tych liczb to:',suma);
repeat until keypressed;
end.
===============

   {1} w zmiennej suma bΩdziemy trzymaµ sumΩ wczytywanych liczb, jednak na pocz▒tku musimy przypisaµ jej warto╢µ 0, gdy┐ mog│aby zawieraµ jak▒╢ przypadkow▒ warto╢µ co zmieni│oby nasz▒ sumΩ i w rezultacie podany wynik by│by z│y.

   Program dzia│a w nastΩpuj▒cy spos≤b:
1.Zerujemy warto╢µ zmiennej suma (suma:=0);
2.Wczytujemy ilo╢µ liczb do zsumowania (zmienna ile).
3.Program wchodzi w pΩtle.
4.Wczytywana jest liczba.
5.Jej warto╢µ jest dodawana do dotychczasowej warto╢ci zmiennej suma.
6.Je╢li zsumowali╢my "ile" liczb to pΩtla ko±czy siΩ w przeciwnym wypadku wracamy do do pkt. 4.

   Teraz kolejna wa┐na rzecz. Powiedzia│em, ┐e pΩtla mo┐e wykonywaµ dowoln▒ instrukcje, a wiΩc mo┐e wykonywaµ tak┐e... inn▒ pΩtle. Sp≤jrzcie poni┐ej:

for i:=1 to 20 do {1} for j:=1 to 20 do {2} akcja{3}

   {2} druga pΩtla wykona 20 razy pewn▒ akcjΩ.
   {1} pierwsza pΩtla wykona tak┐e 20 razy pewn▒ akcje, jednak dla niej t▒ akcj▒ jest druga pΩtla. A wiΩc pomy╢lmy: pierwsza wykonuje 20 razy drug▒, ta za╢ 20 razy wykonuje jak▒╢ akcje. Ile razy wykona siΩ akcja? 20x20=400. Warto╢ci zmiennych "i: oraz "j" (zauwa┐, ┐e musimy u┐ywaµ dw≤ch r≤┐nych zmiennych) bΩd▒ zmieniaµ siΩ w nastΩpuj▒cy spos≤b:

i=1 j=1
i=1 j=2
i=1 j=3
....
i=1 j=19
i=1 j=20
i=2 j=1
i=2 j=2
....
i=2 j=19
i=2 j=20
i=3 j=1
....
i=20 j=19
i=20 j=20

   i tu nast▒pi koniec!

   PamiΩtaj! Je╢li czego╢ nie rozumiesz (co jest ca│kiem normalne) to wr≤µ do pocz▒tku! Zobaczysz, ┐e za kt≤rym╢ razem zrozumiesz!

   I znowu zadanie.

Zad2.
Napisz program, kt≤ry wy╢wietli na ekranie tabliczkΩ mno┐enia (liczby od 1..9). Tabliczka ma wygl▒daµ w nastΩpuj▒cy spos≤b:

1x1=1 1x2=2 1x3=3 ... 1x9=9
2x1=2 2x2=4 2x3=6 ... 2x9=18
itd.

   Podpowied╝: wykorzystaj dwie pΩtle FOR:). ===============
program program026;

uses crt;

var i,j:byte;

begin;
clrscr;
writeln('----------------------');
writeln('| TABLICZKA MNOZENIA |');
writeln('----------------------');
for i:=1 to 9 do
begin;
for j:=1 to 9 do
write(i,'x',j,'=',i*j:2,' ');
writeln;
end;
repeat until keypressed;
end.
===============

   Chcia│bym zwr≤ciµ uwagΩ na uk│ad:

for i:=1 to 9 do{1}
begin;{2}
for j:=1 to 9 do{3}
write(i,'x',j,'=',i*j:2,' ');{4}
writeln;{5}
end;

   DziΩki temu, ┐e po pΩtli {1} najpierw jest {2}, a potem pΩtla {3}, zostanie wy╢wietlone 9 mno┐e± {4}, potem za╢ kursor przeskoczy do nastΩpnej linii (5}, i tak 9 razy. Zatem otzrymamy po 9 mno┐e± w 9 liniach.

O pΩtli FOR to by by│o na tyle. Teraz zajmiemy siΩ pΩtl▒ WHILE (czyt. │ajl). Postaµ tej pΩtli jest nastΩpuj▒cy:

while spe│niony_jest_warunek do akcja

   gdzie akcja jest albo procedur▒, funckj▒, albo instrukcj▒ z│o┐on▒. PΩtlΩ t▒ mo┐na t│umaczyµ jako: dop≤ki spe│niony jest warunek r≤b akcje. Teraz pasuje wyja╢niµ co to jest ten warunek.
Naj│atwiej jest to zrobiµ na przyk│adzie. A wiΩc sp≤jrzcie:

===============
program program027;

uses crt;

var i:byte;

begin;
clrscr;
i:=1;
while i<=20 do {1}
begin;
writeln('Oto zdanie nr:',i);
i:=i+1;
end;
repeat until keypressed;
end.
===============

   {1} PΩtla dzia│a w nastΩpuj▒cy spos≤b: dop≤ki "i" jest mniejsze lub r≤wne 20 r≤b: wypisz na ekran zdanie, zwiΩksz "i" o 1. Ta pΩtla wykona siΩ 20 razy. W tej pΩtli nie mamy ┐adnych ogranicze± co do typu naszych zmiennych. A wiΩc mo┐emy napisaµ taki program:

===============
program program028;

uses crt;

var i:real;

begin;
clrscr;
i:=1;
while i<=10 do
begin;
writeln('Oto zdanie nr:',i:0:1);
i:=i+0.5;
end;
repeat until keypressed;
end.
===============

    Je╢li chodzi o warunek to nie musi to byµ por≤wnanie liczb, mog▒ to byµ tak┐e │a±cuchy, znaki itp. Je╢li chodzi o te ostatnie to poznamy je w przysz│o╢ci. Co do por≤wnaµ to mamy nastΩpuj▒ce:

= (np. i=10);
< (np. i<10);
> (np. i>10);
<= (czyli mniejsze lub r≤wne, np. i<=10);
>= (czyli wiΩkszy lub r≤wne, np. i>=10);
<> (czyli r≤┐ne, np. i<>10);

   Por≤wnywaµ mo┐emy nie tylko liczby, ale r≤wnie┐ znaki i │a±cuchy, np. "pascal">"ala" poniewa┐ wyraz "ala" jest wcze╢niej w alfabecie ni┐ wyraz "pascal". Po za tym w warunkach pomocne s▒ nam pewne wyra┐enia, a s▒ nimi: and, or oraz not.

   Oto kilka przyk│ad≤w z obja╢nieniami:

   Operator "and" (koniunkcja).

while (i<10) and (j<100) do akcja

   Po przet│umaczeniu tego na jΩzyk mowy mamy: dop≤ki "i" jest mniejsze od 10 i "j" jest mniejsze od 100 r≤b akcje. PΩtla ta sko±czy siΩ gdy kt≤ry╢ z tych warunk≤w nie bΩdzie spe│niony. Zauwa┐my, ┐e do │▒czenia kilku warunk≤w musimy u┐yµ nawias≤w oddzielaj▒cych kolejne warunki.

   Operator "or" (alternatywa).

while (i<10) or (j<100) do akcja

   Dop≤ki "i" jest mniejsze od 10 lub "j" jest mniejsze od 100 r≤b akcje. PΩtla w tym wypadku sko±czy siΩ gdy oba warunki bΩd▒ niespe│nione.

   I ostatni operator "not" (zaprzeczenie). Operator ten s│u┐y do zaprzeczania wyra┐e±.

while not(i<10) od akcja;

   Dop≤ki "i" nie bΩdzie mniejsze od 10 r≤b akcje.

   A teraz zadanie.

Zad3.
Za pomoc▒ dw≤ch pΩtli while napisz poprzedni program (ten z tabliczk▒ mno┐enia).

===============
program program029;

uses crt;

var i,j:byte;

begin;
clrscr;
writeln('----------------------');
writeln('| TABLICZKA MNOZENIA |');
writeln('----------------------');
i:=1;
while i<=9 do
begin;
j:=1;
while j<=9 do
begin;
write(i,'x',j,'=',i*j:2,' ');
j:=j+1;
end;
writeln;
i:=i+1;
end;
repeat until keypressed;
end.
===============

   Jak widaµ powoli zaczyna wzrastaµ ilo╢µ u┐ywanych begin-≤w i end-≤w, niestety trzeba siΩ do tego przyzwyczaiµ:). Dok│adn▒ interpretacjΩ tego programu pozostawiam Tobie.

   COFNIJ    PRZEJD¼ DALEJ


 

REDAKCJA

WstΩp
Co w numerze
My
Prenumerata
FAQ
MagaZINier

O WSZYSTKIM

Overclocking
Symulatory kosmiczne
Windows - z│o wcielone?
Where and What
Ja te┐ studiujΩ informatykΩ
Informatyka - kontra
Nie tylko gramy - kontra

KSIí»KI

Franky Furbo
Tam, gdzie spotykaj▒ siΩ wszystkie ╢wiaty
Stado
Przerwana lekcja muzyki

RPG

Fabularne RPG
Jak stworzyµ klimat na sesji
Jak uprzykrzyµ graczom ┐ycie
Pomagajmy mistrzowi
Zr≤b to sam

FILMY

Blair Witch Project 2
Przedwio╢nie

MUZYKA

Metallica - historia zespo│u
Blank & Jones "DJ Culture"
Guano Apes "Don't Give Me Names"
D┐em - Wehiku│ Czasu na gitarze

STAúE KíTY

Replay
TurboPascal - kursu cz.2