Sunteți pe pagina 1din 8

Subprograme

Programele se pot descompune in subprobleme (module), adica in grupe de actiuni


care se pot repeta de un numar de ori si care se executa numai in functie de anumite
conditii. Acest lucru determina existenta unui modul principal pentru prelucrarile principale
si pentru activarea “subordonatilor”.

In faza de programere modulele vor deveni subprograme iar modulul principal –


program principal.
Subprogramele in limbajul C++ se numesc functii.

Un program scris în limbajul C/C++ este un ansamblu de funcţii, fiecare dintre acestea efectuând o
activitate bine definită.

Un program C++ este alcatuit din una sau mai multe functii, din care una este
radacina sau functie principala - adica nu poate lipsi si executia incepe automat cu
ea. Aceasta se numeste main.

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

Definitie. Subprogramul este prin urmare un ansamblu alcatuit din tiputi de date, variabile si instructiuni
scrise in vederea unei anumite prelucrari (calcule, citiri, scrieri), care se identifica printr-un nume si care poate
fi executat doar daca este apelat .

Avantajele utilizarii subprogramelor:


 Modularizarea problemei (descompunerea in subprobleme)
 Reutilizarea aceleasi secvente de mai multe ori (in contexte diferite)
 Depanarea si intretinerea mai usoara

1
O funcţie este formata din antet si corp:
antet_funcţie
{corpul_funcţiei
}
Sau:
tip_val_return nume_func (lista_declaraţiilor_param_ formali)
{declaraţii_variabile_locale
instrucţiuni
[return valoare]
}

Antetul unei functii:


Prima linie reprezintă antetul funcţiei, în care se indică: tipul funcţiei, numele acesteia şi lista
declaraţiilor parametrilor formali.
La fel ca un operand sau o expresie, o funcţie are un tip, care este dat de tipul valorii returnate de funcţie
în funcţia apelantă. Dacă funcţia nu întoarce nici o valoare, în locul tip_vali_return se specificăvoid.
Dacă tip_val_return lipseşte, se consideră, implicit, că acesta este int.
Nume_funcţie este un identificator
Lista_declaraţiilor_param_formali (încadrată între paranteze rotunde) constă într-o listă (enumerare)
care conţine tipul şi identificatorul fiecărui parametru de intrare, despărţite prin virgulă. Tipul unui parametru
poate fi oricare, chiar şi tipul pointer. Dacă lista parametrilor formali este vidă, în antet, după numele funcţiei,
apar doar parantezele ( ), sau (void).
Corpul funcţiei este un bloc, care implementează algoritmul de calcul folosit de către funcţie. În corpul
funcţiei apar (în orice ordine) declaraţii pentru variabilele locale şi instrucţiuni. Dacă funcţia întoarce o valoare,
se foloseşte instrucţiunea return valoare. La execuţie, la întâlnirea acestei instrucţiuni, se revine în funcţia
apelantă.

Corpul unei functii:


Corpul funcţiei este un bloc, care implementează algoritmul de calcul folosit de către funcţie. În corpul
funcţiei apar (în orice ordine) declaraţii pentru variabilele locale şi instrucţiuni. Dacă funcţia întoarce o valoare,
se foloseşte instrucţiunea return valoare. La execuţie, la întâlnirea acestei instrucţiuni, se revine în funcţia
apelantă.

În limbajul C/C++ se utilizează declaraţii şi definiţii de funcţii.

Declaraţia conţine antetul funcţiei şi informează compilatorul asupra tipului, numelui funcţiei şi a listei
parametrilor formali (în care se poate indica tipul parametrilor formali şi numele acestora). Declaraţiile de funcţii
se numesc prototipuri, şi sunt constituite din antetul funcţiei.
Definiţia conţine antetul funcţiei şi corpul acesteia. Nu este admisă definirea unei funcţii în corpul altei
funcţii.

Apelul şi prototipul funcţiilor

O funcţie 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);

Parametrii efectivi trebuie să corespundă cu cei formali ca ordine şi tip. La apel, 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 instrucţiunii de
apel, din funcţia apelantă. O altă posibilitate de a apela o funcţie este aceea în care apelul funcţiei constituie
operandul unei expresii (apelul functiei intervine intr-o expresie). Acest lucru este posibil doar în cazul în care
funcţia returnează o valoare, folosită în calculul expresiei(doar pentru functiile cu tip).

2
Parametrii declaraţi în antetul unei funcţii sunt numiţi formali, pentru a sublinia faptul că ei nu reprezintă
valori concrete, ci numai ţin locul acestora pentru a putea exprima procesul de calcul realizat prin funcţie. Ei se
concretizează la execuţie prin apelurile funcţiei.
Parametrii folosiţi la apelul unei funcţii sunt parametri reali, efectivi, concreţi, actuali iar valorile lor
vor fi atribuite parametrilor formali, la execuţie. Utilizarea parametrilor formali la implementarea funcţiilor şi
atribuirea de valori concrete pentru ei, la execuţie, reprezintă un prim nivel de abstractizare în programare. Acest
mod de programare se numeşte programare procedurală şi realizează un proces deabstractizare prin parametri.

Variabilele declarate în interiorul unei funcţii, cât şi parametrii formali ai acesteia nu pot fi accesaţi decât
în interiorul acesteia. Aceste variabile sunt numite variabile locale şi nu pot fi accesate din alte funcţii. Domeniul
de vizibilitate a unei variabile este porţiunea de cod la a cărei execuţie variabila respectivă este accesibilă. Deci,
domeniul de vizibilitate a unei variabile locale este funcţia în care ea a fost definită.

Sa se scrie o functie care sa afiseze suma cifrelor unui numar intreg dat paramentru.

#include <iostream >

using namespace std;


long int n; //s-a declarat variaabila globala n valabila si in subprogram si in MAIN()
void cifre(long int n) // functia CIFRE nu returneaza o valoare si este apelata in MAIN()
{
int s=0;
while(n!=0) { s+=n%10; n=n/10; }
cout<<"Suma cifrelor este "<<s<<endl;;
}
int main()
{
cout<<"Dati numarul n= ";cin>>n;
cifre(n);
}
Sa se scrie o functie care sa afiseze nr de cifre ale unui nr
#include<iostream >

using namespace std;


int s(long n)
{
int c,nr=0; // s-a declarat variabila locala valabile doar in functia s(n)
while(n)
{
nr=nr+1;
n=n/10;
}
return nr;
}
int main()
{
long n;
cout<<"n=";cin>>n;
cout<<s(n);
}

Sa se afiseze toate numerele prime mai mici sau egale cu n

3
#include <iostream >
#include <math.h>

using namespace std;


int n;
void numere_prime(int n)
{
int i,j,prim;
cout<<"Numerele prime mai mici sau egale decat "<<n<<" sunt "<<endl;
for(i=2;i<=n;i++) //parcurgem toate valorile pana la n
{
prim=1; // presupunem ca nu exista divizori
for(j=2;j<=i/2;j++) // ex: daca i=10 , j i-a toate valorile pana la i
if(i%j==0) prim=0; // inseamna ca are divizori si nu este prim
if(prim==1) cout<<i<<" "; //daca PRIM nu si-a schimbat valoarea inseamna ca NU ARE DIVIZORI
}
}

int main()
{
cout<<"Dati n = ";cin>>n;
numere_prime(n);
}

Sa se scrie o functie care sa verifice daca un numar intreg este sau nu palindrom (este egal
cu rasturnatul sau).

#include <iostream >


using namespace std;
int palindrom(long int x) // x este declarat ca parametru formal
{
long int z=0,y;
y=x; // retin in y valoarea lui x pentru a nu se pierde valoarea citita
while(x!=0)
{ z=z*10+x%10; //se construieste numarul z adaugand ultima cifra din x
x=x/10; } //valoarea lui x se divide (sterge ultima cifra din x)
if(z==y) return 1; //testeaza daca valoarea construita chiar este egala cu valoarea initiala citita(y=x)
else return 0; //daca nu sunt egale returneaza val 0
}
int main()
{
long int a,b;
cout<<"Dati numarul a= ";cin>>a;
if(palindrom(a)!=0) cout<<"numarul "<<a<<" este palindrom"<<endl;
else cout<<"numarul "<<a<<" NU este palindrom"<<endl;
}

Sa se afiseze toate numerele perfecte mai mici sau egale cu n

Ex: 6=1+2+3 are suma divizorilor egal cu nr citit

4
#include <iostream >
using namespace std;
#include <math.h>
int n;
void numere_perfecte(int n)
{
int i,j,suma;
cout<<"Numerele perfecte mai mici sau egale decat "<<n<<" sunt "<<endl;
for(i=6;i<=n;i++) //6 este primul nr perfect si pleaca de la el
{
suma=0;
for(j=1;j<=i/2;j++)
if(i%j==0) suma=suma+j;
if(suma==i) cout<<i<<" "; // afiseaza nr perfecte cu spatii intre ele
}
}
int main()
{
cout<<"Dati n = ";cin>>n;
numere_perfecte(n);
}

Sa se afiseze toate patratele perfecte mai mici sau egale cu n.

#include <iostream >


#include <math.h>

using namespace std;


int n;
void numere_patrate_perfecte(int n)
{
int i,j;
cout<<"Numerele patrate perfecte mai mici sau egale decat "<<n<<" sunt "<<endl;
for(i=1;i<=n;i++)
if(sqrt(i)==floor(sqrt(i))) cout<<i<<" ";
}
int main()
{
cout<<"Dati n = ";cin>>n;
numere_patrate_perfecte(n);
}

.
Să se determine cel mai mare divizor comun (c.m.m.d.c.)a doua numere întregi citite de la tastatura

Cmmdc se va calcula folosind relatia:

cmmdc(a,b)=cmmdc(a-b, b), a>b


=cmmdc(a, b-a), b>a
=a, daca a=b,

5
#include<iostream >

using namespace std;


int cmmdc(int a,int b)
{
if(a==b) return a;
else if(a>b) return cmmdc(a-b,b);
else return cmmdc(a,b-a);
}
int main()
{
int x,y;
cout<<"x=";cin>>x;
cout<<"y=";cin>>y;
cout<<"cmmdc este: "<<cmmdc(x,y);
}

Sa se scrie cate o functie care sa determine:


- cel mai mare divizor comun a doua numere intregi date ca parametri.
- cel mai mic multiplu comun a doua numere intregi date ca parametri
Indicatii:
- Pentru determinarea cmmdc se va folosi algoritmul lui Euclid prin impartiri
repetate.
- Pentru determinarea cmmmc se va folosi relatia dintre cmmmc si cmmdc: cmmmc(a,b)=(a*b)/cmmdc(a,b)

#include <iostream >

using namespace std;


int cmmdc(int a, int b)
{
int r;
r=a%b;
while(r!=0) int cmmmc(int a, int b)
{ {
a=b; return(a*b/cmmdc(a,b));
b=r; }
r=a%b;
}
return b;
}

Int main(void)
{
int x,y,d,m;
cout<<"Dati primul numar ";cin>>x;
cout<<"Dati al doilea numar ";cin>>y;
d=cmmdc(x,y);
cout<<"C.m.m.d.c este "<<d<<endl;
m=cmmmc(x,y);
cout<<"C.m.m.m.c este "<<m<<endl;
}

Se citeste un vector cu n elemente numere naturale. Sa se afiseze toate perechile de


elemente din vector care sunt formate din elemente prime intre ele.

6
#include<iostream >
using namespace std;

int n;
void citire(int a[100], int n)
{ int i;
cout<<”n=”; cin>>n;
for(i=1; i<=n; i++)
{ cout<<”elementul[”<<i<<”]=”;
cin>>a[i];
}
}

int cmmdc(int x, int y)


{ while(x!=y)
if(x>y)
x=x-y;
else y=y-x;
return x;
}

int main()
{ int a[100], i , j;
citire(a,20); //creaza vectorul a cu 20 locatii
for(i=1; i<n; i++)
for(j=i+1; j<=n; j++)
if(cmmdc(a[i],a[j])==1)
cout<<a[i]<<" "<<a[j];
}

Se considera un numar natural in baza 10. Se cere sa se scrie o functie care sa afiseze
reprezentarea numarului dat in baza 2.Exemplu: Pentru n=10 reprezentarea numarului in
baza 2 este 1010

using namespace std;


#include <iostream>
int n;
void baza2(int n)
{
int i=1,j,x[30],cifre;
while(n!=0)
{
x[i]=n%2;
n=n/2;
i++;
}
cifre=i-1;
cout<<"Reprezentarea numarului in baza 2 este: ";
for(i=cifre;i>=1;i--) cout<<x[i]<<" ";
cout<<endl;
}
int main()
{
7
cout<<"Dati n = ";cin>>n;
baza2(n);
}

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