Sunteți pe pagina 1din 7

REFERAT DE LABORATOR Nr.

10 (din 14) 2010

REFERAT DE LABORATOR NR. 10

TEMA:
Funcii. Transmiterea parametrilor tablou. Transmiterea argumentelor
ctre funcia main. Funcii cu parametri implicii. Funcii cu numr variabil
de parametri. Funcii predefinite. Suprancrcarea funciilor.

NOIUNI TEORETICE
1. Transmiterea parametrilor tablou

n limbajul C, cazul parametrilor tablou constituie o excepie de la regula transferului


parametrilor prin valoare: o variabil tablou are ca valoare adresa de nceput a tabloului (este
un pointer constant).
n cazul unei funcii care prelucreaz elementele unui tablou unidimensional (vector), n lista
declaraiilor parametrilor formali vor apare tipul i numele vectorului (pentru care se poate
omite specificarea numrului maxim de elemente ale acestuia) i numrul de elemente cu care
se lucreaz:
<tip_val_ret> <nume_functie>(<tip_tab> <nume_tab>[], int <nr_elem>);
<tip_val_ret> <nume_functie>(<tip_tab> *<nume_tab>, int <nr_elem>);
Apelul funcei creia i se transmite ca parametru un vector este:
<nume_functie>(<nume_tab>, <nr_elem>);
Pentru tablourile bidimensionale (vectori de vectori), poate fi omis doar precizarea
numrului de linii, deoarece pentru a adresa elementul a[i][j], compilatorul utilizeaz
relaia: &mat[i][j]=&mat+(i* N+j)*sizeof(tip), n care N reprezint numrul de
coloane, iar tip reprezint tipul tabloului.
Pentru tablourile multidimensionale, pentru ca elementele tabloului s poat fi referite n
funcie, compilatorul trebuie informat asupra modului de organizare a tabloului.

2. Transmiterea argumentelor ctre funcia main

n situaia n care este necesar transmiterea unor informaii (opiuni, date iniiale, etc) ctre
un program la lansarea n execuie a acestuia, informaiile vor fi transmise ca parametri ctre
funcia main. Pentru a putea transmite parametrii (n vederea unei prelucrri ulterioare a
acestora), trebuie inclus headerul stdarg.h, iar prototipul funciei main are forma:
main (int argc, char *argv[ ], char *env[ ])

Semnificaia parametrilor (argc, argv i env) din antet este:


Adresele de nceput ale acestor iruri de caractere sunt memorate n tabloul de pointeri
argv[], n ordinea n care apar n linia de comand (argv[0] memoreaz adresa irului
care constituie numele programului, argv[1] - adresa primului argument, etc.).
Parametrul ntreg argc memoreaz numrul de elemente din tabloul argv (argc>=1).
Parametrul env[] este un tablou de pointeri ctre iruri de caractere care pot specifica
parametri ai sistemului de operare.
Autor: Diana tefnescu 1
REFERAT DE LABORATOR Nr. 10 (din 14) 2010

3. Funcii cu parametri implicii

Spre deosebire de limbajul C, n limbajul C++ se pot face iniializri ale parametrilor formali.
Parametrii formali iniializai se numesc parametri implicii. La apelul funciilor cu parametri
implicii, unui parametru implicit, poate s-i corespund sau nu, un parametru efectiv. Dac
la apel nu i corespunde un parametru efectiv, atunci parametrul formal va primi valoarea prin
care a fost iniializat (valoarea implicit). Dac la apel i corespunde un parametru efectiv,
parametrul formal va fi iniializat cu valoarea acestuia, negijndu-se astfel valoarea implicit a
parametrului formal.

4. Funcii cu numr variabil de parametri

n limbajele C i C++ se pot defini funcii cu un numr variabil de parametri. Parametrii care
trebuie s fie prezeni la orice apel al funciei se numesc parametri fici, ceilali se numesc
parametri variabili. n antetul unei funcii cu numr variabil de parametri, parametrii fici
ocup primele poziii din list, iar prezena parametrilor variabili se indic prin trei puncte
care se scriu dup ultimul parametru fix al funciei. Prototipul unei funcii cu numr variabil
de parametri este:
<tip_ret> <nume_funct>(<lista_decl_par_formal_ficsi>, . . . );

Funciile predefinite cu numr variabil de parametri sunt, de obicei, funcii de bibliotec (ex:
printf, scanf). Pentru a-i defini propriile funcii cu numr variabil de parametri,
utilizatorul trebuie s foloseasc macrouri speciale, care permit accesul la parametrii variabili
i se gsesc n headerul stdarg.h.

5. Funcii predefinite

Orice mediu de programare este prevzut cu una sau mai multe biblioteci de funcii
predefinite. Orice bibliotec este format din:
fiierele header (conine prototipurile funciilor, declaraiile de variabile);
biblioteca (arhiva) propriu-zis (conine definiii de funcii).

Pentru ca funciile predefinite s poat fi utilizate ntr-un program, fiierele header n care se
gsesc prototipurile acestora trebuie incluse printr-o directiv preprocesor (exemplu
#include <stdio.h>). Deasemenea, utilizatorul i poate crea propriile headere. Pentru a
putea utiliza funciile din headerele proprii, utilizatorul trebuie s includ aceste headere n
programul apelant (exemplu #include "my_header.h").
Pentru funciile predefinite, au fost create fiiere header orientate pe anumite numite tipuri de
aplicaii. De exemplu, funciile matematice se gsesc n headerul <math.h>. Headerul
<stdlib.h> conine funcii standard, headerul <values.h> definete o serie de constante
simbolice (exemplu MAXINT, MAXLONG) care reprezint, n principal, valorile maxime i
minime ale diferitelor tipuri de date, etc.

6. Suprancrcarea funciilor

Limbajul C++ ofer posibilitatea de suprancrcare a numelui unei funcii (pe scurt,
suprancrcarea funciilor), ceea ce conduce la utilizarea unor funcii cu acelai nume, care
execut prelucrri diferite. Prototipurile unei funcii suprancrcate trebuie s difere ntre ele
prin numrul i/sau tipul parametrilor formali i/sau prin tipul valorii returnate. Selecia
funciei se realizeaz n momentul compilrii.
Autor: Diana tefnescu 2
REFERAT DE LABORATOR Nr. 10 (din 14) 2010
PROBLEME REZOLVATE

9. S se afle elementul minim dintr-un vector de maxim 10 elemente. Se vor scrie dou
funcii: de citire a elementelor vectorului i de aflare a elementului minim:

#include <iostream.h>
int min_tab(int a[], int nr_elem)
{int elm=a[0];
for (int ind=0; ind<nr_elem; ind++)
if (elm>=a[ind]) elm=a[ind];
return elm; }

void citireVector(int b[], int nr_el)


{ for (int ind=0; ind<nr_el; ind++){
cout<<"Elem "<<ind+1<<"="; cin>>b[ind];}
}

main()
{int a[10]; int i,j,n; cout<<"n="; cin>>n;
citireVector(a,n);
int min=min_tab(a,n); cout<<"Elem. min:"<<min<<'\n'; }

Aceleeai problem poate fi implementat folosind aritmetica pointerilor:

#include <iostream.h>
void citireVector(int *b, int nr_el)
{ for (int ind=0; ind<nr_el; ind++){
cout<<"Elem "<<ind+1<<"="; cin>>*(b+ind);}
}

int min_tab(int *a, int nr_elem)


{int elm=*a;
for (int ind=0; ind<nr_elem; ind++)
if ( elm>=*(a+ind) ) elm=*(a+ind);
return elm; }

main()
{
int a[10]; int i,j,n; cout<<"n="; cin>>n;
citireVector(a, n);
int min=min_tab(a,n);
cout<<"Elem. min:"<<min<<'\n'; }

10. Fie o matrice de maxim 10 linii i 10 coloane, ale crei elemente se introduc de la
tastatur. S se implementeze dou funcii care afieaz matricea i calculeaz elementul
minim din matrice.

#include <iostream.h>
int min_tab(int a[][10], int nr_lin, int nr_col)
{int elm=a[0][0];
for (int il=0; il<nr_lin; il++)
for (int ic=0; ic<nr_col; ic++)
if (elm>=a[il][ic]) elm=a[il][ic];
return elm;
}

Autor: Diana tefnescu 3


REFERAT DE LABORATOR Nr. 10 (din 14) 2010
void afisare(int a[][10], int nr_lin, int nr_col)
{
for (int i=0; i<nr_lin; i++)
{for (int j=0; j<nr_col; j++) cout<<a[i][j]<<'\t';
cout<<'\n';
}
}

main()
{int mat[10][10];int i, j, M, N;cout<<"Nr. linii:"; cin>>M;
cout<<"Nr. coloane:"; cin>>N;
for (i=0; i<M; i++)
for (j=0; j<N; j++)
{ cout<<"mat["<<i<<","<<j<<"]="; cin>>mat[i][j];}
afisare(mat, M, N);
int min=min_tab(mat, M, N);
cout<<"Elem. min:"<<min<<'\n'; }

11. S se implementeze un program care afieaz argumentele transmise ctre funcia


main.
#include <iostream.h>
#include <stdarg.h>

main(int argc, char *argv[], char *env[])


{cout<<"Nume program:"<<argv[0]<<'\n';
//argv[0] contine numele programului
if(argc==1)
cout<<"Lipsa argumente!\n";
else
for (int i=1; i<argc; i++)
cout<<"Argumentul "<<i<<":"<<argv[i]<<'\n'; }

12. S se implementeze un program care, la lansarea n execuie, primete ca parametrii o


ntrebare format din mai multe cuvinte. Ultimul cuvnt din ntrebare este un grup de
caractere, care vor fi cutate, pe rnd, n componena celorlalte cuvinte din ntrebare.
ntrebarea (cu excepia ultimului cuvnt) va fi afiat pe ecran. n situaia n care unul din
caracterele din acest ultim cuvnt este ntlnit n cadrul celorlalte cuvinte, programul
returneaz o valoare ntreag care indic poziia caracterului n ultimul cuvnt. De
exemplu, dac se transmite ca parametru ctre funcia main ntrebarea "Ce mai faci?
AFC", rezultatul este: afiarea ntrebrii "Ce mai faci?"; la ntlnirea caracterului A, se
returneaz valoarea 1; n condiiile n care caracterul A nu ar fi fost ntlnit, ar fi fost
cutat urmtorul caracter (F din AFC), iar la ntlnirea acestuia, s-ar fi returnat valoarea 2,
etc.; n condiiile n care caracterul F nu ar fi fost ntlnit, ar fi fost cutat urmtorul
caracter (C din AFC), iar la ntlnirea acestuia, s-ar fi returnat valoarea 3, etc.; dac nici
unul din caracterele componente ale cuvntului AFC nu ar fi fost coninut n ntrebare, s-ar
fi returnat codul 0.

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <process.h>

main(int argc,char *argv[])


{int index, c, code; char next_char, *point;
if (argc < 3) /* testarea prezenei argumentelor n linia de comand*/
{ printf("Intrebare!!!!\n");return 0; }
Autor: Diana tefnescu 4
REFERAT DE LABORATOR Nr. 10 (din 14) 2010

argc--;
for(index = 1;index < argc;index++)
printf("%s ",argv[index]); /*afiarea cuv. 2, 3, , n-1 (fr cel care
conine caract. de comparare) din ntrebare */
c = getch(); printf("%c\n",c);
if (islower(c)) c = toupper(c);
point = argv[argc]; code = 0; index = 0;
do { next_char = *(point + index);
if (islower(next_char)) next_char = toupper(next_char);
if(next_char == c) code = index + 1;
index++;
} while (*(point + index)); /* NULL */
Return code; /* returnarea codului de eroare */ }

13. S se scrie urmtorul program, n care funcia afisare are un numr variabil de
parametri.

#include <iostream.h>
#include <stdarg.h>
void afisare(int, ...);//prototip functie cu nr. variabil de parametri
main()
{int i = 5;int pv_unu = 1, pv_doi = 2;
afisare(pv_unu, i); /* Param.fix=1 Parametrii variabili sunt 5 */
afisare(3,i,i+pv_doi,i+pv_unu);/*Param.fix=3 Parametrii var. sunt 5 7 6 */
afisare(pv_doi, 70, 300); /* Param.fix=2 Parametrii variabili sunt 70 300 */ }

void afisare(int nr, ...)


{va_list param_pt;

cout<<"Param.fix="<<nr<<'\n';
va_start(param_pt,nr); // Apel macro setup
cout << "Parametrii variabili sunt ";
for (int i = 0 ; i < nr ; i++)
cout << va_arg(param_pt,int) << " "; // Extragere parametru
cout << "\n";
va_end(param_pt); /* Inchidere macro*/
}

14. S se rearanjeze elementele unei matrici de ntregi astfel nct s fie ordonate cresctor
att pe linii, ct i pe coloane.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void citire(int a[][10], int m, int n)
{for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
cout<<"a["<<i<<","<<j<<"]=";cin>>a[i][j];}
}

void afisare(int a[][10], int m, int n)


{for(int i=0;i<m;i++)
{ cout<<'\n';
for(int j=0;j<n;j++) cout<<'\t'<<a[i][j]; }
}

Autor: Diana tefnescu 5


REFERAT DE LABORATOR Nr. 10 (din 14) 2010

void ord(int a[][10], int m, int n, int dir, int k)


{int i,j,x;
if(dir==1)
{for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[k][i]>a[k][j]){x=a[k][i];a[k][i]=a[k][j];a[k][j]=x;}
}
else if(dir==2)
{for(i=0;i<m-1;i++)
for(j=i+1;j<m;j++)
if(a[i][k]>a[j][k]){x=a[i][k];a[i][k]=a[j][k];a[j][k]=x;}
}
}

main()
{int A[10][10],n,m; int i,j;cout<<"Nr. linii="; cin>>m;
cout<<"Nr. coloane="; cin>>n;
citire(A,m,n);cout<<"Matricea initiala:\n";afisare(A,m,n);
for(i=0;i<m;i++) ord(A,m,n,1,i);
for(j=0;j<n;j++) ord(A,m,n,2,j);
cout<<"Matricea obtinuta:\n";afisare(A,m,n);getch();
}

PROBLEME PROPUSE SPRE REZOLVARE

1. Fie n natural, citit de la tastatur (n<100). S se determine toate tripletele de numere (x, y,
z) mai mici dect n, care sunt numere pitagorice (ndeplinesc relaia x 2 + y 2 = z 2 ).
Numerele fiecrui triplet vor fi afiate n ordine cresctoare, pe cte o linie a ecranului.
2. S se calculeze valorile urmtoarelor expresii (n natural, citit de la tastatura), folosind o
funcie care calculeaz termenul general.
1. E(n)=1*(1+2)*(1+2+3)* . . . *(1+2+3+. . . +n)
2. E(n)=1*2 - 2*4 + 3*6 - 4*8 + . . . +(-1) n *n*2*n
3. S se creeze o bibliotec de funcii pentru lucrul cu matrici, care s conin funciile
utilizate frecvent (citirea elementelor, afisarea matricii, adunare a dou matrici, etc). S se
foloseasc aceast bibliotec.
4. S se creeze o bibliotec de funcii pentru lucrul cu vectori, care s conin funciile
utilizate frecvent. S se foloseasc aceast bibliotec.
5. S se scrie un program care genereaz toate numerele palindrom, mai mici dect o valoare
dat, LIM. Un numr palindrom are cifrele simetrice egale (prima cu ultima, a doua cu
penultima, etc). Se va folosi o funcie care testeaz dac un numr este palindrom.
6. Fie matricea C (NXN), N<=10, ale crei elemente sunt date de relaia:
j
j! + sin(kx) , dac i<j
k =0
i
C i, j = x , dac i=j

i! + i cos(kx) , dac i>j


k =0

unde x [0,1], x introdus de la tastatur

Autor: Diana tefnescu 6


REFERAT DE LABORATOR Nr. 10 (din 14) 2010
a) S se implementeze urmtoarele funcii: de calcul a elementelor matricii; de afiare a
matricii; de calcul i de afiare a procentului elementelor negative de pe coloanele
impare (de indice 1, 3, etc).
b) S se calculeze i s se afieze matricea B, unde: B = C - C2 + C3- C4 + C5.

Autor: Diana tefnescu 7

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