ces-10 introduÇÃo À computaÇÃo capítulo vii tipos enumerativos e estruturas

44
CES-10 INTRODUÇÃO À CES-10 INTRODUÇÃO À COMPUTAÇÃO COMPUTAÇÃO Capítulo VII Capítulo VII Tipos Enumerativos e Tipos Enumerativos e Estruturas Estruturas

Upload: internet

Post on 17-Apr-2015

109 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

CES-10 INTRODUÇÃO CES-10 INTRODUÇÃO À COMPUTAÇÃOÀ COMPUTAÇÃO

Capítulo VII Capítulo VII

Tipos Enumerativos e Tipos Enumerativos e EstruturasEstruturas

Page 2: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

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

Page 3: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

7.1 – Tipos Enumerativos7.1 – Tipos Enumerativos

7.1.1 – Conceitos, declarações e 7.1.1 – Conceitos, declarações e expressõesexpressões

Valores manipulados até agora: números Valores manipulados até agora: números inteirosinteiros, , reaisreais e e caracterescaracteres

Tipos enumerativos: Tipos enumerativos: artifício da Linguagem C artifício da Linguagem C para se trabalhar com valores diferentes desses:para se trabalhar com valores diferentes desses:

Dias da semana, meses do ano, cores, estados Dias da semana, meses do ano, cores, estados civis de pessoas, naipes de baralho, etc.civis de pessoas, naipes de baralho, etc.

Page 4: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Exemplo: Exemplo: sejam as declaraçõessejam as declarações

enum diasemana {domingo, segunda, terca, quarta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};quinta, sexta, sabado};

enum mes {janeiro, fevereiro, marco, abril, maio, enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, junho, julho, agosto, setembro, outubro, novembro, dezembro};dezembro};

enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};

Elas criam os seguintes novos Elas criam os seguintes novos tipos de tipos de variáveisvariáveis::

enum diasemana, enum mes e enum corenum diasemana, enum mes e enum cor

Os valores dessas variáveis serão Os valores dessas variáveis serão respectivamente:respectivamente:

{domingo, ..., sabado}, {janeiro, ..., dezembro} e {domingo, ..., sabado}, {janeiro, ..., dezembro} e {branca, ..., preta}{branca, ..., preta}

Page 5: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

enum diasemana {domingo, segunda, terca, quarta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};quinta, sexta, sabado};

enum mes {janeiro, fevereiro, marco, abril, maio, enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, junho, julho, agosto, setembro, outubro, novembro, dezembro};dezembro};

enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};

Declarações de variáveisDeclarações de variáveis::

enum diasemana hoje, ontem, amanha;enum diasemana hoje, ontem, amanha;

enum mes MesNascimento, MesAtual, MesPassado;enum mes MesNascimento, MesAtual, MesPassado;

enum cor cor1, cor2, cor3;enum cor cor1, cor2, cor3;

Outra forma de declarar variáveis:Outra forma de declarar variáveis:

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado} hoje, ontem, amanha;sexta, sabado} hoje, ontem, amanha;

Page 6: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

A palavra A palavra enumenum é obrigatória: é obrigatória:

enum diasemana hoje, ontem, amanha;enum diasemana hoje, ontem, amanha;

enum mes MesNascimento, MesAtual, MesPassado;enum mes MesNascimento, MesAtual, MesPassado;

enum cor cor1, cor2, cor3;enum cor cor1, cor2, cor3;

Mas pode-se dispensá-la mediante o uso de Mas pode-se dispensá-la mediante o uso de typedeftypedef::

typedef enum diasemana diasemana;typedef enum diasemana diasemana;

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

typedef enum cor cor;typedef enum cor cor;

enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};

diasemanadiasemana hoje, ontem, amanha; hoje, ontem, amanha;

corcor cor1, cor2, cor3; cor1, cor2, cor3;

No Borland,, enum cor pode ser usada num typedef antes de declarada

diasemana e cor passam a ser tipos equivalentes aos tipos enum diasemana e enum cor

Page 7: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

typedef enum diasemana diasemana;typedef enum diasemana diasemana;

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

typedef enum cor cor;typedef enum cor cor;

enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};

diasemana hoje, ontem, amanha; diasemana hoje, ontem, amanha;

cor cor1, cor2, cor3;cor cor1, cor2, cor3;

As variáveis e os valores desses tipos podem As variáveis e os valores desses tipos podem ser usados em ser usados em atribuiçõesatribuições e e expressõesexpressões::

cor1 = azul;cor1 = azul;

if (ontem == segunda) hoje = terca;if (ontem == segunda) hoje = terca;

Page 8: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};

Na realidade, Na realidade, domingo, segunda, ... , sabado, branca, amarela, ... , domingo, segunda, ... , sabado, branca, amarela, ... , pretapreta

são são constantes inteirasconstantes inteiras como aquelas criadas como aquelas criadas por uma declaração por uma declaração constconst

Os Os valoresvalores dessas constantes dessas constantes não podem ser não podem ser alteradosalterados por nenhum comando do programa por nenhum comando do programa

Assim, o comandoAssim, o comando segunda = 5;segunda = 5;

não é aceitonão é aceito pelo compilador pelo compilador

Page 9: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};

Por default, o compilador estabelece os Por default, o compilador estabelece os seguintes valores:seguintes valores:

Constante Valor Constante Valor

domingo 0 branca 0

segunda 1 amarela 1

terca 2 azul 2

quarta 3 verde 3

quinta 4 vermelha 4

sexta 5 marrom 5

sabado 6 cinza 6

preta 7

Page 10: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Pode-se Pode-se explicitarexplicitar o valor desejado para as o valor desejado para as constantesconstantes

ExemploExemplo: seja a seguinte declaração:: seja a seguinte declaração:

enum mes {janeiro, fevereiro = 7, marco, abril, maio, enum mes {janeiro, fevereiro = 7, marco, abril, maio, junho = 5, julho, agosto, setembro, outubro = 26, junho = 5, julho, agosto, setembro, outubro = 26, novembro, dezembro};novembro, dezembro};

Os valores das constantes serão:Os valores das constantes serão:Constant

eValor Constant

eValor Constant

eValor

janeiro 0 maio 10 setembro 8

fevereiro 7 junho 5 outubro 26

marco 8 julho 6 novembro

27

abril 9 agosto 7 dezembro

28

Page 11: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

ExemploExemplo: variáveis lógicas simuladas por tipo : variáveis lógicas simuladas por tipo enumerativo:enumerativo:

typedef enum logic logic;typedef enum logic logic;

enum logic {False, True}; enum logic {False, True};

logic L1, L2, L3;logic L1, L2, L3;

Nestas declarações, as constantes Nestas declarações, as constantes FalseFalse e e TrueTrue têm respectivamente os valores têm respectivamente os valores 00 e e 11

Page 12: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

7.1.2 – Entrada e saída amigável para 7.1.2 – Entrada e saída amigável para tipos enumerativostipos enumerativos

Sejam novamente as declarações:Sejam novamente as declarações:

typedef enum diasemana diasemana;typedef enum diasemana diasemana;

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

diasemana hoje, ontem, amanha;diasemana hoje, ontem, amanha;

A constante inteira A constante inteira quartaquarta não tem nada a ver não tem nada a ver com a cadeia de caracteres com a cadeia de caracteres “quarta”“quarta”

Isso dificulta a Isso dificulta a entrada e saída amigávelentrada e saída amigável para esses tipospara esses tipos

Page 13: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

typedef enum diasemana diasemana;typedef enum diasemana diasemana;

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

diasemana hoje, ontem, amanha;diasemana hoje, ontem, amanha;

Por exemplo, numa Por exemplo, numa leituraleitura para a variável para a variável hojehoje, , deve ser usado um formato deve ser usado um formato inteirointeiro::

printf ("Entre com o dia de hoje: "); printf ("Entre com o dia de hoje: ");

scanf ("%d", &hoje);scanf ("%d", &hoje);

Então, caso o operador queira que o valor de Então, caso o operador queira que o valor de hoje hoje seja seja quartaquarta, ele deverá digitar , ele deverá digitar 33 e não a e não a cadeia cadeia quartaquarta

É necessário É necessário mais trabalhomais trabalho para tornar a para tornar a entrada amigávelentrada amigável (ver programa a seguir) (ver programa a seguir)

Page 14: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

#include <string.h>#include <string.h>

/*/* Declaracoes de tiposDeclaracoes de tipos */*/

typedef char nome[10];typedef char nome[10];

typedef enum diasemana diasemana;typedef enum diasemana diasemana;

enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};

/*/* Cabecalho e declaracoes de variaveisCabecalho e declaracoes de variaveis */*/

void main( ){void main( ){

diasemana hoje, ontem, amanha; char c;diasemana hoje, ontem, amanha; char c;

nome cadhoje, nome cadhoje, NomeDia[7] = {"domingo", "segunda", NomeDia[7] = {"domingo", "segunda", "terca", "quarta","terca", "quarta",

"quinta", "sexta", "sabado"}"quinta", "sexta", "sabado"};;

“domingo”

“segunda”

“terca”

“quarta”

“quinta”

“sexta”

“sabado”

0

1

2

3

4

5

6

NomeDiaPara o

operador digitar uma cadeia e não um númerocadhoje

Page 15: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

/*/* Desejo de execucaoDesejo de execucao */*/

printf ("Conhecer dia de ontem e de amanhan? (s/n): ");printf ("Conhecer dia de ontem e de amanhan? (s/n): ");

c = getche ();c = getche ();

/*/* Leitura do dia de hojeLeitura do dia de hoje */*/

while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {

printf ("\n\n\tDigite o dia de hoje: "); scanf ("%s", printf ("\n\n\tDigite o dia de hoje: "); scanf ("%s", cadhoje);cadhoje);

/*/* Conversao da cadeia digitada para o tipo diasemanaConversao da cadeia digitada para o tipo diasemana*/*/

for (hoje = domingo; hoje <= sabado; hoje++)for (hoje = domingo; hoje <= sabado; hoje++)

if (strcmp (cadhoje, NomeDia[hoje]) == 0)if (strcmp (cadhoje, NomeDia[hoje]) == 0)

break;break;

“domingo”

“segunda”

“terca”

“quarta”

“quinta”

“sexta”

“sabado”

0

1

2

3

4

5

6

NomeDia

cadhoje

Page 16: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

/*/* Caso de erro de digitacaoCaso de erro de digitacao */*/

if (hoje > sabado)if (hoje > sabado)

printf("\n\thoje: erro de digitacao\n\n");printf("\n\thoje: erro de digitacao\n\n");

/*/* Determinacao dos dias de ontem e amanhanDeterminacao dos dias de ontem e amanhan */*/

else {else {

ontem = (hoje + 6) % 7; amanha = (hoje + 1) % 7;ontem = (hoje + 6) % 7; amanha = (hoje + 1) % 7;

printf("\n\thoje = %s; ontem = %s; amanhan = %s;\n\printf("\n\thoje = %s; ontem = %s; amanhan = %s;\n\n",n",

NomeDia[hoje], NomeDia[ontem], NomeDia[hoje], NomeDia[ontem], NomeDia[amanha]);NomeDia[amanha]);

}}

/*/* Desejo de nova execucao Desejo de nova execucao */*/

printf ("Conhecer dia de ontem e de amanhan? (s/n): "); c = printf ("Conhecer dia de ontem e de amanhan? (s/n): "); c = getche ();getche ();

}}

}}

“domingo”

“segunda”

“terca”

“quarta”

“quinta”

“sexta”

“sabado”

0

1

2

3

4

5

6

NomeDia

Page 17: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

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

Page 18: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

7.2 – A Necessidade de 7.2 – A Necessidade de EstruturasEstruturas

Em muitas aplicações, é útil poder tratar todas as Em muitas aplicações, é útil poder tratar todas as informações de uma entidadeinformações de uma entidade ou de uma pessoa ou de uma pessoa como sendo uma como sendo uma única unidadeúnica unidade

Por exemplo, é muito melhor dizer: Por exemplo, é muito melhor dizer: Levar o carro Levar o carro para casapara casa

do que dizerdo que dizer

Carro:Carro: entidadeentidade composta de composta de rodasrodas, , motormotor, , latarialataria, etc., etc.

Levar as rodas do carro para casaLevar o motor do carro para casaLevar os bancos do carro para casaLevar a lataria do carro para casaLevar o painel do carro para casaEtc.

Page 19: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

No entanto, nessas mesmas aplicações, pode No entanto, nessas mesmas aplicações, pode ser importante também a capacidade de se ser importante também a capacidade de se tratar tratar cada uma dessas informações em cada uma dessas informações em separadoseparado

Por exemplo:Por exemplo:

Consertar um pneu do carro Ligar o motor do carro Ajustar o banco do motoristaLavar a lataria do carroAcender o painel do carroEtc.

Page 20: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Exemplo: declarações para cadastrar os Exemplo: declarações para cadastrar os empregados de uma empresaempregados de uma empresa

Informações sobre um empregado

Nome

Endereço

Telefone

Sexo

Estado civil

Data de

nascimento

Data de

admissão

Cargo

Setor de

trabalho

Salário

LogradouroNúmeroComplementosBairroCidadeEstadoPaís

DiaMêsAno

DiaMêsAno

Ao ser admitido, todas as informações do empregado são inseridas no cadastro

Ao ser demitido, todas as informações do empregado são deletadas do cadastro

Ao mudar de endereço ou de salário ou de estado civil, nem todas as informações do empregado são manipuladas

Page 21: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Estruturas de dados para o cadastro dos empregados

O vetor de empregados é composto de elementos de mesmo tipo

Mas cada empregado guarda informações de diversos tipos

Page 22: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Um endereço também guarda informações de diversos tipos

Variáveis do tipo empregado e do tipo endereço são estruturadas heterogêneas

Também são genericamente denominadas estruturas

Em C, usa-se a declaração struct

Page 23: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Struct Struct para endereço:para endereço:

struct endereco {struct endereco {

char logradouro[15]; int numero;char logradouro[15]; int numero;

char complemento[6], bairro[10], cidade[10], estado[3], char complemento[6], bairro[10], cidade[10], estado[3], pais[10];pais[10];

};};

Esta declaração cria o novo Esta declaração cria o novo tipo de variáveistipo de variáveis::

struct enderecostruct endereco

Campos Campos das variáveis desse tipo:das variáveis desse tipo:logradouro, numero, complemento, bairro, cidade, estado, pais

Page 24: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

struct endereco {struct endereco {

char logradouro[15]; int numero;char logradouro[15]; int numero;

char complemento[6], bairro[10], cidade[10], estado[3], char complemento[6], bairro[10], cidade[10], estado[3], pais[10];pais[10];

};};

Declaração de variáveis desse tipo:Declaração de variáveis desse tipo:

struct endereco ender1, ender2, ender3;struct endereco ender1, ender2, ender3;

Outra forma de declarar variáveis:Outra forma de declarar variáveis:

struct endereco {struct endereco {

char logradouro[15]; int numero;char logradouro[15]; int numero;

char complemento[6], bairro[10], cidade[10], char complemento[6], bairro[10], cidade[10], estado[3], pais[10];estado[3], pais[10];

} ender1, ender2, ender3} ender1, ender2, ender3;;

Page 25: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

A palavra A palavra structstruct é obrigatória: é obrigatória:

struct endereco ender1, ender2, ender3;struct endereco ender1, ender2, ender3;

Mas pode-se dispensá-la mediante o uso de Mas pode-se dispensá-la mediante o uso de typedeftypedef::

typedef struct endereco endereco;typedef struct endereco endereco;

struct endereco {struct endereco {

char logradouro[15];char logradouro[15];

int numero;int numero;

char complemento[6], bairro[10], cidade[10], char complemento[6], bairro[10], cidade[10],

estado[3], pais[10];estado[3], pais[10];

};};

endereco ender1, ender2, ender3;endereco ender1, ender2, ender3;No Borland, struct endereco pode ser usada num typedef, antes de declarada

endereco passa a ser um tipo equivalente ao tipo struct endereco

Page 26: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Struct Struct para empregado:para empregado:

struct empregado {struct empregado {

char nome[20], cargo[10], setor[10];char nome[20], cargo[10], setor[10];

endereco ender; int tel;endereco ender; int tel;

sexo sex; civil estciv;sexo sex; civil estciv;

data nasc, adm;data nasc, adm;

float salario;float salario;

};};

typedef int data[3];

sexo e civil são tipos enumerativos (ver declarações a seguir)

Page 27: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

typedef int data[3];typedef int data[3];

typedef enum sexo sexo;typedef enum sexo sexo;

typedef enum estcivil civil;typedef enum estcivil civil;

typedef struct endereco endereco;typedef struct endereco endereco;

typedef struct empregado empregado;typedef struct empregado empregado;

enum sexo {masc, fem};enum sexo {masc, fem};

enum estcivil {solt,cas,viuvo,desq,divorc};enum estcivil {solt,cas,viuvo,desq,divorc};

struct endereco {struct endereco {

char lograd[15], compl[6], bairro[10], cidade[10], char lograd[15], compl[6], bairro[10], cidade[10], estado[3], pais[10];estado[3], pais[10];

int numero;int numero;

};};

struct empregado {struct empregado {

char nome[20], cargo[10], setor[10];char nome[20], cargo[10], setor[10];

endereco ender; int tel;endereco ender; int tel;

sexo sex; civil estciv;sexo sex; civil estciv;

data nasc, adm;data nasc, adm;

float salario;float salario;

};};

Obs.: um campo de uma struct pode ser outra struct

Declaração do cadastro:

empregado Cadastro [1000];

sizeof (Cadastro) =

138000 bytes

Page 28: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

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

Page 29: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

7.3 – Manipulação dos 7.3 – Manipulação dos Campos de uma EstruturaCampos de uma Estrutura

7.3.1 – Acesso aos campos de uma estrutura7.3.1 – Acesso aos campos de uma estrutura

Para acessar individualmente os Para acessar individualmente os camposcampos de uma de uma estruturaestrutura, usa-se o operador , usa-se o operador ‘.’‘.’ ( (pontoponto))

Por exemplo, declarando-se Por exemplo, declarando-se empregado E1, E2, empregado E1, E2, E3;E3;

pode-se fazer atribuições aos campos pode-se fazer atribuições aos campos teltel, , estcivestciv e e salariosalario::

E1.tel = 31874622; E1.tel = 31874622; E2.estciv = cas; E2.estciv = cas;

E3.salario = 6000,00;E3.salario = 6000,00;

Page 30: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

O O logradouro do endereço de E1logradouro do endereço de E1 pode receber pode receber um valor, usando-se a função um valor, usando-se a função strcpystrcpy::

strcpy (E1.ender.lograd, “Nove de Julho”);strcpy (E1.ender.lograd, “Nove de Julho”);

CamposCampos de estruturas também podem de estruturas também podem receber receber valores lidosvalores lidos e podem ser e podem ser escritosescritos no vídeo ou no vídeo ou em arquivos:em arquivos:

gets (Cadastro[i].ender.lograd);gets (Cadastro[i].ender.lograd);

scanf("%d",&Cadastro[i].ender.numero);scanf("%d",&Cadastro[i].ender.numero);

printf("%s",Cadastro[i].ender.lograd);printf("%s",Cadastro[i].ender.lograd);

printf("%5d",Cadastro[i].ender.numero);printf("%5d",Cadastro[i].ender.numero);

A seguir, um A seguir, um programaprograma para para lerler de um arquivo e de um arquivo e escreverescrever no vídeo as informações de no vídeo as informações de todos os todos os empregadosempregados de um cadastro ( de um cadastro (reduziu-sereduziu-se as as informações a serem guardadas) informações a serem guardadas)

Page 31: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Exemplo: programa para cadastramento Exemplo: programa para cadastramento dos empregados de uma empresados empregados de uma empresa

Informações sobre um empregado

Nome

Endereço

Estado civil

Data de

admissão

Salário

LogradouroNúmeroBairro

DiaMêsAno

Page 32: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

/*/* Definicao dos tiposDefinicao dos tipos */*/

typedef int data[3];typedef int data[3];

typedef enum estcivil civil;typedef enum estcivil civil;

typedef struct endereco endereco;typedef struct endereco endereco;

typedef struct empregado empregado;typedef struct empregado empregado;

/*/* Definicao do tipo enumerativoDefinicao do tipo enumerativo */*/

enum estcivil {solt, cas, viuvo, desq, divorc}; enum estcivil {solt, cas, viuvo, desq, divorc};

Page 33: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

/*/* Definicao das estruturasDefinicao das estruturas */*/

struct endereco {struct endereco {

char lograd[26], bairro[20]; int numero;char lograd[26], bairro[20]; int numero;

};};

struct empregado {struct empregado {

char nome[31]; endereco ender;char nome[31]; endereco ender;

civil estciv; data nasc; int salario;civil estciv; data nasc; int salario;

};};

/*/* Vetor com os nomes dos estados civisVetor com os nomes dos estados civis*/*/

char EstadoCivil[][12]char EstadoCivil[][12]

= {"solteiro", "casado", "viuvo", = {"solteiro", "casado", "viuvo", "desquitado", "desquitado", "divorciado"}; "divorciado"};

Para escrever os estados civis ao invés de números

“solteiro”

“casado”

“viuvo”

“desquitado”

“divorciado”

0

1

2

3

4

EstadoCivil

Page 34: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

/*/* Cabecalho da main e declaracoes locaisCabecalho da main e declaracoes locais*/*/

void main(){void main(){

int i, n; char c;int i, n; char c;

empregado Cadastro[10];empregado Cadastro[10];

FILE *filein;FILE *filein;

/*/* Abertura do arquivo de dadosAbertura do arquivo de dados */*/

filein = fopen ("Empregados.dat", "r");filein = fopen ("Empregados.dat", "r");

/*/* Tamanho da estrutura empregadoTamanho da estrutura empregado */*/

printf ("Tamanho da estrutura empregado: %d printf ("Tamanho da estrutura empregado: %d bytes", bytes",

sizeof (empregado));sizeof (empregado));

A título de curiosidade

Page 35: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

/*/* Leitura do cadastro dos empregadosLeitura do cadastro dos empregados */*/

fscanf (filein, "%d", &n); // Leitura do numero de fscanf (filein, "%d", &n); // Leitura do numero de empregadosempregados

for(i = 0; i < n; i++) {for(i = 0; i < n; i++) {

fscanf (filein, "%c", &c); // Eliminacao de enter fscanf (filein, "%c", &c); // Eliminacao de enter do arquivodo arquivo

fgets (Cadastro[i].nome, 31, filein);fgets (Cadastro[i].nome, 31, filein);

fgets (Cadastro[i].ender.lograd, 26, filein);fgets (Cadastro[i].ender.lograd, 26, filein);

fscanf(filein, "%d", &Cadastro[i].ender.numero);fscanf(filein, "%d", &Cadastro[i].ender.numero);

fgets (Cadastro[i].ender.bairro, 21, filein);fgets (Cadastro[i].ender.bairro, 21, filein);

fscanf(filein, "%d", &Cadastro[i].estciv);fscanf(filein, "%d", &Cadastro[i].estciv);

fscanf(filein, "%d%d%d",fscanf(filein, "%d%d%d",

&Cadastro[i].nasc[0], &Cadastro[i].nasc[0],

&Cadastro[i].nasc[1], &Cadastro[i].nasc[1], &Cadastro[i].nasc[2]);&Cadastro[i].nasc[2]);

fscanf(filein, "%d", &Cadastro[i].salario);fscanf(filein, "%d", &Cadastro[i].salario);

}}

O arquivo de dados deve ser preparado cuidadosamente

Os espaços entre os dados são relevantes para evitar erros na leitura

Page 36: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

/*/* Escrita do cadastro dos empregadosEscrita do cadastro dos empregados */*/

printf ("\n\n\nListagem dos Empregados:");printf ("\n\n\nListagem dos Empregados:");

for(i = 0; i < n; i++) {for(i = 0; i < n; i++) {

printf("\n\n%d)\nNome: %s", i+1, Cadastro[i].nome);printf("\n\n%d)\nNome: %s", i+1, Cadastro[i].nome);

printf("\nEndereco: %s",Cadastro[i].ender.lograd);printf("\nEndereco: %s",Cadastro[i].ender.lograd);

printf(", %7d",Cadastro[i].ender.numero);printf(", %7d",Cadastro[i].ender.numero);

printf(", %s",Cadastro[i].ender.bairro);printf(", %s",Cadastro[i].ender.bairro);

printf("\nEstado Civil: printf("\nEstado Civil: %s",EstadoCivil[Cadastro[i].estciv]);%s",EstadoCivil[Cadastro[i].estciv]);

printf("\nData de Nascimento: %2.2d/%2.2d/%d",printf("\nData de Nascimento: %2.2d/%2.2d/%d",

Cadastro[i].nasc[0], Cadastro[i].nasc[1], Cadastro[i].nasc[0], Cadastro[i].nasc[1], Cadastro[i].nasc[2]);Cadastro[i].nasc[2]);

printf("\nSalario: %d",Cadastro[i].salario);printf("\nSalario: %d",Cadastro[i].salario);

}}

/*/* Fechamento da telaFechamento da tela */*/

printf ("\n\nDigite algo para encerrar: "); getch ();printf ("\n\nDigite algo para encerrar: "); getch ();

}}

“solteiro”

“casado”

“viuvo”

“desquitado”

“divorciado”

0

1

2

3

4

EstadoCivil

Page 37: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Arquivo de dados “Empregados.dat”:Arquivo de dados “Empregados.dat”:

44

Julio Silva Souza R Direita 301Julio Silva Souza R Direita 301 Centro 3 14 3 1987 1300Centro 3 14 3 1987 1300

Maria Ramos Leite Av 9 de Julho 2091Maria Ramos Leite Av 9 de Julho 2091 Aclimacao Aclimacao 0 15 9 1993 20000 15 9 1993 2000

Adalberto Correia Pr Jose Silva 14Adalberto Correia Pr Jose Silva 14 Butanta Butanta 1 25 11 1968 82001 25 11 1968 8200

Bianca Rocha Camargo R Augusta 1271Bianca Rocha Camargo R Augusta 1271 Jardins Jardins 2 2 4 1975 150002 2 4 1975 15000

fgets (Cadastro[i].nome, 31, filein);fgets (Cadastro[i].nome, 31, filein);

fgets (Cadastro[i].ender.lograd, 26, filein);fgets (Cadastro[i].ender.lograd, 26, filein);

fscanf(filein, "%d", fscanf(filein, "%d", &Cadastro[i].ender.numero);&Cadastro[i].ender.numero);

fgets (Cadastro[i].ender.bairro, 21, filein);fgets (Cadastro[i].ender.bairro, 21, filein);

30 espaços

25 espaços

20 espaços

Page 38: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Resultado no vídeo:Resultado no vídeo:

Page 39: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

7.3.2 – Inicialização e atribuição de 7.3.2 – Inicialização e atribuição de estruturasestruturas

EstruturasEstruturas também podem ser também podem ser inicializadasinicializadas em suas declarações; exemplo: em suas declarações; exemplo:

typedef struct endereco endereco;typedef struct endereco endereco;

struct endereco {struct endereco {

char lograd[30];char lograd[30]; int numero;int numero; char char bairro[15];bairro[15];

};};

O resultado da seguinte declaração está O resultado da seguinte declaração está abaixo: abaixo:

endereco ender = {“Av. Nove de Julho”, 1300, “Centro”};endereco ender = {“Av. Nove de Julho”, 1300, “Centro”};Av. Nove de Julho■ Centro■1300

ender

lograd numero bairro

\0

Page 40: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Exemplo: Inicialização de matriz de Exemplo: Inicialização de matriz de estruturasestruturas

Seja o seguinte trecho de programa: Seja o seguinte trecho de programa:

struct complexo {float real, imag;};struct complexo {float real, imag;};

typedef struct complexo complexo;typedef struct complexo complexo;

int i, j; int i, j; complexo A[3][3] = {complexo A[3][3] = {

{{1.0, -0.1},{2.0, -0.2},{3.0, 4.3}},{{1.0, -0.1},{2.0, -0.2},{3.0, 4.3}},

{{4.0, -3.4},{5.0, 4.1},{6.0, -2.6}}{{4.0, -3.4},{5.0, 4.1},{6.0, -2.6}}

};};

for (i = 0; i < 3; i++) {for (i = 0; i < 3; i++) {

for (j = 0; j < 3; j++)for (j = 0; j < 3; j++)

printf ("(%5.1f) + i(%5.1f) ", A[i][j].real, printf ("(%5.1f) + i(%5.1f) ", A[i][j].real, A[i][j].imag);A[i][j].imag);

printf ("\n");printf ("\n");

}}

1.0 -0.1

2.0 -0.2

3.0 4.3

4.0 -3.4

5.0 4.1 6.0 -2.6

0.0 0.0 0.0 0.0 0.0 0.0

A

0 1 2

0

1

2

( 1.0) + i( -0.1) ( 2.0) + i( -0.2) ( 3.0) + i( 4.3)( 4.0) + i( -3.4) ( 5.0) + i( 4.1) ( 6.0) + i( -2.6)( 0.0) + i( 0.0) ( 0.0) + i( 0.0) ( 0.0) + i( 0.0)

Resultado no vídeo

Page 41: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Diferentemente das Diferentemente das variáveis indexadasvariáveis indexadas, uma , uma variável do tipo variável do tipo structstruct pode pode receberreceber numa numa atribuição o atribuição o valor de outravalor de outra do mesmo tipo do mesmo tipo

Exemplo: Exemplo: sejam as declarações:sejam as declarações:

typedef struct endereco endereco;typedef struct endereco endereco;

struct endereco {struct endereco {

char lograd[30];char lograd[30]; int numero;int numero; char bairro[15];char bairro[15];

};};

endereco ender1 = {“Av. Nove de Julho”, 1300, “Centro”}, endereco ender1 = {“Av. Nove de Julho”, 1300, “Centro”}, ender2;ender2;

ender2 = ender1;ender2 = ender1; equivale aequivale astrcpy (ender2.lograd, ender1.lograd);ender2.numero = ender1.numero;strcpy (ender2.bairro, ender1.bairro);

Page 42: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Exemplo: Exemplo: sejam as declarações:sejam as declarações:

typedef struct matriz matriz;typedef struct matriz matriz;

struct matriz {int A[5][3];}struct matriz {int A[5][3];}

int B[5][3], C[5][3];int B[5][3], C[5][3];

matriz M1, M2;matriz M1, M2;

““Se você não pode passar um elefante por Se você não pode passar um elefante por debaixo de uma porta, coloque-o dentro de debaixo de uma porta, coloque-o dentro de um envelope e passe-o.”um envelope e passe-o.”

““Se não é possível fazer atribuições entre Se não é possível fazer atribuições entre variáveis indexadas, colocando-as em variáveis indexadas, colocando-as em estruturas, isso se torna possível”estruturas, isso se torna possível”

Tendo M1 e B sido previamente inicializadas,

C = B; é proibido

M2 = M1; é válido

Page 43: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

O uso de O uso de estruturasestruturas para guardar para guardar vetoresvetores e e matrizesmatrizes apresenta uma outra apresenta uma outra vantagemvantagem

Trabalhando com Trabalhando com matrizesmatrizes, seus , seus elementoselementos são guardados numa variável e seu são guardados numa variável e seu numero de numero de linhas e colunaslinhas e colunas ficam em outras variáveis ficam em outras variáveis

No entanto, No entanto, todastodas essas informações dizem essas informações dizem respeito a uma respeito a uma mesma entidademesma entidade, sugerindo , sugerindo que fiquem armazenadas numa que fiquem armazenadas numa mesma mesma variávelvariável

Com estruturas isso é possível:Com estruturas isso é possível:typedef struct matriz matriz;struct matriz {int Elementos[10][10]; int nlin, ncol;};matriz A, B, C;

Em quase todos os exemplos vistos com variáveis indexadas, isso se aplica

Page 44: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas

Exercícios 7.3:Exercícios 7.3:1.