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: funcii i proceduri. Definirea acestor subprograme n cadrul unui program Pascal se face n partea de declaraii, astfel : <Def_subprogram> ::= <Def_funcie> | <Def_procedur> unde : <Def_funcie> ::= <Antet_funcie> ; <Bloc> <Def_procedur> ::= <Antet_procedur> ; <Bloc> iar <Antet_funcie> ::= 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 funciei i poate fi un tip simplu (Real, Integer, Byte, Boolean, Char, String, etc). Este obligatoriu ca n corpul funciei s existe cel puin o instruciune (de atribuire) prin care funciei s i se atribuie o valoare (<Nume>:= . . . ) . Apelarea unei funcii se face scriind ntr-o expresie numele funciei urmat de lista parametrilor actuali, iar apelarea unei proceduri se face scriind numele procedurii urmat de lista parametrilor actuali pe locul unei instruciuni, ceea ce echivaleaz cu execuia tuturor instruciunilor din bloc, astfel <Apel-procedura> ::= <Nume> [ (<Lista-p.a.> ] Dac apelul unei funcii apare n cadrul unei expresii ntr-o anumit instruciune, apelul unei proceduri constituie o instruciune de sine stttoare.
65

8.2. Parametri.
Un subrogram este apelat pentru a rezolva o anumit subproblem. n acest scop i vom furniza nite date de intrare i el ne va da ca rezultate nite date de ieire 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 cror valori lucreaz subprogramul) pe cnd cei de ieire vor fi variabile (unde se vor depune rezultatele). Parametrii formali reprezint datele de intrare (crora le corespunde valorile expresiilor date prin parametrii actuali, deci vor fi de tip valoare) i de ieire (crora le corespunde adresele variabilelor corespunztoare parametrilor actuali, deci vor fi de tip variabil) ale subprogramului. Lista parametrilor formali este format din mai multe seciuni de parametri separate ntre ele de caracterul ';' . Sintaxa acestei liste este: <L_p_f.> ::= <spf> { ; <spf> } unde prin <spf> s-a notat o seciune de parametri formali care are sintaxa <spf> ::= <sp_val> | <sp_var> | <p_functie> | <p_procedura> Seciunea de parametri valoare <sp_val> are sintaxa <sp_val> ::= <lista_id> : <id_tip>, iar seciunea 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 asemntoare seciunii parametrilor valoare, singura diferen fiind prezena cuvntului VAR n faa listei. Trebuie s existe o coresponden biunivoc (ca numr, poziie, tip, semnificaie, etc.) ntre parametrii actuali i cei formali.

66

8.3. Vizibilitate.
n definiia unui subprogram apare la nceput un antet, dup care urmeaz un bloc, care conine o list de declaraii. Elementele definite n lista de Acesta constituie

declaraii sunt locale pentru blocul n care sunt definite.

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 lng variabilele locale ale subprogramului S , toate elementele declarate n lista de declaraii 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. Considernd programul principal ca un bloc de nivel 0, vom considera subprogramele definite n el ca blocuri de nivel 1. n general, un bloc definit ntrun bloc de nivel i are nivelul i+1. S n1 S1 n2 S2 n2 S2a n3 S2b n23

P n0 (nivelul 0)

Dac ntr-un bloc de nivel i se folosete o variabil v, i acelai identificator v noteaz o variabil ntr-un bloc de nivel i+1, atunci cele dou variabile se consider distincte dei au acelai nume. n acest caz variabila din blocul interior este cea considerat existent n acest bloc, iar cea exterioar nu exist dect n partea blocului de nivel i exterioar blocului de nivel i+1. n exemplul urmtor se realizeaz reuniunile (AB, AC i BC) a trei mulimi date de la tastatur (A, B i C) pe o linie, fiecare mulime fiind introdus element cu element, acestea fiind separate cu spaiu sau virgul ( de exemplu : 100,200,404,6789 ). Mulimile fiind memorate sub form de iruri, se va memora cardinalul mulimii pe poziia 0, iar elementele pe poziiile 1,2,3,... .

67

Pentru c o mulime (de tip ir) apare ca parametru formal, va trebui s declarm acest tip ( Type Multime = . . . ). Procedura Citete nu are dect un parametru de ieire (mulimea A care se citete), declarat ca parametru de tip variabil : Citete A

Procedura Tiprete are un singur parametru de intrare (mulimea A care se tiprete), declarat ca parametru de tip valoare : A Tiprete

Procedura Reuniune calculeaz reuninunea a dou mulimi. Are doi parametri de intrare (A i B) tip valoare i un parametru de ieire (C) de tip variabil: A B Reuniune C

Reuniunea mulimilor A i B se calculeaz astfel :


se iniializeaz mulimea C cu A (C:=A) ; se adaug mulimii C elementele bB care nu aparin mulimii A (C:=C B\A). Funcia Apart (b,A) determin dac bA sau nu (returneaz valoarea

True respectiv False), prin compararea succesiv a lui b cu elementele mulimii A pn cnd gsete o valoare egal cu b sau termin toate posibilitile.

Program AuB_AuC_BuC; Type Var Multime = Array[0..100] Of Integer; A, B, C, AuB, AuC, BuC : Multime; { Citeste o multime de la tastatura }

Procedure Citeste (Var A:Multime);

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; End; Function Apart (b:Integer; A:Multime) : Boolean; Var i,n : Integer; Begin i:=1; n:=A[0]; {Apartine, daca i<=n } { C := A B } While (i<=n) And (b<>A[i]) Do i:=i+1; Apart := i<=n End; Procedure Reuniune (A,B:Multime; Var C:Multime); Var i,p,q,r : Integer; Begin C:=A; p:=A[0]; q:=B[0]; Begin End C[0]:=r { Tipareste pe ecran o multime A } r:=C[0]; For i:=1 To q Do If Not Apart(B[i],A) Then r:=r+1; C[r]:=B[i] End; Procedure Tipareste (A:Multime); Var n,i : Integer; Begin n:=A[0]; Write ( {); For i:=1 To n Do Write (A[i],,); Writeln (Chr(8),}) End; Begin Citeste (A); Citeste (B); Citeste (C); Reuniune(A,B,AuB); Tipareste (AuB); Reuniune(A,C,AuC); Tipareste (AuC); Reuniune(B,C,BuC); Tipareste (BuC); End.
70

{ n=Card(A) A[0] } {Apartine b multimii A?}

{ Rescrie peste ultima virgula, acolada } { Modulul principal }

Readln

S-ar putea să vă placă și