Sunteți pe pagina 1din 23

MEDII DE PROGRAMARE IN IA Cursul 6 Funct ii denite de utilizator n Guru

Nicolae T and areanu

Facultatea de Matematic a si Informatic a, Universitatea din Craiova, str.A.I.Cuza 13, 1100-Craiova, Romania e-mail: rcai@central.ucv.ro
1

Obiective

Obiectivele acestui capitol sunt urm atoarele: nsu sirea modului de denire a sierelor UDF dezvoltarea capacit a tii de scriere a aplicat iilor care utilizeaz a aceste siere

Crearea unui UDF


FUNCTION

Un sier UDF ncepe ntotdeauna cu o instruct iune Aceast a instruct iune desemneaz a nceputul unei funct ii din punct de vedere sintactic. Ultima instruct iune a unei funct ii este ENDFUNCTION. Dac a funct ia ntoarce o valoare, atunci ea trebuie s a cont in a de asemenea o instruc tiune RETURN. Forma instruct iunii FUNCTION este: FUNCTION nume(lista argumente) instructiuni; RETURN(); ENDFUNCTION Lista de argumente cont ine nume de variabile separate prin virgule. In instruct iunea FUNCTION entitatea nume reprezint a numele funct iei.

3 Un sier UDF poate s a cont in a mai multe funct ii. Nu este obligatorie prezent a listei cu argumente. Evident iem urm atoarele observat ii importante n leg atur a cu sintaxa utilizat a ntr-un UDF: - Variabilele LOCAL, GLOBAL si STATIC trebuie declarate imediat dup a FUNCTION. - Variabilele utilitare trebuie declarate GLOBAL. - Toate instruct iunile trebuie terminate cu punct si virgul a. - RETURN ntoarce o singura valoare; n parantez a se poate trece orice expresie si n acest caz valoarea acesteia se returneaz a locului n care a fost apelat a. - Semnul de atribuire este := - Argumentele nu trebuie declarate ca variabile; ele sunt declarate automat; parametrii care sunt tablouri se declar a n lista de argumente, precedat i de specicatorul ARRAY la fel ca n exemplul de mai jos: FUNCTION arc(ARRAY aa, rata, salariu)

4 - Dac a o funct ie nu cont ine argumente, atunci se trece lista de argumente vid a: FUNCTION produs()

Compilarea unui UDF

Compilarea unui sier UDF se realizeaz a cu comanda: C > g3c nume.kgl

In urma compil arii se obt ine un sier nume.kgb si un sier nume.blb. Fi sierul KGB cont ine o informat ie header pentru toate funct iile existente n UDF-ul respectiv, iar sierul BLB cont ine codul compilat binar actual. La ecare compilare a sierului UDF, ambele siere sunt actualizate. Pentru a putea utiliza funct iile existente ntr-un UDF, acestea se ncarc a n memorie cu comanda: C > LOAD UDF nume Informat iile introduse r am an n memorie p an a la utilizarea comenzii C > RELEASE UDF nume Exemplul 3.1 Consider am urm atorul sier cu numele e1.kgl:

5 function f1() global p; global array vec; p:=2; dim vec(2); vec(1):=10; vec(2):=20; endfunction Se observ a c a n acest sier se init ializeaz a valoarea variabilei globale p si valorile vectorului global vec. Funct ia f1 nu are argumente. Se observ a modul n care vectorul vec a fost declarat global si modul n care s-a denit num arul de componente ale acestuia. Consider am sierul UDF cu numele e2.kgl: function f2() global p; global array vec; output "PRIMA VALOARE ESTE: ",vec(1); output "Valoarea lui p este: ",p; endfunction Funct ia f2 a seaz a valoarea primei componente a vectorului global vec si valoarea variabilei globale p. Aceast a funct ie

6 nu init iaz a valori de variabile, dar utilizeaz a valori atribuite de o alt a funct ie. At at f1 c at si f2 nu returneaz a valori. Consider am de asemenea sierul de mai jos cu numele e3.ipf: global p; global array vec; local s; f1(); output "Valoarea lui p este : ", p; s:=vec(1)+vec(2); output "Rezultatul este : ",s; Aceste trei siere comunic a cu date prin intermediul variabilelor globale. Se observ a modul de apelare a funct iei f1. Faptul c a aceast a funct ie nu returneaz a nici o valoare permite ca apelarea ei s a nu se fac a ntr-o instruct iune de atribuire. Prelucrarea si executarea acestor siere se face n urm atoarele etape: Compilarea sierului e1.kgl sub sistemul de operare: C > g 3c e1.kgl Compilarea sieului e2.kgl:

7 C > g 3c e2.kgl Deschiderea unei sesiuni de lucru: C > guru -g arcarea funct Inc iei f1: Guru > load udf e1 arcarea funct Inc iei f2: Guru > load udf e2 Execut ia funct iei f2: Guru > f2() Rezultatele execut iei lui f2: PRIMA VALOARE ESTE: ERROR Valoarea lui p este: ERROR Execut ia sierului e3.ipf: Guru perform e3 Rezultatul execut iei sierului e3: Valoarea lui p este: 2.00

8 Rezultatul este : 30.00 Guru > Se observ a efectul execut iei funct iei f2 nainte de a executat a funct ia f1. Variabilele care nu au fost init ializate, n cazul de fat a de f1, primesc valoarea ERROR. Execut ia sierului e3.ipf init ializeaz a valorile acestor variabile prin execut ia funct iei f1. aplicat Exemplul 3.2 In ia care urmeaz a ne propunem s a d am un exemplu de utilizare a variabilelor STATIC, GLOBAL si transmitere de parametrii ntre funct ii. Pentru aceasta ne propunem s a scriem un program pentru rezolvarea urm atoarei probleme: o coloan a a matricei x se nume ste pozitiv a dac a suma elementelor ei este pozitiv a; problema cere s a se g aseasc a suma elementelor tuturor coloanelor pozitive din matricea x. Pentru rezolvarea acestei probleme vom considera la nceput sierul ex12a.ipf de mai jos: FUNCTION col(array y,n,j,k) LOCAL s,i; STATIC suma; IF j=1 THEN suma:=0;ENDIF; s:=0;

9 FOR i:=1 TO n DO s:=s+y(i); ENDFOR; IF s>0 THEN suma:=suma+s;ENDIF; IF j=k THEN output "SUMA TOTALA ESTE :",suma; ENDIF; ENDFUNCTION Parametrii funct iei col au urm atoarele semnicat ii: y este un vector cu n componente; el va cont ine pe r and coloanele unei matrice j are valori de la 1 la k S a consider am de asemenea urm atorul sier, cu numele ex12b.kgl: FUNCTION mat(array x,m,k) LOCAL i,j,a; global t; local array v; dim v(t); FOR j:=1 TO k DO FOR i:=1 TO m DO v(i):=x(i,j); ENDFOR; !m=nr.linii k=nr coloane

10 col(v,m,j,k); ENDFOR; ENDFUNCTION Acum consider am urm atorul sier ex12.ipf: GLOBAL t; LOAD UDF ex12a; LOAD UDF ex12b; LOCAL DIM bb(4,3);t:=4; bb(1,1):=-5;bb(2,1):=1;bb(3,1):=0;bb(4,1):=2; bb(1,2):=7;bb(2,2):=0;bb(3,2):=1;bb(4,2):=2; bb(1,3):=1;bb(2,3):=2;bb(3,3):=3;bb(4,3):=-8; mat(bb,4,3); RELEASE ALL; De observat specicul variabilei statice suma: aceast a variabil a este init ializat a numai la prima apelare a funct iei col; orice apelare ulterioar a cunoa ste valoarea anterioar a. Programul de lucru este urm atorul: se compileaz a ex12a.kgl si ex12b.kgl: C> g3c ex12a se compileaz a ex12b.kgl: C> g3c ex12b

11 se trece la execut ia programului ex12.ipf: Guru > perform ex12

Aplicat ii

Consider am c a avem de rezolvat urm atoarea problem a: un salariat do- re ste s a cumpere n rate un aparat electronic; el cunoa ste: dob anda solicitat a de magazin; pret ul aparatului; rata anual a de cre stere a salariului; rata anual a de cre stere a ntret inerii apartamentului n care locu- ie ste. Problema se pune s a se scrie un program care s a solicite ca date de intrare: salariul actual al persoanei n cauz a; dob anda solicitat a de magazin; num arul de rate n care s a se pl ateasc a aparatul; rata anual a de cre stere a salariului si a ntret inerii apartamentului

12 si s a a seze: rata lunar a; suma de bani care r am ane persoanei pe o lun a dup a ce aceasta pl ate ste rata si ntret inerea apartamentului; suma total a cu care va pl ati aparatul achizionat. Pentru nceput vom considera urm atoarele dou a funct ii: 1) Funct ia calcul rate cu trei argumente: variabila vtotala, care prime ste ca valoare pret ul aparatului a sat la magazin variabila n, care reprezint a num arul de luni n care cump ar atorul dore ste s a pl ateasc a aparatul; presupunem c a se accept a cel mult 36 de luni variabila dob, care reprezint a dob anda anual a de pl atit pentru cump ar ator Funct ia calculeaz a suma pe care o are de pl atit cump ar atorul pe ecare lun a si c at a pl atit p an a n prezent. Aceste valori calculate sunt atribuite unor variabile globale pentru a putea utilizate de alte unit a ti de program.

13 2) Funct ia situat ie, cu dou a argumente: tabloul sal, care reprezint a salariul anual pe perioada c at cump ar atorul are de pl atit rate variabila k, reprezent and num arul unei luni din perioada n care se achit a aparatul Funct ia returneaz a unit a tii apelante, prin intermediul instruct iunii RETURN, suma de bani care i r am ane cump ar atorului dup a ce a pl atit rata unei luni si ntret inerea pe luna respectiv a. Implementarea acestor dou a funct ii o g asim n sierul rata.kgl de mai jos: function calcul_rate(vtotala,n,dob) global dim luna(36); global platit; local k,suma,ratalunara,dlunara; suma:=vtotala; ratalunara:=vtotala/n; platit:=0; dlunara:=dob/12; for k:=0 to n-1 do luna(k+1):=ratalunara+dlunara*suma/100; suma:=suma-ratalunara;

14 platit:=platit+luna(k+1); endfor; endfunction function situatie(array sal,k) global array luna; global array intretinere; local an; an:=toint((k-1)/12)+1; return(sal(an)-(intretinere(an)+luna(k))); endfunction Utilizarea acestor dou a funct ii o prezent am n sierul vanzare.ipf, care are urm atorul cont inut: global array luna; global platit,dim intretinere(36) local dim salariu(36) load udf rata /* calculez salariul si intretinerea apartamentului***/ local baza1,baza2; local dim adaos1(36),adaos2(36); output "Salariul lunar actual este: "; input baza1 num using "ddddddd"; output "Intretinerea actuala a apartamentului este:";

15 input baza2 num using "ddddddd"; i=1; while i<=3 do output "Cresterea salariului in \% pentru anul ",i; input adaos1(i) num using "dd"; output "Cresterea intretinerii in \% pentru anul ",i; input adaos2(i) num using "dd"; salariu(i)=baza1+adaos1(i)*baza1/100; intretinere(i)=baza2+adaos2(i)*baza2/100; i=i+1 endwhile output "DATI VALOAREA APARATULUI:"; input v num using "ddddddd"; output "DATI NUMARUL DE RATE:"; input nrate num using "dd"; output "DATI DOBANDA ANUALA:"; input dobinda num using "dd.dd"; calcul_rate(v,nrate,dobinda) k=0;x=nrate MOD 3;y=nrate-x output "DORITI SA AFLATI TOATE RATELE LUNARE?(da/nu)"; input rasp str using "aa"; if rasp="da" then output "RATELE LUNARE SUNT:" while k<=y-3 do

16 output luna(k+1),luna(k+2),luna(k+3) k=k+3 endwhile if x=1 then output luna(nrate) else if x=2 then output luna(nrate-1),luna(nrate); endif endif output "SUMA TOTALA DE PLATIT ESTE:",platit endif output "DORITI SUMA CARE RAMANE DIN SALARIU"+\ " INTR-O ANUMITA LUNA?(da/nu)"; input rasp str using "aa"; if rasp="da" then input q int using "dd" with "DATI NUMARUL LUNII:"; u=situatie(salariu,q); output "DUPA PLATA RATEI SI A "+\ "INTRETINERII RAMANE SUMA:",u; endif release all Cititorul este rugat s a urm areasc a n special urm atoarele aspecte legate de modalit a tile de implementare puse la dispozit ie de mediul Guru:

17 transmiterea unor valori ntre unitatea apelant a si funct ie prin declarare global a; utilizarea funct iei built-in toint, care calculeaz a partea ntreag a. utilizarea instruct iunii RETURN: argumentul acesteia este o expresie; nu este necesar a atribuirea valorii acestei expresii unei variabile, pentru ca apoi, acea variabil a s a e trecut a ca argument pentru RETURN ncorporarea a dou a funct ii, calcul rate si situat ie n acela si sier kgl

Teme

TEMA nr. 5.1 Realizat i urm atoarele modic ari, pe r and, si urm arit i efectele obt inute: eliminat i cele dou a declarat ii GLOBAL punet i punct si virgul a dup a ENDFUNCTION punet i punct si virgul a dup a FUNCTION ...... eliminat i ultimul IF ..... ENDIF din ex12a.kgl

18 TEMA nr. 5.2 1) Eliminat i din sierul rata.kgl instruct iunea: local k, suma, ratalunara, dlunara; Compilat i sierul obt inut. Explicat i fenomenul constatat. 2) Eliminat i cuv antul global din instruct iunea global dim luna(36); Compilat i sierul si explicat i fenomenul. 3) Se poate utiliza instruct iunea FOR n sierul vanzare.ipf? TEMA nr. 5.3 Un cet a tean dispune de o sum a N de lei. El dore ste s a depun a ace sti bani ntr-un depozit pe trei luni la o banc a astfel nc at s a ridice la ecare trei luni dob anda obt inut a. Se presupune c a termenul de depunere este multiplu de 3. Scriet i un sier kgl care s a cont in a funct ia depozit; aceasta va ntoarce valoarea dob anzii, iar ca parametri formali va utiliza num arul de luni, suma depus a si dob anda anual a.

19 Scriet i un sier ipf care s a utilizeze funct ia depozit pentru dou a b anci, astfel nc at cet a teanul s a ae suma obt inut a din dob anzi pentru ecare banc a. TEMA nr. 5.4 Reconsider am enunt ul din exercit iul 5.3: presupunem c a cet a teanul p astreaz a depozitul k grupe de 3 luni si extrage suma dup a 3 k + s zile, unde s < 90. Fiecare banc a ofer a o dob anda mai mic a pentru cele s zile. Cunosc and aceste dob anzi si suma depus a, scriet i un program care s a obt in a dob anda total a ncasat a. TEMA nr. 5.5 Un cet a tean dispune de o sum a N n lei. Pentru a obt ine un prot pe un an calendaristic el are la dispozit ie dou a variante: s a transforme suma n dolari s a transforme suma n euro s a depun a suma ntr-un depozit la o banc a cu dob anda d% pe an Presupun and ca n cazul transform arii sumei n valut a, f ar a s a o depun a la banc a, peste un an revine la moneda leu, se cere s a se scrie un program care s a decid a care

20 este varianta optim a (protul cel mai mare). Se presupune c a se cunoa ste raportul dolar/leu si euro/leu peste un an (presupun and o cre stere lunar a aproximativ egal a cu cre sterea din ultimul an). TEMA nr. 5.6 Un cet a tean dispune de o sum a N n lei. Se prezint a la o cas a de schimb valutar si dore ste s a schimbe suma n dolari si/sau euro. Presupunem c a cet a teanul obt ine d dolari si e euro. Scriet i un program care, cunosc and cursul de schimb, s a calculeze pe d si e astfel nc at suma neschimbat a s a e minim a. TEMA nr. 5.7 Se considera un alfabet nit A. Fiecarui element ai din A i se ataseaza o probabilitate pi. Fie (0, 1). Utilizati facilitatile oferite de GURU pentru a calcula cea mai mica multime B A cu proprietatea ca aB pa > 1 . TEMA nr. 5.8 Se consider a o matrice A(n,n) cu elemente numere reale. O linie a matricei A se numeste majoritar a dac a cel mai mare element al ei se a a pe diagonala principal a. Scriet i un program care s a a seze liniile majoritare din A. Utiliz and variabile statice scriet i aplicat ia care calculeaz a suma elementelor tuturor liniilor majoritare.

21 TEMA nr. 5.9 Scriet i doua unit ati de program astfel nc at: una din ele apeleaz a o procedur a pentru calculul mediei aritmetice M a n numere si ntoarce rezultatul d% din M. Procedura se a a n cealalt a unitate de program. Num arul d nu se transmite ca parametru n procedur a. Pentru transmiterea lui d utilizat i variabile de tip GLOBAL. TEMA nr. 5.10 La o stat ie de benzin a sosesc n autoturisme. Timpul n care se face alimentarea unui autoturism este direct proport ional cu cantitatea de benzin a solicitat a. Cunosc and cantit a tile de benzin a s1 , . . . , sn solicitate de cele n autoturisme, scriet i un program care s a calculeze ordinea de servire astfel nc at timpul total de a steptare s a e minim. Aat i timpul de a steptare pentru ecare autoturism. TEMA nr. 5.11 Scriet i o procedur a pentru rezolvarea n Zm a ecuat iei P (X ) = 0 , unde P este un polinom de gradul n. Utilizat i aceast a procedur a ntr-o unitate apelant a. TEMA nr. 5.12 Considerat i ecuat ia (X + 2) Y 2 + (X 2 3 X + 2)

22 Y +4 = 0. Scriet i un program care s a citeasc a pe X si s a ae Y sau s a citeasc a pe Y si s a calculeze X . Utilizat i macrouri. TEMA nr. 5.13 Considerat i n puncte n plan, denite prin coordonatele carteziene. Scriet i o funct ie GURU care s a calculeze num arul punctelor aate n interiorul cercului de ecuat ie x2 + y 2 = 9. Aat i num arul punctelor din ecare cadran, interioare acestui cerc. TEMA nr. 5.14 Denit i un graf orientat n GURU. Scriet i o procedur a GURU care pentru dou a noduri date s a g aseasc a un drum elementar de la primul nod la al doilea. TEMA nr. 5.15 Scriet i o funct ie care s a calculeze produsul boolean a dou a matrici booleene de tip n n. Utilizat i aceast a funct ie pentru a deduce existent a drumurilor de o anumit a lungime ntre dou a noduri ale unui graf orientat dat. TEMA nr. 5.16 Scriet i funct ia cu numele suma care s a primeasc a doua numere si s a returneze suma lor. Scriet i o funct ie cu numele b care s a primeasc a ca argument un num ar

23 natural n si s a returneze elementul de pe locul n din sirul lui Fibonacci: F ib(0) = 0; F ib(1) = 1 F ib(n + 1) = F ib(n 1) + F ib(n), n = 1, 2, 3, . . . Funct ia b va utiliza funct ia suma, dar nu va utiliza tablouri. Scriet i un program care s a utilizeze funct ia b. TEMA nr. 5.17 Scriet i un program pentru calculul compusei a dou a relat ii binare. Utilizat i un sier UDF si un sier IPF. TEMA nr. 5.18 Scriet i un program n Guru pentru a calcula c atul si restul mp art irii unui polinom P (x) la x a n Zm . TEMA nr. 5.19 Scriet i o funct ie care s a descompun a un text n cuvintele componente. Utilizat i aceast a funct ie ntr-un program IPF.

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