Na primjeru izračuna opsega i površine (što je svima jasno, zar ne???) nekih geometrijskih likova pokušati ćemo objasniti primjenu

potprograma

Radi usporedbe, zadatak ćemo prvo riješiti "pješice" pomoću višestrukog grananja CASE, a onda ćemo programu dodati potprograme. Radi se o primjerima u Borland Pascal-u 7.

 


Zadatak: Napisati program koji izračunava opseg i površinu za kvadrat, pravokutnik ili krug po izboru. Varijable koje ćemo koristiti su a za stranicu kvadrata, odnosno a i b za stranice pravokutnika, r za polumjer kruga i O i P za opseg i površinu lika. Sve te varijable će biti realni brojevi. Dogovorimo se da za koji lik ćemo računati odabrati ćemo upisom 1 - za kvadrat, 2 - za pravokutnik i 3 za krug u varijablu izbor koja će biti tipa integer.

Home


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

 

Povratak na sadržaje iz informatike

Home