Documente Academic
Documente Profesional
Documente Cultură
Procedura = Procedure (
Aceste declaraii ne permit s declarm n altetul subprogramelor parametri de tip funcie i procedur astfel :
Function | Procedure <nume_subpr> ( ... f:Functie; ... p:Procedura; ... ) ...
Apelul subprogramelor va utiliza funcii sau proceduri ca parametri actuali : . . . <nume_subpr> ( ... f1, ... ,metoda1, ... ) ... . . . <nume_subpr> ( ... f2, ... ,metoda2, ... ) ...
. . .
70
unde fi i metodai sunt funcii i proceduri de tipul Funcie respectiv Procedur. n exemplul urmtor se poate observa c exist parametri att funcii ct i proceduri. Se genereaz irul X cu 10 elemente dup regula Xi=f(i), se ordoneaz cresctor i se tiprete, apoi irul Y cu 11 elemente dup regula Yi=g(i), se ordoneaz descrescator i se tiprete. Program Parametri_Functie_Procedura; Type Sir = Array [1..30] Of Integer; {$F+}
Functie = Function (x:Integer) : Integer; FctBool = Function (a,b:Integer) : Boolean; Procedura = Procedure(Var Z:Sir; n:Integer); Var X, Y : Sir;
Function f (x:Integer) : Integer; Begin f:=Sqr(x+1)-x End; Function g (x:Integer) : Integer; Begin g:=Sqr(x-1)+x End; Function Cresc(a,b:Integer):Boolean; Begin Cresc:=a<b End;
Function DesCresc(a,b:Integer):Boolean; Begin DesCresc:=a>b End; Procedure Ordonez (Var X:Sir; n:Integer; Relatie : FctBool ); Var Begin Ordonat : Boolean; k, i, v : Integer; k:=1; For i:=1 To n-k Do If Not Relatie(X[i],X[i+1]) Then Ordonat:=False k:=k+1 Until Ordonat; End; Procedure OrdCresc Begin Ordonez (Var A:Sir; n:Integer); ) End;
71
( A, n, Cresc
Procedure Gen_Ord_Tip (Var A:Sir; n:Integer; r : Functie; Ordonare : Procedura ); Var i:Integer; Begin For i:=1 To n Do A[i]:=r(i); Ordonare (A,n); For i:=1 To n-1 Do Write (A[i],,); Writeln(A[n]) End; Begin Gen_Ord_Tip (X,10, f, OrdCresc ); Gen_Ord_Tip (Y,11, g, OrdDesCresc ); End. Readln { Prel X } { Prel Y } {Generare} {Ordonare} { Tiparire }
72
Ad (A,m,B,n,Tr) =
adic : suma a dou numere se poate obine prin nsumarea cturilor i a resturilor (mpririi la 10) celor dou numere (cturile sunt reprezentate de primele m-1 respectiv n-1 cifre, iar resturile sunt a[m] respectiv b[n]). Dac suma resturilor depete 9 atunci Transportul este 1 (altfel este 0). Este suficient s rezolvm problema doar n cazul mn. Dac m>n (1) atunci (pentru c adunarea este comutativ) se adun B cu A (Ad:=B+A). Suma a dou numere se poate obine prin adunarea resturilor (primele m-1 respectiv n-1 cifre) i a transportului rezultat din nsumarea cturilor (cifra m respectiv n ), la care se adaug cifra rezulat din nsumarea rsturilor (5). Dac nu mai sunt cifre n A care trebuiesc adunate, atunci se adun 0 (4). Dac toate cifrele au fost adunate (att ale lui A ct i ale lui B) atunci rezultatul este dat de ultimul transport calculat, adic 0 sau 1 , cazul (2) respectiv (3). Apelul funciei este Ad (A,m,B,n,0) pentru c transportul iniial este nul.
{ Adun_Str[n], n<=30 }
Function Adun (a, b : Numar) : Numar; Function Ad (m, n, t : Byte) : Numar; Var c:Char; Function Tr (a:Char):Byte; Var s : Byte; Begin Tr:=0;
{ c:=a+b[n] Mod 10
73
Begin If n=0 Then If t=0 Then Ad:= Else Ad:=1 Else Ad:=Ad(m-1,n-1,Tr(a[m]))+c End; Begin If Length(a)>Length(b) Then Adun := Adun (b,a) Else Adun := Ad (Length(a),Length(b),0) End; {Adun } Function Sp(a:Numar) : Numar; Begin If Length(a)<n Then Sp:=Sp( +a) Else Sp:=a End; Begin Write ( Dati a : ); Write ( Dati b : ); Writeln(Sp(a)+ + ); Writeln(Sp(b)); Write (Sp(Adun (a,b))); Readln End. Readln (a) ; Readln (b) ; { Tipareste : { { 1234 + } 123 1357 } } { Completeaza la stanga cu spatii } { Cazul (1), m>n } { Initial Transportul = 0 } Else If m=0 Then Ad:=Ad(m ,n-1,Tr( 0))+c { Cazul (2) } { { { (3) } (4) } (5) }
74
n cazul n care dorim s definim funcii simultane (una prin cealalt) va apare problema urmtoare : Ce functie (procedur) se va scrie prima ?. Aceasta pentru c dac se refer un subprogram, acesta trebuie s fie deja definit (de exemplu subprogramul S1 refer (se definete prin) subprogramul S2, iar S2 se definete cu ajutorul lui S1). n aceast situaie se va defini doar antetul unui subprogram urmat de declaia Forward (ceea ce permite scrierea ulterioar a corpului subprogramului). Acest subprogram poate fi referit, de ctre alte
{ Subprogramul S1 apeleaz S2 }
Begin ... S2... End; Exemplul care urmeaz va utiliza trei funcii simultane (mutuale) pentru a compara dou numere (a<b, a>b, a=b) reprezentate prin irul (caracterelor) cifrelor. Se observ c este usor de definit a<b (prin >) pentru c este b>a; a=b (prin <,>) nseamn Not a<b i Not a>b, iar a>b dac numrul cifrelor lui a este mai mare dect numrul cifrelor lui b sau dac numrul cifrelor lui a este egal cu numrul cifrelor lui b atunci sau ctul lui a este mai mare dect ctul lui b sau cturile sunt egale iar restul lui a este mai mare dect restul lui b (prin mprire la 10).
75
Program Comparare_Numere_Str_cifre_baza_10; Const Type Var n=10; Numar = String[n]; a,b : String;
Function MaiMare(a,b : Numar) : Boolean; Forward; Function MaiMic (a,b : Numar) : Boolean; Begin MaiMic:=MaiMare(b,a) End;
Function Egale (a,b : Numar) : Boolean; Begin Egale := Not MaiMic(a,b) And Not MaiMare(a,b) End; Var m,n:Byte; { |A| > |B| } { = } { Cat(A) > Cat(B) } { Am > Bn }
Function MaiMare (a,b:Numar) : Boolean; Begin MaiMare:=(m>n) Or (m=n) And (m>0) And
m:=Length(a); n:=Length(b);
(MaiMare(Copy(a,1,m-1),Copy(b,1,n-1)) Or End; Begin Write ( Dati a : ); Write ( Dati b : ); Readln (a) ; Readln (b) ;
If MaiMic (a,b) Then Write ( a < b ) Else If MaiMare(a,b) Then Write ( a > b ) Else If Egale End. (a,b) Then Write ( a = b ) Else Write ( a ? b ); Readln
76