1
2
Variáveis Compostas
Heterogêneas
Conjuntos de dados logicamente
relacionados, mas de tipos diferentes
(numérico, literal, lógico).
Conhecidos como registros ou
3
Variáveis Compostas
Heterogêneas
Os registros correspondem a conjuntos de
posições de memória conhecidos por um
mesmo nome e individualizados por
identificadores associados a cada conjunto
de posições.
Na variável composta homogênea, a
individualização de um elemento é feita
através de índices, já no registro cada
componente é individualizado pela
4
Variáveis Compostas
Heterogêneas
Um registro é, portanto, uma coleção
de campos, em que cada campo pode
ser de um tipo diferente.
A linguagem C++ também oferece
outros dois mecanismos para a
criação de variáveis compostas
heterogêneas: uniões e classes.
5
Variáveis Compostas
Heterogêneas
Por meio da palavra-chave struct define-se
um novo tipo de dado.
Definir um tipo de dado significa informar ao
compilador o seu nome, o seu tamanho em
bytes e o formato em que ele deve ser
armazenado e recuperado da memória.
Informa como ele está organizado e quais
são os seus membros.
A definição de um registro não cria a
variável, somente informa ao compilador as
características do novo tipo. Não há reserva
de memória.
6
Variáveis Compostas
Heterogêneas
Em C/C++ esta declaração é realizada da
seguinte forma:
struct Nome_da_estrutura {
tipo identificador1;
tipo identificador2;
...
tipo identificadorN;
} variáveis;
Variáveis Compostas
Heterogêneas
8
Variáveis Compostas
Heterogêneas - Exemplo
Nome do
Registro
Componentes
do Registro
Struct Cliente { string Nome; string Rua; int Numero; string CEP; char Sexo; string Nascimento; string CPF; String RG; } ;Variáveis Compostas Heterogêneas
– Declaração de Variáveis
Depois de definir um novo tipo de dado, este
pode ser usado para declarar variáveis de modo
análogo a qualquer tipo simples.
Sintaxe:
tipoDeDadoRegistro nomeDaVariável;
Exemplos:
Funcionario funcionario; // variável funcionario do tipo Funcionario
Variáveis Compostas Heterogêneas –
Acesso aos membros de um registro
Pelo fato de o registro conter várias informações, para
acessar um campo individualmente é necessário indicar o
nome da variável e o nome do campo desejado,
separados pelo operador ponto.
Variáveis Compostas Heterogêneas –
Acesso aos membros de um registro
Exemplos:
Funcionario funcionario;
cout << funcionario.nome; // Imprime o nome do funcionário
cout << funcionario.nome[0]; // Imprime o primeiro caracter do nome
Funcionario funcionarios[10];
cout << funcionarios[9].nome; // Imprime o nome do último funcionário
cout << funcionarios[0].nome[0]; /* Imprime o primeiro caracter do nome
Variáveis Compostas Heterogêneas –
Inicialização de variáveis do tipo registro
É possível inicializar uma variável do tipo registro de
forma semelhante a uma matriz.
Os valores a serem atribuídos a seus membros devem
ser colocados na ordem em que foram definidos,
separados por vírgulas e entre chaves.
struct Data{
int dia;
int mes;
int ano;
};
Data natal = {25,12,2013};
Data aniversario = {12,8,2013};
Variáveis Compostas Heterogêneas –
Atribuições entre registros
Uma variável do tipo registro pode ser atribuída à
outra variável do mesmo tipo por meio de uma
atribuição simples.
Os valores de todos os membros de um registro
são atribuídos aos membros de outro registro.
struct Data{
int dia;
int mes;
int ano;
};
Data anoNovo = {1, 1, 2012};
Data aniversarioCris = anoNovo;
14
Variáveis Compostas
Heterogêneas - Exemplo
Em um certo município, vários proprietários
de imóveis estão em atraso com o
pagamento do imposto predial. Desenvolver
um programa que calcule e escreva o valor
da multa a ser paga por esses proprietários
considerando que:
Os dados de cada imóvel: identificação (string),
valor do imposto e número de meses em atraso
serão digitados;
As multas devem ser calculadas a partir do valor
15
Variáveis Compostas
16
Variáveis Compostas
Heterogêneas - Exemplo
/*ProgC078 - Programa para
apresentação de estruturas em C*/
#include <iostream>
int main(){
struct {int Id;
float Imp;
int Meses;} Imovel;
float Multa;
char resp = 'S';
while(resp == 'S') {
std::cout << "\nDigite os dados
do imovel (Identificador, Imposto e
Meses): ";
std::cin >> Imovel.Id >>
Imovel.Imp >> Imovel.Meses;
if (Imovel.Imp <= 50)
Multa = 1;
else if (Imovel.Imp <= 180)
Multa = 2;
else if (Imovel.Imp <= 500)
Multa = 3;
else
Multa = 5;
Multa = ((Multa * Imovel.Imp) / 100)
* Imovel.Meses;
std::cout << "\nImovel: " <<
Imovel.Id << "\tMulta: " << Multa <<
"\n";
std::cout << "Deseja Continuar
(S/N)? ";
std::cin >> resp;
}
return 0;
}
Declaração de estrutura.Leitura da estrutura.
Teste de componente da estrutura
17
Variáveis Compostas
Heterogêneas - Exemplo
/*ProgC079 - Programa para
apresentação de vetores de
estruturas em C*/
#include <iostream>
#include <cstdlib>
using namespace std;
struct Venda{
int pecas;
float preco;
};
Venda Vendas[5];
int main(){
int cont = 1;
while (cont <= 5) {
cout << "Digite a Peca " << cont <<
": ";
cin >> Vendas[cont].pecas;
cout << "Digite o preco " << cont
<< ": ";
cin >> Vendas[cont].preco;
cont++;
}
cont = 1;
while (cont <= 5) {
cout << "A Peca " <<
Vendas[cont].pecas << " tem valor = "
<< Vendas[cont].preco << "\n";
cont++;
}
system ("PAUSE > 0");
return 0;
}
Declaração de estrutura.18
Variáveis Compostas
Heterogêneas - Exemplo
/*ProgC080.cpp - Outra forma de
declarar estrutura*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef struct Produto{
int cod;
float valor;
char nome[30];
};
int main(){
Produto Prod;
cout << "Digite o codigo do produto:
";
cin >> Prod.cod;
cout << "Digite o valor do
produto: ";
cin >> Prod.valor;
fflush(stdin);
cout << "Digite o nome do
produto: ";
gets(Prod.nome);
cout << "Apresentacao da
Entrada de Dados \n\n\tCodigo: "
<< Prod.cod;
cout << "\n\tValor: " <<
Prod.valor;
cout << "\n\tNome: " <<
Prod.nome;
system ("pause>0");
return 0;
}
Outra forma de declarar registro19
Variáveis Compostas Heterogêneas –
Passando registro para funções
Variáveis do tipo registro podem ser
passados como parâmetro de funções
da mesma maneira que foi trabalhado
com as demais variáveis (simples,
20
Variáveis Compostas Heterogêneas –
Passando registro para funções
/*ProgC081.cpp - Registro e funções*/ #include <iostream> #include <cstdio> using namespace std; struct Funcionario { int codigo; char nome[30]; float salario; char sexo; };
void cadastra(Funcionario &f); void exibe(Funcionario f); int main() { Funcionario funcionario; cadastra(funcionario); exibe(funcionario); return 0; }
void cadastra(Funcionario &f) { cout << "Entre com o código: "; cin >> f.codigo;
cout << "Entre com o nome: "; fflush(stdin);
gets(f.nome);
cout << "Entre com o salário: "; cin >> f.salario;
cout << "Entre com o sexo: "; cin >> f.sexo;
}
void exibe(Funcionario f){
cout << "\nCódigo: " << f.codigo; cout << "\nNome: " << f.nome; cout << "\nSalário: " << f.salario; cout << "\nSexo: " << f.sexo;
} Declaração de registro Protótipos Passagem por referência Passagem por valor
21
Variáveis Compostas Heterogêneas –
Passando registro para funções
A sintaxe de passar um vetor ou
matriz de registros é semelhante a de
passar vetor ou matriz de variáveis
simples.
Na chamada a uma função deve-se
escrever apenas o nome do vetor ou
matriz.
No cabeçalho de definição da função
declaram-se normalmente os
vetores/matrizes de registros.
22
Variáveis Compostas Heterogêneas –
Passando registro para funções
/*ProgC082.cpp - Registro e Função*/ #include <iostream> #include <cstdio> using namespace std; struct Funcionario{ int codigo; char nome[30]; float salario; char sexo; }; void cadastra(Funcionario f[]); void exibe(Funcionario f[]); int main(){ Funcionario funcionarios[10]; cadastra(funcionarios); exibe(funcionarios); return 0; } void cadastra(Funcionario f[10]){ for(int i=0; i<10; i++) {
cout << i+1 << "o. FUNCIONARIO\n"; cout << "Entre com o código: ";
cin >> f[i].codigo;
cout << "Entre com o nome: "; fflush(stdin); gets(f[i].nome); cout << "Entre com o salário: "; cin >> f[i].salario;
cout << "Entre com o sexo: "; cin >> f[i].sexo;
} }
void exibe(Funcionario f[10]){ for(int i=0; i<10; i++) {
cout << i+1 << "o. FUNCIONARIO\n"; cout << "\nCódigo: " << f[i].codigo; cout << "\nNome: " << f[i].nome; cout << "\nSalário: " << f[i].salario; cout << "\nSexo: " << f[i].sexo; } } Declaração de registro Protótipos Vetor Parâmetro vetor
23
Variáveis Compostas Heterogêneas –
Passando registro para funções
Pode-se retornar um registro completo
para outra função, como pode ser
observado na função novaVenda() no
exemplo a seguir.
24
Variáveis Compostas Heterogêneas –
Passando registro para funções
/*ProgC083.cpp - Função e registro*/ #include <iostream> using namespace std; struct Venda{ int quantPecas; float preco; }; Venda novaVenda(){ Venda v;
cout << "\nNova Venda\n";
cout << "\nInsira o numero de peças: "; cin >> v.quantPecas;
cout << "\nInsira o preço: "; cin >> v.preco;
return v; }
void listaTotalVendas(Venda &v1, Venda &v2){ cout << "\nVenda Total\n";
cout << "\nTotal de peças: " <<
(v1.quantPecas + v2.quantPecas); cout << "\nPreço Total: " << (v1.preco +
v2.preco); }
int main() {
Venda venda1, venda2; venda1 = novaVenda(); venda2 = novaVenda(); listaTotalVendas(venda1, venda2); return 0; } Declaração de registro
25
Variáveis Compostas Heterogêneas –
Registros Aninhados
Podem-se definir tipos de dados
registro cujos membros são outros
registros.
Variáveis Compostas Heterogêneas –
Registros Aninhados
/*ProgC084.cpp - Registro aninhado*/ #include <iostream>
#include <cstdio> using namespace std; struct Data{
int dia; int mes; int ano;}; struct Venda{
int quantPecas; float preco; Data dtVenda;}; int main(){
Venda v = {15, 130.50, {27, 5, 2011}};
cout << "Quantidade de peças: " << v.quantPecas << endl << "Preço: " << v.preco << endl
<< "Data da venda: " << v.dtVenda.dia << "/" << v.dtVenda.mes << "/" << v.dtVenda.ano;
return 0; }
Declaração de
27