Sunteți pe pagina 1din 9

Subprograme

LECȚIA 1 Subprograme în C++


Utilitate, concepte fundamentale

Prof. Daniela Stratulat


Definiție Prin subprogram vom înţelege un ansamblu
alcătuit din declarații şi instrucţiuni scrise în vederea unei anumite
prelucrări, ansamblu implementat separat şi identificat printr-un
nume.

Până în prezent am fost doar utilizatori de subprograme


(funcții). Ne-am folosit doar de funcțiile standard, predefinite, iar
utilizarea lor presupunea includerea fișierului header dorit.
(#include<cmath> sau #include<fstream>)

Pentru a înţelege noţiunea de subprogram, vom porni de la


două exemple.
Exemplul 1 Se consideră funcţia:
Se citesc două valori reale a şi b.
Să se scrie un program care afişează
care dintre valorile f(a) şi f(b) este
cea mai mare.

Ce observăm? Că atât pentru calculul valorii funcţiei în punctul a, cât şi pentru


calculul valorii funcţiei în punctul b, aplicăm acelaşi tip de raţionament: încadrăm
valoarea respectivă (a sau b) într-unul dintre cele trei intervale şi aplicăm formula de
calcul corespunzătoare.

Cum procedăm? Prin utilizarea cunoştinţelor dobândite până în prezent, scriem


secvenţa de program care calculează valoarea funcţiei pentru x=a şi se mai scrie o dată
(sau se copiază şi se adaptează) secvenţa de program care calculează valoarea funcţiei
pentru x=b.

Oare nu se poate lucra şi altfel? Răspunsul este afirmativ. Se scrie un


subprogram care calculează valoarea funcţiei într-un punct x oarecare şi se apelează
subprogramul: o dată pentru x=a şi încă o dată pentru x=b. Valorile calculate la cele două
apeluri, se compară între ele şi se afişează rezultatul cerut.
Exemplul 2 Se citeşte n, un număr natural. Se citesc apoi n numere
reale. Se cere să se afişeze cele n numere în ordinea crescătoare a valorilor lor.
Desigur, ştim să rezolvăm această problemă în mai multe feluri, pentru că
ştim să memorăm un şir de valori (folosind un vector) şi am studiat mai multe
metode prin care se poate obţine ordonarea crescătoare a unui şir de valori
(folosind algoritmi de sortare). De această dată vom utiliza subprogramele.

Vom scrie un subprogram care citeşte un vector, unul care tipăreşte un


vector şi un al treilea care sortează vectorul după una din metodele cunoscute.

În acest caz, programul ar arăta astfel:


Pasul 1 - se apelează subprogramul care citeşte vectorul.
Pasul 2 - se apelează subprogramul care sortează vectorul.
Pasul 3 - se apelează subprogramul care tipăreşte vectorul.

Faţă de scrierea clasică, aici problema a fost descompusă în trei


probleme mai simple (citire, sortare şi tipărire). În general, o problemă complexă se
rezolvă mai uşor dacă o descompunem în alte subprobleme mai mici. Apoi, şansele
de a greşi la scrierea unui subprogram sunt cu mult mai mici decât acelea de a greşi
la scrierea unui program mare.
Putem acum enumera unele dintre avantajele utilizării
subprogramelor:

 reutilizarea codului - odată scris, un subprogram poate fi


utilizat de către mai multe programe;
 elaborarea algoritmilor prin descompunerea problemei în
altele mai simple - în acest fel, rezolvăm mai uşor problema;
 reducerea numărului de erori care pot apărea la scrierea
programelor;
 depistarea cu uşurinţă a erorilor - verificăm la început
subprogramele, apoi modul în care le-am asamblat (le-am
apelat din cadrul programului);
 realizarea unor programe uşor de urmărit (lizibile).
Exemple de utilizare a funcţiilor
Problema 1 Se citeşte n, număr natural. Să se scrie programele care
tipăresc valoarea calculată a expresiilor:
#include <iostream>
using namespace std;

double expresie(int n)
{ double s=0; int i;
#include <iostream> for (i=1;i<=n;i++)
using namespace std; s+=1./i; // sau s=s+1./i
return s;
double expresie(int n) }
{ double s=0; int i;
for (i=1;i<=n;i++) int main()
s+=1./i; { int n,i;
return s; double rez, prod=1;
} cout<<"n="; cin>>n;
rez=expresie(n);
int main() for (i=1;i<=n;i++)
{ int n; prod=prod*rez;
cout<<"n="; cin>>n; cout<<prod;
cout<<expresie(n); return 0;
return 0; }
}
Observații  Antetul funcţiei: double expresie(int n)
 Funcţia se numeşte ”expresie”
#include <iostream>  Funcţia are un parametru formal numit n. Rolul său este
using namespace std; important deoarece precizează pentru ce valoare trebuie
calculată expresia. Aşa cum vom vedea, există
double expresie(int n) posibilitatea să avem mai mulţi parametri, de diferite
{ double s=0; int i; tipuri.
for (i=1;i<=n;i++)  Funcţia are un anumit tip, care precizează natura
s+=1./i; rezultatului. În exemplu, tipul este double întrucât
return s; expresia calculată este de acest tip.
}  Funcţia are variabile proprii - adică variabile care sunt
definite în cadrul ei. În exemplu, s şi i. Aceste variabile
int main() se numesc variabile locale.
{ int n;  Am văzut că funcţia întoarce un anumit rezultat - în
cout<<"n="; exemplul nostru, de tip double. Observaţi mecanismul
cin>>n; prin care am obţinut aceasta. Calculez expresia în mod
cout<<expresie(n); obişnuit. Rezultatul este reţinut de variabila locală s.
return 0; Prin instrucţiunea ”return s;”, funcţia a primit ca
} valoare de retur conţinutul variabilei s.
Parametri formali. Parametri efectivi.

Definiţie Parametrii care se găsesc în antetul funcţiei se


numesc parametri formali.
Atunci când scriem o funcţie nu cunoaştem valoarea
propriu-zisă a parametrilor. Funcţia trebuie să întoarcă rezultatul
corect, oricare ar fi valoarea lor. Din acest punct de vedere ei se
numesc formali.

Definiţie Parametrii care se utilizează la apel se numesc


parametri efectivi.
La apel, lucrurile stau altfel: valorile acestora sunt
cunoscute. Prin urmare, aceştia se numesc parametri efectivi
(sau actuali).
Problema 2 Se citeşte n, număr natural. Se citeşte un vector cu n componente
numere întregi. Se cere să se tipărească vectorul sortat.
#include <iostream> void scriu (int vt[10], int n)
using namespace std; { int i;
void citesc (int vt[10], int n) for(i=1;i<=n;i++)
{ int i;
cout<<vt[i]<<” “;
for(i=1;i<=n;i++)
{ cout<<"v["<<i<<"]="; }
cin>>vt[i]; int main()
} { int v[10], n;
} cout<<"n="; cin>>n;
void sortez (int vt[10], int n) citesc(v,n);
{ int gasit, i, man; sortez(v,n);
do scriu(v,n);
{ gasit=0;
return 0;
for (i=1;i<=n-1;i++)
if (vt[i]>vt[i+1]) }
{ man=vt[i]; Programul conţine trei funcţii: citesc, sortez şi scriu.
vt[i]=vt[i+1]; La apel, controlul programului este transferat la prima
vt[i+1]=man;
gasit=1;
instrucţiune a funcţiei. După executarea funcţiei, se revine în
} programul principal la prima instrucţiune care urmează celei de
} while (gasit); apel - în cazul de faţă se întâlneşte o altă instrucţiune de apel.
} Cele trei funcţii au tipul void, adică nu au valoare de
retur. Ele returnează rezultatul prin intermediul parametrilor.

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