Documente Academic
Documente Profesional
Documente Cultură
TEMA:
Funcţii. Noţiuni generale. Transmiterea parametrilor unei funcţii.
NOŢIUNI TEORETICE
1. Noţiuni generale
Un program în limbajul C/C++ este un ansamblu de funcţii, fiecare dintre acestea efectuând o
activitate bine definită. Funcţiile comunică prin argumente: ele primesc ca parametri
(argumente) datele de intrare, efectuează prelucrările descrise în corpul funcţiei asupra
acestora şi pot returna o valoare (rezultatul, datele de ieşire). Execuţia oricărui program
începe cu funcţia principală, numită main. Funcţiile pot fi descrise în cadrul aceluiaşi fişier,
sau în fişiere diferite, care sunt testate şi compilate separat, asamblarea lor realizându-se cu
ajutorul linkeditorului de legături.
În cazul în care o funcţie nu returnează nici o valoare, ea poate fi apelată printr-o construcţie
urmată de punct şi virgulă, numită instrucţiune de apel, de forma:
<nume_funcţie> (<lista_parametrilor_efectivi>);
În cazul în care funcţia returnează o valoare, apelul funcţiei va constitui operandul unei
expresii.
La apelul unei funcţii, parametrii efectivi trebuie să corespundă cu cei formali, ca ordine şi
tip. În momentul apelului unei funcţii, se atribuie parametrilor formali valorile parametrilor
efectivi, după care se execută instrucţiunile din corpul funcţiei. La revenirea din funcţie,
controlul este redat funcţiei apelante, şi execuţia continuă cu instrucţiunea următoare (din
funcţia apelantă) instrucţiunii de apel.
Când parametrii transmişi unei funcţii sunt pointeri (variabile care conţin adrese),
parametrii formali ai funcţiei apelate vor fi iniţializaţi cu valorile parametrilor efectivi,
deci cu valorile unor adrese. Astfel, funcţia apelată poate modifica conţinutul locaţiilor
spre care pointează argumentele (pointerii). La transmiterea parametrilor prin pointeri, ca
parametri efectivi pot apare expresii de pointeri.
Însăşi valoarea returnată de o funcţie poate fi un pointer.
În limbajul C++ variabila referinţă reprezintă un sinonim (alt nume) al altei variabile.
Pentru variabilele referinţă nu se alocă spaţiu în memorie (acestea constituind un alt nume
care poate fi utilizat pentru o zonă de memorie rezervată deja) şi nu îşi pot modifica
valoarea. În limbajul C++, parametrii unei funcţii pot fi variabile referinţă. În acest mod
de transmitere a parametrilor, unui parametru formal i se poate asocia (atribui) chiar
obiectul parametrului efectiv. Astfel, parametrul efectiv poate fi modificat direct prin
operaţiile din corpul funcţiei apelate. La transmiterea parametrilor prin referinţă, ca
parametri efectivi nu pot apare expresii, ci doar nume de variabile.
Însăşi valoarea returnată de o funcţie poate fi o referinţă.
PROBLEME REZOLVATE
1. Să se scrie un program care citeşte două numere şi afişează cel mai mare divizor comun al
acestora, folosind o funcţie îl calculează.
#include <iostream.h>
int cmmdc(int x, int y)
{if (x==0 || y==1 || x==1 || y==0) return 1;
if (x<0) x=-x; if (y<0) y=-y;
while (x != 0){
main()
{ int n1,n2; cout<<”n1=”;cin>>n1; cout<<”n2=”;cin>>n2;
int diviz=cmmdc(n1,n2);
cout<<”Cel mai mare divizor comun al nr-lor:”<<n1<<” şi ”;
cout<<n2<<” este:”<<diviz<<’\n’;
/* sau:
cout<<”Cel mai mare divizor comun al nr-lor:”<<n1<<” şi ”;
cout<<n2<<” este:”<<cmmdc(n1,n2)<<’\n’;*/ }
i =1
#include <iostream.h>
#include <math.h>
double omega(double, int);
// prototipul funcţiei omega - antet din care lipsesc numele parametrilor formali
double psi(double); // prototipul funcţiei psi
main()
{double u, z; int m; cout<<”u=”; cin>>u; cout<<”m=”; cin>>m;
z=2*omega(2* psi(u) + 1, m) + omega(2*pow(u,2) - 3, m+1);
cout<<”z=”<<z<<’\n’; }
#include <iostream.h>
void schimbă(int *, int *); //prototipul functiei schimba
main()
{int x, y, *ptx, *pty; ptx=&x; pty=&y; cout<<”x=”;cin>>x;
cout<<”y=”;cin>>y;cout<<”x=”<<x;cout<<”y=”<<y<<’\n’;
cout<<"Adr. lui x:"<<&x<<" Val lui x:"<<x<<'\n';
cout<<"Adr.lui y:"<<&y<<" Val y:"<<y<<'\n';
cout<<"Val. lui ptx:"<<ptx;
cout<<" Cont. locaţiei spre care pointează ptx:”<<*ptx<<'\n';
cout<<"Val. lui pty:"<<pty;
cout<<"Cont. locaţiei spre care pointează pty:"<<*pty;
schimba(ptx, pty);
// SAU: schimba(&x, &y);
cout<<"Adr. lui x:"<<&x<<" %x Val lui x: %d\n”, &x, x);
cout<<"Adr. y:"<<&y<<" Val lui y:"<<y<<'\n';
cout<<"Val. lui ptx:"<<ptx;
cout<<" Cont. locaţiei spre care pointează ptx:”<<*ptx<<'\n';
cout<<"Val. lui pty:"<<pty;
cout<<" Cont. locaţiei spre care pointează pty:"<<*pty<<'\n';
}
void schimbă( int *p1, int *p2)
{cout<<"Val. lui p1:"<<p1;
cout<<" Cont. locaţiei spre care pointează p1:"<<*p1<<'\n';
cout<<"Val. lui p2:"<<p2;
cout<<" Cont. locaţiei spre care pointează p2:"<<*p2<<'\n';
int t = *p1; // int *t ; t=p1;
*p2=*p1; *p1=t;
cout<<"Val. lui p1:"<<p1;
cout<<" Cont. locaţiei spre care pointează p1:”<<*p1<<'\n';
cout<<"Val. lui p2:"<<p2;
cout<<" Cont. locaţiei spre care pointează p2:"<<*p2<<'\n'; }
main()
{long i = 35001; double w;
cout<<"i="<<i;cout<<" Adr.lui i:"<<&i<<'\n';
w=omega(&i); cout<<”i=”<<i<< w=”<<w<<’\n’; } // i = 350017 w = 35000
#include<math.h>
#include<stdio.h>
#include<iostream.h>
int prim(int k)
{for(int i=2;i<=sqrt(k);i++)
if(k%i==0) return 0;
return 1; }
main()
{long n,d=2,k; cout<<"Dati n: ";cin>>n;
cout<<n<<"=";
do { k=0;
while(n%d==0) { n/=d; k++; }
if(k!=0) cout<<d<<"^"<<k<<"*";
do d++; while(prim(d)==0);
}while(n!=1);
cout<<"\b \b"; }
8. Să se scrie un program care citeşte un număr natural, n, scris cu cifre arabe şi îl afişează
folosind cifrele romane.
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
const char *rom="IVXLCDMP"; char sir[20];
void transforma(char n, int r)
{int i,j,x;char ret[4]="";r=2*r;x=(int)n-(int)'0';
if(x>=1&&x<=3)
{ for(i=1;i<=x;i++)
ret[i-1]=rom[r];
ret[i-1]='\x0'; }
else if(x==4)
{ ret[0]=rom[r];
int main()
{unsigned int n;char nr[4];
cout<<"Dati numar scris cu cifre arabe :"; cin>>n;
itoa(n,nr,10);int i,j;
for(j=0,i=strlen(nr);i>0;i--,j++)
transforma(nr[j],i-1);
cout<<"Numarul "<<n<<" scris cu cifre romane:"<<sir;}
#include<iostream.h>
#include<conio.h>
#include<math.h>
int prim(int x)
{for(int i=2;i<=sqrt(x);i++)
if(!(x%i)) return 0;
return 1;}
main()
{long k=1, n; cout<<"Introduceti valoarea lui n"; cin>>n;
for(int i=2;i<=n/2;i++)
if(prim(i) && (k*i)<n) k*=i;
cout<<"Numarul mai mic decât "<<n;
cout<<" cu cei mai multi divizori primi este "<< k<<'\n';
getch(); }
1. Să se scrie un program care citeşte câte două numere, până la întâlnirea perechii de
numere 0, 0 şi afişează, de fiecare dată, cel mai mare divizor comun al acestora, folosind o
funcţie care îl calculează.
8. Secvenţele următoare sunt corecte din punct de vedere sintactic? Dacă nu, identificaţi
sursele erorilor.
void a(int x, y) {cout<<"x="<<x<<" y="<<y<<'\n'; }
main( ) { int b=9; a(6, 7); }
main( ) {int x=8; double y=f(x); cout<<"y="<<y<<'\n';}
int f(int z) {return z+z*z;}