Sunteți pe pagina 1din 26

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

1. Generaliti
Toate exemplele de pn acum, erau alctuite dintr-un singur bloc de instruciuni,
cuprinse ntre begin i end numit modul principal sau program principal. Limbajul de
programare Pascal permite gruparea instruciunilor i n mai multe blocuri de instruciuni numite
subprograme.
Programele vor fi mult mai clare, mai uor de urmrit i corectat.
Dac grupm instruciunile ntr-un subprogram, trebuie s comandm execuia secvenei
respective. Vom spune c apelm subprogramul.
Scopul organizrii n subprograme este acela de a apela subprogramul de mai multe ori,
fr ca s existe o regul care s dicteze repetarea.
Blocul de program din interiorul cruia se apeleaz un subprogram, poart numele de
modul apelant. Acesta poate fi programul principal sau chiar un alt subprogram. Aadar
subprogramele se pot apela unul pe altul.
La fiecare apel al unui subprogram, modulul apelant poate transmite acestuia nite date,
pe care subprogramul le va folosi atunci cnd se execut. Aceste date se numesc parametri. La
fiecare execuie a sa, n urma unui apel, subprogramul poate s lucreze cu alte date, pe care le-a
recepionat sub forma unor parametri. Exist i subprograme fr parametri, care opereaz direct
asupra variabilelor programului.
Orice subprogram are un identificator (un nume ales de noi) i eventual un set de
parametri.
Exemplu: Fie un program structurat astfel:
P modul/program principal
P1,P2 subprograme
P este modul apelant pentru P1 i P2
P1 este modul apelant pentru P2

P
P1
P2

Subprogramele pot fi de dou tipuri:


Proceduri
Funcii

Avantajele folosirii subprogramelor sunt:


O mai mare claritate i coeziune a programelor;
Posibilitatea de a executa instruciunile dintr-un subprogram de mai
multe ori, la fiecare execuie cu alte date.

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

2. Proceduri
2.1 Declarare i apel. Variabile globale i locale

O procedur este un modul de program alctuit dintr-o secven de


instruciuni care se execut ca urmare a apelrii procedurii dintr-un alt
modul.

Exemplu: Fie dou numere reale a i b, realizeaz un program care afieaz media
aritmetic a celor dou numere.
Vom prezenta, pentru comparaie:
varianta cu un singur modul principal(Varianta V1)
varianta n care folosim o procedur pentru calcularea mediei aritmetice (Varianta
V2)
{Varianta V1}
program sub_1;
var ma,a,b:real;
begin
write(a,b:);
readln(a,b);
{1}
ma:=(a+b)/2;
{2}
writeln(ma:,ma:8:2);{3}
readln;
end.
{Varianta V2}
program sub_2;
var ma,a,b:real;
procedure calcul_media;
begin
ma:=(a+b)/2;
{2}
writeln(ma:,ma:8:2);{3}
end;
begin
write(a,b:);
readln(a,b);
{1}
calcul_media;
{4}
readln;
end.

{1} dm valori unor variabile a i b prin


citire
{2} calculm media aritmetic a
numerelor a i b, pe care o memorm n
variabila ma
{3} afim media aritmetic ma, pe 8
caractere, dintre care 2 zecimale

n aceast variant se observ c


instruciunile {2} i {3} pentru calculul i afiarea
mediei aritmetice sunt grupate ntr-o procedur
denumit calcul_media. Astfel, programul are
acum dou module de program:
- modulul(programul) principal, citim
numerele a i b ({1}), apoi comandm (apelm)
execuia instruciunilor {2} i {3} pentru calculul
i afiarea mediei (apelnd procedura calculmedia)
- procedura calcul_media, care conine
instruciunile{2} i {3} pentru calculul i afiarea
mediei

{5}

Modulul principal este modulul apelant pentru procedur.


Am artat mai sus, c o procedur poate s primeasc date din partea modulului apelant,
date numite parametri. n cazul procedurii calcul_media, din exemplul nostru nu are parametri.
Ea folosete valorile a i b citite anterior n programul principal.
3

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Sunt aceste variabile cunoscute de procedur, dei ele au fost stabilite n afara acesteia?
Da, deoarece variabilele a i b au fost declarate la nceputul programului, deci valorile lor sunt
vzute n tot programul. Ele se numesc variabile globale.
Funcionarea programului de mai sus este urmtoarea:
Se ncepe execuia programului principal cu
citirea de la tastatur a numerelor a i b {1}
Este apelat procedura calcul_media {4}: n
acest moment programul principal e abandonat i se
execut corpul procedurii:
- Calculeaz media aritmetic a numerelor a i b
{2}. Evident variabilele a i b vor fi nlocuite cu
valorile lor.
De exemplu pentru a=3 i b=4 avem:
ma:=(a+b)/2=(3+4)/2=3.5
- Afieaz media aritmetic ma, adic valoarea
3.5

Program principal
Citete a i b
apel

Procedura

revine

Dup ncheierea execuiei procedurii, se


revine n programul principal la linia imediat
urmtoare celei care a fcut apelul, adic linia {5}
n afar de variabilele globale n cadrul programelor exist i variabile declarate n
subprogram atunci ele sunt cunoscute numai n subprogramul respectiv i de subprogramele
apelate din interiorul su, acestea se numesc variabile locale.
n aceast situaie programul de mai sus va putea fi scris astfel, {Varianta V3}, unde
procedura calcul_media conine toate aciunile: citirea numerelor a i b, calculul i afiarea
mediei aritmetice:
{Varianta V3}
program sub_3;
procedure calcul_media;
var ma,a,b:real;
begin
write(a,b:);
readln(a,b);
ma:=(a+b)/2;
writeln(ma:,ma:8:2);
end;
begin
calcul_media;
end.

Observm c variabilele a i b sunt folosite


numai n procedur, motiv pentru care le-am declarat n
interiorul procedurii. n acest caz, ele sunt variabile
locale.

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Sintaxa unei proceduri fr parametri poate fi:


Procedure <id_proc>;
{declaraii de variabile locale }
Begin
{corpul procedurii}
Apelul unei proceduri: <id_proc>;
end;

Structura unui program Pascal, care conine proceduri fr parametri este:


Program <nume_program>;
{declaraii de variabile globale}
Procedure <id_proc1>;
{declaraii de variabile locale }
Begin
{corpul procedurii}
end;
Procedure <id_proc2>;
{declaraii de variabile locale }
Begin
{corpul procedurii}
end;

Begin{Program principal}
{corpul programului}
<id_proc1>;{apel proceduri}
<id_proc2>;
end.
<id_proc> -identificatorul (numele) procedurii
Comparnd {Varianta V2} i {Varianta V3} putem formula cteva concluzii:
Domeniu de vizibilitate al unei variabile(constante) = zona din program n care
este vzut declaraia acesteia, adic zona de program n care e cunoscut valoarea sa.
Dac o variabil e declarat n interiorul unui subprogram = variabil local.
Dac o variabil e declarat la nceputul programului principal = variabil
global.
Putem avea ntr-un program o variabil local i una global cu acelai nume. n
acest caz, n subprogramul n care a fost declarat, variabila local ascunde variabila global
cu acelai nume, adic n timpul execuiei subprogramului este vzut valoarea variabilei
locale, iar n afara subprogramului este cunoscut variabila global.

Exemplu: Ilustrm deosebire ntre variabilele globale i cele locale:


Considerm un program care conine:
un modul principal P
trei subprograme, notate P1, P2, P3.
presupunem c avem urmtoarele variabile:
x, variabil global
b, variabil local n P1
m, variabil local n P2
programul principal apeleaz procedurile P1 i P2, iar P1 apeleaz P3
5

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu


Care va fi domeniul de vizibilitate n acest caz?
P
var x:integer;
P1
var
b:integer;

P2
var
m:integer;

P3

Astfel:
- variabila x, fiind global, este vizibil n tot programul, adic n modulul principal P
i n procedurile P1, P2, P3.
- Variabila b, ea nu e vizibil n modulul principal P i nici n procedura P2.
- variabila m, fiind variabil local n procedura P2, este vizibil n procedura P2

I.

Sarcin de lucru
Se consider urmtorul program:
Program sl1;
Var x: integer;
Procedure P1;
Var y:integer;
Begin
P2;
End;
Procedure p2;
Var z:integer;
Begin
{corpul procedurii}
End;
Procedure p3;
Var m:integer;
Begin
P1;
end;
begin{modul principal P}
p3;end.

Care este domeniul de vizibilitate al


variabilelor din program? Precizai i tipul lor
locale/globale.

x- _____________________________________
y- _____________________________________
z- _____________________________________
m- _____________________________________

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Probleme rezolvate:
1. Scriei un program care determin volumul unui con de raz r i nlime h,
citite de la tastatur. Se va verifica i condiia ca r i h s fie numere pozitive.
Soluie: Definim trei variabile: v volumulconului, r raza, h nlimea i constanta
(pi)=3.14
Algoritmul problemei presupune parcurgerea urmtoarelor etape:

{1} citim de la tastatur dimensiunile trunchiului: r i h

{2} dac r i h sunt pozitive, atunci:


-{3} calculm volumul v, cu formula v ( r 2 h ) / 3
-{4} afim volumul conului

{5} n caz contrar afim un mesaj de eroare.


Varianta a
{cu un singur modul principal}

Varianta b
{cu o procedur, volum_con, care
calculeaz volumul conului}
program spb1b;
var r,h:integer;
v:real;
const pi=3.14;
procedure volum_con;
begin
{2}if (r>0) and (h>0) then
begin
{3}v:=(pi*r*h)/3;
{4}writeln(volumul:,v:6:2);
end
else
{5}writeln(Eroare);
end;
begin
{1}write(r,h:);readln(r,h);
volum_con; {6-apel procedur}
readln;
end.

program spb1a;
var r,h:integer;
v:real;
const pi=3.14;
begin
{1}write(r,h:);readln(r,h);
{2}if (r>0) and (h>0) then
begin
{3}v:=(pi*r*h)/3;
{4}writeln(volumul:,v:6:2);
end
else
{5}writeln(Eroare);
readln;
end.

2. Se citesc de la tastatur pe rand numerele unui ir, pn la ntlnirea valorii 0, care nu


face parte din ir. Cte numere positive i cte numere negative sunt n ir? Programul va
conine o procedur.
Ne reamintim: Algoritmul de citire a numerelor pe rnd pn la ntlnirea valorii 0 este:
<citete x> {x e numrul dat de la
tastatur}
repeat
<prelucreaz x>
{1}
<citete x> {2}
until x=0;
{3}

Exemplu: Fie irul -2, 3, 0


Pas1: {1}prelucreaz x=-2
{2}citete x=3
{3}testeaz x=0?3=0?Nu
Pas2: {1}prelucreaz x=3
{2}citete x=0
{3}testeaz x=0?0=0?DaSTOP
7

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Soluie: Fie nrp i nrn numrul elementelor pozitive respective numrul elementelor
negative din ir. Iniializm nrp:=0 i nrn:=0. Citim pe rand elementele irului n aceeai
variabil x, mai apoi, ntr-un ciclu :
Repet
Prelucrez elementul x tocmai citit:
- dac este pozitiv, mrim cu 1 nrp (nrp:=nrp+1)
- n caz contrar, mrim cu 1 nrn (nrn:=nrn+1)
Citim urmtorul element tot n variabila x:
Pn cnd am introdus la citirea lui x valoarea 0.
Dup ncheierea ciclului, afiez valorile pentru nrp i nrn.
Varianta a
{cu un singur modul principal}
Program spb2a;
Var x,nrp,nrn:integer;
Begin
{citesc separate primul element}
Write(x:);readln(x);
{iniializez nrp i nrn}
nrp:=0; nrn:=0;
repeat
if x>0 then
nrp:=nrp+1
else
nrn:=nrn+1;
{citesc urmtorul element n variabila x}
readln(x)
until x=0;
writeln(nrp:,nrp,nrn:,nrn);
end.

Varianta b
{cu o procedur, prel_elem }
Program spb2b;
Var x,nrp,nrn:integer;
Procedure prel_elem;
Begin
if x:0 then
nrp:=nrp+1
else
nrn:=nrn+1;
end;
Begin{PP}
Write(x:);readln(x);
nrp:=0; nrn:=0;
repeat
prel_elem;
write(x:);readln(x)
until x=0;
writeln(nrp:,nrp,nrn:,nrn);
readln;
end.
3. Ce se va afia n urma execuiei programului de mai jos, pentru n=3:

program suma_a_n_elemente;
var s,n,i:integer;
procedure suma;
begin
s:=0;
for i:=1 to n do
s:=s+i;
end;
begin{PP}
write(n:);readln(n);
suma;
writeln(Suma este:,s);
readln;
end.

Soluia:
1. Citete n=3 n programul principal
2. Apelez procedura suma;
s=0
Pas1:
i=1 s=s+i
s=0+1=1
Pas2:
i=2 s=s+i
s=1+2=3
Pas3:
i=3 s=s+i
s=3+3=6
Pas4:
i=4 4>3 STOP
Abandonez procedura, m ntorc n
programul principal
3. Afiez rezultatul: s=6
8

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

II.
1. Scrie un program care afieaz suma numerelor dintr-un ir date de
la tastatur atta timp ct nu s-a dat valoarea 0, care nu face parte din
ir.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Sarcin de lucru

Sarcin de lucru

2. Ce se va afia n urma execuiei programului de mai jos:


Program afiare;
____________________________
Var a:integer;
____________________________
procedure p;
____________________________
var b,c:integer;
____________________________
begin
____________________________
b:=3*a;c:=b+2;a:=c+3; ____________________________
write(a);
____________________________
writeln(b,c);
____________________________
end;
____________________________
begin{PP}
____________________________
a:=5;
____________________________
p;
____________________________
readln;
end.

3. Scrie un program care afieaz suma numerelor naturale pare mai


mici sau egale cu un numr n dat de la tastatur. Exemplu: pentru
n=8, se vor afia s=2+4+6+8=20.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Sarcin de lucru

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Autoevaluare I
1. Care sunt deosebirile ntre o variabil global i o variabil local?
2. Ce se nelege prin modul apelant? Cum are loc execuia unei proceduri n urma
apelului?
3. Pentru fiecare din afirmaiile de mai jos, precizai dac este adevrat sau fals:
a.

O variabil global este vizibil pe tot parcursul execuiei programului n care a


fost declarat

b.

n cazul n care conine cel puin dou instruciuni, corpul unui subprogram
este cuprins ntre begini end

c.

n cadrul unui program, o procedur poate fi executat o singur dat.

4. Pentru fiecare din mrimile indicate mai jos, s se scrie un program care, folosind o
procedur, calculeaz i afieaz mrimea respectiv. Se vor verifica i condiiile alturate
formulelor.

a. Aria unui paralelogram: A=d1*d2*sin b, n condiiile: d1, d2>0, b 0 ,

b. Aria total a unui cilindru: A=2* *R*(R+G), n condiiile R,G>0.


5. Scrie o procedur care afieaz maximul a dou numere ntregi a,b. Numerele se
citesc n programul principal.
6. Scrie o procedur care calculeaz i afieaz valoarea funciei f(x), pentru o valoare
a lui x care se consider citit n programul principal:

x 2 1, pentru x 3

f ( x ) x 2, pentru x ( 3,3 )
2
x 4 x 5, pentru x 3
7. Scrie o procedur care tiprete numerele naturale impare mai mici sau egale cu o
valoare dat n. Exemplu: pentru n=8, se vor afia 1, 3, 5, 7.
8. Se citesc succesiv de la tastatur elementele unui ir de numere ntregi, pn la
ntlnirea valorii 0, care nu face parte din ir. S se afieze media aritmetic a elementelor din ir.
Programul va conine o singur procedur.
10

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

2.2 Parametrii unei proceduri

Parametrii unei proceduri sunt date pe care modulul appellant le transmite


la fiecare apel unui subprogram, i pe care acesta le va folosi atunci cnd se execut.
Parametrii unei proceduri pot fi:
A. parametri transmii prin valoare
B. parametri transmii prin referin

A. Parametri transmii prin valoare


Pentru a nelege funcionarea parametrilor, vom pleca de la variantele V2 i V3 (vezi
paginile 2 i 3) ale programului pentru calculul mediei aritmetice a dou numere, prezentat n
paragraful 1.2.1.
Dac apelm procedura de mai multe ori n programul principal, ea se va executa de cte
ori a fost apelat, dar de fiecare dat va afia media aritmetic pentru aceleai numere a i b citite
de la tastatur.
Dar, exist i posibilitatea ca procedura la fiecare execuie s foloseasc alte date. Acest
lucru se face transmind procedurii datele respective ca parametri.
Vom ilustra mecanismul funcionrii parametrilor pe acelai exemplu, calculul mediei
aritmetice a dou numere:
{Varianta V4}
program sub_4;
var ma,a0,b0,a,b:real;
procedure calcul_media(a,b:real);
begin
ma:=(a+b)/2;
writeln(ma:,ma:8:2);
end;
begin
calcul_media(2,3);
{apel 1}
a0:=-5;b0:=-4;
calcul_media(a0,b0);
{apel 2}
calcul_media(abs(a0),abs(b0));
{apel 3}
write(a,b:);readln(a,b);
calcul_media;
{apel 4}
end.

11

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Procedura calcul_media trebuie s poat calcula i afia media aritmetic pentru oricare
dou numere reale. De aceea aceste numere vor fi transmise efectiv ca parametric procedurii
atunci cnd aceasta este apelat. Pentru a realize acest lucru definim n antetul procedurii doi
parametri a i b de tipul real, care sunt de fapt nite simboluri(nu au nici o valoare n momentul
definirii), se numesc parametric formali.
Antetul procedurii va arta astfel:
procedure calcul_media(a:real;b:real);
Corpul procedurii va rmne la fel.
Pentru a se executa procedura aceasta trebuie apelat. La apel, se precizeaz numele
procedurii i valorile concrete ale parametrilor, aceste valori se numesc parametri
actuali(efectivi).
Acest mod de transmitere a parametrilor se numete transmiterea patrametrilor prin
valoare.
Cnd este apelat o oprocedur modulul principal e abandonat temporar i se
execut procedura. n acest moment parametri formali sunt nlocuii n tot corpul
procedurii cu parametri efectivi.
Dup terminarea execuiei procedurii, se revine imediat n programul principal
la linia imediat urmtoare celei care a fcut apelul.
Parametrii transmii prin valoare se comport ca nite variabile locale.

n continuare, s urmrim ce se ntmpl cnd lansm n execuie {Varianta V4} a


programului pentru calculul mediei aritmetice.

Modulul principal ncepe cu apelul procedurii calcul_media(2,3); {apel 1}, n


acest moment parametrii formali a i b sunt nlocuii cu parametri efectivi 2 respectiv 3, n tot
corpul procedurii:
- {ma:=(a+b)/2} nlocuiete valorile lor ma:=(2+3)/2)=2.5
- { writeln(ma:,ma:8:2);} va afia ma:uuuu2.50, u Space
n acest moment parametrii actuali sunt valori constante.

Dup ncheierea execuiei {apel 1} se revine n programul principal la linia


imediat urmtoare

Se atribuie variabilelor a0 i bo valorile -5 respectiv -4 i se trece la linia


urmtoare cu apelul procedurii calcul_media(a0,b0); {apel 2}, n acest moment parametrii
formali a i b sunt nlocuii cu parametri efectivi -5 respectiv -4, n tot corpul procedurii:
- {ma:=(a+b)/2} nlocuiete valorile lor ma:=(-5-4)/2)=-4.5
- { writeln(ma:,ma:8:2);} va afia ma:uuu-4.50, u Space
n acest moment parametrii actuali sunt valori ale unor variabile.

12

Unitatea de nvare: Subprograme

Prof. Cremona Murariu

clasa a XI-a
Grup colar Mreti

Dup ncheierea execuiei {apel 2} se revine n programul principal la linia


imediat urmtoare

Se execut {apel 3}, n acest moment parametrii formali a i b sunt nlocuii cu


parametri efectivi abs(-5) respectiv abs(-4), n tot corpul procedurii:
- {ma:=(a+b)/2} nlocuiete valorile lor ma:=(5+4)/2)=4.5
- { writeln(ma:,ma:8:2);} va afia ma:uuuu4.50, u Space
n acest moment parametrii actuali sunt valori returnate de ctre funcii.

Dup ncheierea execuiei {apel 3} se revine n programul principal la linia


imediat urmtoare

n acest moment se vor citi de la tastatur valorile pentru a i b, dup care se


realizeaz {apel 4}. Dei parametri formali au acelai nume cu parametri actuali calculatorul nu
va face confuzie ntre ei,deoarece parametri formali nu au nici o valoare, iar cei actuali sunt
valorile variabilelor a i b citite de la tastatur.
n acest moment parametrii actuali sunt pot fi nite variabile care au acelai nume ca i
parametri formali.

!
Valorile parametrilor actuali pot fi: constante, variabile, valori ale variabilelor
obinute prin atribuire sau citire, valori ale unor expresdii, valori returnate de funcii.
Parametri actuali trebuie s corespund ca num, ordine i tip cu parametri
formali.

Exemplu:
Sintaxa procedure
unei proceduri
cu parametri este:
Fie procedura:
test(x,y:integer;z:real);
Apelul: test(5,3.5,-2.1); va genera eroare deoarece al doilea parametru
Procedure <id_proc>(<l1>:<tip1>;<l2>:<tip2>;<l3>:<tip3>;.);
efectiv(actual) este 3.5 este un numr real, iar parametru formal y este de tipul integer.
{declaraii de variabile locale }
Deci, n concluzie:
Begin
{corpul procedurii}
end;
Apelul unei proceduri: <id_proc>(<l1>,<l2>,<l3>,);
<l1>,<l2>,<l3>, sunt liste de parametri, ea poate conine unul sau

mai muli parametric separai prin virgul


<id_proc> identificatorul (numele) procedurii
<tip1>,<tip2>,<tip3>, tipurile
parametrilor
13

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Probleme rezolvate:
1. Se citesc de la tastatur n triplete de numere ntregi. Pentru fiecare dintre ele s se
verifice dac numerele care-l compun pot forma laturile unui triunghi., apoi n caz afirmativ se
va afia aria triunghiului calculat cu formula lui Heron, iar n caz contrar se va afia un mesaj de
eroare. Pentru testarea unui triplet se va folosi o procedur care primete ca parametric cele tri
numere.
Soluie:
Reamintim: Aria trunghiului prin formula lui Heron se calculeaz astfel:
At

p ( p a ) ( p b ) ( p c ) , unde p

Exemplu numeric:
Pentru n=4 i tripletele:
346
149
333
-2 -1 0

abc
2

se afieaz
5.33
nu e triunghi
3.90
nu e triunghi

Definim o procedur {scriere_triunghi(a,b,c:integer;)} care va prelucra tripletul alctuit


din numerele a, b, c.
1. Testm dac a, b, c formeaz laturile unui triunghi:
- sunt mai mari ca 0
- suma aoricare dou dintre ele este mai mare dect a treia
2. n caz contrar se tiprete un mesaj de eroare
n acest caz programu va avea urmtoarea form:
program sp5;
var i,n:integer; x,y,z:integer;
procedure scriere_triunghi(a,b,c:integer);
14

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

var p,A:real;
begin
{dac numerele a, b, c pot fi laturile unui triunghi}
if (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a) then
begin
{tiprete aria triunghiului de laturi a, b, c}
p:=(a+b+c)/2;
A:=sqrt(p*(p-a)*(p-b)*(p-c));
Writeln(Aria triunghiului:,A:6:2);
end
else
writeln(Nu este triunghi!);
end;
begin{PP}
write(Numrul de triplete:);readln(n);
{citire numere, testare triunghiuri i scriere arii/mesaje}
for i:=1 to n do
begin
readln(x,y,z); {la fiecare pas citesc cte un triplet}
scriere_triunghi(x,z,y);
end;
readln;
end.
Realizeaz un program care calculeaz i afieaz suma a n
elemente dintr-un vector. Programul va conine 2 proceduri: una pentru
citirea elementelor care va conine un parametru; a doua pentru calculul
sumei.
_______________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

Sarcin de lucru
III.

15

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

________________________________________________________________

Autoevaluare II

1. Care sunt parametrii unui subprogram? Cum funcioneaz transmiterea parametrilor?


2. Completai afirmaiile cu cuvntul (cuvintele lips):
a. Parametrii definii la scrierea unei proceduri se numesc.., iar cei transmii
la apelul unui subprogram se numesc
b. Valorile

parametrilor

transmii

la

apelul

unui

subprogram

pot

fi..
c. Dup

execuia

unui

subprogram,

se

revine

modulul

appellant

la

linia.
3. Scrie o procedur care calculeaz i afieaz aria unui paralelogram: A=d1*d2*sin b,

n condiiile: d1, d2>0, b 0 , , mrimile d1, d2 i b se transmit ca parametri subprogramului.

16

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

4. Scrie o procedur care afieaz numerele naturale divizibile cu 3, mai mici dect o
valoare n, transmis ca parametru.
5. Scrie o procedur care verific dac un numr natural x transmis ca parametru este
ptrat perfect, n caz afirmativ l afieaz. (Un numr este ptrat perfect dac radicalul su este
ntreg, este egal cu partea ntreag din radical, adic sqrt(x)=trunc(sqrt(x)))

B. Parametri transmii prin referin

Exemplu:
Se citesc de la tastatur dou perechi de numere (a1,b1) i (a2,b2). S se calculeze media
aritmetic a numerelor fiecrei perechi apoi s se determine cea mai mare dintre mediile
obinute.
Soluie: Dac folosim o procedur care calculeaz media aritmetic a dou numere
oarecare a i b, ar fi necesar s se execute de dou ori, mai mult ar trebui ca cele dou medii s
fie memorate n dou variabile diferite, Ma1 i Ma2, care apoi trebuie comparate pentru a o
determina pe cea mai mare dintre ele.
Pentru a evita acest lucru vom folosi pentru declararea mediei un parametru gol care nu
are nici o valoare la apel. El va primi o valoare concret n timpul execuiei procedurii, numinduse parametru transmis prin referin, cnd l vom defini va fi precedat de cuvntul cheie var.

17

Unitatea de nvare: Subprograme

Prof. Cremona Murariu


{Varianta V4}
program sub_4;
var ma1,ma2,a1,b1,a2,b2:real;
procedure
calcul_media(a,b:real;var
ma:real);
begin
ma:=(a+b)/2;
writeln(ma:,ma:8:2);
end;
begin{PP}
write(a1,b1:);readln(a1,b1);
{1}
calcul_media(a1,b1,Ma1);
{2}
write(a2,b2:);readln(a2,b2);{3}
calcul_media(a2,b2,Ma2);
{4}
if Ma1>=Ma2 then
writeln(Ma1:,Ma1:6:2)
else
writeln(Ma2:,Ma2:6:2);end.

clasa a XI-a
Grup colar Mreti
Funcionarea programului:
- {1} citim numerele a1 i b1
- {2} facem apelul procedurii
calcul_media(a1,b1,Ma1); Astfel, n timpul
execuiei procedurii vor avea loc nlocuirile:
aa1, bb1, maMa1, deci se va calcula
media aritmetic a numerelor a1 i b1, ce va
fi memorat n Ma1.
- {3} citesc numerele a2 i b2
- {4} facem apelul procedurii
calcul_media(a2,b2,Ma2); Astfel, n timpul
execuiei procedurii vor avea loc nlocuirile:
aa2, bb2, maMa2, deci se va calcula
media aritmetic a numerelor a2 i b2, ce va
fi memorat n Ma2.
! Ma1 i Ma2 sunt variable globale,
de aceea valoarea pe care o primesc prin
apelul procedurii este vzut n tot
programul. Astfel se trece la determinarea
celei mai mari medii.

Limbajul Pascal permite i transmiterea parametrilor prin referin.


Dac un parametru transmis prin referin se modific n interiorul
subprogramului, atunci noua valoare a parametrului este vzut i la nivelul
modulului apelant. De asemenea, putem s transmitem prin referin i un
parametru gol, n acest caz, acesta poate primi o valoare n corpul
subprogramului, valoare care va fi cunoscut i de modulul apelant

Probleme rezolvate:

1. Scrie un program care interschimb ntre ele dou numere reale, date ca parametric,
folosind metoda paharelor.
Soluie: Pentru a rezolva problema, prin metoda paharelor, vom folosi o variabil
auxiliar care ne va ajuta s realizm interschimbarea (aux).
Programul va fi:
Exemplu numeric: Fie a=7 i b=5
Program sub6;
apelez
procedura schimba(a,b), deci x a i y
Var a,b:integer;
b (parametri formali se nlocuiesc cu cei
Procedure schimba(var x,y:integer);
actuali)
{interschimb x i y ntre ele}
Var aux:integer;
- n procedur se realizeaz:
Begin
aux:=a aux:=7
aux:=a;
a:=b a:=5
a:=b;
b:=aux b:=7,
b:=aux;
- se revine n programul principal unde se
afieaz noile valori pentru a i b
a:=5
18
b:=7,

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu


end;
begin{PP}
{citeste numerele a i b}
write(Numerele:);readln(a,b);
schimba(a,b);{apeleaz procedura}
{afieaz noile numere a i b}
writeln(a:,a);
writeln(b:,b);
readln;
end.

2. Se consider programul de mai jos:


a. ce se afieaz n urma execuiei sale
b. ce se va afia dac antetul procedurii p ar fi: p(x,y:integer);
var a,b:integer;
procedure
p(var x:integer; var y:integer);
begin
x:=x-b;
y:=y-a;
end;
begin
a:=4; b:=1;
writeln(a,b);{1}
p(a,b); write(a,b);{2}end.

Soluie: a. Variabilele a i b sunt globale. Primul apel {1} afieaz


valorile iniiale: a=4 i b=1. n urma apelului procedurii p(a,b) se fac
nlocuirile: a:=a-b a:=4-1=3, b:=b-a b:=1-3=-2
Variabilele a i b sunt transmise prin referin, deci modificarea
lor din procedur se vede i n programul principal, deci la apelul {2}
se afieaz: a:=3 i b:=-2
b. Dac antetul procedurii ar fi p(x,y:integer); b parametrii sar tramsmite prin valoare, deci modificarea din cadrul procedurii nu ar
mai fi vzut dup revenirea din procedur n modulul principal.
Deci:- {1} se afieaz a=4 i b=1
- apelul p(a,b) efectueaz acelei operaii ca la a.,
obinndu-se n procedur a:=3 i b:=-2,
- {2} se va afia a:=4 i b:=1

Autoevaluare III

Autoevaluare III

1. Ce este un parametru transmis prin referin?


2. Cnd se recomand transmiterea unui parametru transmis prin referin?
3. Se consider urmtorul program. Deducei de se va afia n urma execuiei sale.
program exemplu;
var x,y:integer;
procedure test(m:integer; var n:integer);
begin
m:=m+3;
n:=n+m;

19

Unitatea de nvare: Subprograme

Prof. Cremona Murariu

clasa a XI-a
Grup colar Mreti

end;
begin
x:=3; y:=5;
test(x,y);
write(x,y);
test(x,y);
write(x,y);
end.
4. Scrie o procedur care returneaz numrul elementelor positive i numrul elementelor
negative dintr-un ir de numere citite de la tastatur pn la ntlnirea valorii 0, care nu face parte din ir.
Procedura va ntoarce valorile cerute prin intermediul unor parametric transmii prin referin.

3. Funcii. Declararea i apelul funciilor

Ca i procedurile funciile fac parte din categoria subprograme. Ele


efectueaz operaii, dar n plus, o funcie ntoarce (returneaz) o anumit valoare.
Tipul valorii returnate se precizeaz la declararea funciei, dup enumerarea
!
parametrilor. Valoarea returnat de funcie poate fi flolosit n modulul appellant.
n rest funciile se comport i lucreaz la fel ca procedurile.
Antetul funciei fr parametri este:
function calcul_media:real;
Corpul reale
funciei
este alctuit dintr-o
Exemplu: Calculul mediei aritmetice a dou numere
a i b.
singurfr
instruciune:
prin
funcia
Pentru aceasta definim o funcie calcul_media,
parametric,cea
care
va care
returna
media
va
returna
media
aritmetic
a
celor
dou
aritmetic a celor dou numere.
numere.
Calcul_media:=(a+b)/2;
Vom spune c funcia returneaz o
valoare prin numele su.
Funcia este apelat n programul
20
principal, la afiare:
writeln(Ma:, calcul_media);

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu


Program f1;
Var a,b:real;
Function calcul_media:real;
Begin
Calcul_media:=(a+b)/2;
End;
Begin
Write(a,b:);readln(a,b);
Writeln(Ma:, calcul_media);
End.

Programul poate fi scris i folosind transmiterea celor dou valori ca parametri transmii
prin valoare, calculnd media aritmetic pentru dou perechi de numere (a1,b1) i (a2,b2). Forma
programului este:
Program f2;
Var ma1,ma2,a1,b1,a2,b2:real;
Function calcul_media(a,b:real):real;
Begin
Calcul_media:=(a+b)/2;
End;
Begin
Write(a1,b1:);readln(a1,b1);
ma1:=calcul_media(a1,b1);
Write(a2,b2:);readln(a2,b2);
ma2:=calcul_media(a2,b2);
Writeln(Ma1:, ma1);
Writeln(Ma2:, ma2);
End.

Antetul funciei cu parametri este:


function calcul_media(a,b:real):real;
Corpul funciei este alctuit dintr-o singur
instruciune: cea prin care funcia va returna media
aritmetic a celor dou numere.
Calcul_media:=(a+b)/2;
Vom spune c funcia returneaz o valoare prin
numele su.
Funcia este apelat n programul principal de
dou ori ca o expresie, dup care valoarea ei este
afat:
ma1:=calcul_media(a1,b1);writeln(Ma1:, ma1);
Idem pentru:
ma2:=calcul_media(a2,b2); Writeln(Ma2:, ma2);

Sintaxa unei funcii cu/fr parametri este:


function <id_func>[(<l1>:<tip1>;<l2>:<tip2>;<l3>:<tip3>;.)]:<tip_r>;
{declaraii de variabile locale }
Begin
{corpul funciei}
end;
Apelul unei funciii: <variabil>:=<id_func>(<l1>,<l2>,<l3>,);
Writeln(<variabil>)
<l1>,<l2>,<l3>, sunt liste de parametri, ea poate conine unul sau
mai muli parametri separai prin virgul
<id_func> identificatorul (numele) funciei
<tip1>,<tip2>,<tip3>, tipurile parametrilor
<tip_r> tipul valorii returnate

21

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Un subprogram trebuie plasat n cadrul programului naintea modulului care l


apeleaz.
Probleme rezolvate:
1. Precizai ce se afieaz n urma execuiei programului de mai jos. Justificai rspunsul.
program demo;
Soluie:
var y:integer;
Programul testeaz dac valoarea lui y
function ex(a,b:integer):integer;
este egal cu o valoare returnat de ctre
begin
funcia ex(1,y), afind true
n caz
y:=(a+b) mod 3;
afirmariv, respectiv false n caz contrar.
ex:=y;
Astfel: y=4, apel ex(1,y) ex(1,4)
end;
parametrii a1, b4.
begin
n funcie: y:=(a+b) mod 3 y=(1+4)
y:=4;
mod 3=5 mod 3 y=2
if y=ex(1,y) then
!Atenie, y nu mai este 4, ci 2, pentru c
writeln(true)
s-a modificat n funcie, i, fiind variabil
else
global, modificarea sa e vazut n
writeln(false);
modulul principal expresia ex(1,y) are
end.
valoarea true.
2. Gii erorile din programul de mai jos, i dup corectarea lor precizi ce afieaz
programul.
program greit;
var a,b:integer;
function calcul(x,y:integer):integer;
begin
calcul:=(x+y)/2;
end;
begin
a:=10;b:=3;
writeln(calcul(a,b))
end.

Greeala se afl n antetul funciei, ea trebuie


s returneze o valoare real, de aceea antetul ar
trebui s fie:
calcul(x,y:integer):real;
Valoarea returnat de program va fi:
x=10, y=3 calcul:=(10+3)/2 funcia

returneaz valoarea 6.5, care va fi i afiat.

3. S se calculeze expresia:

E 1 3 2 5 3 7 .... n 2 n 1

Deci, programul va fi:

Soluie:
Ne reamintim: Pentru a calcula suma
vom folosi un ciclu for n care i=1, 2,n.
Pentru fiecare valoare a lui i se adaug la E
termenul care se obine pentru respectiva valoare
a lui i:
E:=0;
for i:=1 to n do
E:=E+i*(2*i+1)

22

program f2;
var n:integer;
function suma(n:integer):real;
var k:integer;E:real;
begin
E:=0;
for i:=1 to n do
E:=E+i*(2*i+1)
suma:=E;
end;
begin
write(n:);readln(n);
writeln(E:,suma(n):6:2);
end.

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

4. Scrie o funcie care returneaz suma cifrelor unui numr natural x dat ca parametru.
Ne reamintim: Cifrele unui numr se extrag de la dreapta la stnga, cu urmtorul algoritm
bazat pe un ciclu de mpriri la 10:

d:=x;
{d dempritul, c -cifra extras, x - numrul}
Repeat
c:=d mod 10;
<prelucreaz cifra extras c>
d:=d div 10 {ctul mpririi va fi noul demprit}
until d=0;

Soluia:
Folosind cele de mai sus, putem scrie programul, pentru calcularea sumei folosimo
funcie function suma_cifre(x:longint):integer;
Program f3;
var x: integer;
function suma_cifre(x:longint):integer;
var c,s:integer;d:longint;
begin
d:=x; s:=0;
Repeat
c:=d mod 10;
s:=s+c;
d:=d div 10
until d=0;
suma_cifre:=s;
end;
begin
write(Dati numarul:);readln(n);
write(Suma cifrelor lui ,x, este:, suma_cifre(x));
end.

Autoevaluare IV
1. Ce este o funcie? Prin ce se deosebete o funcie de o procedur?
2. Pentru fiecare dintre afirmaiile de mai jos, precizai dac este adevrat sau fals:
a. O funcie trebuie s aib cel puin un parametru formal;
b. Nu se poate transmite ca parametru unei funcii, o variabil care aparine unui tip
anonim;
c. variabilele de tip array nu se pot transmite ca parametri;
d. Valoarea returnat de o funcie poate fi afiat
3. Precizai ce va afia urmtorul program:
23

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu


program ex;
var x,y:integer;
function calcul(n:integer):integer;
begin
z:=z+n;
calcul:=sqr(n);
end;
begin
z:=9;
x:=calcul(z);
writeln(x, ,z);
end.

4. Gsii erorile din programul de mai jos, dup care precizai ce afieaz programul:
program test;
var a,b.integer;
function test(p,q:integer):boolean;
begin
test:=(p+q)/4;
end;

begin
a:=5.3; b:=3.1;
writeln(test(a,b));
end.

5. Scrie o funcie care calculeaz: S 1 4 7 ... ( 3 * n 2 ) . Valoare lui n se va


transmite ca parametru.
6. Se consider un numr natural transmis ca parametru. Scrie o funcie care returneaz
cte cifre pare sunt n numr.

4. Recapitulare
1. Precizeaz, pentru fiecare din afirmaiile de mai jos dac este adevrat sau fals,
justificnd rspunsul:
a. parametrii actuali ai unei proceduri/funcii trebuie s coincid ca numr i tip cu
parametrii formali.
b. parametrii actuali ai unei proceduri/funcii sunt nite simboluri, iar cei formali sunt
nite valori concrete cu care lucreaz subprogramul
c. Valoarea returnat de ctre o funcie poate fi transmis ca parametru altui subprogram.

24

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Soluie:
a - FALS, parametrii actuali trebuie s corespund ca numr, tip i ordine cu parametrii
formali
b FALS, invers, parametrii formali sunt cei precizai la declararea funciei i sunt
nite simboluri, n timp ce parametri actuali se transmit la apelul subprogramului i sunt valori
concrete ale parametrilor formali.
c ADEVRAT
2. Pentru fiecare afirmaie din coloana A, alegei din coloana B noiunea pe care o
definete:
Coloana A
a. o variabil ale crui valori sunt cunoscute
numai n subprogramul n care a fost declarat i
n subprogramele apelate de acesta
b. o valoare concret a unui parametru, care se
transmite la apelul unui subprogram
c. o variabil ale crei valori sunt cunoscute n
tot programul
5.
d. un simbol definit la declararea unui subprogram
Soluie:

a5

b6

c2

Coloana B
1. valoarea unei variabile
2. variabil global
3. valoare returnat
4. parametru formal
5. variabil local
6. parametru actual
d4

3. Se consider programul de mai jos:


Program test;
Var a,b:integer;
Procedure test(var x:integer;y:integer);
Begin
x:=x-y;
y:=y div 2;
end;
begin
a:=0; b:=1;
while b>o do
begin
test(a,b);
writeln(a:3,b:3)
end;
end.

a. programul funcioneaz corect?


b. n caz afirmativ precizai ce afieaz
programul, iar n caz contrar precizai dac
este posibil ca, printr-o singur modificare,
programul s funcioneze correct
c. ce se va afia dac antetul procedurii este:
procedure test(var x:integer; var y:integer);

Soluie:
a. La nceput, cu b=1, condiia b>0 este ndeplinit, deci se intr n ciclu.

Astfel, la apelul procedurii test(a,b); parametrii x a, y b n procedur face:


a:=a-b=10-1=9
b:=b div 2=1 div 2=0
Deci parametrul b este transmis prin valoare, aa c modificarea suferit de b nu este vzut din
programul principal, n schimb a e transmis prin referin. La ntoarcerea n programul principal avem:
a=9 i b=1. Astfel orici pai am executa avem b=1, deci condiia b>0 este ndeplinit la nesfrit ,
intrm ntr-o bucl infinit.
b. Transmind parametrul b prin referin, sunt anse ca la un moment dat condiia b>0 s nu
mai fie ndeplinit, deci s se ias din ciclu.

25

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

c. Dup execuia apelului procedurii se obine: a=9 i b=0, pentru c valoarea lui b poate fi
vzut i n programul principal.
4. Scrie o funcie care calculeaz de cte ori apare un n numr natural n, transmis ca parametru,
ntr-un ir de numere citit n modulul principal pn la ntlnirea valorii 0, care nu face parte din ir.

Soluie:
function numarare(n:integer):integer;
begin
nr:=0;{utilizat pentru numarare}
while x<>0 do
begin
if x=n then
nr:=nr+1;
readln(x);
end;
numarare:=nr;
end;

Sarcin de lucru
IV.
1. Scrie un program care calculeaz i afieaz, n funcie de dorina utilizatorului, aria
unui ptrat de latur L, sau dreptunghi de laturi L i l sau aria unui cerc de raz r, sau aria unui
triunghi dcu baza b i nlimea h. Pentru calculul fiecreia dintre ele se va folosi cte o
procedur.
2. Scrie un program pentru calculul valorii expresiei de mai jos, folosind dou funcii:

3 x 2 , pentru x 1

E min 2 x 2 3 x 2 , x 2 2 , pentru x [ 1,1 ]


x 1, pentru x 1

3. Scrie o funcie care ntoarce oglinditul unui numr natural x transmis ca parametru.

26

Unitatea de nvare: Subprograme

clasa a XI-a
Grup colar Mreti

Prof. Cremona Murariu

Bibliografie
G.Mateescu, P. F. Moraru; Informatica Manual pentru
clasa a XI-a, Editura Donaris, 2006
G.Mateescu, P. F. Moraru; Informatica Manual pentru
clasa a X-a, Editura Donaris, 2004
G.Mateescu, P. F. Moraru; Teste gril de programare,
Editura Petrion, 2002
G.Mateescu, P. F. Moraru; Bacalureat la informatic,
Editura Petrion, 2002
G.Mateescu, P. F. Moraru; Informatica Manual pentru
clasa a IX-a, a X-a, Editura Petrion, 2000
Sorin Tudor; Manual de informatica-clasa a IX-a, varianta
Pascal, Editura L&S Infomat, 2000
Rancea Doina; Limbajul Turbo Pascal, Editura Libris, Cluj
1993
Knuth D. E; Tratat de programarea calculatoarelor
Algoritmi fundamentali, Editura Tehnic, 1974
Prezentarea n PowerPoint

27