Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORITMOS E PROGRAMAÇÃO APLICADA Prof. Fábio Ataide de Lima Estruturas de dados heterogêneas Registros Comando typedef Uniões UNIDADE III – PARTE 3 TÓPICOS DESTA AULA Permitem agregar diversas informações, que podem ser de diferentes tipos de dados (ao contrário de vetores e matrizes). São conceitualmente chamadas de registros, em que cada informação é denominada de campo (ou atributo, ou membro), as quais podem: • ser de diferentes tipos; • ou ainda, representar outros registros. Com o seu uso, os dados referentes a um determinado contexto ficam melhor agrupados. ESTRUTURAS DE DADOS HETEROGÊNEAS REGISTROS: EXEMPLO FICHA DO VEÍCULO Marca: Modelo: Motor: . Ano de Fabricação: Ano Modelo:Categoria CNH: Combustível: Placa: Termo usado para identificar registros na linguagem C. Sintaxe para declarar uma struct: nome_estrutura e lista_variáveis: opcionais, porém ao menos um deve ser especificado. ESTRUTURAS (STRUCTS) struct nome_estrutura { tipo campo_1; tipo campo_2; ... tipo campo_n; } lista_variáveis; ESTRUTURAS: EXEMPLO Declaração da estrutura para ficha de veículo. • Armazenando a estrutura diretamente nas variáveis: struct { char marca[16]; char modelo[16]; char placa[11]; char categ; char combust[11]; int anofab; int anomod; float motor; } v1, v2; • Definindo um nome para a estrutura e, depois, atribuindo nas variáveis: struct veiculo { char marca[16]; char modelo[16]; char placa[11]; char categ; char combust[11]; int anofab; int anomod; float motor; }; struct veiculo v1, v2; Para se referir a um membro de uma estrutura, basta escrever o nome da variável de estrutura e o nome do membro separados por um ponto: Observação importante sobre struct em C: • Somente pode ser utilizada dentro do bloco de instruções em que foi definida. • Para que ela seja acessível de qualquer parte do programa, deve ser definida antes da função main(), preferencialmente logo após as instruções #include. MANIPULAÇÃO DOS MEMBROS DE ESTRUTURAS struct veiculo v; v.marca = "Ford"; v.anofab = 2018; struct veiculo v; printf("Marca..........: "); fflush(stdin); gets(v.marca); printf("Modelo.........: "); fflush(stdin); gets(v.modelo); printf("Placa..........: "); fflush(stdin); gets(v.placa); do { printf("Categoria (A-E): "); fflush(stdin); scanf("%c", &v.categ); } while (!(v.categ >= 'A' && v.categ <= 'E') && !(v.categ >= 'a' && v.categ <= 'e')); LEITURA DE MEMBROS DE ESTRUTURAS printf("Combustivel....: "); fflush(stdin); gets(v.combust); printf("Ano fabricacao.: "); scanf("%d", &v.anofab); printf("Ano modelo.....: "); scanf("%d", &v.anomod); printf("Motor..........: "); scanf("%f", &v.motor); EXIBIÇÃO DE MEMBROS DE ESTRUTURAS printf("\nMarca/modelo: %s/%s", v.marca, v.modelo); printf("\nMotor/placa.: %.1f %s", v.motor, v.placa); printf("\nAno fab/mod.: %d/%d", v.anofab, v.anomod); printf("\nCombustivel.: %s\n", v.combust); struct veiculo v[5]; int i; for (i = 0; i < 5; i++) { printf("Marca..........: "); fflush(stdin); gets(v[i].marca); printf("Modelo.........: "); fflush(stdin); gets(v[i].modelo); printf("Placa..........: "); fflush(stdin); gets(v[i].placa); do { printf("Categoria (A-E): "); fflush(stdin); scanf("%c", &v[i].categ); } while (!(v[i].categ >= 'A' && v[i].categ <= 'E') && !(v[i].categ >= 'a' && v[i].categ <= 'e')); VETORES DE ESTRUTURAS printf("Combustivel....: "); fflush(stdin); gets(v[i].combust); printf("Ano fabricacao.: "); scanf("%d", &v[i].anofab); printf("Ano modelo.....: "); scanf("%d", &v[i].anomod); printf("Motor..........: "); scanf("%f", &v[i].motor); printf("-----------------\n"); } VETORES DE ESTRUTURAS printf("\nMarca Modelo Motor"); printf(" Placa Cat A.Fab A.Mod Combustivel"); for (i = 0; i < 5; i++) { printf("\n%-15s %-15s", v[i].marca, v[i].modelo); printf(" %.1f %-10s", v[i].motor, v[i].placa); printf(" %c %d", v[i].categ, v[i].anofab); printf(" %d %s", v[i].anomod, v[i].combust); } printf("\n"); Permite ao programador definir um novo nome para um determinado tipo. Sintaxe: Exemplos: • Dando o nome inteiro para o tipo int: • Definindo uma struct como novo tipo de dado: COMANDO typedef typedef tipo_existente novo_nome; typedef int inteiro; inteiro num1, num2; typedef struct { char nome[30]; float nota[4]; } Aluno; int main(void) { Aluno eu, grupo[4]; } Tipo de dado derivado (como uma estrutura) com membros que compartilham o mesmo espaço de armazenamento. O espaço a ser armazenado na memória será o tamanho do maior tipo. Sintaxe: UNIÕES union nome_união { tipo campo_1; tipo campo_2; ... tipo campo_n; } lista_variáveis; União para armazenar o CPF ou o CNPJ: Dessa forma, é possível pedir um ou outro, de acordo com o tipo de pessoa especificado: UNIÕES: EXEMPLO union PFouPJ { char cpf[15]; char cnpj[19]; } pessoa; if (tipo == 'F' || tipo == 'f') { printf("CPF.........: "); fflush(stdin); scanf("%s", pessoa.cpf); } else { printf("CNPJ........: "); fflush(stdin); scanf("%s", pessoa.cnpj); } Modularização de programas Sub-rotinas PRÓXIMA AULA
Compartilhar