Sunteți pe pagina 1din 6

8.

Subprograme Pascal :
Procedure, Function , parametri, vizibilitate.

8.1. Subprograme Pascal : Procedure, Function.

În limbajul Pascal exist• dou• tipuri de subprograme: func•ii •i proceduri.

Definirea acestor subprograme în cadrul unui program Pascal se face în


partea de declara•ii, astfel :
<Def_subprogram> ::= <Def_func•ie> | <Def_procedur•>
unde :
<Def_func•ie> ::= <Antet_func•ie> ; <Bloc>
<Def_procedur•> ::= <Antet_procedur•> ; <Bloc>
iar
<Antet_func•ie> ::= FUNCTION <Nume> [ (L_p_f) ] : <Tip_f>
<Antet_procedur•> ::= PROCEDURE <Nume> [ (L_p_f) ]
<Nume> este un identificator care reprezint• numele subprogramului definit, iar
lista parametrilor formali <L_p_f> este optional• •i ea precizeaz• variabilele de
care depinde subprogramul •i tipul acestor variabile;
<Tip_f> reprezint• codomeniul func•iei •i poate fi un tip simplu (Real, Integer,
Byte, Boolean, Char, String, etc). Este obligatoriu ca în corpul func•iei s• existe
cel pu•in o instruc•iune (de atribuire) prin care func•iei s• i se atribuie o valoare
(<Nume>:= . . . ) .

Apelarea unei func•ii se face scriind într-o expresie numele func•iei urmat
de lista parametrilor actuali, iar apelarea unei proceduri se face scriind numele
procedurii urmat de lista parametrilor actuali pe locul unei instruc•iuni, ceea ce
echivaleaz• cu execu•ia tuturor instruc•iunilor din bloc, astfel

<Apel-procedura> ::= <Nume> [ (<Lista-p.a.> ]

Dac• apelul unei func•ii apare în cadrul unei expresii într-o anumit•
instruc•iune, apelul unei proceduri constituie o instruc•iune de sine st•t•toare.

65
8.2. Parametri.

Un subrogram este apelat pentru a rezolva o anumit• subproblem•. În


acest scop îi vom furniza ni•te date de intrare •i el ne va da ca rezultate ni•te date
de ie•ire prin care se realizeaz• comunicarea între modulul apelant (parametri
actuali) •i subprogram (parametri formali).

Date de intrare Date de iesire


Subprogram

Parametrii actuali de intrare sunt expresii (cu a c•ror valori lucreaz•


subprogramul) pe când cei de ie•ire vor fi variabile (unde se vor depune
rezultatele).
Parametrii formali reprezint• datele de intrare (c•rora le corespunde
valorile expresiilor date prin parametrii actuali, deci vor fi de tip valoare) •i de
ie•ire (c•rora le corespunde adresele variabilelor corespunz•toare parametrilor
actuali, deci vor fi de tip variabil•) ale subprogramului.
Lista parametrilor formali este format• din mai multe sec•iuni de
parametri separate între ele de caracterul ';' . Sintaxa acestei liste este:
<L_p_f.> ::= <spf> { ; <spf> }
unde prin <spf> s-a notat o sec•iune de parametri formali care are sintaxa
<spf> ::= <sp_val> | <sp_var> | <p_functie> | <p_procedura>
Sec•iunea de parametri valoare <sp_val> are sintaxa
<sp_val> ::= <lista_id> : <id_tip>, iar
sec•iunea de parametri variabil• <sp_var> are sintaxa
<sp_var> ::= VAR <lista_id> : <id_tip>
unde <id_tip> este un identificator de tip, definit anterior, deci asem•n•toare
sec•iunii parametrilor valoare, singura diferen•• fiind prezen•a cuvântului VAR în
fa•a listei.
Trebuie s• existe o coresponden•• biunivoc• (ca num•r, pozi•ie, tip,
semnifica•ie, etc.) între parametrii actuali •i cei formali.

66
8.3. Vizibilitate.

În defini•ia unui subprogram apare la început un antet, dup• care urmeaz•


un bloc, care con•ine o list• de declara•ii. Elementele definite în lista de
declara•ii sunt locale pentru blocul în care sunt definite. Acesta constituie
domeniul de vizibilitate al acestor elemente; ele pot fi folosite numai în interiorul
subprogramului în care au fost declarate, nu •i în afara acestuia.
Fie S un subprogram al programului P (vezi figura de mai jos). Pe lâng•
variabilele locale ale subprogramului S , toate elementele declarate în lista de
declara•ii ale programului P sunt considerate globale pentru subprogramul S •i
pot fi folosite în acest subprogram. Deci elementele declarate în S pot fi folosite
numai în S, nu •i în restul programului P. Ele sunt locale pentru S, dar sunt
globale •i pot fi folosite în subprogramele S1 •i S2 incluse în S. Elementele
definite în P sunt globale •i pot fi folosite în S, S1 •i S2.

Considerând programul principal S2a


ca un bloc de nivel 0, vom considera n3
subprogramele definite în el ca blocuri S2 S2b
S S1
de nivel 1. În general, un bloc definit n1 n2 n2 n23

întrun bloc de nivel i are nivelul i+1. P


n0 (nivelul 0)
Dac• într-un bloc de nivel i se folose•te o variabil• v, •i acela•i
identificator v noteaz• o variabil• într-un bloc de nivel i+1, atunci cele dou•
variabile se consider• distincte de•i au acela•i nume. În acest caz variabila din
blocul interior este cea considerat• existent• în acest bloc, iar cea exterioar• nu
exist• decât în partea blocului de nivel i exterioar• blocului de nivel i+1.
În exemplul urm•tor se realizeaz• reuniunile (A∪B, A∪C •i B∪C) a trei
mul•imi date de la tastatur• (A, B •i C) pe o linie, fiecare mul•ime fiind introdus•
element cu element, acestea fiind separate cu spa•iu sau virgul• ( de exemplu :
100,200,404,6789 ). Mul•imile fiind memorate sub form• de •iruri, se va memora
cardinalul mul•imii pe pozi•ia 0, iar elementele pe pozi•iile 1,2,3,... .

67
Pentru c• o mul•ime (de tip •ir) apare ca parametru formal, va trebui s•
declar•m acest tip ( Type Multime = . . . ).

Procedura Cite•te nu are decât un parametru de ie•ire (mul•imea A care se


cite•te), declarat ca parametru de tip variabil• :
A
Cite•te

Procedura Tip•re•te are un singur parametru de intrare (mul•imea A care


se tip•re•te), declarat ca parametru de tip valoare :
A
Tip•re•te

Procedura Reuniune calculeaz• reuninunea a dou• mul•imi. Are doi


parametri de intrare (A •i B) tip valoare •i un parametru de ie•ire (C) de tip
variabil•:
A
Reuniune C
B

Reuniunea mul•imilor A •i B se calculeaz• astfel :


• se ini•ializeaz• mul•imea C cu A (C:=A) ;
• se adaug• mul•imii C elementele b∈B care nu apar•in mul•imii A (C:=C ∪
B\A).

Func•ia Apart (b,A) determin• dac• b∈A sau nu (returneaz• valoarea


True respectiv False), prin compararea succesiv• a lui b cu elementele mul•imii
A pân• când g•se•te o valoare egal• cu b sau termin• toate posibilit••ile.

Program AuB_AuC_BuC;

Type Multime = Array[0..100] Of Integer;

Var A, B, C, AuB, AuC, BuC : Multime;

Procedure Citeste (Var A:Multime); { Citeste o multime de la tastatura }

68
Var c,p,n : Integer; s : String;

69
Begin
Write (’ Dati elementele multimii : ’); Readln (s); n:=0;
While s<>’’ Do Begin
n:=n+1; Val(s,A[n],p);
If p>0 Then Val(Copy(s,1,p-1),A[n],c) Else p:=Length(s);
Delete (s,1,p)
End;
A[0]:=n; { n=Card(A)→ A[0] }
End;
Function Apart (b:Integer; A:Multime) : Boolean; {Apartine b multimii A?}
Var i,n : Integer;
Begin i:=1; n:=A[0];
While (i<=n) And (b<>A[i]) Do i:=i+1;
Apart := i<=n {Apartine, daca i<=n }
End;
Procedure Reuniune (A,B:Multime; Var C:Multime); { C := A ∪ B }
Var i,p,q,r : Integer;
Begin C:=A; p:=A[0]; q:=B[0]; r:=C[0];
For i:=1 To q Do
If Not Apart(B[i],A) Then Begin
r:=r+1; C[r]:=B[i] End C[0]:=r
End;
Procedure Tipareste (A:Multime); { Tipareste pe ecran o multime A }
Var n,i : Integer;
Begin
n:=A[0]; Write (’ {’);
For i:=1 To n Do Write (A[i],’,’);
Writeln (Chr(8),’}’) { Rescrie peste ultima virgula, acolada }
End;
Begin { Modulul principal }
Citeste (A); Citeste (B); Citeste (C);
Reuniune(A,B,AuB); Tipareste (AuB);
Reuniune(A,C,AuC); Tipareste (AuC);
Reuniune(B,C,BuC); Tipareste (BuC); Readln
End.

70