Sunteți pe pagina 1din 7

Borland C++ Laborator 11

FUNCII

1. Scopul lucrrii
nelegerea i utilizarea modului de a scrie o funcie, alta dect
funcia principal main.

2. Desfurarea lucrrii

2.1. FUNCII VOID:
Limbajul C++ folosete dou tipuri de subprograme:
- funcii void;
- funcii care ntorc o valoare.

Scrierea funciilor void :
O astfel de funcie arat ca funcia main, cu deosebirea c ncepe prin
cuvntul cheie void n locul lui int. n plus, o funcie void nu conine
nici o instruciune de tipul return 0; aa cum se ntmpl n cazul
lui main, deci nu ntoarce nici o valoare.
Vom studia un program simplu care folosete funcii void i va
tiprii textul:

*************
*************
Jubileu aniversar!
*************
*************
*************
*************
Programul se scrie sub forma urmtoare:
#include <iostream.h>
void Tipareste2Linii(); //prototip de functie
void Tipareste4Linii(); //prototip de functie
int main()
{
Tipareste2Linii(); //apel de functie
cout << " Jubileu aniversar! " << endl;
Tipareste4Linii(); //apel de functie
return 0;
}
void Tipareste2Linii() //Aceasta functie tipareste doua linii de asteriscuri
{
cout << "*************" << endl;
cout << "*************" << endl;
}
void Tipareste4Linii() //Aceasta functie tipareste patru linii de asteriscuri
{
cout << "*************" << endl;
cout << "*************" << endl;
cout << "*************" << endl;
cout << "*************" << endl;
}
Se observ similaritatea dintre funcia main i descrierea funciilor.
Cele dou funcii care fac parte din corpul funciei main sunt fr
parametri. Fiecare dintre definiiile acestor funcii este format din titlul
funciei urmat de un bloc de instruciuni care alctuiesc corpul funciei.
Titlul unei funcii void ncepe cu cuvntul cheie void care semnaleaz c
nu ntoarce nici o valoare. Implicit, n corpul unei astfel de funcii nu va
aprea nici o instruciune return urmat de o valoare.
Definiiile funciilor pot aprea n orice ordine, deci main ar fi putut
aprea dup cele dou funcii. Cele dou declaraii dinaintea funciei main
se numesc prototipuri de funcii. Ele sunt necesare pentru c regulile din
C++ impun declararea unui identificator naintea folosirii sale. Cei doi
identificatori sunt Tipareste2Linii i Tipareste4Linii folosii
n main.
Sintaxa i semantica funciilor void:
Apelul funciilor (invocarea funciei) nseamn execuia corpului
funciei apelate, iar apelarea se face dup forma general:
NumeFuncie(List Parametri Actuali);
Parametrii dintr-un apel de funcie se numesc parametri actuali.
Parametrii care apar n titlul funciei se numesc parametri formali.
Conform sintaxei C++, lista de parametri poate s fie vid.
Lista de parametri actuali din ablonul sintactic al apelului de funcie
este subliniat pentru ca poate s lipseasc.
Dac lista conine doi sau mai muli parametri, acetia trebuie separai
prin virgul: Expresie1, Expresie2, ... Expresie n.
n momentul apelului unei funcii, parametrii actuali sunt transmii
parametrilor formali conform poziiei lor, de la stnga la dreapta, iar apoi
controlul este transferat primei instruciuni din corpul funciei. Cnd se
ncheie i execuia ultimei instruciuni din funcie, controlul este transmis
punctului n care s-a fcut apelul.
Declaraii i definiii de funcii :
Pentru c n C++ orice identificator trebuie declarat nainte de a fi
folosit, i funciile trebuie s respecte aceast regul.
O declaraie de funcie anun compilatorul despre numele funciei,
tipul de dat al valorii returnate (poate fi i void) i tipurile datelor folosite
n lista de parametri. Programul din exemplul de mai sus conine dou
declaraii de funcii care nu sunt nsoite de corpul funciilor. Acestea sunt
prototipuri de funcii. Dac declaraiile sunt nsoite i de corpul funciei,
atunci este vorba despre definiii de funcii. Toate definiiile sunt declaraii,
dar nu toate declaraiile sunt definiii.
Prototipuri de funcii:
Pentru a satisface cerina ca orice identificator s fie declarat nainte
de a fi folosit, programatorii C++ plaseaz prototipurile funciilor chiar
naintea definiiei funciei main, la nceputul programului.
Pentru o funcie void, ablonul sintactic al unei declaraii este:
void NumeFuncie(ListParametriFormali);
Prototipul nu este nsoit de corpul funciei, lista de parametri formali
este opional i declaraia se ncheie cu ;
Lista parametrilor formali este opional i are urmtoarea form:
TipData & NumeVariabil, TipDat & NumeVariabil ...
Ampersantul & este ataat tipului de dat i este opional. ntr-un
prototip de funcie, lista parametrilor formali trebuie s specifice tipurile de
dat ale parametrilor, dar numele lor poate s lipseasc.
Exemplu:
void Traiectorie(int, double);
void Traiectorie(int viteza, double unghi);
Numele parametrilor sunt utili pentru explicitarea funciei, dar
compilatorul le ignor.
Definiii de funcii
Aa cum am vzut deja, definiia unei funcii const din titlul funciei
i corpul funciei care este, de fapt, un bloc. ablonul sintactic al unei
definiii de funcie este:
void NumeFuncie(ListParametriFormali)
{
Instruciune
...
}
!!!!! Titlul funciei nu se ncheie cu ; ca la prototipurile de funcii.
Sintaxa listei de parametri din definiie difer de cea folosit n
prototip, n sensul c aici trebuie specificate numele tuturor parametrilor
formali.
TipData & NumeVariabil, TipDat & NumeVariabil ...

Variabile locale:
Deoarece corpul unei funcii este un bloc, orice funcie poate include
declaraii de variabile n interiorul ei. Aceste variabile se numesc variabile
locale pentru c sunt accesibile doar n interiorul blocului n care sunt
declarate. n contrast cu variabilele locale sunt variabilele declarate n afara
tuturor funciilor i accesibile lor i se numesc variabile globale.
Variabilele locale ocup spaiu de memorie doar pe timpul execuiei
funciei. Cnd funcia i ncheie execuia, variabilele locale sunt terse din
memoria calculatorului. Acesta este motivul pentru care la fiecare apel al
unei funcii variabiilele locale pornesc cu valori nedefinite, deci trebuie
iniializate n interiorul funciei. Fiind terse din memorie dup ncheierea
apelului, valorile variabilelor locale nu se pstreaz ntre dou apeluri de
funcii.

2.2. PARAMETRI
Atunci cnd se execut o funcie, ea folosete parametrii actuali care i-
au fost transmii prin apelul su, innd, ns, cont de natura parametrilor
formali. Limbajul C++ accept dou tipuri de parametri formali:
- parametri valoare;
- parametri referin.
Parametrii referin sunt cei pentru care tipul de dat este nsoit, n
lista parametrilor formali, de semnul &. Funcia primete adresa de memorie
a parametrului actual.
Din declaraiile parametrilor valoare lipsete semnul &, iar funcia
primete o copie a valorii parametrului actual.
Tip de parametru Folosire
Parametru actual Apare n apelul funciei. Parametrii
corespunztori pot fi att valoare ct i
referin
Parametru valoare formal Apare n titlul funciei. Primete o copie a
valorii pstrate n parametrul actual
corespunztor
Parametru referin formal Apare n titlul funciei. Primete adresa
parametrului actual corespunztor
Numrul parametrilor actuali din apelul unei funcii trebuie s fie egal
cu numrul parametrilor formali din titlul funciei. De asemenea, tipurile
datelor trebuie s corespund.
Exemplu:
Titlul:
void ShowMatch(double num1, int num2, char letter);
Apel:
ShowMatch(varDouble, varInt, varChar);

Exemplu de program ce calculeaz ptratul i cubul unui numr dat de
la tastatur.

#include <iostream.h>
#include <conio.h>
int Patrat(int);
int Cub(int);
int n;
int main()
{
cout << "Introduceti un numar natural n= " << endl;
cin>>n;
Patrat(n);
Cub(n);
cout<<"Final !";
return 0;
getch();
}
int Patrat(int n)
{
n*=n;
cout<<"Patrutul numarului "<<n<<endl;
}
int Cub(int n)
{
n*=n*n;
cout<<"Cubul numarului "<<n<<endl;
}

3. Aplicaii practice

1. Folosind funcii scriei un program care sa calculaze urmtoarele trei
operaii: 7 / 4 folosind impartirea intreaga, 7 / 4 folosind impartirea
reala, restul mpririi lui 7 la 4.

#include <iostream.h>
#include <conio.h>
int impartirea_intreaga (int,int);
float impartirea_reala (float,float);
int restul_impartirii (int,int);
int n,m;
float nr,mr;
void main()
{
cout << "Introduceti primul numar n= " << endl;
cin>>n;
cout << "Introduceti al doilea numar m= " << endl;
cin>>m;
nr=n; mr=m;
impartirea_intreaga (n,m);
impartirea_reala (nr,mr);
restul_impartirii (n,m);

cout<<"SFARSIT !";

getch();
}

int impartirea_intreaga (int n, int m)
{
int rez;
rez=n/m;
cout<<"Impartirea intreaga intre "<<n<<" si "<<m<<"=
"<<rez<<endl;
}

float impartirea_reala (float nr, float mr)
{
cout<<"Impartirea reala intre "<<nr<<" si "<<mr<<"=
"<<nr/mr<<endl;
}

int restul_impartirii (int n, int m)
{
int r;
r=n%m;
cout<<"Restul impartirii intre "<<n<<" si "<<m<<"=
"<<r<<endl;
}

2. Se introduce de la tastatur n un numr natural.
- s se calculeze suma cifra sale (ex.: n cazul n care n = 213, suma va
fi 6);
- s se afieze numrul obinut prin inversarea cifrelor sale (ex.: n cazul
n care n=412, numrul invers va fi 214).
Rezolvai problema folosind funcii.

#include <iostream.h>
#include <conio.h>
int suma_cifrelor (int);
int inversarea_numarului (int);
int n1,n2,s=0, ninv=0;
void main()
{
cout << "Introduceti un numar mare n= " << endl;
cin>>n1;
n2=n1;
suma_cifrelor (s);
inversarea_numarului (ninv);

cout<<"SFARSIT !";

getch();
}

int suma_cifrelor (int s)
{
while(n1)
{s+=n1%10;
n1/=10;
}
cout<<"Suma cifrelor este "<<s<<endl;
}

int inversarea_numarului (int ninv)
{
while(n2)
{ninv=ninv*10+n2%10;
n2/=10;
}
cout<<"Numarul inversat este "<<ninv<<endl;
}

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