program
likovi;
uses crt;
var a,b,r,O,P:real;
izbor:integer;
const pi=3.14;
|
begin
clrscr;
writeln('Racunamo opsege i povrsine
jednostavnih geometrijskih likova');
writeln(' 1 - kvadrat');
writeln(' 2 -
pravokutnik');
writeln(' 3 - krug'); |
readln(izbor);
case izbor of
1: begin writeln('Odabrali
ste kvadrat');
write('Upisite
stranicu a: '); readln(a);
O:=4*a; P:=a*a;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
2: begin writeln('Odabrali
ste pravokutnik');
write('Upisite
stranicu a: '); readln(a);
write('Upisite
stranicu b: '); readln(b);
O:=2*(a+b);
P:=a*b;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
3: begin writeln('Odabrali ste krug');
write('Upisite
polumjer r: ');readln(r);
O:=2*r*pi;
P:=r*r*pi;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
else writeln('Niste odabrali niti
jedan od ponuđenih likova');
end;
readln;
end.
|
|
U zaglavlju smo, dakle, deklarirali a, b, r, O i P kao realne brojeve i
izbor kao cijeli broj.
Pi koji nam treba za krug definirali smo kao konstantu.
|
U bloku smo prvo obrisali ekran i zatim korisniku programa ispisali
poruke o tome što program radi i uputili ga kako će odabrati izračun
opsega i površine za željeni geometrijski lik.
|
Nakon toga
preko tipkovnice se učitava broj za odabir željenog lika.
|
U višestrukom
grananju CASE ovisno o odabranom liku izračunavamo opsege i površine i
ispisujemo rezultate.
|
Ukoliko
korisnik ne upiše niti jedan od očekivanih brojeva, kroz opciju ELSE
dobiva poruku o tome i program dovršava s radom.
|
|
Ovim je izračun
opsega i površina riješen. No u životu su stvari obično malo
kompliciranije. Na primjer, ne znamo unaprijed za koliko će
geometrijskih likova trebati računati opsege i površine. Time bi za
svaki izračun trebalo ponovno pokretati program. To se može možda malo
jednostavnije
riješiti pomoću petlje REPEAT, ali kako se mi još uvijek na nastavi
mučimo s petljom WHILE odabrati ćemo baš nju za naše rješenje.
Dogovorimo
se da varijabla jos bude tipa karakter
(char) i da ako korisnik upiše u nju malo slovo d program računa dalje,
odnosno još. Ako više nema likova za koje bismo računali opseg i
površinu, dovoljno je u varijablu jos upisati bilo koji znak s
tipkovnice i program završava s radom.
|
program
likovi;
uses crt;
var a,b,r,O,P:real;
izbor:integer;
jos:char;
const pi=3.14;
|
begin
jos := 'd';
while jos := 'd';
begin
clrscr;
writeln('Racunamo opsege
i povrsine
jednostavnih geometrijskih likova');
writeln(' 1 - kvadrat');
writeln(' 2 -
pravokutnik');
writeln(' 3 - krug'); |
readln(izbor);
case izbor of
1: begin writeln('Odabrali
ste kvadrat');
write('Upisite
stranicu a: '); readln(a);
O:=4*a; P:=a*a;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
2: begin writeln('Odabrali ste
pravokutnik');
write('Upisite
stranicu a: '); readln(a);
write('Upisite
stranicu b: '); readln(b);
O:=2*(a+b);
P:=a*b;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
3: begin
writeln('Odabrali ste krug');
write('Upisite
polumjer r: ');readln(r);
O:=2*r*pi;
P:=r*r*pi;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
else writeln('Niste
odabrali niti jedan od ponuđenih likova');
end;
writeln('Zelite li jos racunati
upisite d, a za kraj bilo koji znak'):
readln(jos);
end;
readln;
end.
|
|
|
U zaglavlju smo deklaracijama varijabli dodali i našu varijablu jos u
koju treba učitati korisnikov izbor da li će još računati ili ne.
|
|
Varijablu
jos
smo postavili na početnu vrijednost d. To je potrebno zato što petlja
while provjerava uvjet na početku. Inače bi program na tom mjestu
jednostavno otišao na kraj.
|
|
Ostatak
programa se nije mijenjao.
|
|
|
Nakon izlaza iz višestrukog grananja za odabir likova korisniku
programa nudimo mogućnost da upisom malog slova d u varijablu jos
ponovi izračun za neki drugi lik s nekim drugim vrijednostima stranica.
Ako upiše bilo koji drugi znak osim maloga d program izlazi iz petlje i
ide na kraj.
|
|
Sada
bismo s programom mogli biti gotovo zadovoljni. Zašto gotovo zadovoljni kada program radi?
Zato što jedna od dvije najveće programerske hereze glasi: "Niti jedan
program nije savršen!".
Radi povećanja preglednosti i lakšeg nalaženja grešaka programi se
obično razbijaju na manje cjeline - potprograme. Tako ćemo mi izračun
za svaki lik pojedinačno staviti u posebnu manju cjelinu.
|
program
likovi;
uses crt;
var a,b,r,O,P:real;
izbor:integer;
jos:char;
const pi=3.14;
|
procedure
pravokutnik;
begin
writeln('Odabrali ste pravokutnik');
write('Upisite
stranicu a: ');readln(a);
write('Upisite
stranicu b: ');readln(b);
O:=2*(a+b);
P:=a*b;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
|
procedure
kvadrat;
begin
writeln('Odabrali ste kvadrat');
write('Upisite
stranicu a: ');readln(a);
O:=4*a; P:=a*a;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
|
procedure
krug;
begin
writeln('Odabrali ste krug');
write('Upisite
polumjer r: ');readln(r);
O:=2*r*pi;
P:=r*r*pi;
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
|
begin
jos:='d';
while jos = 'd' do
begin
clrscr;
writeln('Racunamo opsege i povrsine
jednostavnih geometrijskih likova');
writeln(' 1 - kvadrat');
writeln(' 2 -
pravokutnik');
writeln(' 3 - krug');
readln(izbor);
case izbor of
1: kvadrat;
2:
pravokutnik;
3: krug;
else writeln('Niste
odabrali niti jedan od ponuđenih likova');
end;
writeln('Zelite li jos racunati?
(d/n)');
readln(jos);
end;
end. |
|
Zaglavlje
programa nije se mijenjalo. Ono što se je zapravo promijenilo je to da
smo iz naredbe CASE "izvadili" izračune i svakome dodijelili neko ime.
Te izračune smo postavili ispod zaglavlja.
|
Potprogram za
izračun pravokutnika.
|
Potprogram za
izračun kvadrata.
|
Potprogram za
izračun kruga.
|
Glavni
program.
U višestrukom grananju CASE sada samo ovisno o odabranom liku pozivamo
odgovarajući potprogram. Nakon izvršenja niza naredbi u potprogramu,
tijek izvršenja vraća se nazad u glavni program.
|
|
I
baš kada bi pomislili da je gotovo, ima jedna sitnica u gornjem
programu koja bode u oči. Ako ste primjetili, ispis opsega i površine
ponavlja se u svakom podprogramu ( writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);). Slijed tih naredbi je
isti za bilo koji lik za koji smo računali opseg i površinu. Pa kad smo
već naučili što su to potprogrami, strpajmo te dvije naredbe u poseban
potprogram koji se poziva iz već napisanih potprograma. Program jednako
radi, ali smo ušedjeli nekoliko linija, a to je jedan od načina
optimizacije koda.
|
program
likovi;
uses crt;
var a,b,r,O,P:real;
izbor:integer;
jos:char;
const pi=3.14;
|
procedure
ispis;
begin
writeln('Opseg
je : ',O:8:3);
writeln('Povrsina je: ',P:8:3);
end;
|
procedure
pravokutnik;
begin
writeln('Odabrali ste pravokutnik');
write('Upisite
stranicu a: ');readln(a);
write('Upisite
stranicu b: ');readln(b);
O:=2*(a+b);
P:=a*b;
ispis;
end;
|
procedure
kvadrat;
begin
writeln('Odabrali ste kvadrat');
write('Upisite
stranicu a: ');readln(a);
O:=4*a; P:=a*a;
ispis;
end;
|
procedure
krug;
begin
writeln('Odabrali ste krug');
write('Upisite
polumjer r: ');readln(r);
O:=2*r*pi;
P:=r*r*pi;
ispis;
end;
|
begin
jos:='d';
while jos = 'd' do
begin
clrscr;
writeln('Racunamo opsege i povrsine
jednostavnih geometrijskih likova');
writeln(' 1 - kvadrat');
writeln(' 2 -
pravokutnik');
writeln(' 3 - krug');
readln(izbor);
case izbor of
1: kvadrat;
2:
pravokutnik;
3: krug;
else writeln('Niste
odabrali niti jedan od ponuđenih likova');
end;
writeln('Zelite li jos racunati?
(d/n)');
readln(jos);
end;
end. |
|
Za razliku od gornjeg programa ovdje smo dodali potprogram za ispis
naših rezultata. Nakon izvršenja, slijed naredbi se vraća u potprogram
iz kojega je pozvan ovaj potprogram.
|
Potprogram za izračun pravokutnika, kao i ostali potprogrami, nema
naredbe za ispis već samo poziva potprogram ispis.
|
|
|
Glavni
program se u odnosu na gornji primjer programa nije mijenjao.
|
|
Za
naš program dijagram toka
bi izgledao ovako:
|
|
|
Dijagram
toka za izračun kruga izgledao bi ovako:
|

|
Potprogram za
ispis rezultata izračuna izgledao bi ovako:
|

|
Algoritme za
kvadrat i pravokutnik zbog banalnosti neću ovdje crtati.
|
|
Kao
što je već gore rečeno, ovaj zadatak bi se možda jednostavnije riješio
primjenom petlje repeat. Evo
dijagrama , a vi sami pokušajte gornji program prepraviti tako da
se umjesto while koristi repeat.
|

|
Što je
zapravo različito?
Na ovom
mjestu varijablu jos
nismo morali postavljati na početnu vrijednost d zato što petlja repeat provjerava
uvjet tek na kraju.
|
|
|
|
Provjera
uvjeta u petlji repeat. Usporedite s gornjim dijagramom toka i nađite
razlike...
|
Za skinuti gotov
program na svoje računalo odaberite spremi cilj kao ili save target as:
program
|