310 likes | 688 Views
Estrutura de Dados Avançada. Structs (Estruturas de Dados Heterogêneas) Prof. Mário Dantas. Conceito de struct. Vetores e matrizes Estruturas de dados homogêneas Armazenam vários valores, mas todos de um mesmo tipo (todos int , todos double , todos float , todos char ).
E N D
Estrutura de Dados Avançada Structs (Estruturas de Dados Heterogêneas) Prof. Mário Dantas
Conceito de struct • Vetores e matrizes • Estruturas de dados homogêneas • Armazenam vários valores, mas todos de um mesmo • tipo (todos int, todos double, todos float, todos char)
Conceito de struct • Problemas reais • Temos coleções de dados que são de tipos diferentes • Exemplo: ficha de um cadastro de cliente • Nome: string • Endereço: string • Telefone: string • Salário: float • Idade: int
Conceito de struct • Registro (ou struct) • Tipo de dado estruturado heterogêneo • Coleção de variáveis referenciadas sobre um mesmo nome • Permite agrupar dados de diferentes tipos numa mesma estrutura (ao contrário de matrizes que possuem elementos de um mesmo tipo) • Cada componente de um registro pode ser de um tipo • diferente (int, char, ...) • Estes componentes são referenciados por um nome
Conceito de struct • Os elementos do registro • São chamados de campos ou membros da struct • É utilizado para armazenar informações de um mesmo objeto • Exemplos: • carro: cor, marca, ano, placa, chassi • pessoa: nome, idade, endereço
Conceito de struct • Campo (Field) • Conjunto de caracteres com o mesmo significado • Exemplo: nome • Registro (Struct ou Record) • Conjunto de campos relacionados • Exemplo: nome, endereço, telefone, salário e idade de uma pessoa
Sintaxe na Linguagem C • A palavra reservada struct indica ao compilador que está sendo criada uma estrutura • Uma estrutura deve ser declarada após incluir as bibliotecas e antes da main struct <identificador_struct> { tipo <nome_variável_campo1>; tipo <nome_variável_campo2>; ... } <variáveis_estrutura>; struct <identificador_struct> <var1>, <var2>;
Sintaxe na Linguagem C Exemplo: structdata { int dia; intmes; int ano; };
Sintaxe na Linguagem C • A palavra-chave struct informa ao compilador que um modelo de estrutura está sendo definido. • “data” é uma etiqueta que dá nome à definição da estrutura. • Uma definição de estrutura é um comando, por isso deve terminar em ponto-e-vírgula.
Sintaxe na Linguagem C • Os nomes declarados entre as chaves são os campos (ou membros) da estrutura. • Os campos de uma mesma estrutura devem ter nomes diferentes. • Porém, estruturas diferentes podem conter campos com o mesmo nome.
Sintaxe na Linguagem C • Se o compilador C for compatível com o padrão C ANSI • Informação contida em uma struct pode ser atribuída a outra structdo mesmo tipo • Não é necessário atribuir os valores de todos os elementos/campos separadamente • Por exemplo: <var1> = <var2>; • Todos os campos de <var1> receberão os valores correspondentes dos campos de <var2> • Para acessar os campos da struct • Utiliza-se o nome da variável struct, seguido de ponto, seguido do nome do campo • Por exemplo: <var1>.<nome_variável_campo2>;
Sintaxe na Linguagem C • Por exemplo um struct endereço que guarda os elementos nome, rua, cidade, estado e cep structendereco{ char nome[30]; char rua[40]; longintcep; }; • Foi feita apenas a declaração da struct, ainda não foi criada nenhuma variável da structendereço • O comando para declarar uma variável com esta struct é: structenderecoinfo_end;
Sintaxe na Linguagem C • Duas maneiras de declarar a variável x do tipo data: struct data { int dia; int mes; int ano; }; ... struct data x; struct data { int dia; int mes; int ano; } x; ou • Dois comandos: • Defineestrutura como novo tipo • Declara variável do novo tipo definido • Um comando: • Defineestrutura e declara variável do novo tipo definido
Sintaxe na Linguagem C • Já vimos que para acessar os membros de uma structdeve-seusar nome_variável.nome_membro • Portanto, considerando o exemplo anterior • Para inicializar o cep da variável info_end que é uma variável da structendereço se faria: info_end.cep= 123456; • Para obter o nome da pessoa e colocar na string nome da structse poderia utilizar: gets(info_end.nome); • Para imprimir o endereço seria: printf(“%s”, info_end.rua);
Sintaxe na Linguagem C • A definição do formato de uma estrutura pode ser feita dentro da função principal (main) ou fora dela. • Usualmente, declara-se fora da função principal, de modo que outras funções também possam “enxergar” a estrutura definida.
Sintaxe na Linguagem C • Exemplo 1: struct aluno { char nome[40]; float P1; float P2; float T; int faltas; };//como definição de estrutura é comando, precisa ";” main() { struct aluno joao, maria; joao.P1 = 9.5; joao.P2 = 8.5; joao.T = 9.0; joao.faltas = 4; maria = joao; }
Sintaxe na Linguagem C • Exemplo 2 #include <stdio.h> #include <string.h> structendereco { char rua[40]; int num; int complemento; charcep[10]; }; main() { structenderecoe1; // declaração de variáveis do tipo structenderecoe2; // "endereco" compilador aloca mem. // inicialização dos campos de e1... strcpy(e1.rua, "Avenida Ipiranga"); e1.num = 1234; e1.complemento = 101; strcpy(e1.cep, "90000-123");
Sintaxe na Linguagem C // inicialização dos campos de e2... strcpy(e2.rua, "Rua Lima e Silva"); e2.num = 1987; e2.complemento = 308; strcpy(e2.cidade, "Porto Alegre"); strcpy(e2.estado, "RS"); strcpy(e2.cep, "90000-345"); // exibe os dados printf("\n%s %d/%d", e1.rua, e1.num, e1.complemento); printf("\n%s, %s/%s", e1.cep, e1.cidade, e1.estado); printf("\n\n%s %d/%d", e2.rua, e2.num, e2.complemento); printf("\n%s, %s/%s", e2.cep, e2.cidade, e2.estado); }
Sintaxe na Linguagem C • Novos tipos de dados podem ser definidos utilizando-se a palavra-chave typedef. typedefstructnome_da_estrutura { <tipo> campo_1; <tipo> campo_2; ... <tipo>campo_n; } nome_do_tipo;
Sintaxe na Linguagem C • Exemplo: typedefstructdata { int dia; intmes; int ano; } tipoData;
Sintaxe na Linguagem C • O uso mais comum de typedef é com estruturas de dados, pois evita que a palavra-chave struct tenha de ser colocada toda vez que uma estrutura é declarada. structdata dia_de_hoje; tipoDatadia_de_hoje;
Estruturas aninhadas • Um campo de uma estrutura pode ser uma outra estrutura. • Quando isso ocorre, temos uma estrutura aninhada. • O padrão ANSI C especifica que as estruturas podem ser aninhadas até 15 níveis, mas a maioria dos compiladores permite mais.
Estruturas aninhadas - Exemplo typedefstructdata { int dia; intmes; int ano; } tipoData; typedefstructaluno { int matricula; string nome; tipoDatadataNascimento; } tipoAluno;
Ponteiros para estruturas • Como outros tipos de dados, ponteiros para estruturas são declarados colocando-se o operador * na frente do nome da variável estrutura: structdata *ap_ontem; tipoData *ap_amanha;
Ponteiros para estruturas • Para acessar uma estrutura com ponteiros pode-se usar duas sintaxes: • Operador ponto: • Operador seta: *<ponteiro_estrutura>.<campo> <ponteiro_estrutura>-><campo>
Vetor de Struct • O uso mais comum de struct é em vetores • Para declarar um vetor de struct • Define-se a struct • Declara-se o vetor do tipo struct criado • Exemplo: struct aluno Turma380[28]; structenderecovetorEndAmigos[100];
Vetor de Struct • Para manipular os dados do vetor, devem • ser fornecidos o índice e o campo • Exemplo strcpy(Turma380[0].nome, “Fulano”); Turma380[0].P1 = 9.5; Turma380[0].P2 = 8.5; Turma380[0].T = 9.0; Turma380[0].faltas = 4; strcpy(vetorEndAmigos[0].rua, “Carlos Gomes”); strcpy(vetorEndAmigos[1].rua, “Goethe”);
Vetor de Struct • Exemplo: structendereco{ char nome[30]; char rua[40]; char cidade[20]; char estado[3]; longintcep; }; main() { structenderecoinfo_end[5]; int i; for(i = 0; i < 5; i++){ printf("Informe o nome: \n"); gets(info_end[i].nome); } // Imprime todos os nomes do vetor for(i = 0; i < 5; i++) printf("%s\n", info_end[i].nome); fflush(stdin); getchar(); }
Trabalho • Criar uma estrutura chamada DadosAluno, que armazena a média e idade de um aluno. Na função main: criar uma variável que é uma estrutura DadosAluno; ler a média e a idade de um aluno e armazenar na variável criada; exibir na tela a média e a idade do aluno. • Considerando o problema anterior, criar uma variável que é um vetor da estrutura DadosAluno. O programa deve obter a média e a idade de 10 alunos. Depois, estes dados devem ser exibidos.
Trabalho • Fazer um programa que cria uma estrutura livro, que contém os elementos título, ano de edição, número de páginas e preço. Criar uma variável desta estrutura que é um vetor de 5 elementos. Ler os valores para a estrutura e imprimir a média do número de páginas do livros. • Foi realizada uma pesquisa entre 500 habitantes de uma certa região. De cada habitante foram coletados os dados: idade, sexo, salário e número de filhos. Crie a estrutura de dados adequada para armazenar estas informações e faça uma função que armazene as informações digitadas pelo usuário na estrutura de dados criada. Faça também uma função que calcula a média do salário dos habitantes.