Documente Academic
Documente Profesional
Documente Cultură
1. SUBPROGRAME
1.1. Prezentare general
S ne imaginm c dorim s scriem un program n care s citim o mulime de
numere ntregi ale cror proprieti dorim sa le studiem i eventual s efectum n
funcie de proprietile lor diferite operaii cu numerele citite.
De exemplu presupunem c dorim s tim dac numerele citite sunt prime sau
nu, dac nu sunt prime dorim s le descompunem n factori primi, vrem s
verificm dac au proprietea de palindrom sau s le convertim n alte baze i
altele.
Operaiile pe care le-am nirat mai sus sunt suficiente s ne dm seama c
programul pe care urmeaz s-l scriem este lung, greu de scris de urmrit i de
corectat n situaia n care mai facem i greeli pe parcursul scrierii lui.
Ce este de fcut pentru a nu abandona nainte de a ncepe rezolvarea unei
probleme complexe?
Limbajul C++ ne pune la dispoziie instrumentele necesare pentru a ne uura
munca, pentru a nu fi nevoii s repetm de multe ori aceleai secvene de
program, pentru a fi uor de gndit, de realizat, de corectat i de neles i de
ctre o alt persoan dect cea care l-a scris.
Ne rmne doar s mai nvm cte ceva despre subprograme.
Utilizarea subprogramelor ne permite accesul la ceea ce poate oferi
programarea structurat n C++.
Beneficiem astfel de urmtoarele avantaje:
Putem reutiliza cu uurin codul scris.
Elaborarea algoritmilor devine mult mai uoar datorit descompunerii
problemei n probleme mai simple, mai uor de rezolvat.
Corectarea erorilor se realizeaz cu mai mare uurin.
Descompunnd problema i rezolvnd la un moment dat probleme mai
simple, reducem numrul erorilor la elaborarea algoritmilor.
Exemplu:
Se citesc dou numere ntregi. S se calculeze suma lor.
#include <iostream.h>
#include <conio.h>
int suma(int a, int b);
void main()
{int x,y,z;
cout<<"x="; cin>>x;
cout<<"y="; cin>>y;
z=suma(x,y);
cout<<"suma="<<z;
getch();
}
int suma(int a, int b)
{int c;
c=a+b;
return c;
}
//SUMA
//antetul funciei
#include <iostream.h>
float a;
void
main()
void
main()
{int
c;
{
{char
char
b; d=x;
cout<<d;
}
{
} int c=5;
cout<<a<<b<<c;
}
}
Observaie:
n cazul n care ntr-un bloc sau ntr-o funcie sunt vizibile mai multe
variabile cu acelai nume, dar cu domenii de vizibilitate diferite, se
acceseaz variabila cu domeniul cel mai mic de vizibilitate.
Exemplu:
n programul de mai jos sunt definite dou variabile cu numele a. O variabil
global i o variabila local definit n cadrul funciei f.
n timpul execuiei, functia f acceseaz variabila local.
#include <iostream.h>
#include <conio.h>
int a; //a este variabil global
int f()
{int a=5;
a++;
return a;
}
void main()
{
a=f();
cout<<"a="<<a;
getch();
}
-Variabile globale
Segmentul de stiva
-Variabile locale
Heap
b. Dup funcia principal main(), caz n care funcia trebuie declarat nainte,
#include <iostream.h>
int f();
//declararea funciei f
void main()
{cout<<f;
}
int f()
{int a=3;
return a;
}
//definirea funciei f
Prin urmare apelul unei funcii care returneaz o valoare poate fi de forma:
variabila=nume(parametrul1,parametrul2,);
sau
cout<<nume(list parametrii);
Exemplu:
S se nsumeze primele n numere naturale.
#include <iostream.h>
#include <conio.h>
int n;
//declararea variabilei globale
int suma();
//declararea functiei funcia nu are parametrii
void main()
{cout<<"n="; cin>>n;
cout<<"suma primelor n numere naturale:"<<suma();
getch();
}
int suma()
{int i,s=0;
for(i=1;i<=n;i++)
s+=i;
return s;
}
//apelul funciei
//definirea functiei
//definirea funciei
Observaie:
O funcie poate s nu conin parametrii.
n acest caz att la declarare ct i la definire i apel numele funciei va fi
urmat de paranteze rotunde, dar fr s conin nici un parametru.
Parantezele sunt obligatorii pentru a informa compilatorul c este vorba
despre o funcie i nu de o variabil.
1.3.5. Modul de funcionare al unui program care conine una sau mai multe
funcii
n momentul n care se apeleaz o funcie controlul programului se va da
funciei respective pentru a fi executat.
Program
Funcia
f()
Segment de
date
Segment de
stiva
x=suma(
2,
3.14 );
Exemplu:
#include <iostream.h>
#include <conio.h>
void f(int a,int b);
void main()
{ int x=2,y=3;
f(x,y);
//parametrii efectivi sunt variabile
cout<<"x="<<x<<" y="<<y<<endl;
//la revenire x si y sunt nemodificati
f(2*x,2*y);
//parametrii efectivi sunt expresii
cout<<"x="<<x<<" y="<<y;
//la revenire x si y sunt nemodificati
getch();
}
void f(int a,int b)
//functia modifica valorile parametrilor, dar nu le transmite inafara
{a=a+2;
b=a+3;
cout<<"a="<<a<<" b="<<b<<endl;
}
Rezultatul rulrii programului:
a=4 b=7
x=2 y=3
a=6 b=9
x=2 y=3
Observai c n urma apelrii funciei f(), dei n interiorul funciei variabilele a
i b i-au modificat valorile, noile valori nu s-au transmis variabilelor x i y,
acestea rmn nemodificate.
Acest lucru se ntmpl datorit faptului c pe segmentul de stiv s-a
2
3
Segment de stiva
a
2 4
7
dispar3dup
terminarea execuiei
2 6
9
dispar3dup
terminarea execuiei
11
Exemplu:
int f(int &a, int &b);
f(
y );
Rezultatul rulrii:
x=1 y=2
a=2 b=4
a=2 b=2
Parametrul a este transmis prin referin iar parametrul b este transmis
prin valoare.
Iniial x=1 i y=2, n cadrul funciei a devine 2 iar b devine 4.
Deoarece a este un parametru transmis prin referin valoarea lui este
transmis n x. ntruct b este parametru transmis prin valoare, y nu preia valoarea
modificat a lui b
12
Segmentul de stiva
a
1
adresa lui x
b
2
//SUME
//conine funciile matematice
void main()
{ int n; char lit;
//n-nr. elemente, lit-litera citita
cout<<"n="; cin>>n;
cout<<"lit(a sau b)="; cin>>lit;
if(lit=='a')
cout<<"S1="<<s1(n);
else
cout<<"s2="<<s2(n);
getch();
}
long s1(int n)
//funcia s1 are un parametru transmis prin valoare
{int i; long s=0;
for(i=1;i<=n;i++)
s+=pow(2*i-1,2);
return s;
//funcia s1 returneaza valoarea calculat
}
long s2(int n)
//funcia s2 are un parametru transmis prin valoare
{int i;
long s=0,p=1;
for(i=1;i<=n;i++)
{p*=i;
s+=p; }
return s;
//funcia s2 returneaz valoarea calculat
}
13
#include <iostream.h>
//NR. CIFRE PARE SI IMPARE
#include <conio.h>
void cifre(int n, int &x, int &y); //declararea functiei cifre
void main()
{long n;
int c_pare=0,c_impare=0; //c_pare-nr. cifrelor pare,c_impare-nr. Cifrelor impare
cout<<"n="; cin>>n;
cifre(n,c_pare,c_impare);
cout<<"nr. cifre pare="<<c_pare<<endl;
cout<<"nr. cifre impare="<<c_impare<<endl;
getch();
}
void cifre(int n, int &x, int &y)
//definirea functiei cifre
{ while (n)
//cat timp numarul mai are cifre
{if ((n%10)%2==0)
//verifica daca ultima cifra a numarului este para
x++;
//incrementeaz numrul cifrelor pare
else
y++;
//incrementeaza numarul cifrelor impare
n/=10;
//elimina ultima cifra
}
}
14
#include <iostream.h>
//PRIM si FACTORI PRIMI
#include <conio.h>
int prim(int n);
//declararea funciei prim, n parametru transmis prin valoare
void factori(int n); //declararea funciei factori, n parametru transmis prin valoare
void main()
{long n;
cout<<"n="; cin>>n;
if(prim(n))
//apelul funciei prim ca expresie logic
cout<<n<<" este numar prim";
else
{cout<<"descompunerea in factori primi: ";
factori(n);
//apelul funciei factori
}
getch();
}
int prim(int n)
//definirea functiei prim
{int i;
if (n==0 || n==0)
return 0;
for(i=2;i<=n/2;i++)
if(n%i==0)
return 0;
return 1;
}
void factori(int n) //definirea functiei factori
{int i=2,k;
while (n!=1)
{k=0;
while(n%i==0)
{k++;
n/=i;
}
if (k)
cout<<i<<"^"<<k<<" ";
i++;
}
}
15
Definim funcia fibo, care apeleaz funcia max_f i astfel determin max, cel
mai mare numr fibonacci mai mic sau egal cu numrul dat, apoi scade din numrul
dat, numarul max.
Se reia algoritmul atta timp ct numrul dat este diferit de zero.
//DESCOMPUNEREA UNUI NUMAR IN SUMA DE NUMERE FIBONACCI
#include <conio.h>
#include <iostream.h>
void fibo(unsigned long m);
// declararea funciei fibo
unsigned long max_f(unsigned long nr); //declararea functiai max_f
void main()
{unsigned long n;
clrscr();
cout<<"n=";cin>>n;
cout<<n<<" = ";
fibo(n);
getch();
}
16
#include <conio.h>
#define MAX 20
void conv(int n, int b);
void main()
{int n,b;
cout<<"n="; cin>>n;
cout<<"b="; cin>>b;
conv(n,b);
getch();
}
void conv(int n, int b)
{int i=0,j,t[MAX];
while (n)
{t[i++]=n%b;
n=n/b;
}
for(j=i-1;j>=0;j--)
cout<<t[j];
}
//CONV 10->b
//antetul funciei
//numrul n baza 10
//baza de numeraie
//apelul funciei de conversie
b,
Vom realiza dou funcii. Funcia citire, pentru citirea numrului n baza b i a
bazei. Funcia va avea 3 parametrii:
n, numrul de cifre, parametru transmis prin referin
t- tablou unidimensional care va conine cifrele numrului, acest parametru se
transmite prin valoare dei rezultatul citirii trebuie transmis i celorlalte funcii.
ntruct numele unui tablou este adresa primului octet din tablou. Fiind
adres, modificrile se realizeaz n funcie chiar asupra tabloului la adresa la
care este memorat tabloul n segmentul de date.
b-baza de numeraie, parametru transmis prin referin
Funcia conv, convertete numrul din baza b n baza 10. Returneaz numrul n
baza 10. Funcia are trei parametrii transmii prin valoare: n, t, b, cu semnificaia de
mai sus.
17
#include <iostream.h>
//CONV b->10
#include <conio.h>
#include <math.h>
#define MAX 20
void citire(int &n, int t[MAX], int &b);
int conv(int n, int t[MAX], int b);
void main()
{int n,b,t[MAX],nr; //n-nr.de cifre,b-baza,t-conine numarul in baxa b
citire(n,t,b);
//apelul funciei citire
nr=conv(n,t,b);
//apelul funciei conv
cout<<"nr. in baza 10= "<<nr;
getch();
}
void citire(int &n, int t[MAX], int &b) //citeste datele de intrare
{int i;
cout<<"baza=";cin>>b;
cout<<"n=";cin>>n;
cout<<"introduceti "<<n<<" cifre in baza "<<b<<":"<<endl;
for(i=n-1;i>=0;i--)
{cin>>t[i];}
}
int conv(int n,int t[MAX],int b)
{int i,nr=0;
for(i=n-1;i>=0;i--)
nr+=t[i]*pow(b,i);
return nr;
}
18
1.5. Evaluare
TESTUL 1
1. Ce nelegei prin declararea unei funcii, dar prin definirea unei funcii?
2. Descriei antetul unei funcii.
3. Ce va afia urmtorul program?
#include <conio.h>
#include <iostream.h>
int a=5,b=10;
void f(int &a, int b);
void main()
{cout<<a<<" "<<b<<endl;
f(a,b);
cout<<a<<" "<<b;
getch();
}
void f(int &a, int b)
{a=a+10;
b=b+10;
cout<<a<<" "<<b<<endl;
}
a.) 5 10
b.) 5 10
15 20
15 20
5 10
5 20
c.) 5 10
15 20
15 10
d.) 5 10
15 20
15 20
4. Scriei o funcie pentru calculul celui mai mare divizor comun a dou numere
naturale. Funcia va avea ca parametri cele dou numere i va returna cel mai
mare divizor comun.
TESTUL 2
1. Ce nelegei prin parametrii formali, dar prin parametrii efectivi?
2. Ce nelegei prin parametrii transmii prin valoare, dar prin parametrii
transmii prin referin?
3. Ce va afia urmtorul program?
#include <conio.h>
#include <iostream.h>
int a=5,b=10;
void f(int &a, int b);
void main()
{cout<<a<<" "<<b<<endl;
f(a,b);
cout<<a<<" "<<b;
getch();
}
void f(int &b, int a)
{a=a+10;
b=b+10;
cout<<a<<" "<<b<<endl;
}
a.) 5 10
b.) 5 10
c.) 5 10
d.) 5 10
19
15 20
15 10
20 15
15 10
20 15
5 10
15 20
10 15
4. Scriei o funcie care verific dac un numr este palindrom. Funcia va primi
ca parametru numrul i va returna 1 dac numrul este palindrom i zero n
caz contrar.
5. S se afieze numerele cuprinse ntre 100 i 1000 care sunt ptrate perfecte
i sunt prime cu un numr k citit.
TESTUL 3
1. Care este domeniul de vizibilitate al unei variabile declarate la nceputul
funciei main, dar valoarea ei iniial?
2. Care este domeniul de vizibilitate al unei variabile declarate la nceputul
programului, naintea oricarei funcii? Dar valoarea ei?
3. Ce va afia urmtorul program?
#include <conio.h>
#include <iostream.h>
int a=2,b=4;
void f(int &a, int b);
void main()
{cout<<a<<" "<<b<<endl;
f(a,b);
cout<<a<<" "<<b<<endl;
getch();
}
void f(int &a, int b)
{int aux;
aux=a;
a=b;
b=aux;
cout<<a<<" "<<b<<endl;
}
a.) 2 4
4 2
4 2
b.) 2 4
4 2
4 4
c.) 2 4
2 4
4 2
20
21