duminică, 4 decembrie 2011

subprograme

Abstracţia în programare
Abstracţia în programare se realizează cu ajutorul subprogramelor. De multe ori este necesar ca o anumită secvenţă de instrucţiuni să se execute de mai multe ori în cadrul unui program, eventual pentru alte date. De aceea este bine ca aceste instrucţiuni să fie grupate într-un modul purtând un nume. El va fi numit subprogram. Subprogramul se poate activa (lansa în execuţie) la cerere, prin intermediul acestor nume. Să exemplificăm, fie e necesar să se calculeze aria totală a două loturi dreptunghiulare. Algoritmul este următorul:
Algoritm Aria_totala_1
Var
S: real
A: real
B: real
S_total: real
Begin
; calcularea ariei primului lot
ReadReal(a)
ReadReal(b)
S:=a*b
S_total:=s
; calcularea ariei lotului 2
ReadReal(a)
ReadReal(b)
S:=a*b
S_total:=s_total+s
End
Fragmentul comun ReadReal(a)
ReadReal(b)
S:=a*b
Poate fi oformat ca subalgoritm astfel
Algoritm Aria_1_lot
Begin
ReadReal(a)
ReadReal(b)
S:=a*b
End
Atunci algoritmul principal va primi forma:
Algoritm Aria_totala_1
Var
S: real
A: real
B: real
S_total: real
Begin
; calcularea ariei primului lot
Aria_1_lot
S_total:=s
; calcularea ariei lotului 2
Aria_1_lot
S_total:=s_total+s
End
Avantajele folosirii subprogramelor
În general, subprogramele includ mai multe instrucţiuni, folosirea lor având ca efect reducerea dimensiunilor textului sursă al programelor, prin “factorizarea” unor secţiuni comune ale programelor. Subprogramele mai permit:
- sistematizarea elaborării programelor, prin împărţirea unei probleme mai complicate în probleme mai simple, tratate prin subprograme separate;
- scurtarea timpului de elaborare a programelor, prin utilizarea aceluiaşi subprogram în programe diferite;
- economiseşte spaţiul de memorie, la execuţia programului.
Proceduri şi funcţii
În limbajele de programare subprogramele se realizează cu ajutorul procedurilor îi funcţiilor. Utilizarea procedurilor presupune două elemente esenţiale:
- se referă la precizarea grupului de instrucţiuni commune;
- specifică locul sau locurile din program în care grupul de instrucţiuni trebuie executat.
Corespunzător celor două elemente menţionate, regăsim în program două construcţii distincte:
- o secţiune de program distinctă, numită d e f i n i ţ i a p r o c e d u r i i, care este inclusă în partea declarativă a programului, o singură dată;
- o instrucţiune specială, care se numeşte a p e l de p r o c e d u r ă şi care este inclusă în locurile în care ar trebui să fie executate acţiunile din grupul comun.
4.4.1. Definiţia şi apelul unei proceduri simple
Definiţia unei proceduri conţine:
- un antet
- un bloc, numit şi corpul procedurii.
Antetul precizează numele procedurii, care este utilizat şn program, în fiecare din apelurile acesteia.
Corpul procedurii are o parte declarativă şi una executabilă.
O procedură se defineşte în felul următor:
Procedure
Var
< variabile locale>
begin
< corpul procedurii>
end
Apelul procedurii este foarte simplu şi constă doar din numele procedurii. El trebuie inclus în partea executabilă a programului, ca o instrucţiune de sine stătătoare.
Execuţia procedurii
Execuţia apelului de procedură se face printr-un mecanizm mai complicat. Apelul provoacă suspendarea execuţiei procedurii curente, apelante (cea care conţine apelul de procedură) şi activarea procedurii apelate, adică execuţia instrucţiunilor din corpul acesteia. La sfârşitul execuţiei procedurii apelate, se reia execuţia procedurii apelante, din punctual imediat următor apelului.
Variabile locale şi variabile globale
Identificatorii declaraţi în procedură se numesc variabile locale. Ele pot fi folosite numai în această procedură şi nu pot fi accesate în exteriorul ei. Variabilele declarate în algoritmul principal se numesc variabile globale. Domeniul de valabilitate a variabilelor globale este întregul algoritm, inclusiv procedurile algoritmului.
Observaţii:
- o variabilă locală există numai în timpul execuţiei acelei proceduri, fiind cretă la activarea procedurii, prin alocarea spaţiului de memorie necesar şi fiind distrusă la îeşirea din procedură, prin eliberarea spaţiului de memorie. Acest mecanizm constituie un mijloc de economisire a spaţiului de memorie, o aceeaşi zonă de memorie putând fi folosită pentru a păstra, la momente diferite de timp, valorile variabilelor locale ale diversilor proceduri ale programului;
- variabilele locale sunt nedefinite la începutul execuţiei procedurii, nu sunt iniţializate la apelul procedurii şi nici ni-şi păstrează valoarea de la un apel la altul.
4.4.2. Proceduri cu parametri
Procedurile simple, fără parametri au posibilităţi limitate deaceea foarte des se folosesc procedurile cu parametri. Forma cea mai generală a procedurilor este cea parametrizată. De obicei, procedura execută un calcul cu valorile parametrilor săi de intrare şi furnizează rezultatele prin parametrii de ieşire.Se declară o procedură cu parametric astfel:
Procedure (lista parametrilor formali)
Var

begin

end
Se apelează procedura cu parametric astfel:
(lista parametrilor actuali)
Dacă procedura se apelează de mai multe ori, atunci la fiecare apel parametrul formal va conţine valori diferite, în dependenţă de parametrii actuali.
Ca şi variabilele locale, parametrii formali sunt cunoscuţi în procedură, dar sunt necunoscuţi în afara acesteia. Ei se comportă la fel ca variabilele locale, cu o singură excepţie: la apelul procedurii, se realizează iniţializarea parametrilor, printr-un anumit mecanizm. Astfel parametrii formali sunt definiţi ( au valori bine precizate) la începerea execuţiei procedurii. Parametrii nu pot fi utilizaţi în afara procedurii în care sunt declaraţi.
Între lista parametrilor actuali şi lista parametrilor formali se stabileşte o corespondenţă poziţională unu-la-unu. Parametrii pot fi transmişi prin două metode:
- prin valoare;
- prin referinţă.
Transmitera parametrilor prin valoare
Un parametru transmis prin valoare se descrie în lista parametrilor formali în felul următor:
:
Dacă parametrii sunt transmişi prin valoare atunci execuţia procedurii se desfăşoară astfel:
- se calculează valoarea fiecărui parametru actual;
- se alocă memorie pentru parametrii formali, transmişi prin valoare şi pentru variabilele locale ale procedurii;
- valorile parametrilor actuali calculate sunt atribuite parametrilor formali, iniţializându-le;
- se execută corpul procedurii;
- se eliberează memoria, ocupată de parametrii formali, transmişi prin valoare şi de variabilele locale;
- se reia execuţia procedurii apelante, de la instrucţiunea imediat următoare apelului.
În cazul transmiterii prin valoare, parametrii actuali pot fi orice expresii, al căror tip este compatibil cu tipul parametrului formal corespunzător. Parametrii pot fi transmişi prin valoare, dacă reprezintă datele de întrare pentru procedură.
Exemplu: să se calculeze aria totală a două loturi dreptunghiulare.
Rezolvare
Vom elabora procedura Aria_unui_lot, care va avea la întrare cele două dimensiuni ale dreptunghiului. Deci procedura va avea doi parametrii, transmişi prin valoare. Pentru calcularea ariei totale vom apela de două ori procedura Aria_unui_lot cu diferiţi parametric actuali
Algoritm Aria_totala
Var
A1,b1 : real;
A2,b2 : real
S_total: real
Pricedure Aria_unui_lot(latura1:real, latura2: real)
Var
S: real
Begin
S:=latura1 * latura2
S_total:= Stotal+ S
End
Begin
ReadReal(a1)
ReadReal(b1
S_total:=0
Aria_unui_lot(a1,b1)
ReadReal(a2)
ReadReal(b2)
Aria_unui_lot(a2,b2)
WriteReal(s_total)
End
La primul apel al procedurii Aria_unui_lot parametrul actual a1 se copie în parametrul formal latura1, iar parametrul actual b1 se copie în parametrul formal latura2. Începe a lucra procedura care calculează aria primului lot în variabila locală S şi apoi o adaugă la variabila globală S_total, care pănâ la întrare în procedură avea valoarea 0.
La cel de-al doilea apel al procedurii, parametrul actual a2 se copie în parametrul formal latura1, iar parametrul actual b2 se copie în parametrul formal latura2. Începe a lucra procedura care calculează aria celui de-al doilea lot în variabila S şi apoi o adaugă la variabila globală S_total., care până la întrare în procedură conţinea valoarea ariei primului lot.
Exemplu: să se afişeze diuvizorii a două numere naturale citite de la tastatură.
Rezolvare:
Vom elabora procedura Divizori, care va afişa divizorii oricărui număr natural. Procedura va avea o întrare, deci un parametru, transmis prin valoare. Corpul procedurii va conţine un ciclu cu contor, unde variabila ciclului va lua valori din intervalul 1.. N ( N – valoara numărului natural dat). Corpul ciclului va compara resturile de la împărţirea numărului natural N la valorile variabilei ciclui. Dacă restul este egal cu zero, înseamnă că valoarea variabilei ciclului este divisor pentru numărul N.
Algoritm Afisare_divizori
Var
Numar1: natural
Numar2: natural
Procedure Divizor(N: natural )
Var
I: natural
Begin
For I:=1 to N step 1
If N mod I =0 then
WriteNat(i)
End
End
End
Begin
ReadNat(numar1)
Divisor(numar1)
ReadNat(numar2)
Divisor(numar2)
End
Transmiterea parametrilor prin referinţă
Parametrii a căror declaraţie este prefixată de cuvăntul rezervat var sun consideraţi parametri-variabile. Pentru ei există un alt mecanism de transmitere a valorilor, numit transmitere prin referinţă a parametrilor. El constă în punerea în corespondenţă, la apelul procedurii, a parametrilor actuali cu parametrii formali, astfel încât, pe durata execuţiei procedurii, identificatorul unui parametru formal devine sinonim cu identificatorul paramtrului actual corespunzător. Datorită acestui mecanism, operaţiile procedurii au efect direct asupra parametrilor actuali.
Modificările parametrilor-variabile ai unei proceduri persistă (se transmit programului apelant) şi după terminarea execuţiei procedurii. O schimbare a parametrului formal se reflectă în celălalt parametru. Parametru actual corespunzător unui parametru formal variabilă nu poate fi o expresie, ci numai o variabilă. de acelaşi tip cu parametrul formal corespunzător.
Dacă procedura furnizează rezultatele sale programului apelant, atunci acest parametru trebuie să fie transmis numaidecât prin referinţă, iar dacă parametrii reprezintă date de întrare, atunci ei pot fi transmişi atât prin valoare cât şi prin referinţă.
Exemplu: să se calculeze aria totală a două loturi dreptunghiulare.
Rezolvare
Vom elabora procedura Aria_unui_lot, care va avea la întrare cele două dimensiuni ale dreptunghiului. Deci procedura va avea doi parametrii, transmişi prin valoare şi va returna aria calculată programului apelant, deci acest parametru se va transmite prin referinţă. . Pentru calcularea ariei totale vom apela de două ori procedura Aria_unui_lot cu diferiţi parametric actuali
Algoritm Aria_totala
Var
A1,b1 : real;
A2,b2 : real
S1,S2: real
S_total: real
Pricedure Aria_unui_lot(latura1:real, latura2: real, var S:real))
Begin
S:=latura1 * latura2
End
Begin
ReadReal(a1)
ReadReal(b1
Aria_unui_lot(a1,b1,s1)
S_total:=S1
ReadReal(a2)
ReadReal(b2)
Aria_unui_lot(a2,b2,S2))
S_total:=S_total+S2
WriteReal(s_total)
End
La primul apel al procedurii Aria_unui_lot parametrul actual a1 se copie în parametrul formal latura1, iar parametrul actual b1 se copie în parametrul formal latura2 şi se instalează corespondenţa între parametrul actual S1 şi parametrul formal S. Începe a lucra procedura care calculează aria primului lot în variabila S care corespunde zonei de memorie ocupate de variabila globală S1. După terminarea procedurii variabila S1 va conţine aria primului lot.
La cel de-al doilea apel al procedurii, parametrul actual a2 se copie în parametrul formal latura1, iar parametrul actual b2 se copie în parametrul formal latura2 şi se instalează corespondenţa între parametrul actual S2 şi parametrul formal S. Începe a lucra procedura care calculează aria lotului doi în variabila S, care corespunde zonei de memorie ocupate de variabila globală S2. După terminarea procedurii variabila S2 va conţine aria celui de-al doilea lot.
4.4.3. Funcţii
În limbajele de programare subprogramele pot fi realizate şi ca funcţii. Deosebirea între proceduri şi funcţii constă în numărul valorilor calculate şi returnate în punctele din care s-a făcut apelul:
- procedura calculează oricâte valori;
- funcţia calculează întotdeauna o singură valoare.
O funcţie este un subprogram care calculează şi întoarce ca rezultat o singură valoare. Forma generală a definiţiei unei funcţii este următoarea:
Function (lista_parametri_formali): tip_rezultat
Var
< variabile locale>
begin

end
Rezultatul calculat de o funcţie este obligatoriu de tip elementar sau string specificat în antet. Rezultatul calculat de funcţie se întoarce programului apelant cu ajutorul operatorului Return
Lista parametrilor formali are sintaxa identică celei de la procedură.
Apelul funcţiei se face chiar în expresia care utilizează valoarea calculată, într-o formă foarte apropiată de scrierea uzuală a formulelor în matematică. Apelul funcţiei poate să apară în orice expresie, ca operand care are tipul rezultatului funcţiei. Sintaxa apelului unei funcţii este următoarea:
< nume_funcţie >(lista_parametri_actuali)
Efectul funcţiei se manifestă atunci când la evaluarea expresiei este necesară valoarea operandului reprezentat de apelul de funcţie. În acest moment, evaluarea expresiei este suspendată temporar şi se realizează următoarele acţiuni:
- se face transferul parametrilor actual ai funcţiei;
- se execută corpul funcţiei; ca urmare este calculată valoarea funcţiei;
- acestă valoare este chiar valoarea operandului, folosită în continuare la reluarea evaluării expresiei ce conţine apelul funcţiei.
Exemplu: să se calculeze S=max(a,b,c)+max(d,e,f)
Rezolvare:
Vom elabora funcţia Max care are la întrare 3 numere întregi, fie n1,n1,n3. corpul funcţiei determină valoara maximă dintre numerele n1,n2,n3. Deci, funcţia va avea 3 întrări – 3 parametri formali, transmişi prin valoare.
Algoritm Suma_max
Var
A,b,c,d,e,f: integer
S: integer
Function max(n1: integer, n2: integer, n3: integer): integer
Var
N_max: integer
Begin
If n1>n2 then
N_max:=n1
Else
N_max:=n2
End
If n3> n_max then
N_max:=n3
End
Return n_max
End
Begin
ReadInt(a)
ReadInt(b)
ReadInt(c)
ReadInt(d)
ReadInt(e)
ReadInt(d)
S:=max(ab,c)+max(d,e,f)
End
Variabilei globale S i se atribuie valoare unei expresii cu doi operanzi. Operanzii reprezintă apeluri de funcţii. Înainte de a face operaţia adunării se calculează primul operand, care suspendă calculul expresiei şi face apelul funcţiei Max cu parametrii actuali (a,b,c). Funcţia returnează în punctul apelului funcţiei valoarea calculată de funcţie. Apoi se calculează cel de-al doilea operand prin apelul funcţiei Max cu parametrii actuali (d,e,f) ,care returnează în punctual apelului valoarea calculată de funcţie. După ce se adună valorile celor doi operanzi calculaţi.

Niciun comentariu:

Trimiteți un comentariu