Sunteți pe pagina 1din 16

Definirea subprogramelor n C++

Cuprins
1.
2.
3.
4.
5.
6.
7.

Definirea subprogramelor.........................................................................................................2
Clasificarea subprogramelor.....................................................................................................2
Prile unei funcii C/C++.........................................................................................................3
Transferul datelor ntre mediul apelant i subprogramul apelat...........................................4
Transmiterea parametrilor de tip tablou unidimensional.......................................................6
Transmiterea parametrilor de tip tablou unidimensional.......................................................8
Funcii predefinite n C/C++.....................................................................................................9
Funcii matematice.............................................................................................................................9
Funcii pentru numere aleatoare.......................................................................................................10
Funcii de conversie.........................................................................................................................10
Funcii referitoare la iruri de caractere............................................................................................11
Funcii referitoare la fiiere..............................................................................................................11
Alte funcii.......................................................................................................................................11
8.
Exerciii i probleme................................................................................................................12
9.
Exemplu de test subprograme.................................................................................................14

Autor: Diana Vezentan profesor de informatic


Liceul de Informatic Tiberiu Popoviciu Cluj+Napoca

1. Definirea subprogramelor
Ce sunt subprogramele?
Subprogramele reprezint pri ale unui program ce se identific prin nume
Subprogramele se pot activa la cere prin intermediul acestor nume
n limbajele C, C++ subprogramele se numesc funcii
Cnd definim un subprogram?

Dac algoritmul cuprinde o secven de operaii ce se repet


Dac problema iniial e complex, o mprim n mai multe subprobleme, iar pentru rezolvarea
fiecrei subprobleme definim o funcie
Pentru a ascunde detaliile de implementare

Funcii n limbajul C++

Un program C++ este format din una sau mai multe funcii
Orice program C are o funcie principal, main, de unde se lanseaz executarea programului
Din funcia main se pot apela alte funcii care la rndul lor pot s activeze noi funcii.
Funciile fie calculeaz o valoare (ex: sqtr) fie execut anumite operaii fr a returna o valoare
(ex: clrscr()).

2. Clasificarea subprogramelor
n C/C++ funciile pot fi de dou tipuri:
funcii procedurale
funcii operanzi
Funcii procedurale
Funciile procedurale sunt funcii care pot returna zero, una sau mai multe valori prin intermediul
parametrilor.
Exemple:
a) funcie care schimba continutul variabilelor a si b:
swap(a,b);
b) Functie care sterge ecranul
clrscr();
c) Funcie care calculeaza suma dintre a si b in s
aduna (int a, int b, int&s);
Funcii operanzi
Funciile operanzi sunt funcii care returneaz o valoare asociat numelui funciei
Exemple de funcii operand predefinite n C/C++:
abs(x) returneaz modulul lui x
sqrtl(x) returneaz radicalul valorii x
Apelul unei funcii
Apelul unei funcii se poate face n dou moduri: printr-o instruciune de apel sau ca operand ntr-o
expresie
2

1) Instruciunea de apel are forma:


nume(lista parametrilor efectivi);
Instruciunea de apel se folosete atunci cnd funcia apelat nu returneaz nici o valoare, ne
intereseaz doar prelucrrile efectuate de funcie
Exemplu:
void afisare(char cuv[20])
{int i;
for (i=1; i<=strlen(cuv); i++)
cout<<*;
cout<<endl;
}
int main()
{char x[]=exemplu,a[20];
afisare(salut);
afisare(x);
cin>>a;
afisare(a);
return 0;
}
Observaie: Funcia afiare a fost apelat printr-o instruciune de apel.
2) Operand ntr-o expresie
Funcia se apeleaz n cadrul expresiei astfel:
nume(lista parametrilor efectivi)
Observaie: Cnd funcia se apeleaz ca operand ntr-o expresie atunci nu se folosete ; dup numele
funciei.
Exemplu:
int maxim(int a, int, b)
{
if(a>b) return a;
return b;
}
int main()
{ int x=20, y=30, z;
z = maxim(x,y);
cout<<z<<endl;
int v, w;
cin>>v>>w;
cout<<valoarea maxima este <<maxim(v,w)<<endl;
}
Observaie: Funcia maxim a fost apelat ca operand ntr-o expresie.

3. Prile unei funcii C/C++


O funcie C/C++ este format dintr- un antet i un corp. Forma general a unei funcii C/C++ este
urmtoarea:
3

tip_rezultat nume_functie ([lista parametrilor formali])


{
declaratii variabile locale
//corp
instructiuni
}

//antet

Antetul unei funcii


Antetul cuprinde tipul valorii returnate de funcie, numele funciei i parametrii formali cuprini
ntre dou paranteze rotunde:
tip_rezultat nume_functie ([lista parametrilor formali])

Este posibil ca funcia s nu aib parametrii, n acest caz apar doar cele dou paranteze rotunde
Tipul returnat de funcie poate fi orice tip cu excepia tipului tablou
Tipul returnat poate fi void
Parametrii formali pot fi de tip tablou
Valoarea returnat de funcie se specific prin:
return expresie;
Corpul unei funcii
Corpul unei funcii C/C++ este o instruciune compus cuprins ntre acolade:
Forma general a corpului unei funcii este:
{}
Exemplu:
int maxim (int a, int b, int c)
{int m=a;
if (b>m) m=b;
if (c>m) m=c; return m;
}

//antet
//corp

4. Transferul datelor ntre mediul apelant i subprogramul apelat


Pentru comunicarea dintre subprogramul apelat i mediul apelant se folosesc parametri. Parametri
care apar n antet se numesc parametri formali. La activarea subprogramului se stabilesc valori
concrete cu care se va executa subprogramul la acel apel. Aceti parametri se numesc parametri
actuali.
Ce legtur trebuie s existe ntre parametri formali i cei actuali?
Parametri actuali trebuie s corespund cu parametri formali ca numr, ordine i tip. Exist dou
moduri de transfer al parametrilor: prin valoare i prin referin.
Transferul prin valoare
La apelarea unei funcii, se aloc spaiu de memorie pe stiv pentru copii ale valorile parametrilor
actuali. La ncheierea execuiei funciei, zona de memorie alocat pe stiv pentru apel este eliberat.

Exemplu: Ce se afieaz?
void schimba(int x, int y)
{
int aux;
aux=x;
x=y;
y=aux;
cout<<x= <<x<< y= <<y<<endl;
}
int main()
{int a=3,b=4;
schimba(a,b);
cout<<a= <<a<< b=<<b<<endl;
}
Rezultat
x=4 y=3
a=3 b=4
Explicaia rezultatului

Funcia lucreaz cu copiile parametrilor, copiile au fost interschimbate, la ieirea din funcie zona
de memorie alocat pe stiv a fost eliberat, copiile s-au pierdut.
Funcia nu poate modifica valorile parametrilor actuali deoarece nu cunoate adresa la care sunt
memorai ei.

Transferul prin referin


Tipul referin

Este o facilitate suplimentar a limbajului C++


O variabil referin conine adresa unei alte variabile, este un alt nume asociat variabilei, un
sinonim
Tip &var_referinta= variabila_referita;

Exemplu:
int x=10;
int &r=x;//r este o referinta pentru x;
cout<<x;
cout<<r;
Pentru o dat transmis prin referin, la apelarea unei funcii, se aloc spaiu de memorie pe stiv
pentru adresa de memorie a parametrului actual. Subprogramul va lucra direct cu zona de memorie n
care se gsete data. Att modulul apelant ct i modulul apelat lucreaz asupra aceleai date i orice
modificare efectuat de funcie se va reflecta i n modulul apelant.

Exemplu: Realizai o funcie care interschimb valorile parametrilor.


void schimba(int & x, int &y)
{
int aux;
aux=x;
x=y;
y=aux;
cout<<x= <<x<< y= <<y<<endl;
}
int main()
{int a=3,b=4;
schimba(a,b);
cout<<a= <<a<< b=<<b<<endl;
}
Rezultat
x=4 y=3
a=4 b=3
Explicaia rezultatului

Funcia lucreaz cu adresele parametrilor, variabilele au fost interschimbate


Funcia modific valorile parametrilor actuali deoarece cunoate adresa la care sunt memorai ei,
toate prelucrrile sunt fcute asupra variabilelor originale

5. Transmiterea parametrilor de tip tablou unidimensional


Parametri de tip tablou de transmit automat n C/C++ prin referin. Numele unui tablou este un
pointer ctre primul element al tabloului, de aceea un parametru formal de tip tablou unidimensional se
poate specifica prin oricare din formele:
tip *, tip [], tip[max]
Exemplul 1: parametru formal de tip vector
void afisare(int a[], int n) {.}
La apelul unei funcii se specific doar numele tabloului.
Exemplul 2: parametru actual de tip vector
afisare(x,n);

Exerciiu: Realizai o funcie care citete elementele unui vector, o funcie care afieaz elementele
unui vector i apelai aceste funcii pentru dou tablouri.
void citire_tablou( int x[],int &n)
{
int i;
cout<<"Dati numarul de elemente:";
cin>>n;
cout<<"dati elementele tabloului:";
for(i=1;i<=n;i++)
cin>>x[i];
}
void afisare_tablou(int x[], int n)
{
int i;
cout<<"Elementele tabloului sunt:"<<endl;
for(i=1;i<=n;i++)
cout<<x[i]<<' ';
cout<<endl;
}
int main()
{
int a[10],b[20],n,m;
citire_tablou(a,n);
citire_tablou(b,m);
afisare_tablou(a,n);
afisare_tablou(b,m);
}
Exerciiu: Ce se afieaz?
void ghici(int a[],int n)
{
int i;
for(i=1;i<n;i++)
a[i+1]=a[i];
}
int main()
{
int a[10],n;
citire_tablou(a,n);
ghici(a,n);
afisare_tablou(a,n);
}

Explicaia rezultatului
Funcia are acces la adresa tabloului, transformrile se fac asupra originalului, de aceea dup apel
valorile din tablou sunt modificate

6. Transmiterea parametrilor de tip tablou unidimensional


Parametri de tip tablou bidimensional se transmit automat n C/C++ prin referin. Pentru un
parametru formal de tip matrice avem urmtoarele forme:
tip a[][max] sau tip a[max1][max2]
Observaie: Prima dimensiune a unui parametru formal de tip matrice poate lipsi
Exemplul 1: parametru formal de tip matrice
void citire_matrice(int a[][20],int &n,int &m)
{.}
Pentru un parametru actual de tip matrice se specific doar numele matricei
Exemplul 2: parametru actual de tip matrice
citire_matrice(x,n,m);
Exerciiu: Realizai o funcie care citete elementele unei matrici cu n linii i m coloane, o funcie
care afieaz elementele o matrice i o funcie care realizeaz suma a dou matrici. Afiai suma celor
dou matrici, n cazul n care aceast sum se poate calcula.
#include <iostream>
using namespace std;
void citire(int a[][20],int &n,int &m)
{
int i,j;
cout<<"dati numarul de linii:";
cin>>n;
cout<<"dati numarul de coloane";
cin>>m;
cout<<"Dati elementele matricei:"<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
}
void afisare(int a[][20],int n, int m)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<< ' ';
cout<<endl;
8

}
}
void suma(int a[][20],int b[][20],int c[][20],int n,int m)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
c[i][j]=a[i][j]+b[i][j];
}
int main()
{
int a[20][20],b[20][20],c[20][20],n1,n2,m1,m2;
citire(a,n1,m1);
citire(b,n2,m2);
if(n1!=n2||m1!=m2)
cout<<"suma nu se poate efectua!";
else
{
cout<<"sumamatricilor este:"<<endl;
suma(a,b,c,n1,m1);
afisare(c,n1,m1);
}
return 0;
}

7. Funcii predefinite n C/C++


Compilatorul C/C++ pune la dispoziie o bibliotec ce cuprinde sute de funcii. n continuare am
prezentat cteva dintre aceste funcii grupate dup prelucrrile pe care le efectueaz.
Funcii matematice
Funcia
fabs(x)
abs(n)
labs(n)
sqrt(x)
sin(x)
cos(x)
tan(x)
asin(x)

Tipul
argumentului
Real sau ntreg
int
long
Real sau ntreg
Real sau ntreg
Real sau ntreg
Real sau ntreg
Real sau ntreg

Tipul
rezultatului
double
int
long
double
double
double
double
double

Fiierul
antet
math.h
math.h
math.h
math.h
math.h
math.h
math.h
math.h

acos(x)

Real sau ntreg

double

math.h

atan(x)

Real sau ntreg

double

math.h

log(x)

Real sau ntreg

double

math.h
9

Semnificaia rezultatului
Valoarea absolut a lui x
Valoarea absolut a lui n
Valoarea absolut a lui n
Radical din x, x>=0
Sinusul valorii x exprimat n radiani
Cosinusul valorii x exprimat n radiani
Tangenta valorii x exprimat n radiani
Unghiul exprimat n radiani al crui
sinus este x
Unghiul exprimat n radiani al crui
cosinus este x
Unghiul exprimat n radiani a crui
tangent este x
Logaritm natural din x, x>0

log10(x)
exp(x)
fmod(x,y)
pow(x,y)

Real sau ntreg


Real sau ntreg
ntreg, ntreg
Real sau ntreg

double
double
double
double

math.h
math.h
math.h
math.h

pow10(p)
poly(x,g,tab)

int
x=real,g=ntreg,
tab=tablou de
nr reale

double
double

math.h
math.h

Logaritm n baza 10 din x, x>0


Valoarea funciei exponeniale pt. x
Restul mpririi ntregi a lui x la y
x ridicat la puterea y (dac x<0, y
trebuie s fie ntreg)
Calculeaz 10 la puterea p
Returneaz valoarea unui polinom n
punctul x; g=gradul polinomului, tab=
tabloul coeficienilor

Funcii pentru numere aleatoare

Funcia
randomiz
e()
random(n)
rand()

Tip
argum
ent
void

Tipul
rez

int

int

void

int

void

Fiie
rul
antet
stdlib.
h
stdlib.
h
stdlib.
h

Semnificaia rezultatului
Iniializeaz generatorul de numere
aleatoare
Un numr pseudoaleator din
intervalul [0,n-1]
Un numr pseudoaleator din
intervalul [0,RAND_MAX]. RAND_MAX
= 32767

Funcii de conversie

Funcia

Tipul
arg
char*

Tipul
rez
doubl
e

Fiieru
l antet
math.h

atoi(sir_car
)

char*

int

stdlib.h

atol(sir_car
)

char*

long

stdlib.h

ceil(x)

doubl
e

doubl
e

math.h

floor(x)

doubl
e

doubl
e

math.h

tolower(ca

int

int

ctype.h

atof(sir_ca
r)

Semnificaia rezultatului
Conversia unui ir de caractere ntr-o
valoare
double.
Dac
irul
nu
corespunde unei valori double, rezultatul
este 0
Conversia unui ir de caractere ntr-o
valoare
ntreag.
Dac
irul
nu
corespunde unei valori int, rezultatul
este 0
Conversia unui ir de caractere ntr-o
valoare
ntreag.
Dac
irul
nu
corespunde unei valori long, rezultatul
este 0
Cel mai mic ntreg mai mare sau egal cu
x
Ceil(123.45)=124, ceil(-123.45)=-123
Cel mai mare ntreg mai mic sau egal cu
x
Floor(123.54)=123, floor(-123.54)=-124
Modific o liter mare (A-Z) ntr-o liter
10

r)
toupper(ca
r)

int

int

ctype.h

mic (a-z)
Modific o liter mic (a-z) ntr-o liter
mare (A-Z)

11

Funcii referitoare la iruri de caractere

Funcia

Tipul arg

strcmp(sir1,sir2)
Compar 2 iruri
de caractere

char*,cha
r*

strcpy(destinaie,
surs)
strlen(sir)

char*,cha
r*
char*

strstr(s1,s2)

char*,cha
r*

Tip
ul
rez
int

Fiier
ul
antet
string.
h

char
*
size
_t
char
*

string.
h
string.
h
string.
h

Semnificaia rezultatului
Dac sir1<sir2 => un nr
negativ
dac sir1>sir2 => un nr
pozitiv
dac sir1=sir2 => zero
Copiaz irul surs n irul
destinaie
Calculeaz lungimea unui ir
ntoarce un pointer la
elementul din s1 unde ncepe
s2

Funcii referitoare la fiiere

Funcia

Tipul arg

Tipu
l rez

remove(nume_fii
er)

char*

int

Fiier
ul
antet
stdio.h

rename(nume_ve
chi,nume_nou)

char*,cha
r*

int

stdio.h

Semnificaia rezultatului
terge un fiier specificat prin
nume
sau
cale.
Fiierul
trebuie nchis nainte de
tergere. Dac tergerea s-a
efectuat atunci ntoarce 0,
altfel 1
Redenumete un fiier. Dac
redenumirea
s-a
efectuat
atunci ntoarce 0, altfel 1

Alte funcii

Funcia

Tipul
arg

Tipu
l rez

Fiier
ul
antet
dos.h

delay(x)

void

exit()

unsign
ed
int

void

stdlib.
h

gotoxy(x,y)

int,int

void

conio.
h

getch()

void

int

conio.
12

Semnificaia rezultatului
Suspend
execuia
programului
pentru x milisecunde
Termin imediat execuia programului
indiferent de funcia care apeleaz
exit
Pozioneaz cursorul n coloana x i
linia y (n fereastra curent n mod
text). Pentru valori invalide nu se
execut nimic
Citete un caracter de la tastatur

h
getche()

void

int

conio.
h

kbhit()

void

int

conio.
h

fr s-l afieze pe ecran. Returneaz


valoarea caracterului citit
Citete un caracter de la tastatur i
l afieaz pe ecran. Returneaz
valoarea caracterului citit
ntoarce o valoare diferit de 0 dac
a fost apsat o tast. Pentru a afla
ce tast a fost apsat se apeleaz
getch sau getche

8. Exerciii i probleme
Scriei antetele i definiia complet pentru subprogramele urmtoare selecie de
probleme din variantele de subiecte de Bacalaureat.
1. Subprogramul divizor, cu trei parametri, prin care primete 3 numere naturale nenule cu cel mult 9
cifre fiecare i returneaz numrul divizorilor comuni tuturor celor 3 numere.
Exemplu: dac numerele primite ca parametri sunt 24, 20 i 12, subprogramul returneaz valoarea 3
(divizorii comuni sunt 1, 2 i 4).
Rezolvare:
Antet:
int divizor(int a,int b, int c)
Subprogram:
int divizor(int a, int b,int c)
{
int x=0,d,minim;
minim=a;
if(minim>b)
minim=b;
if(minim>c)
minim=c;
for(d=1;d<=minim;d++)
if(a%d==0 &&b%d==0&&c%d==0)
x++;
return x;
}
int main()
{
cout<<divizor(24,20,12);
return 0,
}
2. Subprogramul Nr are un singur parametru, k, prin intermediul cruia primete un numr
natural de cel puin 3 cifre i cel mult 9 cifre, cu toate cifrele nenule. Subprogramul furnizeaz tot
prin intermediul parametrului k, valoarea obinut prin eliminarea primei i ultimei cifre a numrului
transmis la apel.
Exemplu: dac subprogramul primete prin intermediul parametrului k valoarea 12438, n urma
apelului subprogramului Nr, k va primi valoarea 243.
13

Rezolvare:
Antet:
void Nr(int &k)
Subprogram:
void Nr(int &k)
{
int x,e=1;
k=k/10;
x=k;
k=0;
while(x>9)
{
k=k+(x%10)*e;
e=e*10;
x/=10;
}
}
int main()
{
int a;
a=12348;
Nr(a);
cout<<a;
return 0;
}
3. Tabloul unidimensional V, declarat global, memoreaz exact 50 de numere ntregi:
V1, V2,...,V50. Subprogramul Calcul primete prin intermediul parametrului k un numr natural
nenul (k50) i furnizeaz prin intermediul parametrului S suma tuturor elementelor pozitive, din
tabloul V, cu indici mai mari sau egali cu k sau 0 dac toate elementele menionate sunt negative.
Rezolvare:
Antet:
void Calcul(int k,int &S)
Subprogram:
int V[51]={0,1,2,3,4,5};
{
int i;
S=0;
for(i=k;i<=5;i++)
if(V[i]>0)
S+=V[i];
}
int main()
{
int S;
Calcul(2,S);
cout<<S;
14

return 0;
}
4. Funcia f primete prin intermediul parametrului n un numr natural nenul (2n200), iar prin
intermediul parametrului a un tablou unidimensional care conine n valori ntregi nenule (fiecare dintre
aceste valori ntregi avnd cel mult patru cifre). Funcia returneaz valoarea -1 dac numrul de valori
negative din tabloul a este strict mai mare dect numrul de valori pozitive din tablou, valoarea 0 dac
numrul de valori negative din a este egal cu numrul de valori pozitive din tablou i valoarea 1 dac
numrul de valori pozitive din tabloul a este strict mai mare dect numrul de valori negative din a.
Rezolvare:
Antet:
int f(int n,int a[])
Subprogram:
int f(int n,int a[])
{
int i,neg=0,poz=0;
for(i=1;i<=n;i++)
if(a[i]>0)
poz++;
else
if(a[i]<0)
neg++;
if(neg>poz)
return -1;
if(neg==poz)
return 0;
return 1;
}
int main()
{
int a[20],n,i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
cout<<f(n,a);
return 0;
}

9. Exemplu de test subprograme


Se citete un vector a cu n elemente naturale. S se scrie subprograme pentru urmtoarele
prelucrri:
a) S se afieze elementele din a care sunt numere perfecte. (Acest subprogram va
apela un alt subprogram care calculeaz suma divizorilor mai mici dect un numr
dat ca parametru). Un numr este perfect dac este egal cu suma divizorilor si mai
mici dect el.

15

b) S se afieze perechile de elemente vecine care sunt prime ntre ele. Se va apela un
subprogram care calculeaz cmmdc pentru dou numere. Dou numere sunt prime
ntre ele dac cmmdc-ul lor este egal cu 1.
c) S se verifice dac tabloul este ordonat cresctor/ descresctor. Afiai mesaje
corespunztoare.
d) S se genereze un nou vector b care conine elementele din a care au numr impar
de cifre. S se afieze b.
Exemplu:
Pentru n=8 i vectorul a=(10, 5, 6, 212, 8128, 5, 145, 28), se vor obine rezultatele:
a) Numerele ptrate perfecte sunt: 6, 8128, 28
b) Perechile de elemente vecine prime ntre ele sunt: (5,6) (8128,5) (145,28)
c) Tabloul nu este ordonat
d) Vectorul b este: (5,6,212, 5,145)
Timp de lucru: 50 minute
Punctaj: oficiu 2p
a) 2p
b) 2p
c) 2p
d) 2p

16