gvp-local

Procedury

Procedura je podobně jako funkce samostatná část programu. Na rozdíl od funkce však nekončí určením hodnoty. Vytvoření nové procedury má syntaxi:

Procedure název_procedury(seznam parametrů a jejich typy);
tělo procedury

Příklad: procedura, která vytvoří čáru skládající se z n pomlček '-' a odřádkuje:

procedure cara(n:integer);
var i:integer;
begin
  for i:=1 to n do write('-');
  writeln;
end;

Procedura, vypíše na řádek násobky čísla n. Řádek začíná a končí svislou čárkou '|'.

procedure nasobky(n:integer);
var j:integer;
begin
  write('|');
  for j:=1 to 10 do write(j*n:4);
  writeln(' |');
end;

Po provedení programu:

cara(43);
for i:=1 to 10 do nasobky(i);
cara(43);

Dostaneme tento výsledek:

-------------------------------------------
|   1   2   3   4   5   6   7   8   9  10 |
|   2   4   6   8  10  12  14  16  18  20 |
|   3   6   9  12  15  18  21  24  27  30 |
|   4   8  12  16  20  24  28  32  36  40 |
|   5  10  15  20  25  30  35  40  45  50 |
|   6  12  18  24  30  36  42  48  54  60 |
|   7  14  21  28  35  42  49  56  63  70 |
|   8  16  24  32  40  48  56  64  72  80 |
|   9  18  27  36  45  54  63  72  81  90 |
|  10  20  30  40  50  60  70  80  90 100 |
-------------------------------------------

Také procedury mohou měnit hodnoty proměnných
aneb parametry předávané hodnotou a odkazem

Všechny funkce a procedury, které jsme zatím naprogramovali, používaly parametry předávané hodnotou. To znamená, že funkce resp. procedura si vytvoří kopii hodnoty parametru. S vytvořenou kopií potom pracuje. Pokud dochází ke změně této hodnoty, změna se projeví pouze v kopii. Původní hodnota parametru zůstavá nezměněna.

Druhou možností jsou parametry předávané odkazem. Procedura nevytváří žádnou kopii hodnoty, ale pracuje přímo s předanou proměnnou. Pokud funkce resp. procedura mění tuto hodnotu, změněná hodnota je k dispozici i po ukončení procedury. Parametry předávané odkazem jsou uvedeny slovem var.

Příklad:

procedure vypocet(m,n:longint; var soucet,soucin:longint);
begin
  soucet:=m+n;
  soucin:=m*n;
end;

Parametry m,n jsou předávané hodnotou. Hodnota skutečného parametru nepůjde změnit. Procedura se o to ani nepokouší. Parametry soucet a soucin jsou předávané odkazem. Hodnota skutečného parametru se v průběhu zpracování procedury změní. Při provedení vypocet(a,b,c,d) se hodnoty a,b zachovají a c,d změní. V c bude součet a+b, v d součin a*b.

Další příklady:

Procedura převádí větší počet sekund na celé hodiny, minuty a zbylé sekundy:

procedure cas(sek:longint;var h,m,s:longint);
begin
  h:= sek div 3600;
  m:=(sek mod 3600) div 60;
  s:= sek mod 60;
end;
write('zadej pocet sekund ');
readln(sec);
cas(sec,h,m,s);
write('to je ',h,':',m,':',s);
Po zadání čísla
8405
vytiskne
to je 2:20:5

Proedura vyměňuje hodnoty svých parametrů

procedure prohod(var a,b:longint);
var p:integer;
begin
 p:=a;a:=b;b:=p;
end;
write('Vloz dve cisla: ');
readln(a,b);
writeln('a=',a,', b=',b);
prohod(a,b);
writeln('a=',a,', b=',b);
Po zadání čísel 5 a 6 vytiskne
a=5, b=6
a po provedení procedury prohod
a=6, b=5

Funkce vypočítává největší společný dělitel dvou čísel

function NSD(m,n:longint):longint;
begin
  if (m>0) and (n>0) then begin
    while m<>n do begin
      if m>n then m:=m-n
             else n:=n-m;
    end;
    NSD:=m;
  end
  else
    NSD:=-1;
end;
write('Vloz dve cisla: ');
readln(a,b);
writeln('a=',a,', b=',b);
writeln(NSD(a,b));
writeln('a=',a,', b=',b);
Po zadání čísel 15 a 12 vytiskne
a=15, b=12
výsledek funkce bude 3
a potom bude opět vytištěno
a=15, b=12
Kdyby deklarace této funkce byla
function NSD(var m,n:longint):longint;
hodnoty proměnných a,b
by na konci byly
a=3, b=3

Celá řada procedur je v Pascalu již naprogramována. Například tyto:

write(paramety) vypíše své parametry (má volitelný počet parametrů)
read(parametry) načte hodnoty svých parametrů (má volitelný počet parametrů)
val(s,x,c) převede řetězec s na číselnou hodnotu x
break přeruší cyklus for nebo while (bez parametrů)
continue začne nový průchod cyklem for nebo while (bez parametrů)
assign(f,cesta) přiřadí souboru jméno
reset(f);rewrite(f);append(f) otevře soubor
close(f) zavře soubor

Zde si můžete stáhnout soubor se zdrojovými texty příkladů.