Documente Academic
Documente Profesional
Documente Cultură
85
86
Fisier sursa 1
Fisier sursa 2
#include<iostream.h>
extern int i;
int i;
extern float a,b;
float a,b;
void g(){
//declarare prototip functie f
{
void f();
i*=100;//i=100*30=3000
void main(void){
a*=100;//a=50.25*100=5025
i=10;
b*=100;//b=49.75*100=4975
a=20.25;
}
b=79.75;
//se afiseaza i=10,a=20.25,b=79.75
cout<<i=<<i<<,a=<<a<<,b=<<b;
f();
//se afiseaza i=30,a=50.25,b=49.75
cout<<i=<<i<<,a=<<a<<,b=<<b;
// se va apela functia g din fisierul sursa 2
g();
//se afiseaza i=3000,a=5025.0,b=4975.0
cout<<i=<<i<<,a=<<a<<,b=<<b;
}
//descrierea functiei f
void f()
{
i+=20;
a+=i;
b-=i;}
Fig. 5.12
compilatorul va iniializa variabila cu valoarea pe care o indicm. La un nou
apel ulterior al aceleiai funcii, nu se mai face iar iniializarea. Iniializarea
unei variabile statice este diferit de celelalte iniializri de variabile pe care
le execut de obicei compilatorul n cadrul funciilor.
Variabilele statice pot fi interne sau externe.
a) Variabilele statice interne sunt locale funciilor, dar spre deosebire de cele
declarate cu auto i pstreaz valoarea pe parcursul executrii programului.
Aceste variabile sunt importante n definirea funciilor de sine-stttoare
atunci cnd se dorete pstrarea valorii lor ntre dou apelri. Un exemplu de
astfel de funcii este cel al funciilor utilizate la generarea seriilor de numere
87
88
89
evitarea utilizrii recursivitii. Orice funcie care poate fi scris ntr-o form
recursiv poate fi de asemenea scris ntr-o structur ciclic. n exemplu din
fig. 5.16 se prezint rezolvarea problemei din fig. 5.14, dar fr a utiliza
recursivitatea.
5.9. Funcii cu valori implicite pentru parametri
Principala diferen dintre parametrii funciilor din C i respectiv din
C++ const n faptul c C++
#include<iostream.h>
permite programelor s
int factorial(int val){
utilizeze valori implicite
int rezultat=1;
pentru
parametri. Dac
int contor;
programul invoc o funcie
for(contor=2;contor<=val;contor++)
rezultat*=contor;
fr specificarea unuia sau
return (rezultat);}
mai
multor
parametri,
programul va utiliza valorile
void main(void){
implicite.
De
exemplu
int i;
programul din fig. 5.17
for(i=1;i<=5;i++)
cout<<"factorial de
utilizeaz
funcia
"<<i<<"="<<factorial(i)<<endl;}
arata_valori pentru a afia 3
parametri. Dac utilizatorul
Fig. 5.16
invoc funcia cu mai puin
90
#include<iostream.h>
void arata_valori(int unu=1,int doi=2, int trei=3)
{
cout<<unu<<' '<<doi<<' '<<trei<<endl;
}
void main(){
arata_valori(1,2,3);
arata_valori(100,200);
arata_valori(1000);
arata_valori();
}
Fig. 5.17
de 3 parametri,
programul
utilizeaz valorile
implicite 1,2 i 3.
Dup execuie se
afieaz:
123
100 200 3
1000 2 3
123
91
#include<stdio.h>
#include<stdarg.h>
int ad_val(int val,...)
{ va_list argument_ptr ;
int rezultat=0;
if(val!=0)
{
rezultat+=val;
va_start(argument_ptr,val);
while((val=va_arg(argument_ptr,int))!=0)
rezultat+=val;
va_end(argument_ptr);
}
return(rezultat);
}
void main(void){
printf("suma lui 3 este %d \n",ad_val(3,0));
printf("suma lui 3 +5 este %d \n",ad_val(3,5,0));
printf("suma lui 3 +5+8 este %d \n",ad_val(3,5,8,0));}
Fig. 5.18
5.11.Funcii cu un numr variabil de parametri de tipuri multiple
Programul din fig. 5.19 modific funcia add_val pentru ca aceasta s
poat accepta valori de toate tipurile. n acest scop se folosesc descriptori de
format. Analizndu-se aceti descriptori se determin tipul variabilei
transmise ca parametru.
n cele ce urmeaz se prezint alte dou exemple de definire/utilizare a
funciilor definite de utilizator.
Exemplul 1
n exemplul din fig. 5.20 se prezint un program n care se calculeaz i
afieaz suma, diferena i produsul a dou numere reale, furnizate sub form
de date de intrare de ctre utilizator. Se utilizeaz o funcie f care returneaz
suma. Diferena i produsul sunt transmise ctre funcia care o apeleaz pe f
deoarece n lista de parametri formali ai lui f se utilizeaz doi parametri
transmii prin adres: xy va memora produsul iar x_y memoreaz diferena.
92
#include<stdio.h>
#include<stdarg.h>
double ad_val(char *sir,...)
{
va_list marcator ;
double rezultat=0.0;
va_start(marcator, sir); //marcheaza primul argum. supl.
while(*sir)
{
if(*sir=='%') //se sare peste daca nu e specif. form.
{
switch(*(++sir))
{
case 'd':rezultat+=va_arg(marcator, int);
break;
case 'f':rezultat+=va_arg(marcator, double);
break;
}
}
sir++;
}
va_end(marcator);
return(rezultat);
}
void main(void){
double rezultat;
printf("rezultat %f \n",ad_val("%f",1.1));
printf("rezultat %f \n",ad_val("%f %f",1.1, 2.2));
printf("rezultat %f \n",ad_val("%f %f %f",1.1, 2.2,3.3));}
Fig. 5.19
Exemplul 2
Se dau numerele naturale n i k ( n k ). S se determine C k n .
C k n = n! /((n k )!*k!) .
Se va folosi o funcie definit de utilizator pentru calculul unui produs
factorial (fig. 5.21).
n acest exemplu s-a artat i cum se poate face validarea datelor introduse
93
#include<iostream.h>
int fact(int val){
int rezultat=1;
int contor;
for(contor=2;contor<=val;contor++)
rezultat*=contor;
return (rezultat);}
void main(void){
int n,k,combinari;
do
{cout<<"n=";
cin>>n; cout<<"k=";cin>>k;
}
while((k>n) || (k<1) || (n<1));
combinari=fact(n)/fact(n-k)/fact(k);
cout<<"comb. de "<<n<<"luate cate "<<k<<"="<<combinari;
}
Fig. 5.21
94