Daniel Terzella Leandro Amancio Eduardo Bruno …...7HPSODWHV — ’HFODUDom G WHPSODWH˛ FRPHo FR...

Preview:

Citation preview

*HQHULF 3URJUDPPLQJ

Daniel Terzella

Leandro Amancio

Eduardo Bruno Hadlich

$XWRUHV

� 'DYL

5 � 0XVVHU

� $OH[DQGH

$ � 6WHSDQRY

� $UWLJ

DSUHVHQWDG

H

���� � H

5RP

±,WiOLD�

3URJUDPDom *HQpULFD

� 'HILQLom

GR

$XWRUHV

� ³*HQHULF 3URJUDPPLQ

FHQWHU

DURXQ

WK

LGH

R

DEVWUDFWLQ

IUR

FRQFUHWH HIILFLHQ

DOJRULWKP

W

REWDL�

JHQHUL

DOJRULWKP

WKD

FD

E

FRPELQH�

ZLW

GLIIHUHQ

GDW

UHSUHVHQWDWLRQ�W

�SURGXF

� �

ZLG

YDULHW

R

XVHIX

VRIWZDUH�´

3URJUDPDom *HQpULFD

� 2XWU

GHILQLomR

� 3URJUDPDom

*HQpULF

SRG�

VH

GHILQLG

FRP

³SURJUDPDom

FR�

FRQFHLWRV´ � RQG

X

FRQFHLW

p GHILQLG�

FRP

XP

IDPtOL

G

DEVWUDo}H

TX

Vm

UHODFLRQDGD

SR

X

FRQMXQW

FRPX�

G

UHTXLVLWRV�

$QDORJLD

&ODVVLILFDom GD $EVWUDo}HV

� $EVWUDom

G

GDGRV

� 7LSR

G

GDGR

� �

RSHUDo}H�

GHILQLGD

VREU

� �

OHV

� 3RGH

VH

HQWHQGLGD�

LQGHSHQGHQWHPHQW

G

VX

LPSOHPHQWDomR� 3LOKDV � /LVWDV � )LODV

&ODVVLILFDom GD $EVWUDo}HV

� $EVWUDom

G

DOJRULWPRV

� )DPtOLD

G

DEVWUDo}H

G�

GDGR

FR

RSHUDo}H

FRPXQ

HQWU� �

OHV� $OJRULWPR

G

RUGHQDom�

SDU

OLVWDV

LOKD

� �

ILODV

,GpLDV�FKDYH

� (OHYD

� �

QtYH

G

DEVWUDom

G

DOJRULWPR

FRQFUHWR

� �

H

SHUGH

HILFLrQFLD�

� 8WLOL]D

DOJRULWPR

� �

H

V

SUHRFXSD

FR

DEVWUDom

G

GDGRV�

� 5HSUHVHQWDo}H

ODUJDPHQW

DGDSWiYHL

SDU

VXSRUWD

VH

� �

V

GLUHW

Q

FRQVWUXom

G

VRIWZDUH�

8WLOL]DomR

� 'HILQLom

G

XP

FODVV

JHQpULF�

p IHLW

XP

~QLF

YH

� � �

O

p UHXWLOL]DG

DWUDYp�

G

HQYL

G

SDUkPHWURV � �3DUDPHWUL]DomR�

� (VSHFLILFDom

GR

DOJRULWPR

H

WHPS

G

FRPSLODomR�

� 67

H

&��

([HPSO DEVWUDWR

� &ODVVH

FRQFUHWDV

� 5HDOBVWDFN � ,QWHJHUBVWDFN � %RRNBVWDFN

� &ODVV

JHQpULFD

� 6WDFN>*

� RQG

� � �

X

SDUkPHWU

JHQpULFR

� &ODVV

UHXWLOL]iYH

H

GLYHUVD

DSOLFDo}HV

7HPSODWHV

� 'HILQLomR

Vm

XP

� �

ERUGDJH

SDU

SURJUDPDom

JHQpULFD � XP

HVWUDWpJL

G

SURJUDPDom�

Q�

TXD

FRQMXQWR

G

DOJRULWPR

Vm

SDUDPHWUL]DGR

SR

XP

YDULHGDG

G

WLSR

G

GDGRV�HVWUXWXUD

G

GDGR

DGHTXDGDV�

PHFDQLVP

GH 7HPSODWHV H

&�

SHUPLW

TX

X

WLS

VHM

XP

SDUkPHWU

Q

GHILQLom

G

XP

FODVV

R

IXQomR �

� 6H

XV

DEU

QRYD

SRVVLELOLGDGH

Q

OLQJXDJHP � WDL

FRP

� �

GHVFULom�

G

DOJRULWPR

TX

V

[HFXWD

H

WHPS

G

FRPSLODomR ��

JHUDom

� �

WLPL]DG

G

FyGLJR

� � �

UHXV

G

FyGLJR�

7HPSODWHV

XV

G

7HPSODWH

� � �

PRVWUR

HVVHQFLD�

Q�

SURMHW

G

ELEOLRWHF

SDGUm

G

&

� �

�67/� � XP�

YH

TX

D

HVWUXWXUD

� �

DOJRULWPR

O

GHILQLGR�

GHYH

VH

G

XV

JHUD

VH

FRPSURPHWH

VX

HILFLrQFLD $VVLP � YiULR

DOJRULWPR

SRGH

VH

XVDGR�

FR

YiULD

HVWUXWXUD

G

GDGRV

7HPSODWHV

� 8P WHPSODWH Qm

FDXV

SHUG

G

GHVHPSHQKR

WUDQVIRUPDom

G

XP WHPSODWH �DEVWUDWR

� �

XP

FODVV

�FRQFUHWD

� �

IHLW

H

WHPS�

G�

FRPSLODomR

WDPEp

Qm

LPSOLF

Q

UHGXom�

G

TXDQWLGDG

G

FyGLJ

JHUDGR

V

WHQK

H

H

�SURMHW

GXD

FODVVH

GHULYDGD

G

XP WHPSODWH � FyGLJ

VHU

JHUDG

G

IRUP

HTXLYDOHQW� �

GHILQLom

GLUHW

G

GXD

FODVVH

Qm

UHODFLRQDGDV �

7HPSODWHV

� 'HFODUDom

G

WHPSODWH� FRPHo

FR� �

SDODYU

FKDY

WHPSODW

VHJXLG

SR

XP

OLVW�

G�

SDUkPHWUR

G

WLSR

IRUPDL

FRORFDG

HQWU

R� �

tPEROR

� �

! �

7RG

SDUkPHWU

IRUPD

SUHFHGLG�

SHO

SDODYUD�FKDY

W\SHQDP

R

SHO

SDODYUD�FKDYH FODVV�

� 3DUkPHWUR

G

WLSR�

IRUPDL

Vm

WLSR

SULPLWLYR

R

WLSR

GHILQLGR

SHO�

SURJUDPDGRU � XVDGR

SDU

HVSHFLILFD

R

WLSR�

G�SDUkPHWUR

G

FODVV

R

IXQomR �

WLS

G�

UHWRUQ

G

IXQom

� �

SDU

GHFODUD

YDULiYHL

GHQWU�

G

FRUS

G

IXQomR�

([HPSO )XQom *HQpULFD

template < class T>T maximum (T value1, T value2, T value3){

T max = value1;if (value2 > max)

max = value2;

if (value3 > max)max = value3;

retunr max;}

8V G )XQom *HQpULFD

//versão para inteirosint main (){

int int1, int2, int3cout << “ Forneça 3 va lores inteiros: ” ;cin >> int1 >> int2 >> int3;cout << “ O maior valor inteiro é: ”

<< maximum (int1, int2, int3);���

8V G )XQom *HQpULFD

...//versão para doubledouble double1, double2, double3

cout << “ Forneça 3 valores double: ” ;cin >> double1 >> double2 >> double3;cout << “ O maior valor double é: ”

<< maximum (double1, double2, double3);...

8V G )XQom *HQpULFD...//versão para caractereschar char1, char2, char3

cout << “ forneça 3 caracteres: ” ;cin >> char1 >> char2 >> char3;cout << “ O maior valor de caractere é: ”

<< maximum (char1, char2, char3);

return 0;} //fim do main

5HVXOWDG G 8V G )XQomR

Forneça 3 valores inteiros: 1 2 3O maior valor inteiro é: 3

Forneça 3 valores double: 3.3 2.2 1.1O maior valor double é: 3.3

Forneça 3 caracteres: A C BO maior valor de caractere é: C

5HVXOWDG G XV G )XQomR

� 5HVXWDGR G

FRPSLODom

� � �

PHVP

TX�

V�

IRVVH

HVFULWD

� �

IXQo}H

GLIHUHQWH

SDU

FDG�

WLSR � R

VHMD �

FRPSLODG

XP

IXQom

SDU

RSHUD�

FR

LQW � XP

SDU

GRXEOH

RXWU

SDU

FKDU�

� 4XDQG

� �

IHLW

� �

FRPSLODomR � WRGD

D

UHIHUrQFLD

IHLWD

� �

FODVV

Q

IXQom�

JHQpULF

Vm

VXEVWLWXtGD

SHO

WLS

HQYLDG�

SR�

SDUkPHWUR�

([HPSO G )XQom &RPSLODGD

int maximum (int value1, int value2, int value3){

int max = value1;if (value2 > max)

max = value2;

if (value3 > max)max = value3;

retunr max;}

8V G )XQom SR

XP &ODVVH

3HVVRD

SB1RPHSB,GDGHSB5*SB$OWXUD

Se fossem passados para a função 3 Objetos da classe Pessoa?

)XQom

&RPSLODG

FR &ODVV

3HVVRD

Pessoa maximum (Pessoa value1, value2, value3){Pessoa max = value1;if (value2 > max)

max = value2;

if (value3 > max)max = value3;

retunr max;}

Como fazer “Pessoa1 > Pessoa2” ?

)XQom

*HQpULF

FR &ODVV

3HVVRD

� 4XDQG

V

� �

VFUHYH

� �

IXQom

JHQpULF�

Qm�

V

VDEL

� �

SULRU

TXD

� �

PpWRG

TX

FRPSDU�

R

GDGRV �

MXVWDPHQW

SRUTX

� �

FODVV

TX

FKDP

HVV

PpWRG

JHQpULF

�template� �

� $SHQD

DEH�V

TX

SDU�

TX

XP

FODVV

G

� �

QWUDG

SRVV

XVD

HVV

IXQomR �

SUHFLV

TX

� �

PpWRG

operator> HVWHM

GHILQLGR�

6REUHFDUJD

� 6REUHFDUJ

REMHWLY

IRUQHFH

SDU�

WLSR

GHILQLGR

SHO

XVXiUL

D

PHVPD�

H[SUHVV}H

TX

&

� �

IRUQHF

SDU

VHX�

WLSR�

SULPLWLYRV�

� &RP

SRGHPR

� �

DEH�

TXH

��

PDLR

SHVVRD"R: Pode ser visto pela Altura. A maior pessoaé a mais alta!

6REUHFDUJD

� 'HYH�V

VREUHFDUUHJD

� �

RSHUDGR�

G�

! SDU

TX

� �

FODVV

SHVVR

SRVV

XVD

� �IXQomR�

3HVVRD

SB1RPHSB,GDGHSB5*SB$OWXUD

RSHUDWRU!

6REUHFDUJD

Exemplo de função sob recarregada: //recebe objeto pessoa como parâmetroboo l operator> (Pessoa &A) { return (p_Altura > A.p_Altura) }

Na função genérica quando for feito:if (value1 > max)

seria como se estivesse chamando uma função da classe:value1.operator>(max);

2%6

2XWU

� �

SHUDGR�

TX

GHYHUL

VH

VREUHFDUUHJDG

VHULD

� �

SHUDGR�

G�

DWULEXLom

� ��

6REUHFDUJD

� ([LVWH

YiULD

PDQHLUD

G

V

VREUHFDUUHJD

SRUpP � EDVWD�V

VDEH

TX

VREUHFDUJ

� �

X

UHFXUV�

IDFLOLWDGR

SDU

� �

SURJUDPDom

JHQpULF

XVDQG�

WHPSODWH

H

&�� �� 6REUHFDUJ

� �

X

SURFHGLPHQW

EH

FRPX

Q�

/LQJXDJH

&�� � SR

H[HPSO

� � �

SHUDGR

VRP

��

H[HFXW�

G

PDQHLUD

GLIHUHQWH

SDUD LQWV� IORDWV � GRXEOHV SRL

M

IRUD

VREUHFDUUHJDGR

Q

OLQJXDJH

&���

� 0D

SDU

TX

LVV

RFRUU�

GHYH�V

WH

FODVVH

� �

IXQo}H

EH

GRFXPHQWDGD

SDU

TX�

VH

XVXiUL

WHQK

QRom

G

TX

PpWRGR

FULD

Q

VX�

FODVV

SDU

XVD

GHWHUPLQDG

FODVV

R

IXQom

JHQpULFD�

0DL G X 3DUkPHWUR

� REVHUYDom

LPSRUWDQWH�

FRP

SUHFLVDPR

GHILQL

� �

LQVWDQFLDomR H

WHPS

G

FRPSLODomR � FHUWR

SDUkPHWUR

GHYH

VH

LQVWDQFLDGR

SR

OLWHUDLV�

YRL

I�LQW L

%XIIHU�LQW � L! E[

��HUU

`

� X

WHPSODWH SRG

WH

PDL

G

X

SDUkPHWUR � 3RU H[HPSOR�

WHPSODWH�FOD

� �

7� LQW L

FODV

%XIIH� �

Y>L@�

LQ

V]

SXEOLF

%XIIHU�

� V]�L

^`

������`

%XIIHU�IORDW � ���! FEXI�

(VSHFLDOL]DomR�

WHPSODWH JHQpULF

GHY

VH

GHFODUDG

DQWH

G�

TXDOTXH

HVSHFLDOL]DomR

� WHPSODWH�FODVV 7

FOD

� �

/LVW ^� ��� �`�

��WHPSODWHJHQpULF

� WHPSODWH�FODVV 7

FOD

� �

/LVW�7

^� ��� �`

��WHPSODWH HVSHFLDOL]DG

H

SRQWHLURV

� 1HVW

VLWXDomR �

FRPSLODGR�

SULPHLUDPHQW

LU

SURFXUD

WHPSODW

HVSHFLDOL]DG

� /LVW�SRQWHLUR!

DQWH

G

TXDOTXHUWHPSODW

/LVW SDUDPHWUL]DG

SR

X

SRQWHLUR �

� 'HVW

IRUPD � FULD�V�

FR

� �

HQR

WUDEDOK

XP

LQWHUIDF

SDU

XP

FODVV

PDL�

JHQpULF

� �

D

PHVP

WHPS

XP

~QLF

FODVV

SDU

WRGR

R

WLSR

G

/LVW

G

SRQWHLUR�

3ROLPRUILVP 7HPSODWHV

� WHPSODWHV

IXQo}H

YLUWXDL

WH

REMHWLYR�

EDVWDQW

VHPHOKDQWHV� SHUPLWH

��

FULDom�

G

FRQMXQWR

G

WLSR

G

GDGR

FRPSDUWLOKDQG

�XP

LQWHUIDF

H

FRPXP �

� )XQo}H

YLUWXDL

IRUQHFH

X

�WLS

�G

FRPSRUWDPHQWRSROLPyUILFR H

WHPS

G

� �

[HFXomR HQTXDQWR WHPSODWHVDJH

H

WHPS

G

FRPSLODomR �

� 4XDQG

XWLOL]D

X�

R�

RXWUR"

3ROLPRUILVP 7HPSODWHV

funções virtuais são adequadas quando existe uma hierarquia entre as classes que compartilham aquela interface, possibilitando uma forma elegante de permitir diferentes implementações de um mesmo método

$QLPDO

6 � 'LJHVWLYR

*DOLQKD

6 � 'LJHVWLYR

+XPDQR

6 � 'LJHVWLYR

3ROLPRUILVP 7HPSODWHV

� WHPSODWHV WUDWD

VXD

FODVVH

LQVWDQFLDGD�

H�

LJXD

QtYH

KLHUiUTXLFR �

LPSOHPHQWDom

G

X

� �pWRG

� �

~QLFD

SRGHP�V

XWLOL]D

HVSHFLDOL]Do}H

SDU

GHWHUPLQD

D

OLJHLUD

GLIHUHQoD

HQWU

D

FODVVH�

�V�

QHFHVViULR� �

HQTXDQW

� �

DOJRULWP

SULQFLSD� � �

PHVP

SDU

HVW

FRQMXQW

G

FODVVHV �

� $Op

GLVVR � SR

TXHVW}H�G

�HILFLrQFLD � SRG

VH

PDL

LQWHUHVVDQW

UHRUJDQL]DGHWHUPLQDGR

PpWRGR

H

WHPSODWHV D

LQYp

G�

GLVWULEXt�ORV H

IXQo}H

YLUWXDL

SUHVHQWH

H

GLIHUHQWH

FODVVHV�

3ROLPRUILVP 7HPSODWHV

� H[HPSO

JHQpULFR

FRQKHFHPR

� �

FRQFHLW� � �

FRPSRUWDPHQW

G

XP

SLOK

�³~OWLP� �

HQWUD

� � �

SULPHLU

� �

VDLU´

VH

HVP

VDEH�

GR

WLSR

G

LWHQ

TX

HVWm

LQVHULGR

QHOD � 0D

TXDQG�

FKHJ

Q

PRPHQW

G

HIHWLYDPHQW

LQVWDQFLD

XP

SLOKD � X

WLS

G

GDGR

GHY

VH

HVSHFLILFDGR � 1HFHVVLWDPR

G

PHLR

G

GHVFUHYH

� �

QRom

G

SLOK

JHQHULFDPHQW

� �

LQVWDQFLD

FODVVH

TX

Vm

YHUV}H

GHVW

FODVV�

JHQpULF

G

SLOK

SDU

WLSR

HVSHFtILFR

G

SLOKD � (VW

UHFXUV

� �

IRUQHFLG

SR

7HPSODWHV�

3LOK

*HQpULF

�/,)2�

[\Z]DE

([HPSO G &ODVV *HQpULFD

//declaração da classe Pilhatemplate< class T> class Stack{public:

Stack (int = 10); //construtor default (tamanho da pilha 10)~Stack() { delete[] stackPtr;} //destruidorboll push ( const T&); //insere um elemento na pilha

private:int size ; //quantidade de elementos na Pilhaint top; //posição do elemento no topo da pilhaT *stackPtr; //ponteiro para pilha

boll isEmpty() const {retunr top == -1;}boll isFull() const {retunr top == size - 1;}

};

([HPSO G &ODVV *HQpULFD//Construtor com tamanho default 10template<class T>Stack<T>::Stack ( int s ) {

size = (s > 0 ? s : 10);top = -1; //inicialmente stack está vaziastackPtr = new T[ size ] //aloca espaço para elementos

}// insere um elemento na pilha (retorna 1 se bem sucedida e 0 caso contrário)template < class T >boll stack <T>:: push ( const T &pushValue){

if ( ! IsFull() ) {stackPtr[ ++top ] = pushValue; //coloca item em Satckretunr true; //push bem sucedida

}else { retunr false; } //push mal sucedida

}

([HPSO G &ODVV *HQpULFD

//retira um elemento da pilhatemplate< class T >boll stack <T>:: pop ( T &popValue){

if ( ! isEmpty() ){popValue = stackPtr[ top- ]; //remove item de stackreturn true; //operação pop bem sucedida

}return false; //pop mal sucedido}

8V G &ODVV 3LOK *HQpULFDint main(){//uso da pilha com doublestack < dou ble > doubleStack(5);dou ble f = 1.1;cout << “ Inserindo elementos em doub leStack\n”

while ( doubleStack.push( f ) ) //sucesso true retornado{ cout << f << ‘ ’ ;

f += 1.1; }

cout << “ \nStack está cheia. Não pod e inserir ” << f << “ \nRetirando elementos de doubleStack\n ” ;

while (doubleStack.pop ( f ) ) //sucesso: true retornadocout << f << ‘ ’;

cout << “ \nStack está vazia. Não pod e retirar\n” ;

8V G &ODVV 3LOK *HQpULFD... //uso da pilha com inteiroStack< int > inStack; //usa construtor defaultInt i = 1;cout << “ Inserindo elementos em intStack\n”

while ( intStack.push( i ) ) //sucesso true retornado{ cout << i << ‘ ’ ;

++i; }

cout << “ \nStack está cheia. Não pod e inserir ” << i<< “ \nRetirando elementos de intStack\n ” ;

while (intStack.pop ( i ) ) //sucesso: true retornadocout << i << ‘ ’;

cout << “ \nStack está vazia. Não pod e retirar\n” ;

return 0; } //fim do main

5HVXOWDG G 8V G 3LOKDInserindo elementos em doub leStacK1.1 2.2 3.3 4.4 5.5Stack está cheia não pode inserir 6.6

Retirando elementos de doub leStack5.5 4.4 3.3 2.2 1.1Stack está vazia. Não pode retirar

Inserindo elementos em intStack1 2 3 4 5 6 7 8 9 10Stack está cheia não pode inserir 11

Retirando elementos de intStack10 9 8 7 6 5 4 3 2 1Stack está vazia. Não pod e retirar

6WDQGDU 7HPSODW /LEUDU\

� TX

67

"� $SURYDG

H

� � � ��

SHO

FRPLWr G�

SDGU}H

&��

� &ULDGRUHV

$OH[DQGHU 6WHSDQRY � 0HQJ /

� � �

'DYLG 0XVVHU

� %LEOLRWHF

SDGUm

G�

FRPSRQHQWH

UHXWLOL]iYHLV

67

p IRUPDG�

SR

WUr

HOHPHQWR

FKDYH

±FRQWrLQHUHV � LWHUDGRUHV

DOJRULWPR

6WDQGDU 7HPSODW /LEUDU\

� 67/�

67/

$OJRULWPRV

&RQWHLQHUHV

,WHUDGRUHV

3URJ � *HQpULFD

6WDQGDU 7HPSODW /LEUDU\

� &RQWrLQHUHV

� (VWUXWXUD

G

GDGR

SRSXODUH�

SDGURQL]DGDV � FULDGR

DSDUWLU G

WHPSODWHV �

XWLOL]DQGR�V

� �

SDUDGLJP�

G

SURJUDPDom

JHQpULFD� ([�

3LOKDV � /LVWDV � )LODV���

6WDQGDU 7HPSODW /LEUDU\

� $OJRULWPRV

� 8WLOL]DGR

SDU

PDQLSXOD

R�

FRQWHLQHUHV� ([

,QVHULU � 'HOHWDU � 3URFXUDU � &ODVVLILFDU � � �

6WDQGDU 7HPSODW /LEUDU\

� ,WHUDGRUHV

� 6m

XWLOL]DGR

SDU

DFHVVD�

HOHPHQWR

G

FRQWrLQHUHV

6WDQGDU 7HPSODW /LEUDU\

� &RQWHLQHUHV

67

IR

FXLGDGRVDPHQW

SODQHMDG

G

PDQHLU

TX

R

FRQWrLQHUH�

IRUQHoD

IXQFLRQDOLGDGH

VLPLODUHV � G

IRUP

TX

H[LVWD

RSHUDo}H�

JHQpULFD

� �

RXWUD

RSHUDo}H

TX

V�

DSOLFD

� �

VXEFRQMXQWR

G

FRQWHLQHUHV VLPLODUHV�

� ([

IXQom

VL]H �DSOLFDG

� �

WRGR

FRQWHLQHUHV�

� ([

IXQom

HUDVHU �DSHQD

FRQWrLQHUH

G

VXEFODVV

$GDSWDGRUHV�

6WDQGDU 7HPSODW /LEUDU\

� 5HODom

� � �

Q

&RQWrLQHU $OJRULWPRQ Q

� 8

DOJRULWP

SRG�

VH�

XWLOL]DGR SRUYiULRV FRQWHLQHUHV

� 8P FRQWrLQHU SRG

XWLOL]D

YiULR

DOJRULWPRV

6WDQGDU 7HPSODW /LEUDU\

� 2XWUD

ELEOLRWHFDV

� $OJRULWPR

FRQVWUXLGRV QD�

FODVVH

G

FRQWHLQHUHV

$OJRULWP�

$

&RQWrLQHU

$OJRULWP�%

$OJRULWP

&

6WDQGDU 7HPSODW /LEUDU\

� ([HPSOR�

// container

list<string> Friends;

// iterator to the begin

list<string>::iterator begin = Friends.begin()of the container

// iterator to the end of the container

list<string>::iterator end = Friends.end() of the container

// algorithm find() search for "Philippe" in the container

if (find(Friends.begin(),Friends.end(),"Philippe") != Friends.end())

FRXW

� �

�3KLOLSS

L

� �

IULHQ�

R

PLQH

HQG�

6WDQGDU 7HPSODW /LEUDU\

� 9DQWDJHP

� 8VDQG

� �

67/ � SRGHPR

HFRQRPL]D

WHPS

� �

VIRUo

FRQVLGHUiYHL

G�

SURJUDPDom

� �

REWH

FRP

UHVXOWDG�

VRIWZDUH

G

PDLR

TXDOLGDGH�

� GHVHQYROYHGR�

Qm

SHUG

WHPS

Q

FRQVWUXom

G�

FRPSRQHQWH

TX

M

H[LVWH

Q

ELEOLRWHFD

� 6RIWZDUH�

G

PDLR

TXDOLGDGH

3URJUDPDom *HQpULFD

� /LQNV�

� *HQHUL

3URJUDPPLQJ

� KWWS���ZZZ�FV�USL�HGX�aPXVVHU�JS

� 67/

�KWWS���ZZZ�VJL�FRP�7HFKQRORJ\�67/

�KWWS���ZZZ�GHO�XIUM�EU�aYLOODV

�KWWS���ZZZ�FV�USL�HGX�SURMHFWV�67/�VWO�VWO�KWPO

�KWWS���ZZZ�LVHO�LSO�SW�$JHQGD�VHPLQDULR��KWPO

Recommended