Buscar

08. Registros Uniões e Enumerações

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 33 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 33 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 33 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Ju
d
so
n
 S
an
to
s 
S
an
ti
ag
o
REGISTROS, UNIÕES E 
ENUMERAÇÕES
Tipos Compostos de Dados
Introdução
 Variáveis são usadas para armazenar 
informações na memória do computador
 Com os tipos básicos de dados pode-se 
armazenar informações de tipo inteiro ou 
ponto-flutuante
char ch = 'W';
short sol = 25;
int num = 45820;
float taxa = 0.25f;
double peso = 1.729156E5;
Inteiro
Ponto-flutuante
Introdução
 Porém, com os tipos básicos não é possível 
armazenar um conjunto de informações
 Como armazenar o peso de 22 jogadores?
 A solução é usar vetores:
float p1 = 80.2;
float p2 = 70.6;
float p3 = 65.5;
...
float p21 = 85.8;
float p22 = 91.0;
Criar 22 variáveis 
diferentes não é a 
melhor solução.
float peso[22];
 Com vetores não é possível armazenar um 
conjunto de informações de tipos diferentes
 Como armazenar um cadastro completo (nome, 
idade, altura, peso, gols, etc.) de 22 jogadores?
 A solução é usar registros
char nome[22][80];
unsigned idade[22];
unsigned altura[22]; 
float peso[22];
unsigned gols[22];
Introdução
Criar vários vetores 
não é a melhor 
solução.
Registros
 O registro agrupa diversas informações, de 
tipos possivelmente diferentes, sob um único 
identificador
 Para solucionar o problema anterior pode-se criar 
um registro jogador, onde um jogador possui:
 Nome, idade, altura, peso, gols , etc.
 Na linguagem C++, o nome de um registro
define um novo tipo de dado
Registros
 Declaração de um registro:
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
Palavra chave struct Nome do registro
Membros do Registro
Finaliza a instrução de declaração
Declaração
 A declaração do registro não cria variáveis, 
apenas define que tipo de informações serão 
armazenadas 
 Os membros do registro são definidos por 
instruções de declaração de variáveis
 Pode-se usar qualquer tipo, incluindo vetores ou 
mesmo outro tipo definido através de um registro
 A definição de um registro deve ser finalizada 
por um ponto e vírgula
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
Criação de Variáveis
 Após a declaração do registro, pode-se definir 
variáveis desse novo tipo:
 Em C é obrigatório manter a palavra chave struct
 C++ enfatiza que o registro é um novo tipo
jogador pele;
jogador zico;
jogador bebeto;
jogador bebeto; // struct não é necessário em C++
struct jogador bebeto; // struct necessário em C
Criação de Variáveis
jogador zico;
Endereços 
de 
Memória
Dados na 
Memória
zico
nome
salario
gols
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
0xCB20
0xCB21
0xCB22
0xCB23
0xCB24
0xCB25
0xCB26
0xCB27
Usando Registros
 Os campos individuais de um registro são 
acessados através do operador membro (.)
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
jogador zico;
zico.salario = 40000;
zico.gols = 300;
zico.nome = "Zico"; // atribuição inválida
strcpy(zico.nome, "Zico"); // use a função strcpy
Registros
#include <iostream>
using namespace std;
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
int main()
{
jogador a = {"Bebeto", 200000, 600};
jogador b = {"Romário", 300000, 800};
cout << "Contratações para o próximo ano: " 
<< a.nome << " e " << b.nome << "!\n";
cout << "Preço da aquisição: R$"
<< a.salario + b.salario << "!\n";
system("pause");
return 0;
}
Registros
 Saída do programa:
 Cada membro é tratado como uma variável 
do tipo definido na declaração do registro
Contratações para o próximo ano: Bebeto e Romário!
Preço da aquisição: R$500000!
jogador bebeto; // declaração de variável
bebeto // tipo jogador
bebeto.nome // tipo vetor de caracteres
bebeto.salario // tipo float
bebeto.gols // tipo unsigned int
bebeto.nome[0] // tipo caractere
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
Registros
 Tipos definidos pelo programador através de 
registros se comportam de forma semelhante 
aos tipos básicos da linguagem C++:
 Registros podem ser passados como argumentos 
de funções
void imprimir(jogador);
int main()
{
jogador bebeto = {"Bebeto", 200000, 600};
imprimir(bebeto);
...
}
Registros
 Tipos definidos pelo programador através de 
registros se comportam de forma semelhante 
aos tipos básicos da linguagem C++:
 Um registro pode ser um tipo de retorno de uma 
função
jogador lerDados();
int main()
{
jogador bebeto;
bebeto = lerDados();
...
}
Registros
 Tipos definidos pelo programador através de 
registros se comportam de forma semelhante 
aos tipos básicos da linguagem C++:
 Um registro pode ser atribuído a outro de mesmo 
tipo usando o operador de atribuição
int main()
{
jogador bebeto = {"Bebeto", 200000, 600};
jogador romario;
romario = bebeto;
...
}
Vetores de Registros
 Pelo registro ser semelhante a um tipo básico 
de dados, podemos criar vetores de registros
jogador equipe[22]; // cria vetor de 22 jogadores
cin >> equipe[0].nome; // lê nome, salário e
cin >> equipe[0].salario; // gols do primeiro
cin >> equipe[0].gols; // jogador do time
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
...
0 1 2 3 4 5 6 21
nome
salario
gols
Vetores de Registros
#include <iostream>
using namespace std;
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
int main()
{
jogador equipe[22] =
{
{"Bebeto", 200000, 182},
{"Romário", 300000, 178}
};
cout << "Contrações para o próximo ano: "
<< equipe[0].nome << " e " << equipe[1].nome << "!\n";
cout << "Preço da aquisição: R$"
<< equipe[0].salario + equipe[1].salario << "!\n";
system("pause");
return 0;
}
Vetores de Registros
 Saída do programa:
 Como equipe é um vetor do tipo jogador, 
equipe[0] é um jogador
Contrações para o próximo ano: Bebeto e Romário!
Preço da aquisição: R$500000!
jogador potiguar[22]; // declaração do vetor
potiguar // tipo vetor de jogadores
potiguar.nome // inválido, potiguar não é um registro
potiguar[0].nome // tipo vetor de caracteres
potiguar[0].nome[0] // tipo caractere
potiguar[0].salario // tipo float
struct jogador
{
char nome[40];
float salario;
unsigned gols;
};
Declaração de Variáveis
 Pode-se combinar a declaração de um 
registro com a criação de uma variável:
 Pode-se também criar um registro sem nome
struct jogador 
{
char nome[40];
float salario;
} 
maradona, zidane;
struct
{
char nome[40];
float salario;
} 
pele; // criar uma variável é obrigatório
Uniões
 Assim como um registro, uma união pode 
armazenar diferentes tipos de dados
union identificador
{
char ch;
int num;
double frac;
};
Palavra chave union Nome da união
Membros da união
Finaliza a instrução de declaração
Uniões
 A diferença entre um registro e uma união é 
que uma união só armazena um de seus 
membros por vez
 O registro armazena um char, um int e um double
 A união armazena um char ou um int ou um 
double
union identificador
{
char ch;
int num;
double frac;
};
struct identificador
{
char ch;
int num;
double frac;
};
Uniões
identificador id;
id.ch = 'a'; // char
cout << id.ch; // a
id.frac = 3.8; // double
cout << id.frac; // 3.8
cout << id.ch; // lixo
Endereços 
de 
Memória
Dados
id ch num frac
union identificador
{
char ch;
int num;
double frac;
};
0xCB20
0xCB21
0xCB22
0xCB23
0xCB24
0xCB25
Uniões
Um uso para uniões é economizar memória 
quando um item pode usar dois ou mais 
formatos, mas nunca simultaneamente
union regkey 
{
int chave;
char codigo[10];
};
struct software
{
char nome[40];
regkey serial; 
float preco;
};
O numero serial do 
software pode ser uma 
chave inteira ou um 
codigo de caracteres. 
Uniões
#include <iostream>
using namespace std;
union regkey {
int chave;
char codigo[8]; 
};
int main()
{ 
regkey senha;
cout << "Qual seu tipo de senha?\n[1] chave\n[2] código\nOpção: ";
int tipo;
cin >> tipo;
if (tipo == 1)
{
cout << "Digite sua chave: "; 
cin >> senha.chave;
} else {
cout << "Digite seu código: "; 
cin >> senha.codigo; 
}
system("pause");
return 0;
}
Uniões
 Saída do Programa:
 O programador só pode armazenar valores 
em um dos membros da união, portanto ele 
deve saber que informação foi digitada
Qual seu tipo de senha?
[1] chave
[2] código
Opção: 1
Digite sua chave: 12508
Enumerações
 Uma enumeração consiste em um conjunto 
de constantes inteiras, em que cada uma é 
representada por um nome
 A instrução acima faz duas coisas:
 Define cores como o nome de um novo tipo
 Faz dos nomes verde, amarelo, azul e branco
constantes para os valores 0, 1, 2 e 3
enum cores {verde, amarelo, azul, branco};
Enumerações
 Uma enumeração é uma forma alternativa de 
criar constantes simbólicas
 Ela é usada quando conhecemos o conjunto 
de valores que uma variável pode assumir
// vermelho = 0, amarelo=1, verde=2, azul=3, preto=4
enum cores {vermelho, amarelo, verde, azul, preto};
// masculino = 0, feminino = 1
enum sexo {masculino, feminino};
// on = 0, off = 1
enum chave {on, off};
// norte = 0, sul = 1, leste = 2, oeste = 3
enum direcao {norte, sul, leste, oeste};
Enumerações
 Se a intenção é criar apenas constantes sem 
ter um tipo definido:
 Valores podem ser explicitamente definidos
 Alguns valores podem ser omitidos:
 Valores podem ser repetidos
enum {vermelho, amarelo, verde, azul, preto};
enum bits {um=1, dois=2, quatro=4, oito=8};
enum bigstep {primeiro, segundo=100, terceiro};
enum {zero, nulo = 0, one, um = 1};
Enumerações
 Após a definição da enumeração é possível 
criar variáveis da seguinte forma:
 As únicas atribuições válidas são as de um dos 
valores definidos na enumeração
enum cores {vermelho, amarelo, verde, azul, preto};
cores corDoCarro;
corDoCarro = azul; // válido
corDoCarro = 2000; // inválido
corDoCarro = 3; // inválido
corDoCarro = cores (3); // válido, type cast estilo C++
corDoCarro = (cores) 3; // válido, type cast estilo C
int a = azul; // válido, conversão automática
Enumerações
#include <iostream>
using namespace std;
enum mes {Jan=1, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez};
int main()
{ 
mes inicio, fim; // cria variáveis do tipo mês
inicio = Mar; // inicio do semestre
fim = Jun; // fim do semestre
cout << "Digite o mês atual: "; 
int atual; 
cin >> atual; // lê o mês atual numa variável inteira
if (atual == inicio)
cout << "Você pode trancar disciplinas.\n";
else
cout << "Você não pode trancar!\n";
system("pause");
return 0;
}
Enumerações
 Saída do Programa:
 As funções de entrada e saída (cin e cout) não 
sabem como ler ou mostrar um tipo definido 
pelo programador
Digite o mês atual: 5
Você pode trancar disciplinas.
cout << "Digite o mês atual: "; 
mes atual; 
cin >> atual; // o mês deve ser lido como um número inteiro
Conclusão
 Registros são tipos compostos de dados que:
 Reúnem um conjunto de informações, 
possivelmente de tipos diferentes, sob um mesmo 
identificador
 Permitem ao programador criar seus próprios 
tipos de dados
 Funcionam como um tipo básico de dado no que 
diz respeito a atribuição e passagem de parâmetro 
para funções
Conclusão
 Uniões são semelhantes a registros, mas só 
armazenam um membro por vez
 Elas são usadas para economizar memória
 Enumerações são usadas para definir 
constantes inteiras
 O programador pode usar no código fonte de seu 
programa um nome no lugar de um número
 São usadas quando o número de valores que uma 
variável pode assumir é pequeno e conhecido

Outros materiais