Capítulo VII – Tipos Capítulo VII – Tipos Enumerativos e Enumerativos e
EstruturasEstruturas
7.1 – Tipos enumerativos7.1 – Tipos enumerativos
7.2 – A necessidade de estruturas7.2 – A necessidade de estruturas
7.3 – Manipulação dos campos de uma 7.3 – Manipulação dos campos de uma estruturaestrutura
7.4 – Campos alternativos7.4 – Campos alternativos
7.4 – Campos Alternativos7.4 – Campos Alternativos
7.4.1 – Utilidade de campos alternativos7.4.1 – Utilidade de campos alternativos
Seja o cadastramento dos Seja o cadastramento dos moradoresmoradores de um de um prédio prédio
Para todo Para todo moradormorador são registrados: o são registrados: o nomenome, o , o andarandar, o , o númeronúmero do apartamento e a do apartamento e a idadeidade
Conforme a idade, Conforme a idade, outras informaçõesoutras informações são são registradasregistradas
Morador:Morador:
nomenome, , andarandar, , númeronúmero do apartamento, do apartamento, idadeidade
Zero a 3 anos:Zero a 3 anos: número de mamadeirasnúmero de mamadeiras tomadas por diatomadas por dia
4 a 11 anos: escolaridade4 a 11 anos: escolaridade, , número de número de brinquedosbrinquedos que possui; que possui;
12 a 17 anos:12 a 17 anos: escolaridadeescolaridade, , número de número de livroslivros que já leu, que já leu, passatempo prediletopassatempo predileto
18 anos ou mais:18 anos ou mais: escolaridadeescolaridade, , profissãoprofissão, , se é ou não se é ou não casadocasado(a), caso seja casado(a), o (a), caso seja casado(a), o nome do cônjugenome do cônjuge e o e o número de filhosnúmero de filhos
A seguinte A seguinte struct struct poderia ser usada:poderia ser usada:
struct morador {struct morador {
char Nome[30], Escolaridade[10], char Nome[30], Escolaridade[10], Passatempo[15], Passatempo[15], Profissao[15], Profissao[15], NomeConjuge[30]; NomeConjuge[30];
intint andarandar, , numapartamentonumapartamento, , idade, idade, numeromamadeiras, numeromamadeiras,
numbrinquedos, numbrinquedos, numlivros, numlivros, numfilhos;numfilhos;
logic casado;logic casado;
};};
Nenhum morador usaria todos os campos: Nenhum morador usaria todos os campos: desperdíciodesperdício de memória de memória
Solução: Campos Alternativos
Campos Alternativos: Campos Alternativos: campos de uma variável campos de uma variável que compartilham um que compartilham um mesmo espaçomesmo espaço de de memóriamemória
A A variávelvariável não será do tipo não será do tipo structstruct, mas sim do , mas sim do tipo tipo unionunion
No exemplo dos No exemplo dos moradoresmoradores do prédio, o do prédio, o mesmo mesmo espaçoespaço de memória pode ser compartilhado por: de memória pode ser compartilhado por:
nummamadeirasnummamadeiras Escolaridade, numbrinquedosEscolaridade, numbrinquedos Escolaridade, numlivros, PassatempoEscolaridade, numlivros, Passatempo Escolaridade, Profissao, casado, Escolaridade, Profissao, casado,
NomeConjuge, numfilhosNomeConjuge, numfilhos
nummamadeirasnummamadeiras Escolaridade, numbrinquedosEscolaridade, numbrinquedos Escolaridade, numlivros, PassatempoEscolaridade, numlivros, Passatempo Escolaridade, Profissao, casado, Escolaridade, Profissao, casado,
NomeConjuge, numfilhosNomeConjuge, numfilhos
Os Os camposcampos desse espaço a serem desse espaço a serem utilizadosutilizados dependem da dependem da idadeidade do morador do morador
O O tamanho totaltamanho total desse espaço é o desse espaço é o maiormaior dentre aqueles ocupados pelas dentre aqueles ocupados pelas quatro quatro alternativasalternativas
7.4.2 – A declaração union7.4.2 – A declaração union
Sejam as seguintes declarações:Sejam as seguintes declarações:
union valor {union valor {
int valint; double valreal; char valchar;int valint; double valreal; char valchar;
};};
union valor val;union valor val;
A variável A variável valval é do tipo é do tipo union valorunion valor
Os campos Os campos valintvalint, , valrealvalreal e e valcharvalchar compartilham o mesmo espaço de memóriacompartilham o mesmo espaço de memória
Então, essa Então, essa variávelvariável pode guardar pode guardar alternativamentealternativamente, num dado momento, um , num dado momento, um inteirointeiro, um , um realreal ou um ou um caracterecaractere
Val
valint/valreal/valchar
union valor {union valor {
int valint; double valreal; char valchar;int valint; double valreal; char valchar;
};};
union valor val;union valor val;
O O espaçoespaço por ela ocupado é o de um por ela ocupado é o de um doubledouble, , pois dentre os tipos dos três campos, pois dentre os tipos dos três campos, doubledouble é é o que ocupa maior espaço o que ocupa maior espaço
Tal como nas declarações Tal como nas declarações enumenum e e structstruct, a , a variável variável val val poderia ser declarada das poderia ser declarada das seguintes formas alternativas:seguintes formas alternativas:
ouou
union valor {int valint; double valreal; char valchar;
} val;
typedef union valor valor;union valor {
int valint; double valreal; char valchar;
};valor val;
Val
valint/valreal/valchar
typedef union valor valor;typedef union valor valor;
union valor {int valint; double valreal; char valchar;};union valor {int valint; double valreal; char valchar;};
valor val;valor val;
val.valint = 4455;val.valint = 4455;
printf ("1) valint = %d, valreal = %lf, valchar = %c",printf ("1) valint = %d, valreal = %lf, valchar = %c",
val.valint, val.valreal, val.valchar);val.valint, val.valreal, val.valchar);
val.valreal = 4455.68;val.valreal = 4455.68;
printf ("\n\n2) valint = %d, valreal = %lf, valchar = %c",printf ("\n\n2) valint = %d, valreal = %lf, valchar = %c",
val.valint, val.valreal, val.valchar);val.valint, val.valreal, val.valchar);
val.valchar = '*';val.valchar = '*';
printf ("\n\n3) valint = %d, valreal = %lf, valchar = %c",printf ("\n\n3) valint = %d, valreal = %lf, valchar = %c",
val.valint, val.valreal, val.valchar);val.valint, val.valreal, val.valchar);
Exemplo: seja o trecho de programa à esquerda
1) valint = 4455, valreal = 0.000000, valchar = g
2) valint = 343597384, valreal = 4455.680000, valchar = H
3) valint = 343597354, valreal = 4455.680000, valchar = *
No vídeo
Os mesmos 8 bytes (64 bits) estão sendo vistos de formas diferentes
Val
valint/valreal/valchar
7.4.3 – Estruturas com campos 7.4.3 – Estruturas com campos alternativosalternativos
Campos alternativos são Campos alternativos são muitíssimo usadosmuitíssimo usados dentro de estruturasdentro de estruturas
São frequentes os casos em que o São frequentes os casos em que o valor de valor de algum campoalgum campo de uma estrutura de uma estrutura determinadetermina quais os quais os outros camposoutros campos da mesma serem da mesma serem preenchidos em seguida preenchidos em seguida
Seja a seguir o exemplo visto dos Seja a seguir o exemplo visto dos moradores moradores de um prédiode um prédio
Declarações dos tipos utilizados:Declarações dos tipos utilizados:
cadastro Cad; // Cad é do tipo cadastro ondecadastro Cad; // Cad é do tipo cadastro onde
struct cadastro {struct cadastro {
int nmor; morador Moradores[10];int nmor; morador Moradores[10];
};};
typedef struct cadastro cadastro;typedef struct cadastro cadastro;
nmor
morador
morador
morador
morador
morador
morador
morador
morador
morador
morador
Moradores
Cad
typedef struct morador morador;typedef struct morador morador;
struct morador {struct morador {
char Nome[30]; int andar, nap, idade;char Nome[30]; int andar, nap, idade;
infoadicionais InfoAdic;infoadicionais InfoAdic;
};};
nmor
morador
morador
morador
morador
morador
morador
morador
morador
morador
morador
Moradores
Cad
char - [30] int int int infoadicionais
Nome andar nap idade InfoAdic
O tipo morador
typedef union infoadicionais infoadicionais;typedef union infoadicionais infoadicionais;
union infoadicionais {union infoadicionais {
infozeroa3 Info03; info4a11 Info411;infozeroa3 Info03; info4a11 Info411;
info12a17 Info1217; info18oumais Info18;info12a17 Info1217; info18oumais Info18;
};};
char - [30] int int int infoadicionais
Nome andar nap idade InfoAdic
O tipo morador
infozeroa3 / info4a11 / info12a17 / info18oumaisInfo03 / Info411 / Info1217 / Info18
O tipo infoadicionais
typedef struct infozeroa3 infozeroa3;typedef struct infozeroa3 infozeroa3;
struct infozeroa3 {int nmamads;};struct infozeroa3 {int nmamads;};
typedef struct info4a11 info4a11;typedef struct info4a11 info4a11;
struct info4a11 {escolaridade esc; int nbrinq;};struct info4a11 {escolaridade esc; int nbrinq;};
infozeroa3 / info4a11 / info12a17 / info18oumaisInfo03 / Info411 / Info1217 / Info18
O tipo infoadicionais
int
nmamads
O tipo infozeroa3
escolaridade
int
esc nbrinq
O tipo info4a11
typedef struct info12a17 info12a17;typedef struct info12a17 info12a17;
struct info12a17 {struct info12a17 {
escolaridade esc; int nlivros;escolaridade esc; int nlivros;
char Passatempo[20];char Passatempo[20];
};};
infozeroa3 / info4a11 / info12a17 / info18oumaisInfo03 / Info411 / Info1217 / Info18
O tipo infoadicionais
escolaridade
int char - [20]
esc nlivros
Passatempo
O tipo info12a17
typedef struct info18oumais info18oumais;typedef struct info18oumais info18oumais;
struct info18oumais {struct info18oumais {
escolaridade esc; char Profissao[20], escolaridade esc; char Profissao[20], Conjuge[30];Conjuge[30];
char ehcasado; int nfilhos;char ehcasado; int nfilhos;
};};
infozeroa3 / info4a11 / info12a17 / info18oumaisInfo03 / Info411 / Info1217 / Info18
O tipo infoadicionais
O tipo info18oumaisescolarida
decharchar - [20] char - [30] int
esc ehcasado
Profissao Conjuge nfilhos
A seguir, um programa completo
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
/* Declaracoes dos diversos tipos *//* Declaracoes dos diversos tipos */
typedef enum escolaridade escolaridade;typedef enum escolaridade escolaridade;
enum escolaridade {nenhuma, basica, media, enum escolaridade {nenhuma, basica, media, superior};superior};
typedef struct infozeroa3 infozeroa3;typedef struct infozeroa3 infozeroa3;
struct infozeroa3 {int nmamads;};struct infozeroa3 {int nmamads;};
typedef struct info4a11 info4a11;typedef struct info4a11 info4a11;
struct info4a11 {escolaridade esc; int nbrinq;};struct info4a11 {escolaridade esc; int nbrinq;};
typedef struct info12a17 info12a17;typedef struct info12a17 info12a17;
struct info12a17 {struct info12a17 {
escolaridade esc; int nlivros;escolaridade esc; int nlivros;
char Passatempo[20];char Passatempo[20];
};};
typedef struct info18oumais info18oumais;typedef struct info18oumais info18oumais;
struct info18oumais {struct info18oumais {
escolaridade esc; char Profissao[20], escolaridade esc; char Profissao[20], Conjuge[30];Conjuge[30];
char ehcasado; int nfilhos;char ehcasado; int nfilhos;
};};
typedef union infoadicionais infoadicionais;typedef union infoadicionais infoadicionais;
union infoadicionais {union infoadicionais {
infozeroa3 Info03; info4a11 Info411;infozeroa3 Info03; info4a11 Info411;
info12a17 Info1217; info18oumais Info18;info12a17 Info1217; info18oumais Info18;
};};
typedef struct morador morador;typedef struct morador morador;
struct morador {struct morador {
char Nome[30]; int andar, nap, idade;char Nome[30]; int andar, nap, idade;
infoadicionais InfoAdic;infoadicionais InfoAdic;
};};
typedef struct cadastro cadastro;typedef struct cadastro cadastro;
struct cadastro {struct cadastro {
int nmor; morador Moradores[10];int nmor; morador Moradores[10];
};};
/* Cabecalho e declaracoes das variaveis *//* Cabecalho e declaracoes das variaveis */
int main () {int main () {
cadastro Cad;cadastro Cad;
int i; char c;int i; char c;
/* Inicio da entrada de dados *//* Inicio da entrada de dados */
printf ("CADASTRO DE MORADORES DE UM PREDIO");printf ("CADASTRO DE MORADORES DE UM PREDIO");
printf ("\n\nNumero de moradores: "); scanf ("%d", printf ("\n\nNumero de moradores: "); scanf ("%d", &Cad.nmor);&Cad.nmor);
for (i = 0; i < Cad.nmor; i++) {for (i = 0; i < Cad.nmor; i++) {
/* Leitura das informacoes comuns a cada morador *//* Leitura das informacoes comuns a cada morador */
printf ("\n\nMorador n.o %d:", i+1);printf ("\n\nMorador n.o %d:", i+1);
printf ("\n\tNome: "); setbuf (stdin, NULL); printf ("\n\tNome: "); setbuf (stdin, NULL);
gets (Cad.Moradores[i].Nome);gets (Cad.Moradores[i].Nome);
printf ("\tAndar: "); scanf ("%d", printf ("\tAndar: "); scanf ("%d", &Cad.Moradores[i].andar);&Cad.Moradores[i].andar);
printf ("\tApto: "); scanf ("%d", &Cad.Moradores[i].nap);printf ("\tApto: "); scanf ("%d", &Cad.Moradores[i].nap);
printf ("\tIdade: "); scanf ("%d", printf ("\tIdade: "); scanf ("%d", &Cad.Moradores[i].idade);&Cad.Moradores[i].idade);
/* Leitura das informacoes dos moradores com idade de zero a 3 anos /* Leitura das informacoes dos moradores com idade de zero a 3 anos */*/
if (Cad.Moradores[i].idade >= 0 && Cad.Moradores[i].idade if (Cad.Moradores[i].idade >= 0 && Cad.Moradores[i].idade <= 3) {<= 3) {
printf ("\tNumero de Mamadeiras: ");printf ("\tNumero de Mamadeiras: ");
scanf ("%d", scanf ("%d", &Cad.Moradores[i].InfoAdic.Info03.nmamads);&Cad.Moradores[i].InfoAdic.Info03.nmamads);
}}
/* Leitura das informacoes dos moradores com idade de 4 a 11 anos *//* Leitura das informacoes dos moradores com idade de 4 a 11 anos */
else if (Cad.Moradores[i].idade >= 4 && else if (Cad.Moradores[i].idade >= 4 && Cad.Moradores[i].idade <= 11) {Cad.Moradores[i].idade <= 11) {
printf ("\tEscolaridade ");printf ("\tEscolaridade ");
printf ("(0 - Nenhuma, 1 - Basica, 2 - Media, 3 - printf ("(0 - Nenhuma, 1 - Basica, 2 - Media, 3 - Superior): ");Superior): ");
scanf ("%d", &Cad.Moradores[i].InfoAdic.Info411.esc);scanf ("%d", &Cad.Moradores[i].InfoAdic.Info411.esc);
printf ("\tNumero de Brinquedos: ");printf ("\tNumero de Brinquedos: ");
scanf ("%d", scanf ("%d", &Cad.Moradores[i].InfoAdic.Info411.nbrinq);&Cad.Moradores[i].InfoAdic.Info411.nbrinq);
}}
/* Leitura das informacoes dos moradores com idade de 12 a /* Leitura das informacoes dos moradores com idade de 12 a 17 anos */17 anos */
else if (Cad.Moradores[i].idade>=12 && else if (Cad.Moradores[i].idade>=12 && Cad.Moradores[i].idade<=17) {Cad.Moradores[i].idade<=17) {
printf ("\tEscolaridade ");printf ("\tEscolaridade ");
printf ("(0 - Nenhuma, 1 - Basica, 2 - Media, 3 - printf ("(0 - Nenhuma, 1 - Basica, 2 - Media, 3 - Superior): ");Superior): ");
scanf ("%d", scanf ("%d", &Cad.Moradores[i].InfoAdic.Info1217.esc);&Cad.Moradores[i].InfoAdic.Info1217.esc);
printf ("\tNumero de Livros Lidos: ");printf ("\tNumero de Livros Lidos: ");
scanf ("%d", scanf ("%d", &Cad.Moradores[i].InfoAdic.Info1217.nlivros);&Cad.Moradores[i].InfoAdic.Info1217.nlivros);
printf ("\tPassatempo Predileto: ");printf ("\tPassatempo Predileto: ");
setbuf (stdin, NULL); setbuf (stdin, NULL);
gets gets (Cad.Moradores[i].InfoAdic.Info1217.Passatempo);(Cad.Moradores[i].InfoAdic.Info1217.Passatempo);
}}
/* Leitura das informacoes dos moradores com idade de 18 anos ou mais *//* Leitura das informacoes dos moradores com idade de 18 anos ou mais */
else {else {
printf ("\tEscolaridade ");printf ("\tEscolaridade ");
printf ("(0 - Nenhuma, 1 - Basica, 2 - Media, 3 - Superior): printf ("(0 - Nenhuma, 1 - Basica, 2 - Media, 3 - Superior): ");");
scanf ("%d", &Cad.Moradores[i].InfoAdic.Info18.esc);scanf ("%d", &Cad.Moradores[i].InfoAdic.Info18.esc);
printf ("\tProfissao: ");printf ("\tProfissao: ");
setbuf (stdin, NULL); setbuf (stdin, NULL);
gets (Cad.Moradores[i].InfoAdic.Info18.Profissao);gets (Cad.Moradores[i].InfoAdic.Info18.Profissao);
printf ("\tEh casado? (s/n): ");printf ("\tEh casado? (s/n): ");
c = Cad.Moradores[i].InfoAdic.Info18.ehcasado = getche c = Cad.Moradores[i].InfoAdic.Info18.ehcasado = getche ();();
if (c == 's' || c == 'S') {if (c == 's' || c == 'S') {
printf ("\n\tNome do conjuge: "); setbuf (stdin, printf ("\n\tNome do conjuge: "); setbuf (stdin, NULL); NULL);
gets (Cad.Moradores[i].InfoAdic.Info18.Conjuge);gets (Cad.Moradores[i].InfoAdic.Info18.Conjuge);
printf ("\tNumero de Filhos: ");printf ("\tNumero de Filhos: ");
scanf ("%d", scanf ("%d", &Cad.Moradores[i].InfoAdic.Info18.nfilhos);&Cad.Moradores[i].InfoAdic.Info18.nfilhos);
}}
else printf ("\n");else printf ("\n");
}}
}}
/* Listagem das informacoes digitadas *//* Listagem das informacoes digitadas */
printf ("\nListagem dos Moradores:\n");printf ("\nListagem dos Moradores:\n");
for(i = 0; i < Cad.nmor; i++) {for(i = 0; i < Cad.nmor; i++) {
/* Informacoes comuns *//* Informacoes comuns */
printf("\n%d) Nome: %-21s; Andar: %4d; Apto: %5d; printf("\n%d) Nome: %-21s; Andar: %4d; Apto: %5d; Idade: %4d", i+1,Idade: %4d", i+1,
Cad.Moradores[i].Nome, Cad.Moradores[i].andar, Cad.Moradores[i].Nome, Cad.Moradores[i].andar, Cad.Moradores[i].nap, Cad.Moradores[i].nap,
Cad.Moradores[i].idade);Cad.Moradores[i].idade);
/* Moradores de zero a 3 anos *//* Moradores de zero a 3 anos */
if (Cad.Moradores[i].idade >= 0 && if (Cad.Moradores[i].idade >= 0 && Cad.Moradores[i].idade <= 3) {Cad.Moradores[i].idade <= 3) {
printf ("\n\tMamadeiras: %d;", printf ("\n\tMamadeiras: %d;",
Cad.Moradores[i].InfoAdic.Info03.nmamads);Cad.Moradores[i].InfoAdic.Info03.nmamads);
}}
/* Moradores de 4 a 11 anos *//* Moradores de 4 a 11 anos */
else if (Cad.Moradores[i].idade >= 4 && else if (Cad.Moradores[i].idade >= 4 && Cad.Moradores[i].idade <= 11) {Cad.Moradores[i].idade <= 11) {
printf ("\n\tEscolaridade: %d; Brinquedos: %d",printf ("\n\tEscolaridade: %d; Brinquedos: %d",
Cad.Moradores[i].InfoAdic.Info411.esc,Cad.Moradores[i].InfoAdic.Info411.esc,
Cad.Moradores[i].InfoAdic.Info411.nbrinq);Cad.Moradores[i].InfoAdic.Info411.nbrinq);
}}
/* Moradores de 12 a 17 anos *//* Moradores de 12 a 17 anos */
else if (Cad.Moradores[i].idade>=12 && else if (Cad.Moradores[i].idade>=12 && Cad.Moradores[i].idade<=17) {Cad.Moradores[i].idade<=17) {
printf ("\n\tEscolaridade: %d; Livros: %d; printf ("\n\tEscolaridade: %d; Livros: %d; Passatempo: %s",Passatempo: %s",
Cad.Moradores[i].InfoAdic.Info1217.esc,Cad.Moradores[i].InfoAdic.Info1217.esc,
Cad.Moradores[i].InfoAdic.Info1217.nlivros,Cad.Moradores[i].InfoAdic.Info1217.nlivros,
Cad.Moradores[i].InfoAdic.Info1217.Passatempo);Cad.Moradores[i].InfoAdic.Info1217.Passatempo);
}}
/* Moradores de 18 anos ou mais *//* Moradores de 18 anos ou mais */
else {else {
printf ("\n\tEscolaridade %d; Profissao %s; Casado: printf ("\n\tEscolaridade %d; Profissao %s; Casado: %c;",%c;",
Cad.Moradores[i].InfoAdic.Info18.esc,Cad.Moradores[i].InfoAdic.Info18.esc,
Cad.Moradores[i].InfoAdic.Info18.Profissao,Cad.Moradores[i].InfoAdic.Info18.Profissao,
Cad.Moradores[i].InfoAdic.Info18.ehcasado);Cad.Moradores[i].InfoAdic.Info18.ehcasado);
c = Cad.Moradores[i].InfoAdic.Info18.ehcasado;c = Cad.Moradores[i].InfoAdic.Info18.ehcasado;
if (c == 's' || c == 'S') {if (c == 's' || c == 'S') {
printf ("\n\tConjuge: %s, Filhos: %d",printf ("\n\tConjuge: %s, Filhos: %d",
Cad.Moradores[i].InfoAdic.Info18.Conjuge,Cad.Moradores[i].InfoAdic.Info18.Conjuge,
Cad.Moradores[i].InfoAdic.Info18.nfilhos);Cad.Moradores[i].InfoAdic.Info18.nfilhos);
}}
}}
}}
/* Fechamento da tela *//* Fechamento da tela */
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
Exercícios 7.4:Exercícios 7.4:
1)1) Seja o Seja o programa ao programa ao lado contendo lado contendo estruturas e estruturas e campos campos alternativos. alternativos. Mostrar o que Mostrar o que será escrito no será escrito no vídeo pela sua vídeo pela sua execução.execução.
#include <stdio.h>#include <stdlib.h>
typedef char str2[2]; typedef char str4[4];struct ss {str2 x[4]; str4 y[2];};typedef struct ss ss; typedef char str16[16];typedef char str8[8];union uu {ss a; str16 b; str8 c;} uniao;
int main () {str16 palavra =
"ABCDEFGHIJKLMNOP";str8 numero = "12345678";int i, j;for (i=0; i<16; i++) uniao.b[i] =
palavra[i];for (i=0; i<8; i++) uniao.c[i] =
numero[i];for (i=0; i<4; i++) {
for (j=0; j<2; j++)printf ("%c%c",
uniao.a.x[i][j],
uniao.a.y[j][i]);
printf ("\n");}
printf ("\n\n"); system ("pause");return 0;
}
Top Related