Laboratorul 8 Funcţii: PCLP I Conf - Dr.ing. Ana-Maria SUDUC Laboratorul 8
Laboratorul 8 Funcţii: PCLP I Conf - Dr.ing. Ana-Maria SUDUC Laboratorul 8
Laboratorul 8 Funcţii: PCLP I Conf - Dr.ing. Ana-Maria SUDUC Laboratorul 8
Laboratorul 8
Funcţii
1. Noţiuni teoretice
1.1. Forma generală a unei funcţii
Un program conţine una sau mai multe funcţii. Fiecare funcţie are un nume. Numele funcţiei
principale este main, iar numele celorlalte funcţii sunt definite de utilizator.
Forma generală a unei funcţii este:
specificator_de_tip nume_functie (lista_parametri)
{
corpul functiei
}
Specificator_de_tip indică tipul de date returnat de funcţie. O funcţie poate returna orice tip de date,
cu excepţia tablourilor. Lista_parametri este o listă de nume de variabile şi a tipurilor asociate acestora,
separate prin virgulă, care primesc valorile argumentelor la apelul funcţiei. Unei funcţii îi pot lipsi
parametrii, caz în care lista de parametri este vidă. Totuşi, chiar dacă funcţia nu are parametri, parantezele
sunt necesare.
În cazul declaraţiilor de variabile, mai multe variabile pot fi declarate ca fiind de acelaşi tip folosind
o listă de nume de variabile, separate prin virgulă. Spre deosebire de acestea, toţi parametrii unei funcţii
trebuie declaraţi individual, fiecare declaraţie trebuind să conţină numele şi tipul parametrului. Ca atare,
lista de declarare a parametrilor unei funcţii are forma:
f(tip numevar1, tip numevar2,..., tip numevarN)
1.2. Regulile de competenţă ale unei funcţii
Regulile de competenţă ale unui limbaj sunt acele reguli care controlează dacă un fragment de
program are cunoştinţă sau acces la un alt fragment de program sau de date.
În C/C++, fiecare funcţie reprezintă un bloc de cod distinct. Codul unei funcţii este propriu acelei
funcţii şi nu poate fi accesat de nici o altă instrucţiune conţinută într-o altă funcţie, cu excepţia cazului când
este apelată funcţia. Codul care reprezintă corpul unei funcţii este ascuns faţă de restul programului şi, cu
excepţia cazului în care foloseşte date sau variabile globale, nu poate afecta şi nu poate fi afectat de către
alte componente ale programului.
În C/C++, toate funcţiile au acelaşi nivel al domeniului de acţiune, adică nu se poate defini o funcţie
în interiorul altei funcţii. Iată de ce C/C++ nu este, din punct de vedere tehnic, un limbaj structurat pe
blocuri.
1.3. Argumentele unei funcţii
Dacă o funcţie urmează să folosească argumente, trebuie să declare variabile care să accepte valorile
argumentelor. Aceste variabile se numesc parametrii formali ai funcţiei. Aceştia se comportă ca orice altă
variabilă locală în interiorul funcţiei, fiind creaţi la intrarea în funcţie şi distruşi la ieşire. După cum o arată
funcţia care urmează, declaraţiile parametrilor survin după numele funcţiei:
/* Returnează 1 dacă c aparţine şirului s; 0 în caz contrar.*/
int este_in(char *s, char c)
{
while (*s)
1
PCLP I Laboratorul 8
Conf.dr.ing. Ana-Maria SUDUC
if(*s==c) return 1;
else s++;
return 0;
}
Funcţia este_in() are doi parametri, anume s şi c. Această funcţie dă rezultatul 1 dacă caracterul c
este inclus în şirul s şi 0 în caz contrar.
Trebuie să vă asiguraţi că argumentele folosite la apelul unei funcţii sunt compatibile cu tipul
parametrilor acesteia. Dacă tipurile sunt incompatibile, compilatorul nu va emite neapărat un mesaj de
eroare, dar pot apărea rezultate neaşteptate.
1.4. Apelul funcţiilor folosind tablouri
Când un tablou este folosit ca argument al unei funcţii, se transferă numai adresa tabloului, şi nu o
copie a întregului tablou. La apelul unei funcţii cu numele unui tablou, este transmis funcţiei un pointer al
primului element din tablou. Aceasta înseamnă că declararea parametrului trebuie să fie compatibilă cu
tipul pointerului. Există trei modalităţi de a declara un parametru care urmează să primească un pointer
tablou:
- declararea unui tablou;
void afiseaza(int num[10])
Prima aplicaţie de la punctul 2 reprezintă un exemplu pentru prima modalitate, iar a doua aplicaţie
un exemplu pentru cea de-a treia modalitate.
1.5. Revenirea dintr-o funcţie
Revenirea dintr-o funcţie se poate realiza în două moduri:
- după execuţia ultimei instrucţiuni din corpul funcţiei;
- la întâlnirea instrucţiunii return.
Instrucţiunea return este instrucţiunea de revenire din funcţie. Ea are formatele:
- return
- return expresie
Formatul al doilea se foloseşte în corpul unei funcţii care returnează o valoare la revenirea din ea.
Valoarea expresiei din instrucţiunea return este chiar valoarea returnată de funcţie.
În cazul în care tipul acestei expresii diferă de tipul din antet, valoarea expresiei se converteşte
automat spre tipul din antet, înainte de a reveni din funcţie. Se foloseşte revenirea din funcţie fără
instrucţiunea return sau cu ajutorul instrucţiunii return fără a fi urmată de o expresie atunci când funcţia nu
returnează nici o valoare.
2
PCLP I Laboratorul 8
Conf.dr.ing. Ana-Maria SUDUC
Dacă main() nu returnează nici o valoare, poate fi declarată ca fiind de tip void. Unele compilatoare
afişează un avertisment dacă o funcţie nu este declarată de tip void şi nu returnează nici o valoare.
1.7. Prototipizarea funcţiilor
Prototipizarea funcţiei este una dintre îmbunătăţirile majore aduse funcţiilor C++. Prototipul funcţiei
transmite compilatorului detalii despre funcţie: numărul şi tipul argumentelor şi tipul valorilor returnate.
Prototipul funcţiei este o instrucţiune declarativă şi are următoarea formă:
tipul_rezultatului numele_funcţiei (lista_argumente)
Exemplu:
float volum(float a, float b, float c);
către funcţia suma au fost transmise valorile variabilelor x şi y (4 şi 76), nu variabilele în sine.
În acest caz, la apelul funcţiei suma, valoarea variabilelor locale (parametrii formali) a şi b devin 4,
respectiv 76, dar nicio modificare ale valorilor celor două variabile a şi b nu modifică valorile variabilelor x
şi y, deoarece nu variabilele x şi y sau fost transmise funcţiei ci doar copii ale valorilor acestora în
momentul apelului.
În unele cazuri este necesară manipularea valorii unei variabile externe în interiorul unei funcţii.
Acest lucru se poate obţine prin transmiterea argumentelor funcţiei prin referinţă, ca în exemplul următor:
#include <iostream>
using namespace std;
3
PCLP I Laboratorul 8
Conf.dr.ing. Ana-Maria SUDUC
b*=2;
c*=2;
}
int main ()
{
int x=1, y=3, z=7;
dublare (x, y, z);
cout << "x=" << x << ", y=" << y << ", z=" << z;
return 0 ;
}
În exemplul dat se observă că fiecare parametru formal este precedat de semnul ampersand (&).
Acest semn indică faptul că argumentul corespondent va fi transmis prin referinţă şi nu prin valoare. Când o
variabilă este transmisă prin referinţă, nu se transmite o copie a acesteia ci chiar variabila în sine şi orice
modificare făcută asupra variabilelor locale va avea un efect asupra variabilelor corespondente transmise ca
argumente ale funcţiei apelate.
1.10. Parametri cu valori implicite
La declararea unei funcţii se poate specifica o valoare implicită pentru fiecare dintre parametri.
Această valoare va fi utilizată atunci când argumentul corespondent rămâne necompletat la apelul funcţiei.
La apelul funcţiei, dacă argumentul corespondent lipseşte, se utilizează valoarea implicită. Dacă pentru
parametrul care are o valoare implicită se transmite un argument, atunci valoarea implicită este ignorată.
Exemplu:
#include <iostream>
using namespace std;
int main ()
{
cout << inmultire (12)<<endl;
cout << inmultire (20,4)<<endl;
return 0 ;
}
În exemplul anterior, la primul apel al funcţiei inmultire se va obţine rezultatul 12 (12*1 – se
foloseşte valoarea implicită a lui b), iar la cel de-al doilea apel se va obţine 80 (20*4 – valoarea implicită a
lui b este ignorată).
2. Aplicaţii
2.1.Lansaţi în execuţie aplicaţia Code::Blocks:
a. Din meniul Start-> CodeBlocks.
2.2.Creaţi un nou proiect:
a. Apăsați pe comanda Create a New Project.
b. În fereastra New from template selectați Console application și apăsați Go;
c. În fereastra Console application se selectează C++ și se apasă Next;
d. Se introduce numele dorit pentru proiect în câmpul Project title și se apasă Next;
e. Se apasă Finish.
f. În fereastra proiectului, în secțiunea Management se apasă pe semnul plus din fața
directorului Sources și apoi dublu clic pe main.cpp (fișierul ce va conține programul).
2.3. Testaţi următorul program care calculează şi afişează suma a două numere:
4
PCLP I Laboratorul 8
Conf.dr.ing. Ana-Maria SUDUC
#include <iostream>
using namespace std;
int sum(int a, int b); /*prototipul functiei; a si b sunt parametrii formali ai
functiei. Numele parametrilor formali pot lipsi*/
int main ()
{
int r;
r=sum(17,23); //17 si 23 sunt argumentele functiei
cout<<"Valoarea lui r este: "<<r<<endl;
int x,y;
x=17;
y=23;
cout<<"Suma variabilelor x si y este: "<<sum(x,y)<<endl;
return 0 ;
}
int sum(int a, int b) //definitia functiei
{
return a+b;
}
2.4.Scrieţi un program care conţine funcţii de calcul a celor patru operaţii de bază: adunare, scădere,
înmulţire şi împărţire. Apelaţi cele patru funcţii definite cu argumente citite de la tastatură.
2.5.Scrieţi un program care creează un calculator cu 4 operații. Fiecare dintre cele 4 operații se va
realiza prin intermediul unei funcții.
2.6. Testaţi programul următor:
#include <iostream>
using namespace std;
void afiseaza(char *n, int v);
int main ()
{
char nume[15];
int varsta;
cout << "Introduceti numele: ";
cin >> nume;
cout << "Introduceti varsta: ";
cin >> varsta;
afiseaza(nume, varsta);
return 0 ;
}
void afiseaza (char *n, int v)
{
cout << "Numele tau este " <<n<< " si ai " << v << " de ani."<<endl;
}
2.7. Următorul program afişează elementele unui tablou folosind o funcţie, afisează:
#include <iostream>
using namespace std;
int main(void)
{
int t[10],i;
for (i=0; i<10; ++i)
t[i]=i;
afiseaza(t);
return 0 ;
}
void afiseaza (int x[10])
5
PCLP I Laboratorul 8
Conf.dr.ing. Ana-Maria SUDUC
{
int i;
for (i=0; i<10; i++)
cout<<x[i]<<' ';
}
2.8. Modificaţi programul anterior astfel încât să conţină un tablou unidimensional de numere întregi,
a[20], cu n elemente a căror valori sunt citite de la tastatură. Afişaţi acest tablou cu ajutorul funcţiei
afiseaza care a fost modificată în prealabil.
2.9. Adăugaţi încă un vector de numere întregi, b[20], cu m elemente a căror valori sunt citite de la
tastatură. Afişaţi cele m elemente cu ajutorul funcţiei afisează.
2.10. Testaţi următorul program care transformă un şir de caractere în majuscule.
#include <iostream>
using namespace std;
int main()
{
6
PCLP I Laboratorul 8
Conf.dr.ing. Ana-Maria SUDUC
int x,y;
float a,b,c;
cout<<"x=";
cin>>x;
cout<<"y=";
cin>>y;
cout<<x<<"+"<<y<<"="<<suma(x,y)<<endl;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
cout<<"c=";
cin>>c;
cout<<a<<"+"<<b<<"+"<<c<<"="<<suma(a,b,c)<<endl;
return 0 ;
}
int suma (int x, int y)
{
return x+y;
}
float suma(float a, float b, float c)
{
return a+b+c;
}
2.16. Testaţi exemplele furnizate în partea de teorie.
2.17. Testaţi programul următor:
#include <iostream>
using namespace std;
int volume(int);
double volume (double, int);
long volume (long, int, int);
int main()
{
cout << volume(10) << endl;
cout << volume(2.5, 8) << endl;
cout << volume(100L, 75, 15) << endl;
return 0 ;
}
int volume(int s) // cub
{
return(s*s*s);
}
double volume(double r, int h) // cilindru
{
return(3.14519*r*r*h);
}
long volume(long L, int l, int h) // paralelipiped
{
return(L*l*h);
}
Referinţe
http://www.cplusplus.com/doc/tutorial/functions2/