You are on page 1of 16

LUCRAREA DE LABORATOR NR.

7
I. Scopul lucrarii:
Implementarea procedurilor si functiilor utilizator in Turbo Pascal.
II. Continutul lucrarii:
1. Prezentarea modului de definire si de apel al unei proceduri utilizator.
2. Probleme rezolvate cu proceduri.
3. Prezentarea modului de definire si de apel al unei functii utilizator.
4. Probleme rezolvate cu functii.
5. Proceduri si functii recursive.
6. Probleme rezolvate utilizind recursivitatea.
7. Proceduri si functii declarate FORWARD (ulterior).
8. Probleme rezolvate cu proceduri si functii declarate FORWARD.
9. Probleme propuse pentru rezolvare.
10. Continutul referatului.
III. Desfasurarea lucrarii
1. Prezentarea modului de definire si apel ale unei proceduri.
O procedura este o descriere a unui subalgoritm apelabila de mai multe ori in cursul unui
program cu parametrii diferiti. O procedura implica un mod de descriere a unui subalgoritm si un
mod de apel al acesteia.
a) Definirea unei proceduri:
PROCEDURE NumeProcedura ([[VAR ]pf11[,pf12]...:tip1]
[;[VAR ]pf21[,pf22]...:tip2]...[;[VAR ]pfn1[,pfn2]..]:tipn]);
CONST
{declaratii de constante locale procedurii}
TYPE
{declaratii de tipuri locale procedurii}
VAR
{declaratii de variabile locale procedurii}
BEGIN
{descrierea subalgoritmului procedurii}
END;
unde:
- NumeProcedura - reprezinta numele procedurii utilizabil in apelul acesteia.
- pfi1, pfi2,... reprezinta parametrii formali ai procedurii de tipul "tipi" (i=1,n).
- Parametrii precedati de cuvintul cheie VAR sunt parametri de tip variabila. Acesti
parametri, la intrarea in procedura , dupa apelul acesteia, vor avea valorile initiale
corespunzatoare variabilelor omoloage din structura de program apelanta, iar la iesirea din
procedura, dupa executia aceteia, daca procedura modifica continutul parametrilor de tip
variabila, se revine in structura de program apelanta (program principal, procedura sau functie)
cu modificarile variabilelor suferite de acestea in procedura apelata.
- Parametrii neprecedati de cuvintul VAR sunt parametri de tip valoare. Variabilele
identificate ca parametri de tip valoare vor fi variabile proprii procedurii si vor primi valori prin
transferul valorilor variabilelor sau constantelor omoloage, in momentul apelului, in aceasta
variabila. Daca procedura modifica valoarea variabilelor de tip valoare la reintoarcerea in
programul apelant aceste variabile vor avea aceleasi valori ca la intrarea in procedura.
In general parametrii formali ai unei proceduri sunt parametri de intrare (date ale
algoritmului) si parametri de iesire (rezultate ale algoritmului). De asemenea, variabilele de
iesire trebuie sa fie precedate de cuvintul VAR, iar cele de intrare numai in cazul in care acestea

b) Apelul unei proceduri: Apelul unei proceduri se realizeaza prin numele acesteia (cel precizat la definirea procedurii) urmat de lista parametrilor efectivi ai procedurii.). tipul si ordinea acestora. variabila. Probleme rezolvate cu proceduri: 2. fara declararea acestuia la acest nivel este permisa. intr-o structura de program apelanta are o semnificatie locala nivelului inferior si tuturor nivelelor inferioare subordonate. p=n-k.][. Astfel variabila identificata din programul apelant este considerata de procedura sau functie implicit ca un parametru tip variabila (nefiind declarat in lista parametrilor formali).. tipurile utilizator de date.pp). Utilizarea unui identificator de variabila al programului apelant in cadrul unei proceduri sau functii. aflate la nivel inferior. Deci constantele.. tip de data. neafectand declaratia de la nivelul superior unde ramane valabila declaratia initiala..peij . Solutie: Deoarece algoritmul presupune apelarea de trei ori a aceluiasi subalgoritm (pentru p=n.]. aflate la nivel superior. p=k) se va folosi o procedura adecvat definita.1. a) Descrierea algoritmului in Limbajul PseudoCod (LPC): PROGRAM combinari PROCEDURA fact (p. declarate in structura de program apelanta. k (n>=k).. se pot folosi cu aceleasi semnificatii si in subprogramele apelate (proceduri si functii). sa se determine C (combinari de n luate cate k) utilizindu-se formul C = n!/(n-k)!/k! Pentru calculul lui p! (p=n. fie in lista parametrilor formali. fie la nivelul procedurii sau functiei...returneaza programul apelant rezultate (in caz contrar sint neprecedate de cuvintul VAR). p=k) se recomanda folosirea unei proceduri generale pentru calculul lui p!. p=n-k. intro structura de program apelata. INCEPUT pp := 1. Corespondenta dintre parametrii formali din definirea procedurii si parametrii efectivi din apelul procedurii se face prin numarul. unul de intrare p (corespunzator lui n. Declararea unui identificator (constanta. pentru ca procedura sa nu modifice variabilele programului apelant intr-un mod nedorit.. functiile etc. Lista parametrilor formali trebuie sa contina doi parametri. procedurile..) la nivel inferior.NumeProcedura este identificatorul procedurii precizat in descrierea acesteia.pe12]. unde: . PENTRU i:= 1 IN SUS PINA LA p EXECUTA pp := pp*i. . Fie acesta pp. {Programul principal} INCEPUT .. care deja a fost declarat la un nivel superior. Dandu-se numerele naturale n. NumeProcedura ([pe11[. Un identificator nu poate fi declarat de mai multe ori la acelasi nivel. SFARSIT. c) Sfera de influenta a declaratiilor: Tipurile de date utilizate in lista parametrilor formali din definirea procedurilor si functiilor trebuie definite in structura de program apelanta daca nu sunt tipuri standard recunoscute de limbaj. variabilele. Procedurile si functiile se descriu totdeauna inaintea structurii de program apelante.sunt parametri efectivi (actuali. etc. In general procedurile si functiile pot fi imbricate (incuibarite. ci numai variabilele care sunt puse in corespondenta cu parametrii formali de tip variabila in momentul apelului. 2. Este recomandabil ca toate variabilele utilizate de procedura sau functie sa fie declarate. n-k sau lui k) si altul de iesire corespunzator rezultatului (produsul primelor p numere naturale). reali) ai procedurii corespunzatori parametrilor formali din definitia procedurii.pe21[. unele in altele).pe22].

pnk). Sa se calculeze matricea s=ab+bc+ca utilizindu-se o procedura pentru calculul produsului a 2 matrici si o procedura pentru citirea matricelor. END.SCRIE 'n='. WRITELN ('C('.'. READLN (k). CITESTE n.bc. pentru evitarea repetarii de 3 ori a instructiunilor care realizeaza citirea.k. tsir = STRING [2]. .')='.n:1.'.pnk.pn): fact (n-k. a. se va utiliza o procedura de citire a unei matrici. BEGIN pp := 1.pn.cnk: INTEGER.'.b. cnk. IF (n<k) THEN WRITELN ('solutie imposibila') ELSE BEGIN fact (n.')='. fact(k.pnk).ca: tmat. sir: STRING [2].2. VAR n.k: td. CONST nmax = 10. fact (n-k. fact (k.d. SFARSIT. END. VAR n. TYPE td = 1. WRITE ('k='). a.k. cnk:1).b. tmat = ARRAY [td. SCRIE '(C'. VAR i:INTEGER.'. Intrucat in lucrarea de laborator anterioara s-a descris in pseudocod algoritmul pentru inmultirea a doua matrici se va descrie direct programul in Pascal: Program Sumeprod.ab.pk).. 2.i.k:1. b) Descrierea algoritmului in Limbajul Turbo Pascal (LTP): PROGRAM combinari. SFARSIT.j. Se dau matricele patrate de dimensiune n. READLN (n). SCRIE 'k='. PROCEDURE fact (p: INTEGER. cnk:=pn/pnk/pk. FOR i := 1 TO p DO pp := pp * i. cnk:=pn div pnk div pk. {sfirsit procedura} {Programul principal} BEGIN WRITE ('n='). CITESTE k.c cu elemente reale.nmax.td] OF REAL.pk). DACA n<k ATUNCI SCRIE "SOLUTIE IMPOSIBILA" ALTFEL INCEPUT fact (n. Solutie: Deoarece exista 3 matrici care se citesc.pn). VAR pp: INTEGER). END.pk.c.n. De asemenea calcularea matricii s presupune calcularea a trei produse de matrici si ca atare se va proceda la utilizarea unei proceduri care realizeaza produsul a doua matrici patrate oarecare.

VAR x:tmat).c} prodmat (n.c).j]).')=').y:tmat.n.j] + x[i.k] * y[k.j] END. BEGIN FOR i := 1 TO m DO FOR j := 1 TO m DO BEGIN WRITE (sir. END.a. {apelarea procedurii de citire pentru matricea b} citmat ('b('. BEGIN FOR i := 1 TO p DO FOR j := 1 TO p DO BEGIN xy[i. WRITELN.n. Dindu-se vectorii a. END.c.j]. VAR xy: tmat). READLN (n). {apelarea procedurii de citire pentru matricea c} citmat ('c('.k:td. VAR i.' ').n. {apelarea procedurii de citire pentru matricea a} citmat ('a('.a} prodmat (n.b.ab).j.b).ca} FOR i := 1 TO n DO FOR j := 1 TO n DO s[i.a).j] + ca[i. END.j]:=xy[i. i:1.j] := 0. FOR k := 1 TO p DO xy[i. {apelarea procedurii de calcul al produsului matricilor b. FOR i := 1 TO n DO BEGIN FOR j := 1 TO n DO WRITE (s[i. {apelarea procedurii de calcul al produsului matricilor a.j] := ab[i. {programul principal} BEGIN WRITE ('dimensiunea matricilor=').ca).'.m:td.j] + bc[i. aa.j:td. bb) . END. {apelarea procedurii de calcul al produsului matricilor c. {descrierea procedurii de inmultire a 2 matrici} PROCEDURE prodmat (p:td.j:1.bc. {Insumarea matricilor ab. x.'.{descrierea procedurii de citire} PROCEDURE citmat (sir:tsir.3.b. VAR i. {scrierea matricii S} WRITELN ('matricea ab+bc+ca='). b de dimensiune n sa se calculeze cosinusul unghiului dintre cei doi vectori utilizindu-se o procedura pentru calculul produsului scalar (ab. READLN (x[i. 2.j]:7:2.a. END.c.b} prodmat (n.bc}.

n:td.bb).a).b)='. VAR i.nmax. BEGIN FOR i := 1 TO p DO BEGIN WRITE (sir.aa). END. p:td: VAR x:tv). VAR i:td. {calculul produsului scalar bb} prodscal (n.. {calculul cosinusului unghiului (a. CONST nmax = 20.bb.a. END.a.b).b)=cosab=a*b/ / Deoarece in referatul anterior s-a abordat problema produsului scalar se va trece direct la descrierea algoritmului direct in Limbajul Turbo Pascal (LTP). WRITELN ('cos(a.b). daca b=a sau a=b se obtin produsele scalare a*a si b*b a*a = |a|*|a|*cos(a.n. FOR i := 1 TO n DO xy := xy + x[i] * b[i].b:tv. tv = ARRAY [td] OF REAL. {calculul produsului scalar ab} prodscal (n. END.n. END.b. si deci cos(a. READLN (x[i]).')=').aa. |a|= analog |b| = .b)} cosab:= ab/SQRT(aa)/SQRT(bb). cosab:1:5). {citirea componentelor vectorului b} citvect ('b('.ab).i:1.b. {procedura de calcul a produsului scalar} PROCEDURE prodscal (p:td. tsir = STRING [2].a) = |a|2 si deci. {calculul produsului scalar aa} prodscal (n. VAR xy: REAL).a. PROGRAM cosvect.cosab: REAL.y:tv. {citirea componentelor vectorului a} citvect ('a('. BEGIN xy := 0. {programul principal} BEGIN WRITE ('dimensiunea vectorilor='): READLN (n). . a. VAR i := td. {procedura de citire a unui vector} PROCEDURE citvect (sir: tsir. TYPE td = 1.b. x.Solutie: Se porneste de la definitia produsului scalar ai 2 vectori a si b: a*b = |a|*|b|*cos(a. ab.

[.TipFunctie .. .] [FUNCTION .3..[VAR] pfn1[. reali). ..pem1[.]:tip1.. o functie presupune doua ipostaze: .NumeFunctie . Pentru fiecare parametru in parte trebuie sa se specifice tipul asociat. Prezentarea modului de definire si apel al unei functii.. Apelul unei functii: Apelul unei functii se realizeaza prin numele functiei precizat la defininirea acesteia. Acest tip poate fi orice tip declarat in blocurile care includ declaratia functiei.pem2]... {descrierea functiilor apelate de functia curenta}. pe12].NumeFunctie .pe21[.pfn2]. {descrierea procedurilor apelate de functia curenta}... Ultima valoare pe care o va avea aceasta variabila (inaintea reintoarcerii in programul apelant)..pf22].. Observatie: Parametrii formali ai functiei pot fi precedati de cuvantul cheie VAR caz in care pot returna in structura de program apelanta (program principal..[. procedura sau functie) si valori modificate de functie dupa apelul si executia acesteia..:tipn]):TipFunctie.]) unde: . Ca si la o procedura...]. unde: ..reprezinta parametrii formali ai functiei si sunt de fapt argumentele functiei (sau parametrii de intrare in functie). In acest caz functia.. a). ..pfij .pf12]. In corpul functiei acest identificator este folosit ca o variabila de tipul precizat de "TipFunctie". .apelul functiei.. se poate spune ca returneaza structurii de program apelante mai multe rezultate: unul singur asociat numelui functiei si mai multe asociate parametrilor formali de tip variabila (precedati de cuvantul cheie VAR) b).este identificatorul functiei definit la declararea acesteia.este numele functiei care se va folosi la apelul acesteia.pe22].pe1n[.. Nume Functie (pe11[.:tip2] . Spre deosebire de o functie o procedura poate returna unul sau mai multe rezultate. CONST {declaratii de constante locale functiei} TYPE {declaratii de tipuri locale functiei} VAR {declaratii de variabile locale functiei} [PROCEDURE . Definirea unei functii: FUNCTION NumeFunctie([VAR] pf11[.[VAR] [pf21[...] BEGIN {descrierea algoritmului functiei) END. va fi chiar valoarea pe care o returneaza functia dupa apel programului apelant.[. O functie este o descriere a unui subalgoritm care pe baza datelor de intrare returneaza o singura valoare rezultat.definirea functiei. urmat de o lista de parametri efectivi (actuali...reprezinta tipul valorii pe care o returneaza functia programului apelant.

catxy:=x/y. READLN(a.1. fsuma:=x+y.peij .diferenta:1:2). WHILE (raspuns='d') DO BEGIN WRITE('dati nr reale a..cat).VAR difxy. Toate precizarile facute la proceduri referitor la sfera de influenta a declaratiilor sunt valabile si la functii. WRITELN(' a*b='.y:REAL. {sfarsit functie} BEGIN {programul principal} raspuns:='d'. BEGIN difxy:=x-y. produsul si catul acestor numere. READLN(raspuns). VAR a. Probleme rezolvate cu functii.suma:1:2.b:').diferenta. Ca si la proceduri intre parametrii formali din definirea functiei si parametrii actuali din apelul functiei exista o corespondenta din punct de vedere al pozitiei. iar diferenta. FUNCTION fsuma(x. END: END.' a-b='.diferenta. orcare ar fi acestea.b] in n subintervale sau diviziuni. produsxy:=x*y.cat:1:2). PROGRAM SumaDiferentaProdusCat. bazele trapezelor dreptunghice reprezinta valorile functiei in capetele subintervalelor .produs. variabile sau expresii care vor fi puse in corespondenta cu parametrii formali din definirea functiei. Solutie: Metoda presupune impartirea intervalului [a. 4.b).produsxy.' a/b='. Intrucat rezultatul obtinut in urma executarii functiei este asociat numelui acesteia. Fiind data o functie y=f(x) si doua numere reale si pozitive (0<a<b) sa se calculeze utilizandu-se metoda de aproximare a integralei cu trapeze dreptunghice (metoda lui Newton).2. apel imposibil de functie'). WRITELN('a+b='.b.reprezinta parametrii actuali sau efectivi ai functiei (argumentele functiei sau parametrii de intrare in functie) care pot fi constante.b. END ELSE WRITELN('impartire prin b=0. apelul functiei trebuie sa constituie un operand al unei expresii. IF (b<>0) THEN BEGIN suma:=fsuma(a. produsul si catul sa fie returnate prin intermediul parametrilor de tip VAR. si constituirea unor trapeze dreptunghice in care inaltimea trapezelor este lungimea unui subinterval.suma. WRITE('continuati ?(d/n):'). raspuns:CHAR. utilizandu-se o functie definita care sa returneze suma. END. Fiind date doua numere reale sa se calculeze suma.catxy:REAL):REAL.produs:1:2. 4.produs. diferenta. 4. al numarului si tipului acestora. asociata numelui functiei.cat:REAL.

iar laturile neparalele sunt coardele cu care se aproximeaza graficul functiei. y f(a+d) f(a+2d) f(a+3d) f(a) y=f(x) f(a+(n-2)d) f(a+(n-1)d) . ca in figura de mai jos.

BEGIN f:=SQRT(sqr(x)+x+1) END. a...f(a+(n-3)d) f(b) A1 A2 d d A2 A3 d d An-2 An-1 An d d d O x=a x=a+d x x=b x=a+2d x=a+3d x=a+4d x=a+(n-3)d x=a+(n-2)d x=a+(n-1)d Se stie ca integrala definita este de fapt aria suprafetei cuprinsa intre axa ox..+f(a+(n-1)*d)]=d*so..b.. VAR i. Descrierea algoritmul in Limbajul Turbo Pascal (LTP): PROGRAM integrala.+An==(f(a)+f(a+d))*d/2+(f(a+d)+f(a+2*d))*d/2+..d:REAL. Metoda aproximeaza integrala cu suma ariilor trapezelor dreptunghice astfel constituite: S=A1+A2+. so.s:REAL.n:INTEGER. graficul functiei si dreptele x=a si x=b.. {programul principal} BEGIN . {definirea functiei utilizator} FUNCTION f(x:REAL):REAL. Abscisa unui punct x=a+d*i unde d=|b-a|/n iar n este numarul de diviziuni..(f(a+(n-2)*d)+f(a+(n1)*d))*d/2+(f(a+(n-1)*d)+f(b))*d/2=d*[(f(a)+f(b))/2+f(a+d)+f(a+2*d)+.

a.3. PENTRU i := 1 PANA LA n+1 EXECUTA INCEPUT SCRIE ('p(' . CITESTE (p(i)) SFARSIT SCRIE (' x f(x) ') SCRIE ('===============') x := a CAT TIMP (x>=a) SI (x<=b) EXECUTA INCEPUT SCRIE (' '. m:td. CITESTE (b).n.i. CITESTE (h). SCRIE ('h=' ). x) INCEPUT vf := p(1) PENTRU i := 2 PANA LA n+1 EXECUTA vf := vf*x+p(i). {Programul principal} INCEPUT SCRIE ('n=' ). CONST nmax = 20. so := (f(a)+f(b))/2. SCRIE ('b=' ). 4. CITESTE (n).b. n. CITESTE (a). Sa se determine valorile polinomului pentru x variind in intervalul [a.READLN(a). BEGIN vf := p[1].b] cu pasul h utilizandu-se o functie definita de utilizator pentru calculul valorii unui polinom.i: INTEGER. SCRIE ('a=' ). SFARSIT SFARSIT. f(p.WRITE ('diviziunea n=' ). b) Descrierea algoritmului in Limbajul Turbo Pascal (LTP): PROGRAM tabel. WRITE ('b=' ). x: REAL): REAL. s := d * so. WRITE ('a=' ). x. f=vf.x)).READLN (n). WRITELN ('Integrala =' . FOR i := 1 TO n-1 DO so := so+f(a+i*d). x:= x + h. {functia pentru calculul valorii unui polinom} FUNCTION f(p:tpol. ' '. a) Descrierea algoritmului in Limbajul PseuodoCod: FUNCTIE f(p. .READLN (b).nmax. END.vf:REAL. tpol = ARRAY[td] OF REAL. VAR n. ')=' ). VAR i: td. Se considera un polinom de gradul n dat prin coeficientii sai. TYPE td = 1. SFARSIT.h: REAL p: tpol. d := abs(b-a)/n..s).

{citirea intervalului si pasului de tabelare} WRITE ('a='). END. Probleme rezolvate cu recursivitate. Deci pentru calculul factorialului unui numar se foloseste factorialul numarului anterior. END.FOR i := 2 TO m+1 DO vf := vf*x+p[i]. WRITE ('b='). READLN (n). {programul principal} BEGIN WRITE ('gradul polinomului= '). Solutie: Pentru aplicarea unei proceduri sau functii recursive trebuie stabilita relatia de recurenta. Marimea dimensiunii stivei se face cu ajutorul directivei de compilare $M prin care se stabileste dimensiunea stivei Stack si a zonei Heap (vezi mediul Turbo Pascal). ')='). x:= x+h. WRITE ('pasul='). Limbajul Turbo Pascal permite autoapelarea procedurilor si functiilor adica permite apelarea unei functii sau proceduri de ea insasi. la apeluri repetate. Din punct de vedere al programatorului. recursivitatea este o metoda moderna de programare a proceselor iterative. Astfel. Descrierea algoritmului in Limbajul Turbo Pascal (LTP): PROGRAM factorial. WHILE ((x>= a) AND (x<= b)) DO BEGIN WRITE (x:10:2. VAR n:integer.n. Sa se calculeze n! folosind o functie recursiva. READLN (b). END. Prin urmare. WRITELN (' x f(x) '). spatiul ocupat in stiva poate creste in afara limitelor admisibile. Se stie ca n!=n*(n-1)!. {calculul valorilor polinomului} x:= a. Compilatorul trebuie atentionat de folosirea recursivitatii intr-un program prin directive de compilare {$S+} care genereaza un subprogram care verfica depasirea stivei. END. . Cand executia procedurii sau functiei ajunge la instructiunea de apel este declansata o noua executie a procedurii sau functiei etc.f(p.x):10:2). READLN (p[i]). i: 1. precum si a valorilor parametrilor valoare si adresele parametrilor variabila. READLN (h). {citirea coeficientilor polinomului} FOR i := 1 TO n+1 DO BEGIN WRITE ('p('.1. READLN (a). repetitia este declansata de executia unei instructiuni de apel catre blocul recursiv. trebuie sa se prevada un criteriu de oprire a recursivitatii. 5. 6. f:=fv. 6. In cadrul recursivitatii. WRITELN('====================='). la proiectarea proceselor recursive. realizand cea ce se numeste o recursie directa. Orice apel de procedura sau functie determina memorarea in stiva a adresei instructiunii ce urmeaza apelului. Proceduri si functii recursive.

In acest caz se executa atribuirea fact:=1.{descrierea functiei recursive} FUNCTION fact (n:INTEGER):INTEGER BEGIN IF n=0 THEN fact := 1 ELSE fact := n*fact(n-1).'!='. VAR x.fact(n):1). se incheie intregul lant de operatii declansate de apelul fact(4). El se termina atunci cand valoarea efectiva a parametrului n devine 0.m. Sirul apelurilor este ilustrat in figura de mai jos. Se reia in continuare evaluarea expresiei suspendate pentru n=2 si asa mai departe.ecunoscand a 1)*fact(n-1) Fac t(n) Fac fact(4)=4*fact t(4) (3) Fac fact(3)=3*fact t(3) (2) fact(4) fact fact(2)=2*fact (2) (1) fact fact(1)=1*fact (1) (0) fact fact(0)=1 (0) fact(2) fact(3) fact(1) - calcul fact(n) n Se evaluaza de fact(n-1) la sfarsit (baza stivei) fact(0) urcand in stiva pana la fact(n) in varful stivei fact(4)=4*fact(3 )=4*3*2*1=24 fact(3)=3*fact(2 )=3*2*1=6 fact(2)=2*fact(1 )=2*1=2 fact(1)=1*fact(0 )=1*1=1 fact(0)=1 6. La apel se aloca spatiu de memorie pentru n si se face initializarea sa cu 3.m. are loc o noua suspendare a evaluarii expresiei din dreapta si se face apelul fact(2).c.m)=cmmdc(m.m. Sa se determine c.d. n 4 3 2 1 0 Ap calculeaza Suspenda eleaz fact(n)=(n. PROGRAM cmmdcrecursiv. {programul principal} BEGIN WRITE('n='). In acest moment. a doua numere utilizandu-se o functie recursiva pentru calcularea c.m. Deoarece 4<>0 se executa instructiunea: fact := 4*fact(3) Evaluarea expresiei reclama cunoasterea celui de-al doilea termen fact(3). reluanduse evaluarea ultimei expresii suspendate (pentru n=1). END. END. pana cand este calculata prima expresie suspendata pentru n=4.y:INTEGER. Sa urmarim executia functiei recursive fact pentru apelul n=4 (fact(4)). Solutie: Rezolvarea se bazeaza pe relatia de recurenta cmmdc(n.d. obtinandu-se fact:=1*1 si o data cu aceasta terminarea executiei functiei pentru n=1. . Ca atare evaluarea este suspendata temporar executandu-se apelul fact(3). Deoarece 3<>0 se executa din nou instructiunea de atribuire mentionata. READLN(n) WRITELN(n:1.2. La apel se aloca spatiu de memorie parametrului n si se face initializarea sa cu 4.c. Aceasta relatie de recurenta se introduce intr-o functie recursiva.n modulo m).

apelata de o alta procedura sau functie B. Folosind o procedura recursiva sa se calculeze suma din cont dupa un numar n de ani considerand o dobanda p% pe an.c. dobanda (m-1. la randul ei. WRITELN ('la sfarsitul celor '. s=suma curenta} n:INTEGER. Ce se intampla. {program principal} BEGIN WRITE ('x(intreg>0)=').x:1. . Solutie: Recursivitatea procedurii se bazeaza pe relatia de recurenta s(i) := s(i-1)+s(i-1)*p/100 Descrierea algoritmului in Limbajul Turbo Pascal (LTP): PROGRAM DobandaRecursiva.cmmdc(x. O procedura sau o functie este definita FORWARD (ulterior) daca numele procedurii sau functiei este descris separat de corpul procedurii sau functiei.y):1).d.s:REAL {s0=suma initiala. Proceduri si functii declarate FORWARD.(n. PROCEDURE dobanda(m:INTEGER. READLN (n). WRITE ('y(intreg>0)='). READLN (p).n:1.'.d.sd).')=`.('.s). dobanda (n.s:10:2). BEGIN IF (m=0) THEN cmmdc:= n ELSE cmmdc:=cmmdc(m. END.m.3. WRITE ('numarul de ani='). READLN (y).y:1. VAR sd:REAL). s := s0. END. Aceasta impune ca o procedura sau o functie A.so:1:2.' devine='. VAR s0.' ani '. READLN (x). {programul principal} BEGIN WRITE ('suma depusa initial='). 7. sa fie declarata inaintea acesteia. WRITE ('dobanda anuala=').FUNCTION c. READLN (s0). La inceputul unui an se depune la o banca o suma initiala s0.m.m.n mod m).m. END. END. este apelata de procedura sau functia A ? Pentru a permite iesirea din acest cerc vicios (procedura sau functia A apeleaza o alta procedura sau functie B care la randul sau apeleaza procedura sau functia A) limbajul Turbo Pascal utilizeaza directiva FORWARD. WRITELN('c.c. 'suma depusa initial so='. O regula de baza a limbajului Pascal cere ca orice identificator sa fie utilizat numai dupa definirea sau declararea lui. insa daca procedura sau functia B. END.'. BEGIN IF (m>0) THEN BEGIN sd := sd + sd*p*/100.m:INTEGER):INTEGER. 6.

......................................................... 8.... PROCEDURE B....x). WHILE (x<>1) DO BEGIN IF (x MOD 2=0) THEN x := x DIV 2 ELSE x := 3*x+1........................ READLN (x)...... END............. BEGIN ... {apelul procedurii anterioare A} A(ListaParametriActualiA).1...... Algoritmul se termina cand x=1..................... . FORWARD............. ....Prin urmare o procedura sau o functie declarata FORWARD permite divizarea declaratiei unui subprogram in doua parti: una care contine linia de definire a subprogramului (antetul) urmata de cuvantul cheie FORWARD si a doua care contine antetul incomplet al subprogramului (numele fara lista de parametri) si descrierea blocului subprogramului........................ ....... BEGIN ..... . Cu notatiile de mai sus declaratiile procedurii A si B care se apeleaza reciproc pot fi facute astfel: PROCEDURE B (ListaParametriFormaliB)............. WRITELN ('x='... BEGIN WRITE ('Tastati un numar intreg:')......... PROCEDURE A (ListaParametriFormaliA)... 8....... b) Descrierea algoritmului in Limbajul Turbo Pascal (LTP) cu referinte anticipate (FORWARD): PROGRAM CuReferinteAnticipate.... END............ a) Descrierea algoritmului in Limbajul Turbo Pascal fara referinte anticipate: PROGRAM FaraReferinte....... Probleme rezolvate cu proceduri si functii declarate FORWARD. END.. BEGIN . {apelul procedurii ulterioare B} B(ListaParametriActualiB).. VAR x:INTEGER. END. WRITELN ('Sfarsit de program')................ Fiind dat un numar intreg si pozitiv x diferit de 1 sa se determine toate numerele obtinute astfel: x := x div 2 daca x mod 2=0 si n:= 3*x+1 daca x mod 2<>0...... FORWARD.... VAR x:INTEGER FUNCTION fsus (VAR k:INTEGER):INTEGER............. FUNCTION fjos (VAR k:INTEGER):INTEGER....

IF (k<>1) THEN k := fsus(k). WRITE ('valoarea initiala pentru a='). PROCEDURE calculb.b:1:2).k := k DIV 2.n:INTEGER.n:1. IF (i<=n) THEN calculb. READLN (n). . Observatie: Acest algoritm va fi introdus in mediul Turbo Pascal. x := fsus(x).a:1:2. BEGIN WHILE (k MOD 2<>0) DO BEGIN k := 3*k+1. READLN (a). READLN (x). Dandu-se doua valori initiale pentru variabilele a si b (a1 si b1) sa se determine numerele a si b dupa n pasi dati stiind ca exista relatiile de recurenta a=(a+b)/2 si b= . FUNCTION fsus. READLN (b). {Programul principal} BEGIN WRITE ('Dati un numar intreg:'). END. END.k:1). i := 1 {contor de pasi} calcula. BEGIN a := (a+b)/2. PROCEDURE calcula. compilat si executat pas cu pas pentru a se evidentia modul de apelare a functiei fsus de catre functia fjos si invers. WRITELN ('dupa '.k:1). PROCEDURE calcula.2. calcula. FORWARD. END. k := fjos(k). i.b:REAL. WRITELN ('k='. WRITELN ('SFARSITUL PROGRAMULUI').'si b='. i := i+1. Descrierea algoritmul in Limbajul Turbo Pascal (LTP) cu proceduri declarate FORWARD: PROGRAM ReferinteProceduri. WRITELN ('k='. {programul principal} BEGIN WRITELN ('rangul termenului='). WRITE ('valoarea initiala pentru b='). END. 8. END. BEGIN b:= SQRT(a*b). END. VAR a.' pasi a='. END.

Prezentarea succinta a procedurilor si functiilor declarate FORWARD. Sa se calculeze pentru un n dat (n>=2) toti termenii sirului Fibonacci. graficul functiei si dreptele x=3 si x=10 utilizand pentru aproximarea calculului integralei metoda dreptunghiurilor. Se va rezolva problema utilizandu-se: a) o functie pentru calculul lui n! si o procedura pentru calculul c(n.1. 10. 9. 9.10. 9. 9.2. Sa se ordoneze crescator elementele de pe fiecare linie utilizandu-se o procedura pentru ordonarea unui vector si sa se afiseze matricea astfel ordonata. Prezentarea problemelor rezolvate si executate in laborator cu concluziile aferente. utilizandu-se o functie definita pentru calculul distantei dintre doua puncte din plan. Sa se rezolve problema 4. 9.9. Care este diferenta dintre o functie si o procedura? 10. b) utilizandu-se o functie recursiva definita. .5] cu pasul h=0. b) functii sau proceduri recursive stiind ca se poate folosi relatia recurenta: c(n. Sa se verifice daca acestea pot forma un triunghi si in caz afirmativ sa se calculeze aria acestuia si natura sa: isoscel. 9.5. din referat utilizandu-se o functie definita pentru calculul produsului scalar.y2). unde i este numarul liniei care se permuta . Probleme propuse pentru rezolvare: 9. 10. Se da o matrice A de n linii si m coloane. Concluzii si observatii asupra lucrarii. 9. Fiind dat un polinom de gradul n cu coeficienti reali sa se calculeze valorile derivatei acestui polinom pentru x apartinand intervalului [-5. din referat utilizandu-se o functie definita pentru calculul factorialului.2.+c in care n. 9.3.1. echilateral.1.3. Sa se tabeleze functia: f(x) = daca -10<=x<0 f(x)= ln(4 * x+ 1) daca 0<=x<3 f(x)= -2 * x+ 1 ptr 3<=x<=10 pentru x apartinand intervalului [-10. 9.y1).6.4.2.y3). Se va utiliza o procedura care permuta circular dreapta cu o pozitie componentele unui vector. 10.p (n>p) sunt intregi si pozitivi dati. cunoscand relatia de recurenta f(k)=f(k-1)+f(k-2) oricare ar fi k>=2 si f(0)=0 si f(1)=1. Sa se rezolve problema 2.k). Se considera trei puncte in plan (x1. Rezolvarea problemelor propuse in pseudocod si in Turbo Pascal. 10.1. Se va rezolva problema in 2 moduri: a) utilizandu-se o functie declarata pentru calculul unui termen curent apelata de n ori.8. din referat utilizandu-se o procedura pentru calculul valorii unui polinom. Prezentarea succinta a modului de definire si de apel al procedurilor si functiilor. Sa se determine aria suprafetei cuprinsa intre axa ox. 10.(x2. 10.3..5. 9. Sa se calculeze coeficientii binomiali c..11.(x3.k)=(n-k+1)/k*c(n.c+.k-1).10] cu pasul p dat (-10<=p<=10). Sa se rezolve problema 2.7.7. Intr-o matrice cu n linii si m coloane sa se permute circular dreapta fiecare linie "i" cu i pozitii. Se considera functia f(x)= + e. Prezentarea succinta a procedurilor si functiilor recursive.6.Observatie: Ca si la problema precedenta se va executa algoritmul pas cu pas luand pentru n o valoare acceptabila. dreptunghic sau oarecare. Continutul referatului. 10. 9.4.