Documente Academic
Documente Profesional
Documente Cultură
Laborator VIII
Anamaria Rădoi, Adrian Liţă, Ovidiu Grigore
2015
1 Scopul laboratorului
Laboratorul VIII al materiei Programarea Calculatoarelor are ca scop utilizarea
funcţiilor.
În acest laborator se parcurg următoarele puncte:
• declararea şi definirea unei funcţii
• aria de influenţă a unei funcţii
2 Desfăşurarea lucrării
Odată cu creşterea complexităţii programelor scrise, este nevoie de divizarea
unui program în funcţie de sarcinile executate astfel încât implementarea pro-
gramelor şi verificarea lor să fie mai uşor de efectuat. În acest sens, limbajul de
programare C++ oferă posibilitatea utilizării funcţiilor.
Utilizarea unei funcţii presupune mai întâi declararea şi apoi definirea sa.
Declararea funcţiei este obligatorie dacă funcţia este utilizată înainte de definirea
sa. O altă posibilitate este de a defini funcţia înainte de utilizarea sa, evitând
astfel o declarare a prototipului acesteia.
Prin declarare, sunt specificate numele funcţiei, tipul valorii returnate şi
parametrii funcţiei. Dacă tipul unui parametru nu este specificat, atunci para-
metrul este de tip double în mod implicit.
1
Definirea unei funcţii are două părţi: antetul şi corpul. Antetul este acelaşi
cu prototipul folosit în declararea funcţiei, fără adăugarea unui “;” la final.
Corpul funcţiei constă într-un set de instrucţiuni cuprins între acolade { }.
În general, o funcţie este definită în modul următor:
1 t i p _ r e t u r n a t nume_functie ( t i p 1 param1 , t i p 2 param2 , . . . , tipN
paramN )
2 {
3 instructiune 1;
4 instructiune 2;
5 ....
6 instructiune n;
7 // a t e n t i e ! t i p u l v a r i a b i l e i r e t u r n a t e t r e b u i e s a f i e
8 // t i p _ r e t u r n a t
9 return valoare ;
10 }
O funcţie poate returna orice tip de dată sau pointer (de exemplu, un po-
inter către primul element al unui tablou). Returnarea unui rezultat se face
cu ajutorul sintaxei return valoare, aceasta fiind ultima intrucţiuni din corpul
funcţiei. Când funcţia nu returnează nimic, acest lucru este marcat prin tipul
void la declararea funcţiei.
tip1 param1, tip2 param2,..., tipN paramN reprezintă o listă de variabile şi
tipuri asociate acestor variabile. Variabilele din această listă primesc valori la
apelarea funcţiei. O funcţie poate să nu aibă parametrii, însă, şi în acest caz,
sunt necesare parantezele.
În interiorul unei funcţii pot fi definite şi alte variabile, numite variabile
locale. Ele sunt create la intrarea în funcţie şi vor fi distruse la momentul
ieşirii din funcţie. Singura excepţie constă în folosirea variabilelor statice (de
exemplu, static int n), care îşi păstrează valorile modificate la apelări succesive
ale funcţiei, neffind totuşi vizibile în exteriorul funcţiei.
Ca o regulă generală, o funcţie nu poate fi definită în interiorul altei funcţii.
Atunci când o funcţie se apelează pe ea însăşi, atunci funcţia se numeşte
recursivă. Pentru a evita ca o funcţie să se autoapeleze la nesfîrşit, se foloseşte
o intrucţiune condiţionată (de exemplu, if, while, do...while) care determină
ieşirea din buclă.
2
2.2 Apelul prin valoare
Un parametru poate fi transmis prin valoare unei funcţii, dar, în acest caz,
modificările care se efectuează asupra lui nu sunt păstrate la ieşirea din funcţia
respectivă.
Exemplu. Următorul program utilizează o funcţie în care apelul parame-
trilor este efectuat prin valoare. i este trasferat funcţiei prin valoare, adică x va
primi iniţial valoarea lui i, însă, după aceea, nu va mai exista nicio legătură înre
variabile. La sfârşit, i va lua valoarea 7, iar j va lua valoarea 21 (verificaţi).
1 #i n c l u d e <i o s t r e a m >
2 u s i n g namespace s t d ;
3
4 int triplu ( int x)
5 {
6 x = x∗3;
7 return x ;
8 }
9
10 i n t main ( )
11 {
12 i =7;
13 int j = triplu ( i )
14 }
3
1 t i p _ r e t u r n a t ( ∗ nume_functie ) ( t i p 1 param1 , t i p 2 param2 , . . . , tipN
paramN ) ;
4
proiectului C++, se face click dreapta pe folderul Source şi se selectează Add
item....
În cel de-al doilea caz, este necesară includerea unui fişier în cadrul celuilalt
fişier în care este folosită funcţia din primul fişier. Acest lucru se face prin:
1 # include " f i s i e r " ;
5
1
2 #i n c l u d e <i o s t r e a m >
3
4 void f u n c t i a ( i n t n)
5 {
6 p r i n t f ( "Eu s u n t f u n c t i a cu un parametru de t i p i n t \n" ) ;
7 }
8
9 v o i d f u n c t i a ( i n t m, i n t n )
10 {
11 p r i n t f ( "Eu s u n t f u n c t i a cu d o i p a r a m e t r i de t i p i n t \n" ) ;
12 }
13
14 v o i d f u n c t i a ( i n t ∗n )
15 {
16 p r i n t f ( "Eu s u n t f u n c t i a cu un parametru de t i p i n t ∗ \n" ) ;
17 }
18
19 i n t main ( )
20 {
21 int n = 2;
22 functia (2) ;
23 f u n c t i a (2 , 3) ;
24 f u n c t i a (&n ) ;
25 system ( " pause " ) ;
26 return 0;
27 }
1 void f u n c t i a ( f l o a t n)
2 {
3 p r i n t f ( "Eu s u n t f u n c t i a cu un parametru de t i p f l o a t \n" ) ;
4 }
5
3 Probleme rezolvate
1. Calculul expresiilor Se citeşte numărul natural n. Să se scrie progra-
mele care tipăresc valoarea calculată a expresiilor:
1 1 1
E1 = 1 + + + ... +
2 3 n
6
n
1 1 1
E2 = 1 + + + ... +
2 3 n
7
Soluţie: Putem calcula suma cuburilor cifrelor unui număr cu ajutorul unei
funcţii, denumita suma. Numărul n va fi memorat în prima componentă
a vectorului seria. Apoi suma cuburilor cifrelor sale vor fi memorate în a
doua componentă ş.a.m.d. După ce este calculată o nouă valoare, aceasta
este afişată şi comparată cu toate valorile reţinute anterior în şirul seria.
Dacă valoarea este regăsită, programul se opreşte.
1 # i n c l u d e <i o s t r e a m >
2 u s i n g namespace s t d ;
3
4 i n t suma ( i n t n )
5 {
6 i n t tmp , c , s = 0 ;
7 tmp = n ;
8 w h i l e ( tmp != 0 )
9 {
10 c = tmp % 1 0 ;
11 s = s + c∗c∗c ;
12 tmp = tmp / 1 0 ;
13 }
14 return s ;
15 }
16
17 i n t main ( )
18 {
19 i n t i =0 , n , s e r i a [ 4 0 0 ] ;
20 bool g a s i t = 0;
21 p r i n t f ( " C i t e s t e un numar de l a tastatura : ") ;
22 c i n >> n ;
23 seria [0] = n;
24 p r i n t f ( " \n%d" , s e r i a [ 0 ] ) ;
25 do
26 {
27 s e r i a [ i + 1 ] = suma ( s e r i a [ i ] ) ;
28 for ( int ik = 0; ik < i + 1; i k ++){
29 i f ( s e r i a [ i k ] == s e r i a [ i + 1]) gasit = 1;
30 }
31 p r i n t f ( " %d" , s e r i a [ i + 1 ] ) ;
32 i = i + 1;
33 } w h i l e ( g a s i t != 1 ) ;
34
35 system ( " pause " ) ;
36 return 0;
37 }
3. Triunghi special
Se citesc 2 numere naturale m şi n, mai mici decât 10. Să se scrie un
program care afişează un triunghi, după regulile următoare:
• m = 6; n = 1
1
23
456
7891
8
23456
789123
• m = 7; n = 9
9
12
345
6789
12345
678912
3456789
9
35 t r i u n g h i (m, n ) ;
36
37 system ( " pause " ) ;
38 return 0;
39 }
4 Probleme propuse
1. Să se scrie un program care tipăreşte numerele întregi găsite între două
valori citire de la tastatură care se divid la suma cifrelor lor. Programul
va utiliza o funcţie care returnează suma cifrelor unui număr întreg primit
ca parametru.
2. Să se scrie o funcţie care returnează ultima cifră a unui număr întreg citit
de la tastatură.
3. Să se scrie un program care permută două linii i şi j ale unei matrice.
Programul se va realiza astfel:
• se scrie o funcţie pentru citirea de la tastatură a unei matrice;
• se scrie o funcţie pentru afişarea unei matrice;
• se scrie o funcţie care permută două linii;
• funcţia main() rezultă din apelul funcţilor de mai sus.
4. Să se scrie un program care calculeaza transpusa unei matrice. Programul
se va realiza astfel:
• se scrie o funcţie pentru citirea de la tastatură a unei matrice;
• se scrie o funcţie pentru afişarea unei matrice;
• se scrie o funcţie care calculează transpunsa unei matrice;
• funcţia main() rezultă din apelul funcţilor de mai sus.
5. Să se citească două matrice şi să se facă suma lor. Programul se va realiza
astfel:
• se scrie o funcţie de citire a unei matrice cu m linii şi n coloane;
• se scrie o funcţie de tipărire a unei matrice cu m linii şi n coloane;
• se scrie o funcţie care adună două matrice;
• funcţia main() rezultă din apelul funcţilor de mai sus.
6. Să se scrie un program care afişează valoarile maxime, pe linii, ale unei
matrice. Rezultatul va fi stocat într-un vector având lungimea dată de
numărul de linii ale matricei şi, apoi afişat pe ecran. Programul se va
realiza astfel:
• se scrie o funcţie de citire a unei matrice cu m linii şi n coloane;
10
• se scrie o funcţie de tipărire a unei vector cu m elemente;
• se scrie o funcţie care returnează minimul dintre 2 numere;
• funcţia main() rezultă din apelul funcţilor de mai sus.
11