Sunteți pe pagina 1din 10

57

Structura programelor mari


n C sau C++ programele au adesea o structur multifiier (sunt compuse
din mai multe fiiere).
Exemplu fundamental:
Se consider o aplicaie n care se opereaz cu un ir de valori double.
Aplicaia realizeaz succesiv suma valorilor din ir i determinarea valorii
minime. Prelucrrile vor fi realizate n funcii separate.
Soluie: Se creaz un nou proiect denumit operatii:

Se alege ca tip Win32 Console Application i apoi se impune Empty


Project.
Se adaug apoi proiectului fiierul surs Operaii.cpp:
58

#include <iostream>
using namespace std;

double suma(double a[], int n);


double maxim(double a[], int n);

void main()
{
double x[] = {1., 2., 1., 0., 1.};
double rez = suma(x, 5);
cout << "Suma val. din sirul x este : " << rez <<
endl;
double mx = maxim(x, 5);
cout << "Max. val. din sirul x este : " << mx << endl;
}

Funciile necesare vor fi incluse ntr-un alt fiier surs, Funcii.cpp.


59

Fiierul Functii.cpp va avea coninutul:

double suma(double a[], int n)


{
double s = 0.;
int i;
for (i = 0; i < n; i++)
s = s + a[i];
return s;
}

double maxim(double a[], int n)


{
int i;
double max;
max = a[0];
for(i=1; i<n; i++)
{
if(max < a[i])
max = a[i];
}
return max;
}

Observaie: Deoarece naintea utilizrii toate funciile unui program C/C++


trebuie s fie definite (cu excepia funciei principale, main()), fiierul Operatii.cpp
ncepe prin definirea prototipurilor funciilor utilizate:
double suma(double a[], int n);
double maxim(double a[], int n);

n aplicaiile mari, numrul funciilor utilizate poate fi mare i din acest


motiv este bine s fie plasate ntr-un fiier separat de tip header (antet), avnd
de rehul extensia .h.
Adugarea unui astfele de fiier proiectului Operatii se realizeaz astfel:
60

La nceputul fiierului Operatii.cpp n locul liniilor care conineau


prototipurile funciilor utilizate va fi inclus fiierul Operaii.h:
#include <iostream>
#include "Operatii.h"
using namespace std;

void main()
{
double x[] = {1., 2., 1., 0., 1.};
double rez = suma(x, 5);
cout << "Suma val. din sirul x este : " << rez <<
endl;
double mx = maxim(x, 5);
61

cout << "Max. val. din sirul x este : " << mx << endl;
}
Se observ c numele fiierului Operaii.h este plasat ntre ghilimele.
Spre deosebire de Operatii.h, fiierele antet care conin declaraiile funciilor din
bibliotecile limbajului se includ folosind < ... > :
#include <iostream>
#include <ctype.h>
#include <math.h>

Notaia diferit folosit pentru cele dou categorii de fiiere provine din
faptul c fiierele antet create de programator (asemenea fiierului Operatii.h)
vor fi pstrate pe disc n directorul coninnd celelalte fiiere surs ale acesteia.

Vizibilitatea variabilelor
Vizibilitatea unei variabile se refer la zona dintr-un program n care
variabila este cunoscut i poate fi folosit. Din punct de vedere al locului
declarrii, o variabil poate fi global (declarat n afara oricrei funcii) sau
local (declarat n interiorul unei funcii, la nceputul acesteia sau ntr-un bloc
din cadrul acesteia.
Variabilele locale aparinnd unor module distincte (funcii sau blocuri)
sunt diferite, chiar dac poart acelai nume.
Unei variabile globale i se aloc spaiu n memorie n momentul definirii.
Dup linia de definire ea poate fi folosit. Dac variabila global este definit
ntr-un alt fiier aparinnd aceleiai aplicaii sau ntr-o alt poziie, spre sfritul
fiierului n care este folosit, ea trebuie declarat. Pentru a nu i se aloca
memorie nc o dat, numele tipului va fi precedat de cuvntul extern :

Fiier 1 Fiier 2

double scara=1 ; // definire extern double scara ; // declarare

void main() void calcul(double a[], n)


{ {
int i, n ;
62

O variabil global este definit o singur dat, ntr-unul dintre fiierele


aplicaiei. Odat cu definirea ea poate fi iniializat. Ea trebuie declarat ns
(extern ) n toate fiierele n care este folosit.

Structura programului i declararea variabilelor


n C programul are o structur simpl, fiind o niruire de funcii. Fonciile
pot fi plasate ntr-un singur fiier sau n mai multe fiiere. O funcie nu poate
conine o alt funcie (ca n Pascal de exemplu).
O variabil poate fi declarat practic n orice punct din program. De regul
declaraiile de variabile sunt plasate :
 n afara oricrei funcii (variabila fiind global),
 la nceputul unei funcii,
 la nceputul unui bloc din cadrul unei funcii.
Declararea poate fi nsoit de iniializare. Pentru variabilele statice
aceasta are loc o singur dat, naintea nceperii execuiei programului. Pentru
variabilele obinuite, aceasta este repetat la fiecare intrare n funcia sau blocul
n care declaraia este inclus.

Variabilele statice
Variabilele declarate n interiorul unei funcii exist numai pe durata
executrii acesteia. Variabilele declarate n interiorul unui bloc din cadrul unei
funcii exist numai pe durata execuiei instruciunilor blocului n care au fost
definite. nainte de a fi folosite, ele trebuie s primeasc o valoare, aceast
iniializare repetndu-se la fiecare executare a funciei (blocului).
Dac o variabil trebuie s nu-i schimbe valoarea ntre dou apeluri ale
funciei n care este definit ea trebuie declarat ca variabil static :
void calcul( )
{
static int contor ;
static int num=1000 ;
63

...
}
naintea nceperii execuiei programului variabila contor va primi valoarea
0 iar variabila num va primi valoarea 1000. Valoarile rmase n contor i num
dup execuia funciei calcul() vor fi regsite la reintrarea n funcie, dup o nou
apelare.

Recursivitatea
n C o funcie se poate apela pe sine nsi. O astfel de funcie poart
numele de funcie recursiv. Prin recursivitate se pot realiza structuri de cod
repetitive similare celor realizate folosind instruciunile de ciclare.
Exemple :

long factorial(int n);


double suma(int n, double a[]);

void main()
{
long f;
double s;
double a[5]={10., 33., -12.,1., 10.};
f=factorial(6);
s=suma(5, a);
}

long factorial(int n)
{
if(n == 1)
return 1;
else
return n * factorial(n-1);
}

double suma(int n, double a[])


{
if (n == 0)
return a[0];
else
return a[n] + suma(n-1, a);
}
64

La reapelarea funciei este necesar schimbarea cel puin a unei valori din
lista parametrilor formali i anume a valorii variabilei care este testat n vederea
opririi reapelrii.

Date structurate

Programele de calculator sunt scrise pentru a efectua prelucrri de date


specifice unor procese fizice, aparinnd lumii reale. Tipurile de date simple,
elementare, folosite pn acum sunt n multe cazuri improprii memorrii n
calculator a caracteristicilor entitilor manipulate. Pentru apropierea modelului
din memoria calculatorului de entitatea real, ale crei caracteristici sunt
memorate, limbajele de programare permit definirea unor noi tipuri de date
denumite structurate. Ca i n cazul tipurilor simple, dup definirea unui tip de
dat structurat se pot declara variabile aparinnd noului tip.

Exemplu fundamental :
Pentru pstrarea coordonatelor punctelor de pe ecranul calculatorului se
folosesc dou variabile ntregi, x i y. Dac un program opereaz mult cu puncte
este bine s se defineasc un nou tip de dat denumit punct, astfel:

y
struct punct { p1
int x, y ;
};
x

Declaraia noului tip de dat va fi plasat la nceputul programului,


naintea funciei main().
n program vor fi declarate n continuare variabile aparinnd noului tip i
vor fi efectuate diverse prelucrri.
65

#include <iostream>
#include <math.h>
using namespace std;

struct punct {
int x, y ;
};

double distanta(punct, punct); // Prototipul functiei distanta()

void main()
{
punct p1, p2;
double dist;
p1.x = 0;
p2.x = 10;
p1.y = 40;
p2.y = 99;
dist = distanta(p1, p2);
cout << "Distanta este: " << dist << endl;
}

double distanta (punct a, punct b)


{
double v;
v = (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);
return sqrt(v);
}

Se observ c referirea componentelor tipului structurat (denumite i


cmpuri) se realizeaz scriind variabil.cmp.
Componentele unui tip de dat structurat pot aparine unor tipuri simple
dar pot aparine i unor tipuri structurate. Extinznd exemplul dat, se poate defini
un tip structurat denumit cerc, astfel:

struct cerc {
punct centru;
int raza;
};

. . .
cerc c;

. . .

n program se va putea atribui o valoare componentei x a centrului


cercului c scriind:
c.centru.x = 120;
66

O funcie poate returna o valoare aparinnd unui tip structurat. De


exemplu:

punct pct_circum(cerc c, double u)


{
punct p;
p.x = (int)(c.centru.x + raza * cos(3.1415926 * u / 180.));
p.y = (int)(c.centru.y + raza * sin(3.1415926 * u / 180.));
return p;
}

Funcia pct_circum() returneaz un punct de pe periferia unui cerc dat ca


argument.
Observaie:
ntr-un program de calculator care realizeaz construcii grafice, numrul
de puncte, cercuri sau alte entiti grafice poate fi mic sau mare, dar de regul
este necunoscut. Declarate ca n exemplele prezentate, variabilele c (de tip
cerc) sau p1 i p2 (de tip punct) nu sunt de mare ajutor.
Soluia acestei adevrate probleme este reprezentat de alocarea
dinamic a memoriei calculatorului, n timpul exectrii aplicaiei. Pentru aceste
variabile se aloc spaiu n memoria disponibil n timpul rulrii programului,
atunci cnd este necesar. Mai mult, entitile grafice generate vor fi memorate
probabil sub forma unei liste, fiecare element al listei coninnd printre altele, o
referin la elementului urmtor. O astfel de soluie permite crearea unui numr
nedefinit de entiti deoarece memoria unui calculator actual are o capacitate
considerabil.

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