A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas."— Transcrição da apresentação:

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

2 Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura 7.4 – Campos alternativos

3 7.1 – Tipos Enumerativos 7.1.1 – Conceitos, declarações e expressões Valores manipulados até agora: números inteiros, reais e caracteres Valores manipulados até agora: números inteiros, reais e caracteres Tipos enumerativos: artifício da Linguagem C para se trabalhar com valores diferentes desses: Tipos enumerativos: artifício da Linguagem C para se trabalhar com valores diferentes desses: Dias da semana, meses do ano, cores, estados civis de pessoas, naipes de baralho, etc. Dias da semana, meses do ano, cores, estados civis de pessoas, naipes de baralho, etc.

4 Exemplo: sejam as declarações enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro}; enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta}; Elas criam os seguintes novos tipos de variáveis: Elas criam os seguintes novos tipos de variáveis: enum diasemana, enum mes e enum cor Os valores dessas variáveis serão respectivamente: Os valores dessas variáveis serão respectivamente: {domingo,..., sabado}, {janeiro,..., dezembro} e {branca,..., preta}

5 enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro}; enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta}; Declarações de variáveis: Declarações de variáveis: enum diasemana hoje, ontem, amanha; enum mes MesNascimento, MesAtual, MesPassado; enum cor cor1, cor2, cor3; Outra forma de declarar variáveis: Outra forma de declarar variáveis: enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado} hoje, ontem, amanha;

6 A palavra enum é obrigatória: A palavra enum é obrigatória: enum diasemana hoje, ontem, amanha; enum mes MesNascimento, MesAtual, MesPassado; enum cor cor1, cor2, cor3; Mas pode-se dispensá-la mediante o uso de typedef: Mas pode-se dispensá-la mediante o uso de typedef: typedef enum diasemana diasemana; enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; typedef enum cor cor; enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta}; diasemana hoje, ontem, amanha; cor 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

7 typedef enum diasemana diasemana; enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; typedef enum cor cor; enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta}; diasemana hoje, ontem, amanha; cor cor1, cor2, cor3; As variáveis e os valores desses tipos podem ser usados em atribuições e expressões: As variáveis e os valores desses tipos podem ser usados em atribuições e expressões: cor1 = azul; if (ontem == segunda) hoje = terca;

8 enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta}; Na realidade, Na realidade, domingo, segunda,..., sabado, branca, amarela,..., preta são constantes inteiras como aquelas criadas por uma declaração const Os valores dessas constantes não podem ser alterados por nenhum comando do programa Os valores dessas constantes não podem ser alterados por nenhum comando do programa Assim, o comando segunda = 5; Assim, o comando segunda = 5; não é aceito pelo compilador

9 enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta}; Por default, o compilador estabelece os seguintes valores: Por default, o compilador estabelece os seguintes valores: ConstanteValorConstanteValor domingo0branca0 segunda1amarela1 terca2azul2 quarta3verde3 quinta4vermelha4 sexta5marrom5 sabado6cinza6 preta7

10 Pode-se explicitar o valor desejado para as constantes Pode-se explicitar o valor desejado para as constantes Exemplo: seja a seguinte declaração: Exemplo: seja a seguinte declaração: enum mes {janeiro, fevereiro = 7, marco, abril, maio, junho = 5, julho, agosto, setembro, outubro = 26, novembro, dezembro}; Os valores das constantes serão: ConstanteValorConstanteValorConstanteValor janeiro0maio10setembro8 fevereiro7junho5outubro26 marco8julho6novembro27 abril9agosto7dezembro28

11 Exemplo: variáveis lógicas simuladas por tipo enumerativo: Exemplo: variáveis lógicas simuladas por tipo enumerativo: typedef enum logic logic; enum logic {False, True}; logic L1, L2, L3; Nestas declarações, as constantes False e True têm respectivamente os valores 0 e 1

12 7.1.2 – Entrada e saída amigável para tipos enumerativos Sejam novamente as declarações: Sejam novamente as declarações: typedef enum diasemana diasemana; enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; diasemana hoje, ontem, amanha; A constante inteira quarta não tem nada a ver com a cadeia de caracteres quarta A constante inteira quarta não tem nada a ver com a cadeia de caracteres quarta Isso dificulta a entrada e saída amigável para esses tipos Isso dificulta a entrada e saída amigável para esses tipos

13 typedef enum diasemana diasemana; enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; diasemana hoje, ontem, amanha; Por exemplo, numa leitura para a variável hoje, deve ser usado um formato inteiro: Por exemplo, numa leitura para a variável hoje, deve ser usado um formato inteiro: printf ("Entre com o dia de hoje: "); scanf ("%d", &hoje); Então, caso o operador queira que o valor de hoje seja quarta, ele deverá digitar 3 e não a cadeia quarta Então, caso o operador queira que o valor de hoje seja quarta, ele deverá digitar 3 e não a cadeia quarta É necessário mais trabalho para tornar a entrada amigável (ver programa a seguir) É necessário mais trabalho para tornar a entrada amigável (ver programa a seguir)

14 #include #include /*Declaracoes de tipos*/ typedef char nome[10]; typedef enum diasemana diasemana; enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado}; /*Cabecalho e declaracoes de variaveis*/ void main( ){ diasemana hoje, ontem, amanha; char c; nome cadhoje, NomeDia[7] = {"domingo", "segunda", "terca", "quarta", "quinta", "sexta", "sabado"}; domingo segunda terca quarta quinta sexta sabado 0 1 2 3 4 5 6 NomeDia Para o operador digitar uma cadeia e não um número cadhoje

15 /*Desejo 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 hoje*/ while (c == 's' || c == 'S') { printf ("\n\n\tDigite o dia de hoje: "); scanf ("%s", cadhoje); /*Conversao da cadeia digitada para o tipo diasemana*/ for (hoje = domingo; hoje <= sabado; hoje++) if (strcmp (cadhoje, NomeDia[hoje]) == 0) break; break; domingo segunda terca quarta quinta sexta sabado 0 1 2 3 4 5 6 NomeDia cadhoje

16 /*Caso 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 amanhan*/ else { ontem = (hoje + 6) % 7; amanha = (hoje + 1) % 7; printf("\n\thoje = %s; ontem = %s; amanhan = %s;\n\n", NomeDia[hoje], NomeDia[ontem], NomeDia[amanha]); } /*Desejo de nova execucao */ printf ("Conhecer dia de ontem e de amanhan? (s/n): "); c = getche (); printf ("Conhecer dia de ontem e de amanhan? (s/n): "); c = getche ();}} domingo segunda terca quarta quinta sexta sabado 0 1 2 3 4 5 6 NomeDia

17 Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura 7.4 – Campos alternativos

18 7.2 – A Necessidade de Estruturas Em muitas aplicações, é útil poder tratar todas as informações de uma entidade ou de uma pessoa como sendo uma única unidade Em muitas aplicações, é útil poder tratar todas as informações de uma entidade ou de uma pessoa como sendo uma única unidade Por exemplo, é muito melhor dizer: Levar o carro para casa Por exemplo, é muito melhor dizer: Levar o carro para casa do que dizer Carro: entidade composta de rodas, motor, lataria, etc. Carro: entidade composta de rodas, motor, lataria, etc. Levar as rodas do carro para casa Levar o motor do carro para casa Levar os bancos do carro para casa Levar a lataria do carro para casa Levar o painel do carro para casa Etc.

19 No entanto, nessas mesmas aplicações, pode ser importante também a capacidade de se tratar cada uma dessas informações em separado No entanto, nessas mesmas aplicações, pode ser importante também a capacidade de se tratar cada uma dessas informações em separado Por exemplo: Por exemplo: Consertar um pneu do carro Ligar o motor do carro Ajustar o banco do motorista Lavar a lataria do carro Acender o painel do carro Etc.

20 Exemplo: declarações para cadastrar os empregados de uma empresa Exemplo: declarações para cadastrar os empregados 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 Logradouro Número Complementos Bairro Cidade Estado País Dia Mês Ano Dia Mês Ano 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

21 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

22 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

23 Struct para endereço: Struct para endereço: struct endereco { char logradouro[15]; int numero; char complemento[6], bairro[10], cidade[10], estado[3], pais[10]; }; Esta declaração cria o novo tipo de variáveis: Esta declaração cria o novo tipo de variáveis: struct endereco Campos das variáveis desse tipo: Campos das variáveis desse tipo: logradouro, numero, complemento, bairro, cidade, estado, pais

24 struct endereco { char logradouro[15]; int numero; char complemento[6], bairro[10], cidade[10], estado[3], pais[10]; }; Declaração de variáveis desse tipo: Declaração de variáveis desse tipo: struct endereco ender1, ender2, ender3; Outra forma de declarar variáveis: Outra forma de declarar variáveis: struct endereco { char logradouro[15]; int numero; char complemento[6], bairro[10], cidade[10], estado[3], pais[10]; } ender1, ender2, ender3 ;

25 A palavra struct é obrigatória: A palavra struct é obrigatória: struct endereco ender1, ender2, ender3; struct endereco ender1, ender2, ender3; Mas pode-se dispensá-la mediante o uso de typedef: Mas pode-se dispensá-la mediante o uso de typedef: typedef struct endereco endereco; struct endereco { char logradouro[15]; int numero; char complemento[6], bairro[10], cidade[10], estado[3], pais[10]; }; 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

26 Struct para empregado: Struct para empregado: struct empregado { char nome[20], cargo[10], setor[10]; endereco ender; int tel; endereco ender; int tel; sexo sex; civil estciv; data nasc, adm; float salario; }; typedef int data[3]; sexo e civil são tipos enumerativos (ver declarações a seguir)

27 typedef int data[3]; typedef enum sexo sexo; typedef enum estcivil civil; typedef struct endereco endereco; typedef struct empregado empregado; enum sexo {masc, fem}; enum estcivil {solt,cas,viuvo,desq,divorc}; struct endereco { char lograd[15], compl[6], bairro[10], cidade[10], estado[3], pais[10]; int numero; }; struct empregado { char nome[20], cargo[10], setor[10]; endereco ender; int tel; endereco ender; int tel; sexo sex; civil estciv; data nasc, adm; float salario; }; Obs.: um campo de uma struct pode ser outra struct Declaração do cadastro: empregado Cadastro [1000]; sizeof (Cadastro) = 138000 bytes

28 Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura 7.4 – Campos alternativos

29 7.3 – Manipulação dos Campos de uma Estrutura 7.3.1 – Acesso aos campos de uma estrutura Para acessar individualmente os campos de uma estrutura, usa-se o operador. (ponto) Para acessar individualmente os campos de uma estrutura, usa-se o operador. (ponto) Por exemplo, declarando-se empregado E1, E2, E3; Por exemplo, declarando-se empregado E1, E2, E3; pode-se fazer atribuições aos campos tel, estciv e salario: E1.tel = 31874622; E2.estciv = cas; E3.salario = 6000,00;

30 O logradouro do endereço de E1 pode receber um valor, usando-se a função strcpy: O logradouro do endereço de E1 pode receber um valor, usando-se a função strcpy: strcpy (E1.ender.lograd, Nove de Julho); Campos de estruturas também podem receber valores lidos e podem ser escritos no vídeo ou em arquivos: Campos de estruturas também podem receber valores lidos e podem ser escritos no vídeo ou em arquivos: gets (Cadastro[i].ender.lograd); scanf("%d",&Cadastro[i].ender.numero);printf("%s",Cadastro[i].ender.lograd);printf("%5d",Cadastro[i].ender.numero); A seguir, um programa para ler de um arquivo e escrever no vídeo as informações de todos os empregados de um cadastro (reduziu-se as informações a serem guardadas) A seguir, um programa para ler de um arquivo e escrever no vídeo as informações de todos os empregados de um cadastro (reduziu-se as informações a serem guardadas)

31 Exemplo: programa para cadastramento dos empregados de uma empresa Exemplo: programa para cadastramento dos empregados de uma empresa Informações sobre um empregado Nome Endereço Estado civil Data de admissão Salário Logradouro Número Bairro Dia Mês Ano

32 #include #include /*Definicao dos tipos*/ typedef int data[3]; typedef enum estcivil civil; typedef struct endereco endereco; typedef struct empregado empregado; /*Definicao do tipo enumerativo*/ enum estcivil {solt, cas, viuvo, desq, divorc};

33 /*Definicao das estruturas*/ struct endereco { char lograd[26], bairro[20]; int numero; }; struct empregado { char nome[31]; endereco ender; civil estciv; data nasc; int salario; }; /*Vetor com os nomes dos estados civis*/ char EstadoCivil[][12] = {"solteiro", "casado", "viuvo", "desquitado", "divorciado"}; Para escrever os estados civis ao invés de números solteiro casado viuvo desquitado divorciado 0 1 2 3 4 EstadoCivil

34 /*Cabecalho da main e declaracoes locais*/ void main(){ int i, n; char c; empregado Cadastro[10]; FILE *filein; FILE *filein; /*Abertura do arquivo de dados*/ filein = fopen ("Empregados.dat", "r"); filein = fopen ("Empregados.dat", "r"); /*Tamanho da estrutura empregado*/ printf ("Tamanho da estrutura empregado: %d bytes", printf ("Tamanho da estrutura empregado: %d bytes", sizeof (empregado)); A título de curiosidade

35 /*Leitura do cadastro dos empregados*/ fscanf (filein, "%d", &n); // Leitura do numero de empregados for(i = 0; i < n; i++) { fscanf (filein, "%c", &c); // Eliminacao de enter do arquivo fscanf (filein, "%c", &c); // Eliminacao de enter do arquivo fgets (Cadastro[i].nome, 31, filein); fgets (Cadastro[i].ender.lograd, 26, filein); fscanf(filein, "%d", &Cadastro[i].ender.numero); fgets (Cadastro[i].ender.bairro, 21, filein); fscanf(filein, "%d", &Cadastro[i].estciv); fscanf(filein, "%d%d%d", &Cadastro[i].nasc[0], &Cadastro[i].nasc[0], &Cadastro[i].nasc[1], &Cadastro[i].nasc[2]); 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

36 /*Escrita do cadastro dos empregados*/ printf ("\n\n\nListagem dos Empregados:"); for(i = 0; i < n; i++) { 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(", %s",Cadastro[i].ender.bairro); printf("\nEstado Civil: %s",EstadoCivil[Cadastro[i].estciv]); printf("\nData de Nascimento: %2.2d/%2.2d/%d", Cadastro[i].nasc[0], Cadastro[i].nasc[1], Cadastro[i].nasc[2]); Cadastro[i].nasc[0], Cadastro[i].nasc[1], Cadastro[i].nasc[2]); printf("\nSalario: %d",Cadastro[i].salario); } /*Fechamento 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

37 Arquivo de dados Empregados.dat: 4 Julio Silva Souza R Direita 301 Centro 3 14 3 1987 1300 Maria Ramos Leite Av 9 de Julho 2091 Aclimacao 0 15 9 1993 2000 Adalberto Correia Pr Jose Silva 14 Butanta 1 25 11 1968 8200 Bianca Rocha Camargo R Augusta 1271 Jardins 2 2 4 1975 15000 fgets (Cadastro[i].nome, 31, filein); fgets (Cadastro[i].ender.lograd, 26, filein); fscanf(filein, "%d", &Cadastro[i].ender.numero); fgets (Cadastro[i].ender.bairro, 21, filein); 30 espaços25 espaços20 espaços

38 Resultado no vídeo:

39 7.3.2 – Inicialização e atribuição de estruturas Estruturas também podem ser inicializadas em suas declarações; exemplo: Estruturas também podem ser inicializadas em suas declarações; exemplo: typedef struct endereco endereco; struct endereco { char lograd[30]; int numero; char bairro[15]; }; O resultado da seguinte declaração está abaixo: O resultado da seguinte declaração está abaixo: endereco ender = {Av. Nove de Julho, 1300, Centro}; Av. Nove de JulhoCentro1300 ender logradnumerobairro \0

40 Exemplo: Inicialização de matriz de estruturas Seja o seguinte trecho de programa: Seja o seguinte trecho de programa: struct complexo {float real, imag;}; typedef struct complexo complexo; int i, j; complexo A[3][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}} }; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf ("(%5.1f) + i(%5.1f) ", A[i][j].real, A[i][j].imag); printf ("\n"); } 1.0-0.12.0-0.23.04.3 4.0-3.45.04.16.0-2.6 0.0 A 012 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

41 Diferentemente das variáveis indexadas, uma variável do tipo struct pode receber numa atribuição o valor de outra do mesmo tipo Diferentemente das variáveis indexadas, uma variável do tipo struct pode receber numa atribuição o valor de outra do mesmo tipo Exemplo: sejam as declarações: Exemplo: sejam as declarações: typedef struct endereco endereco; struct endereco { char lograd[30]; int numero; char bairro[15]; }; endereco ender1 = {Av. Nove de Julho, 1300, Centro}, ender2; ender2 = ender1; equivale a ender2 = ender1; equivale a strcpy (ender2.lograd, ender1.lograd); ender2.numero = ender1.numero; strcpy (ender2.bairro, ender1.bairro);

42 Exemplo: sejam as declarações: Exemplo: sejam as declarações: typedef struct matriz matriz; struct matriz {int A[5][3];} int B[5][3], C[5][3]; matriz M1, M2; Se você não pode passar um elefante por debaixo de uma porta, coloque-o dentro de um envelope e passe-o. Se você não pode passar um elefante por debaixo de uma porta, coloque-o dentro de um envelope e passe-o. Se não é possível fazer atribuições entre variáveis indexadas, colocando-as em estruturas, isso se torna possível Se não é possível fazer atribuições entre variáveis indexadas, colocando-as em estruturas, isso se torna possível Tendo M1 e B sido previamente inicializadas, C = B;é proibido M2 = M1; é válido

43 O uso de estruturas para guardar vetores e matrizes apresenta uma outra vantagem O uso de estruturas para guardar vetores e matrizes apresenta uma outra vantagem Trabalhando com matrizes, seus elementos são guardados numa variável e seu numero de linhas e colunas ficam em outras variáveis Trabalhando com matrizes, seus elementos são guardados numa variável e seu numero de linhas e colunas ficam em outras variáveis No entanto, todas essas informações dizem respeito a uma mesma entidade, sugerindo que fiquem armazenadas numa mesma variável No entanto, todas essas informações dizem respeito a uma mesma entidade, sugerindo que fiquem armazenadas numa mesma variá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

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


Carregar ppt "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas."

Apresentações semelhantes


Anúncios Google