vendedor
m7s
Curso Prtico de C++
Linclude Miostream.hN
void main89
O
float vendas]+^]$^P WW declara%&o da matriz
float somaV;I mediaP
for8int iV;P iM+P iHH9
for8int GV;P GM$P GHH9
O
coutMM[Cnsira o valor da venda R vendedor: [MM88iH59X5;9MM[ m7s Y
MMGH5MM[: [P
cinNNvendas]i^]G^P
soma HV vendas]i^]G^P
Q
media V somaW+P
for8iV;P iM+P iHH9
O
soma V ;P
for8int GV;P GM$P GHH9
soma HV vendas]i^]G^P
if 8somaNmedia9
coutMM[\nBendedor: [MM88iH59X5;9MM[ valor: [MMsomaP
Q
Q
;niciaiIa!"o de matriI &idimensiona
Uma matriz de duas dimens@es contendoI )or e4em)loI as notas de Kuatro )rovas de tr7s
alunos )ode ser visualizada como a lista a)resentada a*ai4o: 8os nSmeros colocados
fora da ta*ela re)resentam os valores dos /ndices9.
4em)lo:
; 5 : $
; 0.+ ..; ..0 2.;
5 ..$ 0.: +.2 -.+
: -.; 0.; ..; ..:
#egue a inicializa%&o da matriz com os valores da ta*ela acima:
float notas]$^](^ V O O0.+I ..;I ..0I 2.;QI
O..$I 0.:I +.2I -.+QI
O-.;I 0.;I ..;I ..:Q QP
" valores de toda matriz s&o escritos entre chavesI )odendo ser numa Snica linhaI eI
igualmenteI entre chaves a)arecem os valores das linhas se)arados )or v/rgulas eI )or
sua vezI as linhas tam*1m s&o se)aradas )or v/rgulas a)6s o seu fechamento de chave.
Prof. Luiz Bianchi 48
Curso Prtico de C++
Passando vetores e matriIes para +un!)es
Assim como as vari'veisI os vetores e matrizes )odem ser )assados como argumento
)ara uma fun%&o.
#inta4e da )assagem )ara a fun%&o:
nomeTfun%&o 8nomeTvetorI elementosTvetor9
#inta4e do rece*imento )ela fun%&o:
ti)o nomeTfun%&o 8ti)o nomeTvetor] ^I ti)o elementosTvetor 9
A seguir 1 mostrado um e4em)lo Kue )assa vetores )ara a fun%&o e4i*e89 )ara relacionar
o conteSdo desses vetores:
Linclude Miostream.hN
void e4i*e 8int lista]^I int elementos9P WW )rot6ti)o da fun%&o
void main89
O
int )ar]5;^ V O:I (I -I 0I 5;I 5:I 5(I 5-I 50I :;QP WW declara%&o e inicializa%&o
int im)ar]5;^ V O5I $I +I .I 2I 55I 5$I 5+I 5.I 52QP WW idem
coutMM[\nNumeros )ares: [P
e4i*e8)arI5;9P WW chama fun%&o e4i*e
coutMM[\nNumeros im)ares: [P
e4i*e8im)arI 5;9P WW chama a fun%&o e4i*e
Q
void e4i*e 8int lista]^I int elementos9 WW rece*e os agumentos
O
for8int iV;P iMelementosP iHH9
coutMMlista]i^MMc cP
Q
,omo se v7I na chamada J fun%&o e4i*e89I o nome da matriz 1 escrito sem colchetesI
cuGo argumento 1 rece)cionado numa vari'vel seguida de colchetes vazios.
De modo semelhante ao vetor 1 feita a )assagem de matriz )ara fun%&o. A sinta4e da
)assagem de valores de uma matriz de duas dimens@es )ara a fun%&o 1 a mesma
a)resentada )ara o vetor. No entantoI aos )arAmetros rece*idos )ela fun%&o deve ser
inclu/do o /ndice da segunda dimens&o a)6s os colchetes vaziosI sem se)ar'Rlos )or
v/rgula.
A seguir 1 a)resentado um e4em)lo onde a fun%&o somaLinha89 efetua a soma dos
valores de cada linha da matriz e as e4i*e:
Linclude Miostream.hN
const linV+I colV$P
Prof. Luiz Bianchi 49
Curso Prtico de C++
void somaLinha8int somaLinha]^]col^I int linha9P
void main89
O
int matriz]lin^]col^ V OO5I:I$QIO(I+I-QIO.I0I2QI
O5;I55I5:QIO5$I5(I5+QQP
somaLinha8matrizIlin9P
Q
void somaLinha8int mat]^]col^I int linha9
O
int somaV;P
for8int iV;P iMlinhaP iHH9
O
soma V ;P
for8int GV;P GMcolP GHH9
soma HV mat]i^]G^P
coutMM[\n#oma da linha [MM8iH59MM[: [MMsomaP
Q
Q
Resultado do e4em)lo:
#oma da linha 5: -
#oma da linha :: 5+
#oma da linha $: :(
#oma da linha (: $$
#oma da linha +: (:
,onv1m notar Kue tanto os vetores como as matrizes )odem ter seus valores
modificados )ela fun%&o chamadaI uma vez Kue a )assagem de )arAmetros dessas
estruturas sem)re se faz )or refer7ncia e n&o )or valor.
Prof. Luiz Bianchi 50
Curso Prtico de C++
ST8;NS DE CA8ACTE8ES
Uma string ou cadeia de caracteres )ode ser entendida como uma s1rie de letrasI
nSmeros e sim*olos es)ecias escritos entre as)asI como )or e4em)loI a e4)ress&o
Y,urso )r'tico de ,HHZ.
Uma string de caracteres 1 declarada como um vetor do ti)o c%ar ca)az de armazenar
um te4to de um com)rimento es)ec/fico cuGo t1rmino 1 marcado com o caractere zero
8a\;_9. " modo de indicar o Sltimo elemento do vetor 1 a )rinci)al diferen%a entre um
vetor de carateres e outros ti)os de vetores.
" caractere a\;_ re)resenta o s/m*olo NULL ou o decimal zero na ta*ela A#,CC. `
conveniente dizer Kue os caracteres Kue n&o )odem ser o*tidos diretamente do teclado
como a tecla !ABI )or e4em)loI em ,HH eles s&o codificados atrav1s da com*ina%&o de
outros caracteresI geralmenteI antecedidos )or uma *arra invertida 8\9.
,ada caractere de uma string ocu)a um *Ute na mem6ria e todos s&o armazenados
consecutivamenteI sendo Kue o Sltimo *Ute armazena o caractere NULL 8a\;_9I como
mostra a ilustra%&o Kue segue:
# e 4 t a f e i r a \;
;niciaiIando strin, de caracteres
" vetor de caracteres a)resentado na ilustra%&o acima )ode ser inicializado atrav1s do
modo )adr&oI como segue:
char te4to ]^ V Oa#_I ae_I a4_I at_I aa_I a _I af_I ae_I _i_I _r_I _a_I _\;_Q
ou do modo sim)lificado:
char te4to]^ V Y#e4ta feiraZ
No modo )adr&o os caracteres s&o escritos entre a)6strofos e 1 informado o caractere de
fim 8a\;_9. No segundo casoI modo sim)lificadoI a constante 1 escrita entre as)as e o
caractere a\;_ 1 inserido automaticamente )elo sistema.
Um caractere colocado entre a)6strofos 1 denominado constante de caractere e entre
as)asI constante strin, de caracteres Kue sem)re 1 seguida do caractere a\;_
acrescentado )elo com)ilador.
A seguirI um e4em)lo Kue armazena as letras de A a D no vetor de nome letras atrav1s
do la%o +or eI em seguidaI as e4i*e na tela:
Linclude Miostream.hN
void main89
O
char letras]:.^P WW :- letras mais o caractere NULL
Prof. Luiz Bianchi 51
Curso Prtico de C++
for 8int iV;I char letVcAcP letMVcDcP letHHI iHH9
letras]i^ V letP
letras]i^ V c\;cP WW acrescenta o caractere NULL no fim
for8iV;P letras]i^ fV c\;cP iHH9
coutMMletras]i^P
WW ou
coutMMc\ncMMletrasP
Q
Resultado do e4em)lo::
AB,DFE3CFmLMN"PgR#!UBnboD
AB,DFE3CFmLMN"PgR#!UBnboD
Atri&ui!"o de strin,
Para atri*uir um valor a uma string de caracteres o m1todo )r'tico 1 utilizar a fun%&o
Kue a)resenta a seguinte sinta4e:
strcp' 8string5I string:9P
ste comando faz uma c6)ia do conteSdo da string: )ara a string5. A utiliza%&o dessa
fun%&o e4ige a indica%&o do arKuivo de ca*e%alho strin,$% atrav1s da diretiva Linclude.
4em)lo:
Linclude Miostream.hN
Linclude Mstring.hN WW )rot6ti)o da fun%&o
void main89
O
char nome]+;^P
strc)U8nomeI [ oasmin Ea*rielle[9P
coutMMnomeP
Q
" nome oasmin Ea*rielle 1 atri*uido ou co)iado )ara o vetor com o identificador
nome.
Entrada de strin, a partir do tecado
" o*Geto cin como at1 agora fora utilizado )ara dar entrada de valores oriundos do
teclado n&o 1 a)ro)riado )ara ler string de caracteres constitu/da de )alavras e es)a%osI
)orKuanto a entrada 1 encerrada Kuando o comando cin encontra um es)a%o em *ranco.
#egue um e4em)lo:
Prof. Luiz Bianchi 52
Curso Prtico de C++
Linclude Miostream.hN
void main89
O
char nome]+;^P
coutMM[Digite um nome: [P
cinNNnomeP
coutMMnomeP
Q
Resultado do e4em)lo:
Digite um nome: oasmin Ea*rielle
oasmin
,omo se v7I o comando cin encerra a entrada ao encontrar o es)a%o em *ranco entre os
dois nomes digitados.
Para introduzir o nome ou um te4to com)leto 1 comum a utiliza%&o do m1todo ,etine
do o*Geto cin Kue encerra a entrada ao ser )ressionada a tecla N!R. " seguinte
e4em)lo corrige o anterior:
Linclude Miostream.hN
void main89
O
char nome]+;^P
coutMM[Digite um nome: [P
cin.getline8nomeI+;9P
coutMMnomeP
Q
Resultado do e4em)lo:
Digite um nome: oasmin Ea*rielle
oasmin Ea*rielle
" )rimeiro )arAmetro da instru%&o cin$,etine /nomeMT>0 1 o nome da vari'vel 8como o
vetorI neste caso9 onde o dado de entrada do usu'rio ser' armazenado e o segundo
)arAmetro indica o tamanho m'4imo dessa vari'vel.
Uma string de caracteres )ode ser considerada como uma matriz de uma linha )or n
colunas onde 1 referenciada a)enas a coluna. Assim sendoI 1 )oss/vel inserir outras
linhasI transformandoRa numa matriz de duas dimens@es. #egue um e4em)lo onde s&o
codificados os meses do ano:
Linclude Miostream.hN
void main89
Prof. Luiz Bianchi 53
Curso Prtico de C++
O
char meses]5:^](^ VO[Gan[I[fev[I[mar[I[a*r[I[mai[I[Gun[I
[Gul[I[ago[I[set[I[out[I[nov[I[dez[QP
int mesP
do
O
coutMM[Digite o numero do mes: [P
cinNNmesP
Q <hile8mesM5 ii mesN5:9P
coutMM[\n#igla do mes: [MMmeses]8mesR59^MMendlP
Q
Resultado do e4em)lo:
Digite o numero do mes: 5;
#igla do mes: out
"*serve Kue em*ora a matriz c%ar mesesU?DVUWV a)resente dois /ndices 8matriz
*idimensional9I a instru%&o )ara im)res&o na tela:
coutMM[\n#igla do mes: [MMmeses]8mesR59^MMendlP
utiliza a)enas um /ndice U/mesX?0V.
Passando strin,s para +un!)es
A )assagem de uma string de caracteres 1 semelhante a )assagem de um vetor como um
)arAmetro.
#egue um e4em)lo de um )rograma Kue e4i*e na tela uma string de caracteres:
Linclude Miostream.hN
void e4i*e8char t4t]^9P
void main89
O
coutMM[\nDigite uma linha de te4to: [P
char te4to]0;^P
cin.getline8te4toIsizeof8te4to99P
e4i*e8te4to9P
Q
void e4i*e8char t4t]^9
O
coutMM[\n!e4to digitado: [MMt4tP
Q
Prof. Luiz Bianchi 54
Curso Prtico de C++
Resultado do e4em)lo:
Digite uma linha de te4to: Passagem de )arametro.
!e4to digitado: Passagem de )arametro.
,omo se v7I es)ecif/caRse na fun%&o void e-i&e/c%ar t-tUV0 o ti)o e o nome do vetor
seguidos de dois colchetesI sem a es)ecifica%&o do tamanho da string.
BerificaRse tam*1m neste e4em)lo Kue a instru%&o cin$,etine/te-toMsiIeo+/te-to00Y
a)arece ligeiramente modificada em rela%&o JKuela utilizada no )rograma da sec&o
anterior. sse formato torna o )rograma mais fle4/velI uma vez Kue n&o demanda
nenhuma altera%&o caso o tamanho da vari'vel te-to seGa modificado.
Outras +un!)es de strin,s
"s com)iladores ,HH fornecem uma cole%&o de fun%@es diferentes de mani)ula%&o de
strings. A *i*lioteca referente ao arKuivo de ca*e%alho strin,$% define v'rias fun%@es
)ara e4ecutar o)era%@es de mani)ula%&o de strings como a fun%&o strc)U G' a)resentada.
A seguirI s&o descritas *revemente algumas delas:
strcat/str?M strD0Y
,oncatena a string de carateres str? J string strD.
strcmp/str?M strD0Y
,om)ara as strings str? e strD. Retorna zeroI se as strings forem iguaisP retorna um
valor maior Kue zeroI se str? for maior Kue strDP e retorna um nSmero menor Kue zeroI
se str? for menor Kue strD.
srten/str?0
Retorna o tamanho ou o nSmero de carateres armazenados em str?.
Prof. Luiz Bianchi 55
Curso Prtico de C++
EST8UTU8AS DE DADOS
struturas s&o agru)amentos de dados relacionados Kue )odem ser de diferentes ti)os
*'sicos 8intI floatI dou*leI char e void9 so* uma Snica declara%&o. F' foi visto Kue as
matrizes s&o ti)os de vari'veis Kue agru)am dados do mesmo ti)o *'sico. As estruturas
tam*1m s&o ti)os de vari'veisI mas Kue )odem agru)ar dados de ti)os *'sicos
diferentes. "s itens de dados das estruturas s&o denominados mem&rosI ao )asso Kue
das matrizes s&o chamados de eementos.
"s agru)amentos de dados mais im)ortantes dis)on/veis em ,HH s&o as estruturas
com seus dadosXmem&ros e as cassesM Kue caracterizam a )rograma%&o orientada a
o*GetosI com seus dadosXmem&ros e +un!)esXmem&ros. ,omo a declara%&o das
estruturas se assemelha J das classesI a com)reens&o daKuelas aGuda so*remaneira no
entendimento de classes e o*Getos.
De+ini!"o da estrutura
" formato da estrutura 1 discriminado como segue:
struct nome
O
ti)o mem*ro5P
ti)o mem*ro:P
$$$
Q vari'veisP
A estrutura 1 definida com a )alavraRchave struct seguida de um nome identificador.
ntre chaves 1 es)ecificado um ou mais itens de dados 8ti)o e mem*ro9 eI )or SltimoI as
vari'veis Kue tanto )odem ser declaradas aKui como em outra )arte do )rograma Kue
ser' mostrado mais adiante.
4em)lo de um )rograma Kue cria uma estrutura com descri%&o e )re%oI introduz e
e4i*e seus conteSdos:
Linclude Miostream.hN
Linclude Mstring.hN
struct )roduto
O
char descr]+;^P
float )recoP
Q hdI cdP
void main89
O
strc)U8hd.descrI[3ard dis= Ma4tor[9P
hd.)reco V :+;.(:P
Prof. Luiz Bianchi 56
Curso Prtico de C++
coutMM[Descricao: [P
cin.getline8cd.descrI+;9P
coutMM[Preco: [P
cinNNcd.)recoP
coutMM[\n3D R\tDescricao: [MMhd.descrP
coutMM[\n\tPreco: [MMhd.)recoMMendlP
coutMM[\n,D R\tDescricao: [MMcd.descrP
coutMM[\n\tPreco: [MMcd.)recoP
Q
"utro modo de declarar as vari'veis da estrutura 1 usando o nomeRti)o da estrutura
seguido das vari'veis dentro da fun%&o:
Linclude Miostream.hN
Linclude Mstring.hN
struct )roduto
O
char descr]+;^P
float )recoP
QP WW )onto e v/rgula a)6s o fechar chaves
void main89
O
)roduto hdI cdP WW ti)o da estrutura e suas vari'veis
$$$
Q
RessalteRse Kue a cria%&o da estrutura a)enas caracteriza a defini%&o de um novo ti)o de
dado criado )elo usu'rio. Para sua utiliza%&oI deveRse declarar ao menos uma vari'vel
do ti)o )rodutoI neste caso. p cada vari'velI %d e cd declaradas no e4em)loI 1
reservado es)a%o cont/guo de mem6ria necess'rio )ara armazenar todos os mem*ros da
estrutura.
A defini%&o da estrutura fora de KualKuer fun%&oI como a Kue foi criada no )rograma
acimaI )ermite acesso a seus mem*ros )or todas as fun%@es es)ecificadas no )rograma.
Por outro ladoI a estrutura criada dentro da fun%&o restringe o acesso a esta fun%&o.
Acesso a mem&ros da estrutura
Para acessar um mem*ro da estruturaI deveRse informar os nomes da vari'vel e do
res)ectivo mem*ro conectados )or meio do o)erador )onto 8$9.
4em)lo de uma instru%&o de atri*ui%&o:
hd.)reco V :+;.(:P
ste e4em)lo atri*ui o valor :+;.(: ao mem*ro )reco da vari'vel hd.
Prof. Luiz Bianchi 57
Curso Prtico de C++
;niciaiIa!"o de estruturas
As estruturas )odem ser inicializadas na mesma instru%&o de sua defini%&o e se )arecem
com a inicializa%&o de vetores e matrizes.
#egue um e4em)lo:
Linclude Miostream.hN
struct contrato
O
int matriculaP
char nome]:;^P
float salarioP
QP
void main89
O
contrato func V O5:$I [Ana Maria da #ilva[I :+;;.;;QP
Q
Os valores atribudos varivel func devem seguir a ordem de acordo com a declarao
dos membros na estrutura, separados por vrgulas e entre chaves.
Anin%amento e matriI de estruturas
O aninhamento de estruturas refere-se quelas estruturas que participam como membros
de outras estruturas. No exemplo, a seguir, v-se a estrutura data definida como
membro da estrutura contrato. Verifica-se tambm no mesmo exemplo uma matriz de
50 elementos declarada na varivel func da estrutura contrato.
O exemplo objetiva cadastrar e listar elementos da varivel func (funcionrio) e exibir o
valor total dos salrios listados, segundo opo dada a escolher ao usurio.
#include <iostream.h>
#include <iomanip.h>
struct data // estrutura do tipo data
{
int dia, mes, ano; // membros da estrutura
};
struct contrato // estrutura do tipo contrato
{
char nome[30];
float salario;
Prof. Luiz Bianchi 58
Curso Prtico de C++
data nasc; // membro da estrutura do tipo data
};
void incluir(); // prottipo da funo incluir()
void listar(); // prottipo da funo listar()
contrato func[50]; // declara uma matriz de estrutura
int i=0;
void main()
{
int oper;
int verdade=1;
while(verdade)
{
cout<<"1 para incluir";
cout<<"\n2 para listar";
cout<<"\n3 para encerrar : ";
cin>>oper;
if (oper==1) incluir();
else
if (oper==2)listar();
else
verdade=0;
cout<<'\n';
}
}
void incluir()
{
cout<<"\nNome: "; cin>>func[i].nome;
cout<<"Salario: "; cin>>func[i].salario;
cout<<"Dia nasc.: ";cin>>func[i].nasc.dia;
cout<<"Mes nasc.: ";cin>>func[i].nasc.mes;
cout<<"Ano nasc.: ";cin>>func[i++].nasc.ano;
}
void listar()
{
float totsal=0;
cout<<"\n Salario"<<setw(13)<<"Data nasc."<<setw(12)<<"Nome";
cout<<setprecision(2); WW e4i*e duas casas decimais
cout << setiosflags(ios::fixed); WW ini*e a e4i*i%&o em nota%&o cient/fica
for(int j=0; j<i; j++)
{
cout<<'\n'<<setw(10)<<func[j].salario<<setw(6)
<<func[j].nasc.dia<<setw(3)
<<func[j].nasc.mes<<setw(3)
<<func[j].nasc.ano<<setw(20)<<func[j].nome;
totsal += func[j].salario;
Prof. Luiz Bianchi 59
Curso Prtico de C++
}
cout<<"\nTotal salario: "<<totsal<<endl;
}
As estruturas assim como a matriz e a varivel ndice (i) foram declaradas como
componentes externos para permitir o acesso a eles pelas funes incluir() e listar().
Resultado de duas opes de cadastramento (opo 1) e uma de listagem (opo 2) :
1 para incluir
2 para listar
3 para encerrar : 1
Nome: Antonio
Salario: 2500.00
Dia nasc.: 12
Ms nasc.: 10
Ano nasc.: 72
1 para incluir
2 para listar
3 para encerrar : 1
Nome: Maria
Salario: 1850.42
Dia nasc.: 30
Ms nasc.: 05
Ano nasc.: 78
1 para incluir
2 para listar
3 para encerrar : 2
Salario Data nasc. Nome
2500.00 12 10 72 Antonio
1850.42 30 5 78 Maria
Total salario: 4350.42
1 para incluir
2 para listar
3 para encerrar : 3
Estruturas e +un!)es
Prof. Luiz Bianchi 60
Curso Prtico de C++
Estruturas tambm podem ser passadas como argumento de funes de modo
semelhante ao procedimento realizado com quaisquer variveis comuns.
Passa,em por vaor
A seguir, um exemplo de uma funo que efetua um clculo e exibe a mdia de alunos
por sala, a partir de duas variveis do tipo estrutura passadas por valor:
#include <iostream.h>
struct curso
{
int sala;
float aluno;
};
void media(curso n1, curso n2);
void main()
{
curso c1, c2;
cout<<"Curso 1";
cout<<"\n\tQuant. de salas: "; cin>>c1.sala;
cout<<"\tNumero de alunos: "; cin>>c1.aluno;
cout<<"\nCurso 2";
cout<<"\n\tQuant. de salas: "; cin>>c2.sala;
cout<<"\tNumero de alunos: "; cin>>c2.aluno;
media(c1, c2); // variveis tipo estrutura como argumento
}
void media(curso n1, curso n2)
{
float med;
med = (n1.aluno + n2.aluno) / (n1.sala + n2.sala);
cout<<"\nMedia de alunos por sala: "<<med;
}
Resultado do exemplo::
Curso 1
Quant de salas: 12
Numero de alunos: 260
Curso 2
Quant de salas: 8
Numero de alunos: 240
Prof. Luiz Bianchi 61
Curso Prtico de C++
Media de alunos por sala: 25
Passa,em por re+er=ncia
De modo anlogo operao de passagem de variveis comuns, procede-se com as
variveis tipo estrutura na passagem destas como argumento por referncia. bom
lembrar que o mtodo por referncia economiza memria uma vez que o sistema no
faz nenhuma cpia das variveis para serem operadas pela funo. Para apresentar um
exemplo desta tcnica, foi modificado o programa do exemplo anterior para receber
argumentos por referncia:
#include <iostream.h>
struct curso
{ int sala;
float aluno;
};
void media(curso& n1, curso& n2);
void main()
{
curso c1, c2;
cout<<"Curso 1";
cout<<"\n\tQuant. de salas: "; cin>>c1.sala;
cout<<"\tNumero de alunos: "; cin>>c1.aluno;
cout<<"\nCurso 2";
cout<<"\n\tQuant. de salas: "; cin>>c2.sala;
cout<<"\tNumero de alunos: "; cin>>c2.aluno;
media(c1, c2); // variveis tipo estrutura como argumento
}
void media(curso& n1, curso& n2)
{
float med;
med = (n1.aluno + n2.aluno) / (n1.sala + n2.sala);
cout<<"\nMedia de alunos por sala: "<<med;
}
As variveis n1 e n2 compartilham o mesmo espao de memria ocupado pelas
variveis c1 e c2. Observar que o operador & (operador de endereos) escrito junto ao
nome da estrutura que aparece no argumento da funo mdia.
Prof. Luiz Bianchi 62
Curso Prtico de C++
8etorno de varive tipo estrutura
A ilustrao seguinte apresenta o mesmo exemplo modificado para que a funo retorne
uma varivel tipo estrutura:
#include <iostream.h>
struct curso
{
int sala;
float aluno;
};
void media(curso& n1, curso& n2);
curso insere(void);
void main()
{
curso c1, c2;
cout<<"Curso 1";
c1=insere();
cout<<"Curso 2";
c2=insere();
media(c1, c2);
}
curso insere(void)
{
curso sa;
cout<<"\n\tQuant. de salas: "; cin>>sa.sala;
cout<<"\tNumero de alunos: "; cin>>sa.aluno;
return (sa);
}
void media(curso& n1, curso& n2)
{
float med;
med = (n1.aluno + n2.aluno) / (n1.sala + n2.sala);
cout<<"\nMedia de alunos por sala: "<<med;
}
Notar que a funo insere( ) foi definida como uma funo do tipo curso pois ela retorna
uma varivel do tipo especificado.
Prof. Luiz Bianchi 63
Curso Prtico de C++
Prof. Luiz Bianchi 64
Curso Prtico de C++
CGASSES E OFZETOS
Uma classe um mtodo lgico de organizao de dados e funes numa mesma
estrutura e considerada como instrumento principal da programao orientada a
objetos. A varivel de uma classe chamada objeto que far uso dos dados e funes.
Casses
As classes so funcionalmente similares s estruturas, porm enquanto estas definem
apenas dados, aquelas definem os chamados dados-membro e funes-membro. As
funes-membro tambm conhecidas como mtodos so responsveis pelas operaes
realizadas sobre os dados-membro da classe.
Exemplo:
#include <iostream.h>
class area WW define a classe
{
private: // dados-membro:
float largura;
float altura;
public: // funes-membro:
void obtemdados(float larg, float alt); // prottipo da funo
float calcula() // funo inline
{ return(largura*altura);}
};
void area::obtemdados(float larg, float alt)
{
largura=larg;
altura=alt;
}
void main()
{
area parede; // declara o objeto
parede.obtemdados(3.5, 5.2);
float areapar = parede.calcula();
cout<<"Area da parede: "<<areapar;
}
Prof. Luiz Bianchi 65
Curso Prtico de C++
Resultado do exemplo::
Area da parede: 18.2
No exemplo declarada a classe area que contm quatro membros: duas variveis do
tipo float e duas funes: obtemdados e calcula. A funo obtemdados tem apenas seu
prottipo definido dentro da declarao da classe, as operaes so especificadas fora
dela, ao passo que a funo calcula tem seus comandos definidos dentro da classe.
Para definir funes fora da classe deve ser usado o operador de resoluo de escopo
(::) aps o nome da classe. Ele especifica a classe a qual pertence funo-membro. No
exemplo tem-se:
void area :: obtemdados(float larg, float alt)
que significa que a funo obtemdados uma funo-membro da classe area.
As funes-membros, tambm chamadas de mtodos, definidas dentro da classe so
criadas como inline por default, no entanto uma funo-membro inline tambm pode
ser definida fora da classe por meio da palavra reservada inline.
O exemplo traz duas sees private: e public: que especificam a visibilidade dos
membros da classe. (Note-se que na codificao as palavras devem ser seguidas de dois
pontos). Na parte private, geralmente, so escritos os membros de dados, os quais s
podem ser acessados por funes pertencentes classe. Desse modo, diz-se que os
dados esto escondidos ou encapsulados por no permitir que funes extra classe os
acessem. A palavra reservada private por ser default no precisaria ser explicitada no
programa, contudo sua colocao torna mais evidente essa circunstncia. Na seo
public da classe, geralmente, so especificadas as funes ou mtodos que atuam sobre
os dados.
O acesso aos membros pblicos feito atravs do operador ponto de modo anlogo ao
acesso requerido aos membros de uma estrutura.
A instruo
parede.obtemdados(3.5, 5.2);
usa o operador ponto (.) para chamar a funo obtemdados e atribuir valores aos dados
membro.
O&Aetos
Um o*Geto 1 um ti)o es)ecial de vari'vel Kue cont7m dados e c6digos e re)resenta um
elemento es)ec/fico. Um o*Geto 1 uma instAncia ou uma ocorr7ncia es)ec/fica de uma
classe. le geralmente )ossui v'rios atri&utos Kue definem suas caracter/sticasI e
m4todos Kue o)eram so*re esses atri*utos. No e4em)lo anteriorI )arede 1 o nome do
o*Geto do ti)o classe Kue cont1m os atri*utos largura e altura e os m1todos o*temdados
e calcula. A classe 1 o mecanismo Kue reSne o*Getos Kue )odem ser descritos com os
mesmos atri*utos e as mesmas o)era%@es. la agru)a dados e fun%@esI 1 a )e%a
fundamental da )rograma%&o orientada a o*Geto. No e4em)loI a codifica%&o:
Prof. Luiz Bianchi 66
Curso Prtico de C++
area parede;
define como objeto o elemento parede pertencente a classe area, ou seja, declara uma
instncia da classe.
"s o*Getos se comunicam atrav1s de mensa,emI isto 1I de chamada a uma +un!"oX
mem&ro reKuisitando um servi%o atrav1s da e4ecu%&o de uma o)era%&o. A instru%&o
parede.obtemdados(3.5, 5.2);
solicita ao o*Geto )arede Kue rece*a os dados ou as medidas )ara o c'lculo da 'rea.
Uma classe )ermite declarar v'rios o*Getos diferentes. ,ontinuando com o mesmo
e4em)lo Kue se aca*a de e4aminarI ser' adicionado a este outro o*Geto J classe area e o
)rograma modificado fica como segue:
Linclude Miostream.hN
class area WW define a classe
O
)rivate: WW dadosRmem*ro:
float larguraP
float alturaP
)u*lic: WW fun%@esRmem*ro:
void o*temdados8float largI float alt9P WW )rot6ti)o da fun%&o
float calcula89 WW fun%&o inline
O return8larguraXaltura9PQ
QP
void area::o*temdados8float largI float alt9
O
larguraVlargP
alturaValtP
Q
void main89
O
area )aredeI tiGoloP WW declara os o*Getos
)arede.o*temdados8$.+I +.:9P
float area)ar V )arede.calcula89P
coutMM[Area da )arede: [MMarea)arP
tiGolo.o*temdados8;.5:I ;.$;9P
float areatiG V tiGolo.calcula89P
coutMM[\nArea do tiGolo: [MMareatiGP
coutMM[\nguantidade de tiGolos necessarios )ara construir a )aredeI[P
coutMM[\nconsiderando Kue 5;d da area ec de argamassa: [
MM8area)arWareatiGX;.29MM[ tiGolos.[MMendlP
Q
Resultado do e4em)lo::
Prof. Luiz Bianchi 67
Curso Prtico de C++
Area da )arede: 50.:
Area do tiGolo: ;.;$-
guantidade de tiGolos necessarios )ara construir a )aredeI
considerando Kue 5;d da area ec de argamassa: (++ tiGolos.
Na instru%&o Kue define o o*Geto foi inclu/do outro o*Geto de nome tiGolo:
area )aredeI tiGoloP
Por meio do o)erador )ontoI o o*Geto tiGolo tam*1m acessa os mesmos m1todos do
o*Geto )arede )ara atri*uir a seus dadosRmem*ro os devidos valoresI como no caso da
instru%&o:
tiGolo.o*temdados8;.5:I ;.$;9P
" o*Geto tiGolo )ossui as mesmas caracter/sticas do o*Geto )aredeI ou seGaI uma 'rea
definida )ela largura e altura.
" )rograma tem )or o*Getivo determinar a Kuantidade de tiGolos necess'rios )ara
contruir uma )arede considerando uma )ro)or%&o da 'rea constitu/da de argamassa.
Prof. Luiz Bianchi 68
Curso Prtico de C++
FUNNOES CONST8UTO8AS E
DEST8UTO8AS
" )rocesso de inicializa%&o dos dadosRmem*ro da classe 1 sim)lificado )ela defini%&o
de uma fun%&o es)ecial chamada construtora e de forma semelhanteI outra fun%&o
es)ecial denominada destrutora 1 e4ecutada automaticamente toda vez Kue um o*Geto
for destru/do ou li*erado da mem6ria.
Fun!)es construtoras
Uma fun%&o construtora 1 uma fun%&oRmem*ro es)ecial Kue 1 chamada
automaticamente )elo sistema sem)re Kue um o*Geto for criado. la n&o retorna nenhum
valor e na sua defini%&o n&o 1 )recedida do ti)o void. Deve ser declarada com o mesmo
nome da classe e 1 )rontamente e4ecutada toda vez Kue uma nova instAncia da classe
for criada a fim de inicilizar seus atri*utos.
,omo e4em)loI ser' modificado o )rograma anterior )ara im)lementar uma fun%&o
construtora:
Linclude Miostream.hN
class area
O
)rivate:
float larguraP
float alturaP
)u*lic:
area8float largI float alt9P WW fun%&o construtora
float calcula89
O return8larguraXaltura9PQ
QP
area :: area8float largI float alt9
O
larguraVlargP
alturaValtP
Q
void main89
O
area )arede8$.+I +.:9I tiGolo8;.5:I ;.$;9P WW declara os o*Getos
float area)ar V )arede.calcula89P
coutMM[Area da )arede: [MMarea)arP
Prof. Luiz Bianchi 69
Curso Prtico de C++
float areatiG V tiGolo.calcula89P
coutMM[\nArea do tiGolo: [MMareatiGP
coutMM[\nguantidade de tiGolos necessarios )ara construir a )aredeI[P
coutMM[\nconsiderando Kue 5;d da area ec de argamassa: [
MM8area)arWareatiGX;.29MM[ tiGolos.[MMendlP
Q
,omo )ode ser vistoI a fun%&oRmem*ro o*temdados foi su*stitu/da )ela fun%&o
construtora Kue traz o nome da classe. "s argumentos s&o )assados )ara a construtora
no momento em Kue a instAncia da classe for criada.
Fun!)es destrutoras
A fun%&o destrutora 1 uma fun%&oRmem*ro es)ecial Kue 1 e4ecutada automaticamente
Kuando um o*Geto 1 li*erado da mem6ria. la 1 definida com o mesmo nome da classe
)recedida de um til 8q9. ,omo a construtoraI a fun%&o destrutora n&o retorna valor e
nem )ode rece*er argumentos. " uso de destrutores 1 es)ecialmente a)ro)riado )ara
li*erar mem6ria usada )or um o*Geto Kue aloca mem6ria dinamicamente.
A seguirI um e4em)lo da fun%&o destrutora im)lementado no modelo Kue vem sendo
usado:
Linclude Miostream.hN
class area
O
)rivate:
float larguraP
float alturaP
)u*lic:
area8float largI float alt9P WW fun%&o construtora
qarea89P WW fun%&o destrutora
float calcula89
O return8larguraXaltura9PQ
QP
area::area8float largI float alt9
O
larguraVlargP
alturaValtP
Q
area :: qarea89
O
if 8larguraVV$.+ hh alturaVV+.:9
coutMM[\nDestruindo o o*Geto )arede[P
else
Prof. Luiz Bianchi 70
Curso Prtico de C++
coutMM[\nDestruindo o o*Geto tiGolo[P
Q
void main89
O
area )arede8$.+I +.:9I tiGolo8;.5:I ;.$;9P WW declara os o*Getos
float area)ar V )arede.calcula89P
coutMM[Area da )arede: [MMarea)arP
float areatiG V tiGolo.calcula89P
coutMM[\nArea do tiGolo: [MMareatiGP
coutMM[\nguantidade de tiGolos necessarios )ara construir a )aredeI[P
coutMM[\nconsiderando Kue 5;d da area ec de argamassa: [
MM8area)arWareatiGX;.29MM[ tiGolos.[MMendlP
Q
Neste e4em)lo a fun%&o destrutora incor)ora um teste de sele%&o a)enas )ara mostrar
Kue ela est' sendo e4ecutada e Kuais o*Getos est&o sendo destru/dos.
So&recar,a de +un!)es construtoras
,omo KualKuer outraI uma fun%&o construtora )ode ser so*recarregada a)resentando o
mesmo nome com nSmero de argumentos diferentes. #u)ondo Kue se )retenda Kue o
usu'rio insira as medidas no momento em Kue um o*Geto for criado e deseGando manter
a fun%&o construtora )ara os o*Getos definidos com valores iniciaisI )odeRse declarar
uma nova fun%&o construtoraI como mostrado no e4em)lo a seguir:
Linclude Miostream.hN
class area
O
)rivate:
float larguraP
float alturaP
)u*lic:
area8float largI float alt9P WW fun%&o construtora
area89P WW fun%&o construtora so*recarregada
float calcula89
O return8larguraXaltura9PQ
QP
area::area8float largI float alt9
O
larguraVlargP
alturaValtP
Prof. Luiz Bianchi 71
Curso Prtico de C++
Q
area::area89
O
coutMM[Cnsira as medidas R largura e altura: [P
cinNNlarguraNNalturaP
Q
void main89
O
area )arede8$.+I +.:9I tiGoloP
float area)ar V )arede.calcula89P
coutMM[\nArea da )arede: [MMarea)arP
float areatiG V tiGolo.calcula89P
coutMM[\nArea do tiGolo: [MMareatiGP
coutMM[\n\nguantidade de tiGolos necessarios )ara construir a )aredeI[P
coutMM[\nconsiderando Kue 5;d da area ec de argamassa: [
MM8area)arWareatiGX;.29MM[ tiGolos.[MMendlP
Q
Resultado do e4em)lo::
Cnsira as medidas R largura e altura: ;.5 ;.:
Area da )arede: 50.:
Area do tiGolo: ;.:
guantidade de tiGolos necessarios )ara construir a )aredeI
considerando Kue 5;d da area ec de argamassa: 052 tiGolos.
,omo o o*Geto tiGolo foi declarado sem )arAmetrosI ele 1 inicializado com a fun%&o
construtora so*recarregada Kue n&o )ossui )arAmetros. Assim ser' solicitado ao usu'rio
Kue insira as medidas do o*Geto tiGolo.
Prof. Luiz Bianchi 72
Curso Prtico de C++
SOF8ECA8SA DE OPE8ADO8ES
A so*recarga de um o)erador 1 o )rocesso de modificar a funcionalidade desse o)erador
)ara uso de uma determinada classeI com o )ro)6sito de melhorar a legi*ilidade do
)rograma. #o*recarregar um o)erador significa redefiniRlo )ara a)lic'Rlo a ti)os de
dados definidos )elo usu'rio como estruturas e classes. A so*recarga 1 esta*elecida )or
meio da )alavraRchave operator em fun%@es chamadas o)eradoras. A fun%&o rece*e
como nome o s/m*olo do o)erador.
A seguir 1 mostrado um e4em)lo Kue utiliza o o)erador aritm1tico H *in'rio )ara
adicionarI )or disci)linaI as notas de duas disci)linas de tr7s alunos Kue corres)ondem
aos o*Getos aI * e c:
WW so*recarga do o)erador aritm1tico H
Linclude Miostream.hN
class nota
O
)rivate:
float n5I n:P
)u*lic:
nota 89 OQP WW fun%&o construtora vazia
nota 8floatIfloat9P WW fun%&o construtora com argmentos
nota o)erator H 8nota9P WW fun%&o o)eradora de adi%&o
void e4i*e89P
QP
nota::nota 8float nt5I float nt:9
O
n5 V nt5P
n: V nt:P
Q
nota nota::o)erator H 8nota m9
O
float d5 V n5 H m.n5P
float d: V n: H m.n:P
return nota8d5Id:9P
Q
void nota::e4i*e89
O
coutMM[#oma V 8[MMn5MM[I [MMn:MMc9cMMendlP
Q
void main 89
O
nota a 80.+I 5;.;9P
Prof. Luiz Bianchi 73
Curso Prtico de C++
nota * 8(.;I -.+9P
nota c 8-.;I 2.;9P
nota somaP
soma V a H * H cP WW efetua a soma dos valores dos o*Getos
soma.e4i*e89P
Q
Resultado do e4em)lo::
#oma V 850.+I :+.+9
A fun%&o o)eradora declarada fora da classe e destacada a seguir:
nota nota::o)erator H 8nota m9
O
float d5 V n5 H m.n5P
float d: V n: H m.n:P
return nota8d5Id:9P
Q
rece*e a)enas um argumento e retorna o ti)o nota. "s o*Getos da instru%&o
soma V a H * H cP
s&o )assados como argumentos )ara a fun%&o o)eradora.
" )r64imo e4em)lo mostra a so*recarga do o)erador e )ara a fun%&o o)eradora Kue
trata string de caracteres. " )rograma inicialmente e4i*e um te4to e de)ois retira do
te4to a letra , onde ela a)arece.
WW so*recarga do o)erador R
Linclude Miostream.hN
Linclude Mstring.hN
class str
O
)rivate:
char te4to]+;^P
)u*lic:
str8char ]^9P WW fun%&o construtora
str o)erator R 8char9P
void e4i*e89P
QP
str::str8char Xcar9
O
strc)U8te4toI car9P
Q
str str::o)erator R 8char let9
O
Prof. Luiz Bianchi 74
Curso Prtico de C++
char tem)]+;^P
WW for8int iV;I GV;P te4to]i^P iHH9
for8int iV;I GV;P te4to]i^fVc\;cP iHH9
if8te4to]i^ fV let9
tem)]GHH^ V te4to]i^P
tem)]G^VNULLP
return8strc)U8te4toItem)99P
Q
void str::e4i*e89
O
coutMMte4toMMendlP
Q
void main89
O
str nome8[,urso )ratico de ,HH[9P
nome.e4i*e89P
nome V nome R c,cP
nome.e4i*e89P
Q
Resultado do e4em)lo::
,urso )ratico de ,HH
urso )ratico de HH
,omo se )ode verI a sinta4e utilizada na instru%&o
nome V nome R c,cP
melhora so*remaneira a legi*ilidade do )rograma )or a)resentar o estilo de uma
o)era%&o normal de atri*ui%&oI su*traindo do o*Geto nome a letra ,. Lem*rar Kue o
)ro)6sito das so*recargas de o)eradores 1 de tornar o )rograma claro e f'cil de
entender. No entantoI nem todos os o)eradores )odem ser so*recarregados. ")eradores
Kue n&o )odem ser so*recarregados: o o)erador )onto 8$9 de acesso a mem*rosI o
o)erador de resolu%&o de esco)o 8669 e o o)erador de e4)ress&o condicional 8[69.
Prof. Luiz Bianchi 75
Curso Prtico de C++
F;FG;OS8AF;A
A#,N,C"I Ana Fernanda EomesI ,AMP"#I dilene A)arecida Beneruchi de.
Fundamentos da )rograma%&o de com)utadores : algoritmosI Pascal e ,W,. #&o
Paulo : Prentice 3allI :;;:. 4viiiI $++).
F"RBLL"NI Andr1 Luiz BillarP BR#PA,3RI 3enri Frederico. L6gica de
)rograma%&o : a constru%&o de algoritmos e estruturas de dados. :.ed. #&o Paulo :
Ma=ron Boo=sI :;;;. 52.).
FAM#AI mris A. A)rendendo ,. #&o Paulo : Ma=ron Boo=s do BrasilI 5222. :.5).
MCDRA3CI Bictorine Biviane. !reinamento em linguagem ,. #ao Paulo : Ma=ronI
522(. v.
,om)lementar
BRRoI Fohn !homas. Programando em ,. #ao Paulo : Ma=ron Boo=sI 5225. 4viI
$0+).
U,,CI naldirP #"U#AI Reginaldo LuizP m"!ANCI Alice MaUumiI et al. . L6gica de
)rograma%&o : os )rimeiros )assos. 0.ed. #ao Paulo : ricaI 5222. $$2).
Eetr\nica
Algoritmos: htt):WW<<<.manzano.)ro.*rWmenu.html
,HH: htt):WW<<<.c)lus)lus.comWdocW
Prof. Luiz Bianchi 76