Sunteți pe pagina 1din 7

SEMESTRUL al II-lea Referat de laborator nr.

1 Limbajul C++

REFERAT DE LABORATOR NR. 1
TEMA: Concepte de baza ale programarii orientate obiect ilustrate cu ajutorul
unor programe C (laborator facultativ, pentru cei care au cunostinte avansate de
programare).

Exemplul1:
Se definesc tipurile de date CERC_FIGURA i DREPTUNG_FIGURA, pentru lucrul cu figuri geometrice.
Operaiile care pot fi realizate asupra ambelor tipuri de date sunt calculul ariei si afiarea informaiilor despre o
figur geometric (cerc sau dreptunghi).

n fiierul cfigura.h se definesc tipurile de date i se declar prototipurile funciilor care opereaz asupra lor.
n fiierul cfigura.c (.cpp) se implementeaz funciile pentru operarea asupra unei figuri geometrice.
n fiierul figtst1.c (.cpp) se testeaz tipurile de date definite i operaiile asupra acestora.

/*-------------------------------------------------------------------------------------------------------------
Fisierul cfigura.h Defineste tipurile de date pentru lucrul cu figuri geometrice in C
-------------------------------------------------------------------------------------------------------------*/
#i f ndef CFI GURA_H
#def i ne CFI GURA_H
#def i ne T_CERC 1
#def i ne T_DREPTUNG 2
/* Defineste structurile de date pentru figuri */
t ypedef st r uct CERC_FI GURA
{ shor t t i p; /* Tipul figurii (T_CERC) */
doubl e x, y; /* Coordonatele centrului cercului */
doubl e r aza; /* Raza cercului */
} CERC_FI GURA;
t ypedef st r uct DREPTUNG_FI GURA
{ shor t t i p; /* Tipul figurii (T_DREPTUNG) */
doubl e x1, y1; /* Coordonatele coltului stanga sus */
doubl e x2, y2; /* Coordonatele coltului dreapta jos */
} DREPTUNG_FI GURA;
/* definirea unei uniuni a doua structuri */
t ypedef uni on FI GURA
{ shor t t i p; /* tipul figurii */
CERC_FI GURA cer c;
DREPTUNG_FI GURA dr ept ung;
} FI GURA;
/* Prototipuri functii */
doubl e cal cul _ar i e( FI GURA *p_f i gur a) ;
voi d af i s_f i gur a( FI GURA *p_f i gur a) ;
#endi f / * #i f ndef CFI GURA_H */

/*-----------------------------------------------------------------------------------------------------------------
Fisierul cfigura.c Implementarea functiilor C care opereaza asupra figurilor geometrice
-----------------------------------------------------------------------------------------------------------------*/
#i ncl ude <st di o. h>
#i ncl ude " cf i gur a. h"
#i ncl ude <mat h. h>
#def i ne M_PI 3. 14
/* Functia cal cul _ar i e: Calculeaza aria figurii geometrice (cerc sau dreptunghi) */
doubl e cal cul _ar i e( FI GURA *p_f i gur a)
{ doubl e ar i a;
swi t ch( p_f i gur a- >t i p) /* calc. ariei in functie de tipul figurii (cerc sau dreptunghi) */
{ case T_CERC:
ar i a = M_PI * pow( p_f i gur a- >cer c. r aza, 2) ;
br eak;

1
SEMESTRUL al II-lea Referat de laborator nr. 1 Limbajul C++
case T_DREPTUNG:
ar i a = f abs( ( p_f i gur a- >dr ept ung. x2 - p_f i gur a- >dr ept ung. x1) *
( p_f i gur a- >dr ept ung. y2 - p_f i gur a- >dr ept ung. y1) ) ;
br eak;
def aul t : pr i nt f ( " Fi g. Necun. f unct i ei de cl acul al ar i ei ! \ n" ) ; }
r et ur n ar i a; }

/* Functia af i s_f i gur a Afiseaza informatiile despre figura */
voi d af i s_f i gur a( FI GURA *p_f i gur a)
{ pr i nt f ( " Af i sar e: " ) ;
swi t ch( p_f i gur a- >t i p)
{ case T_CERC:
pr i nt f ( " Cer cul cu r aza %f si cent r ul ( %f , %f ) \ n" ,
p_f i gur a- >cer c. r aza, p_f i gur a- >cer c. x, p_f i gur a- >cer c. y) ;
br eak;
case T_DREPTUNG:
pr i nt f ( " Dr ept unghi cu col t ur i l e: ( %f , %f ) si ( %f , %f ) \ n" , \
p_f i gur a- >dr ept ung. x1, p_f i gur a- >dr ept ung. y1,
p_f i gur a- >dr ept ung. x2, p_f i gur a- >dr ept ung. y2) ;
br eak;
def aul t : pr i nt f ( " Fi gur a necunoscut a! \ n" ) ;
}
}

/* Ambele functii primesc ca argument un pointer catre tipul FIGURA */
/*------------------------------------------------------------------------------------------------------------
Fisierul figtst1.c Programul de test
------------------------------------------------------------------------------------------------------------*/
#i ncl ude <st di o. h>
#i ncl ude " cf i gur a. h"
mai n( )
{ i nt i ;
FI GURA s[ 2] ; /* vector cu 2 elemente de tip FI GURA */
/* Initializarea elementelor vectorului */
//un dreptunghi
s[ 0] . t i p=T_DREPTUNG; s[ 0] . dr ept ung. x1 = 80. 0;
s[ 0] . dr ept ung. y1=30. 0; s[ 0] . dr ept ung. x2=120. 0; s[ 0] . dr ept ung. y2=50. 0;
//un cerc
s[ 1] . t i p=T_CERC; s[ 1] . cer c. x=200. 0;
s[ 1] . cer c. y=100. 0; s[ 1] . cer c. r aza=50. 0;
f or ( i = 0; i < 2; i ++)
pr i nt f ( " Ar i a el ement ul ui de i ndi ce %d di n vect or ( de t i pul %d) est e=
%f \ n" , i , s[ i ] . t i p, cal cul _ar i e( &s[ i ] ) ) ;
/* Afisarea informatiilor despre elementele vectorului */
f or ( i = 0; i < 2; i ++) af i s_f i gur a( &s[ i ] ) ;
r et ur n 0; }

/* Rezultatele obinute n urma execuiei:

Aria elementului [0] = 7853.981634
Aria elementului [1] = 5000.000000
Afisare: Cerc cu raza 50.000000 si centrul (100.000000, 100.000000)
Afisare: Dreptunghi cu colturile: (100.000000, 150.000000) si (200.000000, 100.000000)
Aria elementului de indice 0 din vector (de tipul 2) este= 800.000000
Aria elementului de indice 0 din vector (de tipul 2) este= 7853.981634
Afisare: Dreptunghi cu colturile: (80.000000, 30.000000) si (120.000000, 50.000000)
Afisare: Cercul cu raza 50.000000 si centrul (200.000000, 100.000000) */


2
SEMESTRUL al II-lea Referat de laborator nr. 1 Limbajul C++

Exemplul 2:
Exemplul 2 mbuntete implementarea anterioar.
n fiierul figobj.h se definesc tipurile de date CLASA (tip de date), OBIECT (instan a unei clase) i
MESAJ (pentru gestiunea mesajelor prin care comunic obiectele ntre ele). Tot n acest fiier sunt declarate
funciile pentru crearea unui nou obiect (n C++, din punct de vedere al rolului, vor fi constructorii) i funciile
de lucru asupra mesajelor.
n fiierul oricefig.h se definete clasa generic generic_figura, care conine date i funcii comune
tuturor figurilor.
n fiierul objutil.c (.cpp) sunt definite funciile utilitare C, pentru exemplul programrii obiectuale.

n fiierele obj_cerc.c (.cpp), respectiv obj_drep.c (.cpp) se implementeaz clasele cerc
(cerc_clasa), respectiv dreptunghi (drept_clasa), ambele fiind clase derivate din clasa de baz
generic_figura.
Fiierul fig_test.c (.cpp) testeaz implementarea OOP a figurilor geometrice cerc i dreptunghi.

/* ----------------------------------------------------------------------------------------------------------------
Fisierul figobj.h Fisier header cu definitiile figurilor
----------------------------------------------------------------------------------------------------------------*/
#i f ! def i ned( FI GOBJ _H)
#def i ne FI GOBJ _H
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st dar g. h>
#i ncl ude <mat h. h>
t ypedef st r uct MESAJ
{ i nt i d_mesaj ; /* Identificator mesaj */
i nt ( *mesaj _handl er ) ( ) ; /* Functie gestiune mesaj, pointer catre functie */
} MESAJ ;
t ypedef st r uct CLASA
{ st r uct CLASA *p_cl asa_baza; /* Pointer catre clasa de baza */
i nt mar i me; /* Marimea instantei */
i nt num_mesaj e; /* Numarul mesajelor */
MESAJ *mesaj e; /* Tabela de mesaje */
} CLASA;
t ypedef st r uct OBI ECT
{ voi d *p_dat a; /* Data instanta */
CLASA *p_cl asa; /* Pointer catre structura CLASA */
} OBI ECT;

#def i ne ALOC_DATA 1
#def i ne AFI S 2
#def i ne CALCUL_ARI E 3
/* Functii pentru crearea obiectelor */
OBI ECT *nou_cer c( doubl e x, doubl e y, doubl e r aza) ;
OBI ECT *nou_dr ept ung( doubl e x1, doubl e y1, doubl e x2, doubl e y2) ;
/* Functii pentru lucrul asupra mesajelor */
i nt send_mesaj ( OBI ECT *p_obj , i nt msgi d, . . . ) ;
i nt cl asa_mesaj ( CLASA *p_cl asa, OBI ECT *p_obj , i nt msgi d, va_l i st ar gp) ;
voi d *al oc_mem( si ze_t oct et i ) ;
i nt get _of f set ( CLASA *p_cl asa) ;
#endi f
/ * #i f ! def i ned( FI GOBJ _H) */

/* ----------------------------------------------------------------------------------------------------------------
Fisierul oricefig.c Clasa generica " gener i c_f i gur a" : Date, functii comune tuturor figurilor
----------------------------------------------------------------------------------------------------------------*/
#i ncl ude " f i gobj . h"
st at i c i nt al oc_dat a( OBI ECT *p_obj , va_l i st ar gp) ;
st at i c MESAJ mesaj e[ ] =
{ ALOC_DATA, al oc_dat a
};

3
SEMESTRUL al II-lea Referat de laborator nr. 1 Limbajul C++
CLASA gener i c_f i gur a = /* Clasa structura de date */
{ NULL, /* fara clasa baza */
0, /* fara date comune */
si zeof ( mesaj e) / si zeof ( MESAJ ) , /* cate mesaje */
mesaj e /* tabela de mesaje */
};

/* Functia al oc_dat a Aloca memorie pentru un datele obiectului */
st at i c i nt al oc_dat a( OBI ECT *p_obj , va_l i st ar gp)
{ CLASA *p_cl asa;
i nt mar i me = 0;
/* Determina suma marimilor datelor instantelor fiecarei clase */
f or ( p_cl asa = p_obj - >p_cl asa, mar i me = 0; p_cl asa ! = NULL;
p_cl asa = p_cl asa- >p_cl asa_baza)
mar i me += p_cl asa- >mar i me;
/* Aloca memoria necesara */
p_obj - >p_dat a = al oc_mem( mar i me) ;
r et ur n 1; }

/* -------------------------------------------------------------------------------------------------------------
Fisierul: objutil.c Functii utilitare pentru exemplul programarii obiectuale in C
-------------------------------------------------------------------------------------------------------------*/
#i ncl ude " f i gobj . h"
/* Functia send_mesaj Mesaj catre un obiect prin transmiterea mesajului catre clasa */
i nt send_mesaj ( OBI ECT *p_obj , i nt msgi d, . . . )
{ i nt st at us; va_l i st ar gp; va_st ar t ( ar gp, msgi d) ;
st at us = cl asa_mesaj ( p_obj - >p_cl asa, p_obj , msgi d, ar gp) ;
va_end( ar gp) ; r et ur n( st at us) ; }

/* Functia cl asa_mesaj Cauta in tabele "mesaje" un anumit mesaj si apeleaza
" mesaj _handl er " in cazul in care il gaseste */
i nt cl asa_mesaj ( CLASA *p_cl asa, OBI ECT *p_obj , i nt msgi d, va_l i st ar gp)
{ i nt i , st at us; i f ( p_cl asa == NULL) r et ur n 0;
i f ( p_cl asa- >mesaj e ! = NULL)
{ f or ( i = 0; i < p_cl asa- >num_mesaj e; i ++)
i f ( p_cl asa- >mesaj e[ i ] . i d_mesaj == msgi d)
{
r et ur n ( ( *p_cl asa- >mesaj e[ i ] . mesaj _handl er ) ( p_obj , ar gp) ) ; }
/* Daca mesaj netratat, trimite-l clasei de baza */
st at us=cl asa_mesaj ( p_cl asa- >p_cl asa_baza, p_obj , msgi d, ar gp) ;
}
r et ur n( st at us) ; }

/* Functia al oc_memAlocarea memoriei */
voi d al oc_mem( si ze_t numbyt es)
{ voi d *pt r ;
i f ( ( pt r = cal l oc( 1, numbyt es) ) == NULL)
{ f pr i nt f ( st der r , " Er . al ocar e pt r %d oct de memor i e. " , numbyt es) ;
exi t ( 1) ; }
r et ur n( pt r ) ; }

/* Functia get _of f set O data a instantelor este concatenarea datelor tuturor claselor din ierarhie. Functia
calculeaza offset-ul (deplasarea) fata de inceputul datei unei anumite clase */
i nt get _of f set ( CLASA *p_cl asa)
{ CLASA *p_ct ;
i nt mar i met = 0;
/* parcurgerea ierarhiei de clase */
f or ( p_cl asa=p_cl asa- >p_cl asa_baza; p_cl asa ! = NULL;
p_cl asa = p_cl asa- >p_cl asa_baza) mar i met += p_cl asa- >mar i me;
r et ur n mar i met ; }

/* -------------------------------------------------------------------------------------------------------------

4
Fisierul: obj_cerc.c Clasa cerc
SEMESTRUL al II-lea Referat de laborator nr. 1 Limbajul C++
-------------------------------------------------------------------------------------------------------------*/
#i ncl ude " f i gobj . h"
#def i ne M_PI 3. 14
t ypedef doubl e *P_DOUBLE;
t ypedef st r uct DATE_CERC
{ doubl e x, y; /* Coordonatele centrului */
doubl e r aza; /* Raza cercului */
} DATE_CERC;
ext er n CLASA gener i c_f i gur a; /* Clasa de baza */
st at i c i nt cal cul _ar i e( OBI ECT *p_obj , va_l i st ar gp) ;
st at i c i nt af i s( OBI ECT *p_obj , va_l i st ar gp) ;
st at i c MESAJ mesaj e[ ] =
{ CALCUL_ARI E, cal cul _ar i e, AFI S, af i s };

/* Structura de date "clasa" */
CLASA cer c_cl asa =
{ &gener i c_f i gur a, /* Ptr catre clasa baza */
si zeof ( DATE_CERC) , /* Date ptr cercuri */
si zeof ( mesaj e) / si zeof ( MESAJ ) , /* Numar mesaje */
mesaj e /* Tabela mesaje */
};
st at i c i nt cer c_of f set = - 1; /* Offset pentru date cerc */

/* Functia nou_cer c creaza o instanta de tip cerc si o initializeaza */
OBI ECT *nou_cer c( doubl e x, doubl e y, doubl e r aza)
{ OBI ECT *p_obj ; DATE_CERC *p_dat a;
p_obj = ( OBI ECT *) al oc_mem( si zeof ( OBI ECT) ) ;
p_obj - >p_cl asa = &cer c_cl asa;
/* Trimitere mesaj si aloca memorie pentru date */
send_mesaj ( p_obj , ALOC_DATA, 0) ;
/* offset to pentru datele cerc */
i f ( cer c_of f set < 0)
cer c_of f set = get _of f set ( &cer c_cl asa) ;
p_dat a = ( DATE_CERC *) ( ( char *) p_obj - >p_dat a+cer c_of f set ) ;
p_dat a- >x = x; p_dat a- >y = y; p_dat a- >r aza = r aza;
r et ur n( p_obj ) ; }

/* Functia cal cul _ar i e Calculul ariei cercului. */
st at i c i nt cal cul _ar i e( OBI ECT *p_obj , va_l i st ar gp)
{ i nt st at us = 0; doubl e *p_ar ea;
DATE_CERC *p_dat a; /* Pointer catre date cerc */
p_dat a=( DATE_CERC*) ( ( char *) p_obj - >p_dat a+cer c_of f set ) ;
/* Val. pointer catre double cand raspunsul este returnat */
p_ar ea = va_ar g( ar gp, P_DOUBLE) ;
i f ( p_ar ea ! = NULL)
{ *p_ar ea=M_PI *p_dat a- >r aza*p_dat a- >r aza; st at us = 1; }
r et ur n( st at us) ;
}

/* Functia af i s Afisare cerc */
st at i c i nt af i s( OBI ECT *p_obj , va_l i st ar gp)
{ DATE_CERC *p_dat a;
/* Setare pointer catre cerc */
p_dat a=( DATE_CERC*) ( ( char *) p_obj - >p_dat a+cer c_of f set ) ;
pr i nt f ( " Af i sar e: Cer c cu r aza %f si cent r ul ( %f , %f ) \ n" ,
p_dat a- >r aza, p_dat a- >x, p_dat a- >y) ;
r et ur n 1;
}

/* --------------------------------------------------------------------------------------------------------------
Fisierul: obj_drep.c
--------------------------------------------------------------------------------------------------------------*/

5
SEMESTRUL al II-lea Referat de laborator nr. 1 Limbajul C++
#i ncl ude " f i gobj . h"

t ypedef doubl e *P_DOUBLE;

t ypedef st r uct DATE_DREPT
{ doubl e x1, y1; /* Coordonate colt stanga sus */
doubl e x2, y2; /* Coordonate colt dreapta jos */
} DATE_DREPT;

ext er n CLASA gener i c_f i gur a; /* Clasa baza */

st at i c i nt cal cul _ar i e( OBI ECT *p_obj , va_l i st ar gp) ;
st at i c i nt af i s( OBI ECT *p_obj , va_l i st ar gp) ;

st at i c MESAJ mesaj e[ ] =
{ CALCUL_ARI E, cal cul _ar i e, AFI S, af i s };

/* Structura de date " cl asa" */
CLASA dr ept _cl asa =
{ &gener i c_f i gur a, si zeof ( DATE_DREPT) ,
si zeof ( mesaj e) / si zeof ( MESAJ ) ,
mesaj e
};

st at i c i nt dr ept _of f set = - 1;

/* nou_dreptunghi */
OBI ECT *nou_dr ept ung( doubl e x1, doubl e y1, doubl e x2, doubl e y2)
{ OBI ECT *p_obj ; DATE_DREPT *p_dat a;
p_obj = ( OBI ECT *) al oc_mem( si zeof ( OBI ECT) ) ;
p_obj - >p_cl asa = &dr ept _cl asa;
send_mesaj ( p_obj , ALOC_DATA, 0) ;
i f ( dr ept _of f set < 0) dr ept _of f set = get _of f set ( &dr ept _cl asa) ;
p_dat a = ( DATE_DREPT *) ( ( char *) p_obj - >p_dat a+dr ept _of f set ) ;
p_dat a- >x1 =x1; p_dat a- >y1 = y1; p_dat a- >x2 = x2; p_dat a- >y2 = y2;
r et ur n( p_obj ) ; }

/* calcul_arie */
st at i c i nt cal cul _ar i e( OBI ECT *p_obj , va_l i st ar gp)
{ i nt st at us = 0; doubl e *p_ar ea; DATE_DREPT *p_dat a;
p_dat a = ( DATE_DREPT *) ( ( char *) p_obj - >p_dat a+dr ept _of f set ) ;
p_ar ea = va_ar g( ar gp, P_DOUBLE) ;
i f ( p_ar ea ! = NULL)
{*p_ar ea=f abs( ( p_dat a- >x2- p_dat a- >x1) *( p_dat a- >y2- p_dat a- >y1) ) ;
st at us = 1; }
r et ur n( st at us) ; }

/* afis */
st at i c i nt af i s( OBI ECT *p_obj , va_l i st ar gp)
{ DATE_DREPT *p_dat a;
p_dat a=( DATE_DREPT *) ( ( char *) p_obj - >p_dat a + dr ept _of f set ) ;
pr i nt f ( " Af i sar e: Dr ept unghi cu col t ur i l e: "
" ( %f , %f ) si ( %f , %f ) \ n" , p_dat a- >x1, p_dat a- >y1,
p_dat a- >x2, p_dat a- >y2) ;
r et ur n 1; }

/* ----------------------------------------------------------------------------------------------------------------
Fisierul de test: fig_test.c Implementare OOP a fig. geometrice cerc si dreptunghi
----------------------------------------------------------------------------------------------------------------*/
#i ncl ude " f i gobj . h"
i nt mai n( voi d)
{ i nt i ; doubl e ar ea; OBI ECT *f i g[ 3] ;
/* Creare figuri (elemente ale vectorului "f i g" */

6
SEMESTRUL al II-lea Referat de laborator nr. 1 Limbajul C++
f i g[ 0] = nou_cer c( 100. 0, 100. 0, 50. 0) ;
f i g[ 1] = nou_dr ept ung( 100. , 150. , 200. , 100. ) ;
/* Calcul arii */
f or ( i = 0; i < 2; i ++)
{ send_mesaj ( f i g[ i ] , CALCUL_ARI E, &ar ea) ;
pr i nt f ( " Ar i a el ement ul ui [ %d] = %f \ n" , i , ar ea) ; }
/* "afisare" figuri */
f or ( i = 0; i < 2; i ++)
send_mesaj ( f i g[ i ] , AFI S) ;
r et ur n 0; }

/* Rezultatele execuiei:

Aria elementului [0] = 7853.981634
Aria elementului [1] = 5000.0000000
Afisare: Cerc cu raza 50.000000 si centrul (100.000000, 100.000000)
Afisare: Dreptunghi cu colturile: (100.000000, 150.000000) si (200.000000, 100.000000) */

7

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