Subprograme

Un subprogram reprezinta un ansamblu de instructiuni (de declarare, executabile) scrise în vederea executarii unei anumite prelucrari. Este identificat printr-un nume si implementat separat.
I.CLASIFICARE
– functii procedurale
– functii operand
Functii procedurale (void) – nu returneaza niciun rezultat sau returneaza prin parametri
Exemplu:

void afiseaza(int n) 
     { 
          cout<<n; 
        }

Functii operand – returneaza o valoare de tipul specificat
Exemplu:

       int dubleaza(int n) 
        { 
             return 2*n; 
           } 
          int main() 
         { 
              cout << dubleaza(2); // va afisa 4 
           }

II.TRANSMITEREA PARAMETRILOR
– prin valoare – pentru date de intrare
-prin referinta – pentru date de iesire sau intrare – iesire
Exemplu:

#include  
using namespace std; 
void modifica(int a) 
{ 
a = a + 5; 
cout << "a are valoarea: " << a << '\n'; 
} 
int main() 
{ 
int x = 1; 
cout << "x inainte de apel: " << x << '\n'; 
modifica(x); 
cout << "x dupa apel: " << x; 
return 0; 
} 

Output: 
x inainte de apel: 1 
a are valoarea: 6 
x dupa apel: 1	#include  
using namespace std; 

void modifica(int &a) 
{ 
a = a + 5; 
cout << "a are valoarea: " << a << '\n'; 
} 
int main() 
{ 
int x = 1; 
cout << "x inainte de apel: " << x << '\n'; 
modifica(x); 
cout << "x dupa apel: " << x; 
return 0; 
} 

Output: 
x inainte de apel: 1 
a are valoarea: 6 
x dupa apel: 6

III.SUBPROGRAME SI TABLOURI
Tablourile nu se transmit utilizand operatorul &, dar orice modificare a valorilor elementelor tabloului dat ca parametru formal va afecta elementul corespunzător al tabloului dat ca parametru actual.
Exemple:
1. Subprogram citire vector

void citeste(int a[], int n)
{int i;
  for(i=1;i>a[i];
}

2. Subprogram stergere element pozitia k in vector

void stergere(int &n, int a[], int k)
{int i;
for(i=k;i<=n-1;i++)
    a[i]=a[i+1];
n--;
}

3. Subprogram inserare element pozitia k in vector

void inserare(int &n, int a[], int k)
{int i;
for(i=n;i>=k;i--)
    a[i+1]=a[i];
a[k]=0;
n++;
}

4. Subprogram ordonare:

void ordonare(int n, int a[])
{int i,j;
for(i=1;i<=n-1;i++)
    for(j=i+1;ja[j])
          swap(a[i],a[j]);
}

5.Subprogram afisare matrice

void afisare(int A[][101], int n)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<A[i][j]<<" ";
        cout<<endl;
    }
}

6. Subprogram stergere linia k din matrice

void sterglinie(int A[][101], int &n, int m, int k)
{
    for(int i=k;i<n;i++)
        for(int j=1;j<=m;j++)
            A[i][j]=A[i+1][j];
    n--;
}

IV.ALTE EXEMPLE DE FUNCTII
1.Verificare numar prim ( prin referinta)

void prim(int n, int &p)
{
    p=1;
    if(n==0 || n==1) p=0;
    else if(n%2==0 && n!=2) p=0;
       else for(int d=3;d*d<=n;d=d+2)
                if(n%d==0) p=0;
}

2.Cel mai mare divizor comun

void cmmdc(int a, int b, int &c)
{
    while(b!=0)
    {
        int r=a%b;
        a=b;
        b=r;
    }
    c=a;
}

3. Suma divizorilor primi ai unui numar natural

int sum_div_prim(int n)
{
    int s=0;
    int d=2;
    while(n>=d*d)
    {
        if(n%d==0)
        {
            s=s+d;
            while(n%d==0) n=n/d;
        }
        else if(d==2) d++;
             else d=d+2;
    }
    if(n!=1)  s=s+n;
    return s;
}

V. PROBLEME PROPUSE.
1.Scrieti cate un program in care sa utilizati subprogramele de mai sus.
2. Subprogramul putere are trei parametri:
• n, prin care primește un număr natural din intervalul [2,109];
• d și p, prin care furnizează divizorul prim, d, care apare la cea mai mare putere, p, în descompunerea în factori primi a lui n; dacă există mai mulți astfel de divizori se afișează cel mai mare dintre ei.
Scrieți definiția completă a subprogramului.
Exemplu: dacă n=10780, atunci, în urma apelului, d=7 şi p=2 (10780=22 x 5 x 72 x 11)
3. Un număr natural nenul se numeşte sPar dacă atât el, cât și suma divizorilor săi proprii (divizori diferiţi de 1 şi de el însuși), sunt numere pare.
Subprogramul sPar are un singur parametru, n, prin care primeşte un număr natural (n din intervalul [1,109]). Subprogramul returnează cel mai mic număr sPar, strict mai mare decât n. Scrieţi definiţia completă a subprogramului.
Exemplu: dacă n=95, atunci subprogramul returnează 98 (atât 98, cât și 72=2+7+14+49, sunt numere pare).
4. Subprogramul Egal are un parametru, n, prin care primeşte un număr natural cu cel puțin o cifră impară (n apartine intervalului [10,109]). Subprogramul returnează valoarea 1 dacă toate cifrele impare ale lui n sunt egale între ele sau valoarea 0 în caz contrar. Scrieți definiția completă a subprogramului.
Exemplu: dacă n=7727470 sau n=7240 atunci subprogramul returnează 1, iar dacă n=7921470
atunci subprogramul returnează 0.
5. Subprogramul inserare are doi parametri:
• n, prin care primeste un număr natural (2≤n≤20);
• a, prin care primeste un tablou unidimensional care memorează un sir de n numere naturale, fiecare cu cel mult 4 cifre. Cel putin un element al tabloului este număr par.
Subprogramul modifică tabloul, inserând înainte de fiecare termen par al sirului numărul obtinut prin împărtirea la 2 a valorii acestuia si furnizează, tot prin parametrii n si a, valorile actualizate ale datelor primite. Scrieti în limbajul C/C++ definitia completă a subprogramului.
Exemplu: dacă n=7 si a=(1,4,5,3,82,6,2) atunci după apel n=11 si a=(1,2,4,5,3,41,82,3,6,1,2).