Vous êtes sur la page 1sur 20

Tipos Compostos de Dados

U N I ES E EN U M ER A ES
udson Santos Santiago
Introduo

Variveis so usadas para armazenar informaes


na memria do computador
Com os tipos bsicos de dados pode-se armazenar
informaes de tipo inteiro ou ponto-flutuante

char ch = 'W ';


Inteiro short sol = 25;
int num = 45820;

Ponto-flutuante fl
oat taxa = 0.25f;
double peso = 1.729156E5;
Introduo

Porm, com os tipos bsicos no possvel


armazenar um conjunto de informaes
Como armazenar o peso de 22 jogadores?
float p1 = 80.2;
float p2 = 70.6; Criar 22 variveis
float p3 = 65.5;
diferentes no a
...
float p21 = 85.8; m elhor soluo.
float p22 = 91.0;

A soluo usar vetores:


fl
oat peso[22];
Introduo

Com vetores no possvel armazenar um


conjunto de informaes de tipos diferentes
Como armazenar um cadastro completo de 22 jogadores?
(nome, idade, altura, peso, gols, etc.)
char nom e[22][80];
unsigned idade[22]; C riar vrios vetores
unsigned altura[22]; no a m elhor
fl
oat peso[22]; soluo.
unsigned gols[22];

A soluo usar registros


U nies

Assim como um registro, uma unio pode


armazenar diferentes tipos de dados
Palavra chave union Nome da unio

union identifi
cador
{
char ch;
int num ; Membros da unio
double frac;
};

Finaliza a instruo de declarao


U nies

A diferena entre um registro e uma unio que


uma unio s armazena um de seus membros por
vez
O registro armazena um char, um int e um double
A unio armazena um char ou um int ou um double
struct identifi
cador union identifi
cador
{ {
char ch; char ch;
int num ; int num ;
double frac; double frac;
}; };
U nies
union identifi
cador identifi
cador id;
{
char ch; id.ch = 'a'; // char
int num ; cout < < id.ch; // a
double frac; id.frac = 3.8; // double
}; cout < < id.frac; // 3.8
cout < < id.ch; // lixo

0xCB20

0xCB21
Endereos
0xCB22
de
id ch num frac 0xCB23
Memria
0xCB24

0xCB25

Dados

U nies

A unio usada para economizar memria quando


um item pode usar dois ou mais formatos, mas
nunca ao mesmo tempo union regkey
{
long long chave;
char codigo[10];
Exemplo: };

O nmero serial do struct softw are


software pode ser uma {
chave inteira ou um char nom e[20];
fl
oat preco;
cdigo de caracteres.
regkey serial;
bool tiporg;
};
U nies
# include < iostream >
using nam espace std;

union regkey {
int chave;
char codigo[8];
};

int m ain() {
cout < < "Q ualseu tipo de senha?\n[1] chave\n[2] cdigo\nO po: ";
int tipo;
cin > > tipo;

regkey senha;
if (tipo = = 1) {
cout < < "D igite sua chave: ";
cin > > senha.chave;
} else {
cout < < "D igite seu cdigo: ";
cin > > senha.codigo;
}
}
U nies

Sada do Programa:
Q ualseu tipo de senha?
[1] chave
[2] cdigo
O po: 1
D igite sua chave: 12508

O programador s pode armazenar valores em um


dos membros da unio, portanto ele deve saber
que informao foi digitada
Enum eraes

Uma enumerao consiste em um conjunto de


constantes inteiras, em que cada uma
representada por um nome
enum cores {verde, am arelo, azul, branco};

A instruo 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 eraes

uma forma de criar constantes


Ela usada quando conhecemos o conjunto de
valores que uma varivel pode assumir e
desejamos usar nomes para esses valores
// verm elho = 0,am arelo= 1,verde= 2,azul= 3,preto= 4
enum cores {verm elho,am arelo,verde,azul,preto};

// m asculino = 0,fem inino = 1


enum sexo {m asculino,fem inino};

// on = 0,off= 1
enum chave {on,off
};

// norte = 0,sul= 1,leste = 2,oeste = 3


enum direcao {norte,sul,leste,oeste};
Enum eraes

Se a inteno criar apenas constantes sem ter


um
enum tipo:
{verm elho, am arelo, verde, azul, preto};

Valores podem
enum bits {um ser
= 1, dois= 2, explicitamente
quatro= 4, oito= 8}; definidos:

Alguns valores
enum bigstep {prim eiro,podem ser
segundo= 100, omitidos:
tercei
ro};

Valores
enum {zero,podem ser
nulo = 0, one, um repetidos:
= 1};
Enum eraes

Aps a definio da enumerao possvel criar


variveis:
enum cores {verm elho, am arelo, verde, azul, preto};
cores corD oCarro;

As nicas atribuies vlidas so as de um dos valores


definidos na; enumerao
corD oCarro = azul // vlido
corD oCarro = 2000; // invlido
corD oCarro = 3; // invlido

corD oCarro = cores (3); // vlido,type cast estilo C+ +


corD oCarro = (cores) 3; // vlido,type cast estilo C

int a = azul; // vlido,converso autom tica


Enum eraes
# include < iostream >
using nam espace std;

enum m es {Jan= 1, Fev, M ar, Abr, M ai, Jun, Jul, Ago, Set, O ut,N ov, D ez};

int m ain()
{
m es inicio, fi
m ; // cria variveis do tipo m s

inicio = Fev; // inicio do sem estre


fim = N ov; // fi
m do sem estre

cout < < "D igite o nm ero do m s atual: ";


int atual;
cin > > atual; // l o m s atualpara um a varivelinteira

if (atual> = inicio & & atual< = fi


m)
cout < < "Voc est em perodo de aulas.\n";
else
cout < < "Frias!\n";

system ("pause");
return 0;
}
Enum eraes

Sada do Programa:
D igite o m s atual: 3
Voc est em perodo de aulas.

As funes de entrada e sada (cin e cout) no


sabem como ler ou mostrar um tipo definido pelo
programador
cout < < "D igite o m s atual: ";
m es atual;
cin > > atual; // o m s deve ser lido com o um nm ero inteiro


Enum eraes com Escopo

Enumeraes tradicionais tem alguns problemas:

Duas definies podem ter nomes conflitantes:


enum pacote { pequeno, grande, largo, jum bo};
enum cam isa { pequena, m edia, grande, extragrande };

O tipo de um enumerador dependente da


implementao:
Eles podem ser constantes de qualquer tipo inteiro
enum direcao
Embora com: short
C++ {nort
11e,seja
sul, leste, oeste}; especificar o tipo
permitido
Enum eraes com Escopo

Enumeraes tradicionais tem alguns problemas:

Enumeradores so implicitamente convertidos para


inteiros:
Em atribuies
Em comparaes
enum cores {verm elho, am arelo, verde, azul, preto};

int num = verm elho; // converte verm elho para 0

if (num < preto) // converte preto para 4


Enum eraes com Escopo

O C++11 resolve estes problemas com uma nova


forma de enumerao que fornece escopo aos
enumeradores
Enumeradores so de tipo int (quando o tipo no
indicado)
enum class pacote { pequeno, grande, largo, jum bo};
enum class cam isa { pequena, m edia, grande, extragrande };

pacote leite = pacote::grande;


cam isa prom o = cam isa::grande;

int tam anho = cam isa::m edia; // converso im plcita no perm itida
int carga = int (pacote::jum bo); // ok, converso explcita
Resum o

Unies so semelhantes a registros, mas s armazenam


um membro por vez
Elas so usadas para economizar memria
Especialmente til em grandes quantidades (vetores de unies)

Enumeraes so usadas para definir constantes inteiras


O programador pode trabalhar com nomes no lugar de nmeros
So usadas quando o nmero de valores que uma varivel pode
assumir conhecido e pequeno

Vous aimerez peut-être aussi