Sunteți pe pagina 1din 21

CAPITOLUL I

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.

n C++ subprogramele sunt de tip funcie.

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

//apelul funciei suma

//funcia suma de tip int, cu parametrii a i b de tip int

n exemplul de mai sus am definit funcia suma, de tip ntreg, cu parametrii a


i b de tip ntreg. Dup cum se poate observa funcia returneaz o valoare
ntreag, adic de acelai tip cu tipul funciei.
return c;
Funcia se apelez prin numele ei, are dou argumente, x i y de acelai tip
cu parametrii funciei.
La apelul funciei valoarea returnat de funcie se depune n variabila z.
Este necesar s facem cteva precizri legate de variabile, nainte de a studia
mai amnunit funciile.
1.2. Variabile globale i variabile locale
Domeniul de vizibilitate, durata de via i zona de memorie alocat
Variabilele pot fi definite n orice poziie ntr-un program, astfel putem defini
variabile nafara funciilor (chiar nafara funciei principale main), n acest caz
poart numele de variabile globale, n interiorul unei funcii caz n care le vom
numi variabile locale.
n realitate n C++ variabilele pot fi definite n orice punct al programului. Sigur
nu este indiferent poziia n care se definete o variabil, de aceasta depinde
domeniul de vizibilitate al variabilei respective, adic zona de program din care
poate fi accesat variabila.
Domeniul de vizibilitate al unei variabile ncepe n momentul declarrii
ei i sfrsete n moentul n care se ncheie structura n interiorul creia a
fost definit.

1. Variabilele globale, declarate la nceput de program (naintea oricarei funcii)


sunt accesibile din orice punct al programului.
Dc exist funcii definite naintea acestor variabile, pentru acele funcii
variabilele nu sunt vizibile (nu pot fi accesate din interiorul acestor funcii).
Durata de via a unei variabile globale, este atta timp ct programul se
execut.
Are alocat spaiu de memorie pe tot parcursul execuiei programului.
La declarare, variabilele globale se iniializeaz n mod automat cu 0.
2. Variabilele locale definite n interiorul unei funcii, sunt accesibile doar
funciei, nu pot fi utilizate nafara ei.
Durata de via a unei variabile locale este pe tot parcursul execuiei funciei
dac a fost definit la nceputul blocului de instruciuni.
Are alocat zon de memorie numai pe parcursul execuiei funciei respective.
Dac o variabil este definit n interiorul unui bloc de instruciuni, poate fi
accesat doar n interiorul acelui bloc, nu poate fi utilizat nafara lui.
Durata de via a acestei variabile este pn la terminrea execuiei blocului n
care a fost definit.
Are alocat zon de memorie numai pe parcursul executiei blocului respectiv.
Variabilele locale nu se iniializeaz n mod automat. Dac nu le iniializeaz
programatorul, ele rein o aa numit valoare rezidual, adic ceea ce se gaseste
n memorie n acel moment.

#include <iostream.h>
float a;
void
main()
void
main()
{int
c;
{
{char
char
b; d=x;
cout<<d;
}
{
} int c=5;

-variabil global accesibil pe tot parcursul


programului
- variabil local accesibil doar n interiorul
funciei main
-variabil local accesibil doar n interiorul
blocului n care a fost definit

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;
}

//funcia suma de tip int, cu parametrii a i b de tip int


//funcia foloseste variabila locala a(definita in funcie), nu pe cea global

void main()
{
a=f();
cout<<"a="<<a;
getch();
}

Rezultatul rularii programului:


a=6
//apelul funciei suma

n ceea ce privete zona de memorare a variabilelor, putem spune c i din


acest punct de vedere sunt diferene ntre variabilele globale i cele locale.
Sistemul de operare aloc fiecrui program trei zone distincte de memorie
intern, pentru memorarea variabilelor programului.
Exist i posibilitatea ca o variabil s fie memorat ntr-un registru al
microprocesorului. Timpul de acces la variabilele memorate n regitrii este foarte mic
i astfel poate fi mbunatit timpul de execuie al programului.
Zonele de memorie intern alocte:
Segmentul de date

-Variabile globale

Segmentul de stiva

-Variabile locale

Heap

-Date alocate dinamic

1. Variabilele globale se memoreaz n cadrul segmentului de date.


2. Variabilele locale se memoreaz pe segmentul de stiv pus la dispoziia
funciei n interiorul careia sunt definite.
3. Datele alocate dinamic nu constitue obiectul acestui manual.

1.3. Structura funciilor i apelul lor


O funcie se compune din antet i corpul funciei.
Antetul unei funcii cuprinde tipul de dat returnat de funcie, numele
funciei i lista parametrilor.
Corpul funciei este format din una sau mai multe instruciuni cuprinse
ntre acolade.

1.3.1. Formatul unei funcii:


tip nume(parametru1, parametru2, ) { instruciuni }
tip reprezint un tip de dat i desemneaz tipul datei returnate de funcie
(nu este obligatoriu).
nume este un identificator prin intermediul cruia se apeleaz funcia.
parametrii permit transmiterea argumentelor ctre funcie atunci cnd este
apelat. Fiecare parametru const dintr-un tip de dat urmat de un
identificator, ca orice variabil i acioneaz ca o variabil local.
Instruciuni reprezint corpul funciei i trebuie s fie cuprins ntre acolade
{} .

1.3.2. Declararea i definirea unei funcii


A declara o funcie nseamn a o anuna, adic a face cunoscut
programului c aceast funcie exist i caracteristicile ei, adic tipul, numele i lista
eventualilor parametrii. Declararea unei funcii se face cu ajutorul antetului funciei.
tip nume(parametru1, parametru2, );
A defini o funcie nseamn a o descrie npreun cu corpul funciei.
tip nume(parametru1, parametru2, ) { instruciuni }
definiia unei funcii ine loc si de declaraie n cazul n care funcia este plasat
naintea funciei principale main().

1.3.3. Structura unui program care conine subprograme


Un program poate s conin oricte funcii.
Aa cum o variabil nu poate fi accesat n limbajul de programare C nainte
de a fi definit, nici o funcie nu poate fi apelat fr ca programul s tie
caracteristicile acelei functii. Pentru a putea fi apelt funcia trebuie s fie cel putin
declarat.

Exist dou modaliti de a plasa funciile ntr-un program:


a. naintea funciei principale main(), ca n exemplul de mai jos:
#include <iostream.h>
int f()
{int a=3;
return a;
}
void main()
{cout<<f;
}

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

1.3.4. Apelul unei funcii


O funcie poate fi apelat din funcia principal main, dintr-o alt funie sau
chiar din funcia nsi. Acest din urm caz l vom trata ntr-un capitol separat.
Dup cum am spus n paragraful 1.3.1, antetul unei funcii poate conine tipul
datei returnate de funcie sau nu. Aceasta datorit faptului c o funcie poate s
returneze o valoare sau nu.
Din acest punct de vedere putem mpari funciile n dou categorii:
1. Funcii care returneaz o valoare, definite astfel:
tip nume(parametru1, parametru2, ) { instruciuni }
O funcie care returneaz o valoare trebuie s conin linia de cod:
return expresie;
Rezultatul returnat de funcie poate fi utilizat ntr-o expresie sau poate fi afiat.

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

//valoarea returnata de funcie

2. Funciile care nu returneaz o valoare, n loc de tip vor conine cuvntul


void
void nume(parametru1, parametru2, ) { instruciuni }
Apelul unei astfel de funcii:
nume(parametrul1,parametrul2,);
#include <iostream.h>
//AFISARE
#include <conio.h>
int n;
int afisare();
//declararea functiei funcia nu are parametrii
void main()
{cout<<"n="; cin>>n;
afisare();
//apelul funciei
getch();
}
int afisare()
{int i,s=0;
for(i=1;i<=n;i++)
cout<<i<<" ";
}

//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.

n momentul apelrii unei funcii se ntpl mai urmtoarele:


Se aloc spaiu pe segmentul de stiv unde se memoreaz parametrii
funciei (ac funcia are parametrii).
Se salveaz adresa instruciunii urmtoare apelului, pentru ca la revenirea
din funcie programul s continue cu instruciunea urmtoare.
Salt la prima instruciune a funciei
Se aloc spaiu pe segmentul de stiv unde se memoreaz variabilele
locale (dac au fost declarate variabile locale).
Se execut n segven instruciunile funciei apelate.
Se elibereaz segmentul de stiv alocat funciei.
Se revine n punctul n care s-a apelat funcia i programul continu cu
instruciunea urmtoare

Program

Funcia
f()

Segment de
date

Apel functie f()


Instructiunea
urmatoare apelului

Segment de
stiva

1.3.6. Transmiterea parametrilor


Parametrii unei funcii au rolul de a transmite date funciei i/sau de a
transmite date din funcie spre zona de program care a apelat funcia. Parametrii se
descriu prin tipul i numele lor, n antetul funciei, desprii ntre ei prin virgul.
Parametrii care se afl n antetul funciei se numesc parametri formali iar cei
care se afl n instruciunea de apel a funciei se numesc parametri efectivi.
Numele (identificatorii) parametrilor formali poate s fie diferit de numele
parametrilor efectivi sau poate s coincid.
Transmiterea parametrilor se face prin coresponden, din acest motiv
ntre parametrii formali i cei efectivi trebuie s existe o anumit concordan:
Numrul parametrilor formali trebuie s coincid cu numrul parametrilor
reali. Exist o singur excepie i anume parametrii cu valoare implicit,
despre care vom vorbi mai trziu.
Ordinea parametrilor formali trebuie s fie aceeai cu cea a parametrilor
efectivi, deoarece dup cum am spus transmiterea parametrilor se face prin
coresponden.
Tipul parametrilor efectivi trebuie s poat fi convertit implicit n tipul
parametrilor formali sau s coincid.
Exemplu:
int suma (int a, float b)

x=suma(

2,

3.14 );

Parametrii se memoreaz pe segmentul de stiv pus la dispoziia funciei n


momentul apelrii ei. Acetia se memoreaz n ordinea n care au fost trecui
n antetul funciei.
Parametrii transmii i memorai pe segmentul de stiv sunt variabile locale,
iar numele lor este cel din lista de parametrii formali.
Din punctul de vedere al modului de transmitere a parametrilor putem mpri
parametrii n dou categorii: parametrii transmii prin valoare i parametrii
transmii prin referin.
1. Parametrii transmii prin valoare
Parametrii transmii prin valoare au rolul de a transmite date din zona de program
n care s-a apelat funcia nspre funcie.
Funcia va memora aceste date pe segmentul de stiv pus la dispoziie. Dup
terminarea execuiei funciei, segmentul de stiv se elibereaz i astfel programul nu
mai are acces la variabilele memorate pe stiv. Din acest motiv parametrii transmii
prin valoare nu pot transmite datele modificate n cadrul funciei nspre zona de
program de unde a fost apelat funcia.
Prin valoare se pot transmite: variabile, expresii i chiar funcii.

Exemplu:
#include <iostream.h>
#include <conio.h>
void f(int a,int b);

//PARAMETRII TRANSMISI PRIN VALOARE


//parametrii transmisi prin valoare

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

creat o copie a variabilelor x i y cu numele a i b, iar funcia opereaz


asupra acestora.
La terminarea execuiei funciei, se elibereaz segmentul de stiv iar
valorile variabilelor a i b se pierd.
Inainte si dupa apelul functiei
Segment de date
x

2
3

f()- la primul apel

Segment de stiva
a

2 4

7
dispar3dup
terminarea execuiei

f()-la al doilea apel


Segment de stiva
a

2 6

9
dispar3dup
terminarea execuiei

La declararea unei funcii putem specifica o valoare implicit pentru unii


parametrii.
10

n cazul n care nu exist parametrii efectivi corespunztori, vor fi folosite de


ctre funcie valorile implicite.
n cazul n care se transmit parametrii efectivi, se vor folosii valorile acestora.
Privii exemplul de mai jos:
#include <iostream.h>
#include <conio.h>
void afisare(int a,int b=1,int c=2); //b si c sunt parametrii cu valori implicite
void main()
{//am specificat valori pentru toti parametrii, functia le va utiliza pe cele specificate ca
//parametrii efectivi
afisare(3,4,5);
//am specificat valori doar pentru a si b, pentru c se va folosi valoarea implicita
afisare(5,6);
//am specificat valori doar pentru a , pentru b si c se vor folosi valoarile implicite
afisare(7);
getch();
}
void afisare(int a,int b,int c)
//nu se specific de dou ori valoarea implicit
{cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
}
n exemplul de mai sus antetul funciei conine doi parametri cu valori implicite b=1 i
c=2.
La apelul afisare(3,4,5); s-au transmis toi cei 3 parametrii iar funcia a folosit
valorile transmise.
La apelul afisare(5,6); s-au transmis 2 parametrii iar funcia a folosit valorile
transmise pentru a i b i valoarea implicit pentru c.
La apelul afisare(7); s-a transmis doar valoarea parametrului a iar pentru b i c
s-au folosit valorile implicite.
2. Parametrii transmii prin referin
De multe ori este necesar s modificm n interiorul unei funcii valorile unei
variabile externe funciei. n acest scop se folosesc parametrii transmii prin referin.
Prin urmare rolul parametrilor transmii prin referin este ca la revenirea
din funcie, variabila transmis, s rein valoarea modificat n timpul
execuiei funcieie.
Pentru ca un parametru s fie transmis prin referin numele lui trebuie s fie
precedat de caracterul ampersand &, la declararea parametrilor, n antetul funciei.
Caracterul ampersand specific faptul c parametrul este transmis prin
referin i nu prin valoare.

11

Exemplu:
int f(int &a, int &b);

f(

y );

Atunci cnd o variabil este transmis prin referin, nu se face o copie a ei pe


segmentul de stiv ci se reine pe segmentul de stiv adresa variabilei nsi. Cu
alte cuvinte modificrile se efectueaz la adresa reinut, prin urmare chiar asupra
variabilei transmise.
O funcie poate avea unul sau mai muli parametrii transmii prin
referin.
Parametrii efectivi corespunztori parametrilor transmii prin referin
trebuie s fie nume de variabile.
S analizm urmtorul exemplu:
#include <iostream.h>
//PARAMETRII TRANSMISI PRIN REFERINTA
#include <conio.h>
void f(int &a,int b); //parametrul a este transmis prin referinta
//parametrul b este transmis prin valoare
void main()
{ int x=1,y=2;
cout<<"x="<<x<<" y="<<y<<endl;
//x si y inainte de apelatrea functiei
f(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
//x si y dupa apelatrea functiei
getch();
}
void f(int &a,int b)
{a=2*a;
b=2*b;
cout<<"a="<<a<<" b="<<b<<endl;
}

//modificarea valorilor prametrilor a si b


// a si b in functie

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

f()- dup apel

Inainte si dupa apelul functiei


Segmentul de date

Segmentul de stiva

a
1

adresa lui x

b
2

1.4. Probleme rezolvate


1. Se citete o liter i un numr ntreg n. S se calculeze:
-pentru litera a S1=12 + 32 + 52 + ... + (2n-1) 2
-pentru litera b S2=1 + 1*2+1*2*3 + ... +1*2*3...n
#include <iostream.h>
#include <conio.h>
#include <math.h>
long s1(int n);
long s2(int n);

//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

2. Se citete un numr natural n. S se numere cte cifre pare i cte cifre


impare are numrul.
Vom realiza o funcie cifre pentru numrarea cifrelor pare i impare, creia i
transmitem 3 parametrii.
n numrul citit, parametru transmis prin valoare
c_pare-numrul cifrelor pare, parametru transmis prin referin, care va
transmite numarul cifrelor pare ale numarului, din funcie nspre programul
apelant.
c_impare-numrul cifrelor impare, parametru transmis prin referin, care
va transmite numarul cifrelor impare ale numrului, din funcie nspre
programul apelant.
Funcia cifre va returna programului principal numrul cifrelor pare i numrul
cifrelor impare, prin intermediul parametrilor transmii prin referin.

#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
}
}

3. Se citete un numr natural n. S se verifice i s se afieze dac este un


numr prim, altfel s se afieze descompunerea n factori primi.
Definim o funcie prim, care primete ca parametru transmis prin valoare
numrul n i returneaz 1 dac numarul este prim i 0 dac numarul nu este prim.
Definim de asemenea o funcie factori, funcie fr tip, care primete ca
parametru numrul n i afieaz factorii primi i ordinul lor de multiplicitate.

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++;
}
}

4. Se citete un numr natural n. S se descompun n sum de numere fibonacci.


Definim funcia max_f, care determin cel mai mare numr fibonacci mai mic
sau egal cu un numr dat. Funcia primete ca parametru transmis prin valoare
numarul dat.

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();
}

//apelul funciei fibo

unsigned long max_f(unsigned long nr) //definirea functiei max_f


{unsigned long a,b,c;
a=0;b=1;
while(b<=nr)
{c=a+b;
a=b;
b=c;
}
return a;
//valoarea returnat de functia max_f
}
void fibo(unsigned long m)
{int max;
while (m)
{max=max_f(m);
cout<<"+"<<max;
m-=max;
}
}

//definirea functiei fibo

//apelul functiei max_f din interiorul functiei fibo

5. Se citete un numr natural n n baza 10 i b un numr natural 2<=b<=9


reprezentnd o baz de numeraie. S se transforme numrul n n baza b.
Vom scrie o funcie conv, de tip void, cu doi parametrii transmii prin valoare,
respectiv n i b.
Rezultatul conversiei l vom memora ntr-un tablou unidimensional t.
n finalul funciei afim coninutul tabloului n ordinea invers construirii lui.

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

//definirea funciei conv


//restul mpririi lui n la b se depune n tabloul t
//n devine ctul mpririi lui n la b
//afisarea numrului n baza b

6. Se citete un numr natural n i apoi n cifre reprezentnd un numr n baza


1<=b<=9. S se transforme numrul dat din baza b n baza 10.

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;
}

//converteste numarul in baza 10

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

4. Se citesc n numere naturale. Se cere s se calculeze suma numerelor care au


toate cifrele impare.

1.6. Probleme propuse


1. S se afieze numerele naturale mai mari dect 100 i mai mici dect 500
care au toate cifrele distincte utiliznd o funcie care primete ca parametru un
numr i returneaz 1 dac are toate cifrele distincte i 0 dac nu sunt
distincte.

20

2. Se citesc n numere. S se afieze numerele obinute prin inversarea cifrelor.


3. S se afieze toate numerele pn la 1000 al cror ptrat se termin cu cifra
n.
4. Se citesc numere naturale pn la ntlnirea lui 0. S se afieze inversele
numerelor citite, pentru care media aritmetic a cifrelor este strict mai mic
dect 5.
5. Se citesc n numere naturale. S se calculeze suma numerelor care au toate
cifrele pare. Dac nu exist nici un astfel de numr se va afia un mesaj.
6. Calculai suma i produsul divizorilor proprii ai unui numr citit.
7. Fiind dat un numr natural n, s se afieze toi divizorii si i media aritmetic
a divizorilor si cuprini ntre dou valori citite a i b sau un mesaj, dac nu
are divizori ntre aceste valori.
8. Fiind dat un numr natural n, afiai divizorii si i numrai ci dintre acetia
sunt numere prime.
9. S se genereze toate numerele prime mai mici sau egale cu un numr n citit
de la tastatur.
10. Scriei un program care calculeaz suma a dou fracii ordinale. Afiarea se
va face dup simplificarea fraciilor.
11. Se citete un numr natural n. S se stabileasc dac acesta este un termen
al irului lui Fibonacci.
12. Se citete un numr natural n diferit de 0. S se scrie toate tripletele de
numere pitagoreice ( a2+b2=c2), mai mici dect n, nenule.
13. Se citete un numr natural n, n baza 10. S se transforme numrul n baza
16.
14. Se citesc n caractere reprezentnd un numr n baza 16. S se transforme n
baza 10.

Rspuns la testele gril:


TESTUL 1 : c
TESTUL 2 : b
TESTUL 3 : b

21