Módulo 8 Tipos Estruturados

Documentos relacionados
INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

Métodos Computacionais. Tipos Estruturados

INF 1007 Programação II

INF 1007 Programação II

8. Tipos estruturados

Introdução a Programação. Ponteiros para Estruturas, Outros Tipos de Estruturas

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Revisão: Ponteiros e Alocação Dinámica

INF 1007 Programação II

Módulo 5 Vetores e Alocação Dinâmica

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

INF 1007 Programação II

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Introdução a Programação. Tipos Estruturados de Dados

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Módulo 10 Listas Encadeadas

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Módulo 7 Cadeias de Caracteres

Programação de Computadores II. Cap. 5 Vetores

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

5. Vetores e alocação dinâmica

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Introdução à Programação

Programação II. Tipos Estruturados

Tipos Estruturados. Tipos Estruturados

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Computação Eletrônica. Aula 08 Estruturas de Dados. Prof: Luciano Barbosa. CIn.ufpe.br

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Programação de Computadores II. Cap. 4 Funções

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

ESTRUTURA DE DADOS (TCC )

Linguagem C: Elementos fundamentais

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Aula 25: Alocação Dinâmica

Programação II. Vetor de Tipo Estruturado e Vetor de Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

INF 1007 Programação II

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

ponteiros INF Programação I Prof. Roberto Azevedo

Algoritmos e Estruturas de dados

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Módulo 18 - Tabelas de Dispersão. Referências

Alocação Dinâmica em C

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Princípios de Desenvolvimento de Algoritmos MAC122

Estruturas de Dados. Módulo 2 Expressões. 9/8/2005 (c) Marco A. Casanova - PUC-Rio 1

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Ponteiros e Alocação de Memória

INF 1620 P1-04/10/03 Questão 1 Nome:

Estruturas de Dados. Módulo 6 Matrizes. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Reinaldo Gomes Alocação Dinâmica

Linguagem C: Ponteiros - Alocação Dinâmica

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

C Estruturas. Adriano Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Estruturas de Dados. Módulo 15 - Arquivos. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Estruturas. struct são coleções de dados heterogêneos agrupados em uma mesma estrutura de dados. Ex: armazenar as coordenadas (x,y) de um ponto:

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Estruturas em C

Referências. Arquivos. Tópicos Principais. Programação de Computadores II. Motivação. Motivação. Abertura de arquivo. Slides da profa.

Programação II. Tipos Estruturados. Bruno Feijó Dept. de Informática, PUC-Rio

Cap. 3 Entrada e Saída e Controle de Fluxo

Ponteiros e Tabelas. K&R: Capítulo 5

Programação II. Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Cadeias de Caracteres (Strings)

INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

Alocação Dinâmica. Introdução à Computação

O que é um apontador em C (type pointer in C)?

USP-ICMC-BInfo. Ponteiros em C. SCC501 - ICC-II 2011 Prof. João Luís

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Introdução à Computação

Algoritmos e Programação

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

INF 1620 P1-10/04/02 Questão 1 Nome:

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Transcrição:

Estruturas de Dados Módulo 8 Tipos Estruturados 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 8 Tipos estruturados 9/8/2005 (c) Dept. Informática - PUC-Rio 2

Tópicos Tipo estrutura Definição de novos tipos Aninhamento de estruturas Vetores de estruturas Tipo união Tipo enumeração 9/8/2005 (c) Dept. Informática - PUC-Rio 3

Tipo Estrutura Motivação: manipulação de dados compostos ou estruturados Exemplos: ponto no espaço bidimensional representado por duas coordenadas (x e y), mas tratado como um único objeto (ou tipo) dados associados a aluno: aluno representado pelo seu nome, número de matrícula, endereço, etc., estruturados em um único objeto (ou tipo) Ponto X Y Aluno Nome Matr End Rua No Compl 9/8/2005 (c) Dept. Informática - PUC-Rio 4

Tipo Estrutura Tipo estrutura: tipo de dado com campos compostos de tipos mais simples elementos acessados através do operador de acesso ponto (.) struct ponto /* declara ponto do tipo struct */ { float x; float y; ;... struct ponto p; /* declara p como variável do tipo struct ponto */... p.x = 10.0; /* acessa os elementos de ponto */ p.y = 5.0; 9/8/2005 (c) Dept. Informática - PUC-Rio 5

Tipo Estrutura /* Captura e imprime as coordenadas de um ponto qualquer */ #include <stdio.h> struct ponto { ; float x; float y; int main (void) { struct ponto p; printf("digite as coordenadas do ponto(x y): "); scanf("%f %f", &p.x, &p.y); printf("o ponto fornecido foi: (%.2f,%.2f)\n", p.x, p.y); return 0; Basta escrever &p.x em lugar de &(p.x). O operador de acesso ao campo da estrutura tem precedência sobre o operador endereço de 9/8/2005 (c) Dept. Informática - PUC-Rio 6

Tipo Estrutura Ponteiros para estruturas: acesso ao valor de um campo x de uma variável estrutura p: p.x acesso ao valor de um campo x de uma variável ponteiro pp: pp->x acesso ao endereço do campo x de uma variável ponteiro pp: &pp->x struct ponto *pp; (*pp).x = 12.0; /* formas equivalentes de acessar o valor de um campo x */ pp->x = 12.0; 9/8/2005 (c) Dept. Informática - PUC-Rio 7

Tipo Estrutura Passagem de estruturas para funções por valor: análoga à passagem de variáveis simples função recebe toda a estrutura como parâmetro: função acessa a cópia da estrutura na pilha função não altera os valores dos campos da estrutura original operação pode ser custosa se a estrutura for muito grande /* função que imprima as coordenadas do ponto */ void imprime (struct ponto p) { printf("o ponto fornecido foi: (%.2f,%.2f)\n", p.x, p.y); 9/8/2005 (c) Dept. Informática - PUC-Rio 8

Tipo Estrutura Passagem de estruturas para funções por referência: apenas o ponteiro da estrutura é passado, mesmo que não seja necessário alterar os valores dos campos dentro da função /* função que imprima as coordenadas do ponto */ void imprime (struct ponto* pp) { printf("o ponto fornecido foi: (%.2f,%.2f)\n", pp->x, pp->y); void captura (struct ponto* pp) { printf("digite as coordenadas do ponto(x y): "); scanf("%f %f", &p->x, &p->y); int main (void) { struct ponto p; captura(&p); imprime(&p); return 0; 9/8/2005 (c) Dept. Informática - PUC-Rio 9

Tipo Estrutura Alocação dinâmica de estruturas: tamanho do espaço de memória alocado dinamicamente é dado pelo operador sizeof aplicado sobre o tipo estrutura função malloc retorna o endereço do espaço alocado, que é então convertido para o tipo ponteiro da estrutura struct ponto* p; p = (struct ponto*) malloc (sizeof(struct ponto));... p->x = 12.0;... 9/8/2005 (c) Dept. Informática - PUC-Rio 10

Definição de Novos Tipos typedef permite criar nomes de tipos útil para abreviar nomes de tipos e para tratar tipos complexos typedef unsigned char UChar; typedef int* PInt; typedef float Vetor[4]; Vetor v; /* exemplo de declaração usando Vetor */... v[0] = 3; UChar o tipo char sem sinal PInt um tipo ponteiro para int Vetor um tipo que representa um vetor de quatro elementos 9/8/2005 (c) Dept. Informática - PUC-Rio 11

Definição de Novos Tipos typedef Exemplo: definição de nomes de tipos para as estruturas struct ponto { float x; float y; ; typedef struct ponto Ponto; typedef struct ponto *PPonto; ponto Ponto representa uma estrutura com 2 campos do tipo float representa a estrutura ponto PPonto representa o tipo ponteiro para a estrutura Ponto 9/8/2005 (c) Dept. Informática - PUC-Rio 12

Definição de Novos Tipos typedef Exemplo: (definição utilizando um só typedef) struct ponto { float x; float y; ; typedef struct ponto Ponto, *PPonto; ponto representa uma estrutura com 2 campos do tipo float Ponto representa a estrutura ponto PPonto representa o tipo ponteiro para a estrutura Ponto 9/8/2005 (c) Dept. Informática - PUC-Rio 13

Definição de Novos Tipos typedef Exemplo: (definição em um comando só) typedef struct ponto { float x; float y; Ponto; ponto Ponto representa uma estrutura com 2 campos do tipo float representa a estrutura ponto 9/8/2005 (c) Dept. Informática - PUC-Rio 14

Aninhamento de Estruturas Aninhamento de estruturas: campos de uma estrutura podem ser outras estruturas Exemplo: definição de Círculo usando Ponto struct circulo { Ponto p; /* centro do círculo */ float r; /* raio do círculo */ ; typedef struct circulo Circulo; 9/8/2005 (c) Dept. Informática - PUC-Rio 15

/* Função para determinar se um ponto está ou não dentro de um círculo: entrada: ponteiros para um círculo e para um ponto saída: 1 = ponto dentro do círculo 0 = ponto fora do círculo */ &c->p : ponteiro para centro de c int interior (Circulo* c, Ponto* p) { p : ponteiro para o ponto float d = distancia(&c->p, p); c->r : raio do círculo return (d < c->r); d < c->r : testa se d é menor do raio /* Função para a calcular distância entre 2 pontos: cálculo da distância: entrada: ponteiros para os pontos 2 2 saída: distância correspondente d = ( x2 x1 ) + ( y2 y1) */ sqrt da biblioteca math.h float distancia (Ponto* p, Ponto* q) { float d = sqrt((q->x - p->x)*(q->x - p->x) + (q->y - p->y)*(q->y - p->y)); return d; 9/8/2005 (c) Dept. Informática - PUC-Rio 16

#include <stdio.h> #include <math.h> typedef struct ponto { float x; float y; Ponto; typedef struct circulo { Ponto p; /* centro do círculo */ float r; /* raio do círculo */ Circulo; int main (void) { Circulo c; Ponto p; printf("digite as coordenadas do centro e o raio do circulo:\n"); scanf("%f %f %f", &c.p.x, &c.p.y, &c.r); printf("digite as coordenadas do ponto:\n"); scanf("%f %f", &p.x, &p.y); printf("pertence ao interior = %d\n", interior(&c,&p)); return 0; 9/8/2005 (c) Dept. Informática - PUC-Rio 17

Vetores de Estruturas Exemplo: função para calcular o centro geométrico de conjunto de pontos entrada: vetor de estruturas definindo o conjunto de pontos saída: centro geométrico, dado por: xi x = y = n n y i 9/8/2005 (c) Dept. Informática - PUC-Rio 18

Vetores de Estruturas Ponto centro_geom (int n, Ponto* v) { int i; Ponto p = {0.0f, 0.0f; /* declara e inicializa ponto */ for (i=0; i<n; i++) { p.x += v[i].x; p.y += v[i].y; p.x /= n; p.y /= n; return p; função retornando estrutura: para estruturas pequenas, este recurso facilita o uso da função para estruturas grandes, a cópia do valor de retorno pode ser caro 9/8/2005 (c) Dept. Informática - PUC-Rio 19

Vetores de Estruturas Exemplo: função para calcular a área de um polígono plano delimitado por uma seqüência de n pontos a área do polígono é a soma das áreas dos trapézios formados pelos lados do polígono e o eixo x a área do trapézio definido pela aresta que vai do ponto pi ao ponto pi+1 é dada por: a = ( xi + xi )( yi+ 1 + 1 i y ) / 2 y p i p i+1 y i y i+1 algumas áreas são negativas as áreas externas ao polígono são anuladas se a seqüência de pontos do polígono for dada em sentido anti-horário, a área terá valor negativo e a área do polígono é o valor absoluto do resultado da soma. x i x i+1 x 9/8/2005 (c) Dept. Informática - PUC-Rio 20

Vetores de Estruturas float area (int n, Ponto* p) { int i, j; float a = 0; for (i=0; i<n; i++) { j = (i+1) % n; /* próximo índice (incremento circular) */ a += (p[ j ].x - p[ i ].x)*(p[ i ].y + p[ j ].y)/2; return fabs(a); fabs função definida em math.h retorna o valor absoluto de um valor real 9/8/2005 (c) Dept. Informática - PUC-Rio 21

Vetores de Ponteiros para Estruturas Exemplo: tabela com dados de alunos, organizada em um vetor dados de cada aluno: matrícula: número inteiro nome: cadeia com até 80 caracteres endereço: cadeia com até 120 caracteres telefone: cadeia com até 20 caracteres 9/8/2005 (c) Dept. Informática - PUC-Rio 22

Solução 1: Aluno tab struct aluno { int mat; char nome[81]; char end[121]; char tel[21]; ; estrutura ocupando pelo menos 4+81+121+21 = 227 Bytes vetor de Aluno representa um desperdício significativo de memória, se o número de alunos bem inferior ao máximo estimado typedef struct aluno Aluno; #define MAX 100 Aluno tab[max]; 9/8/2005 (c) Dept. Informática - PUC-Rio 23

Solução 2 (usada no que se segue): tab vetor de ponteiros para Aluno elemento do vetor ocupa espaço de um ponteiro alocação dos dados de um aluno no vetor: nova cópia da estrutura Aluno é alocada dinamicamente endereço da cópia é armazenada no vetor de ponteiros posição vazia do vetor: valor é o ponteiro nulo struct aluno { int mat; char nome[81]; char end[121]; char tel[21]; ; typedef struct aluno Aluno; #define MAX 100 Aluno* tab[max]; 9/8/2005 (c) Dept. Informática - PUC-Rio 24

Inicializa - função para inicializar a tabela: recebe um vetor de ponteiros (parâmetro deve ser do tipo ponteiro para ponteiro ) atribui NULL a todos os elementos da tabela void inicializa (int n, Aluno** tab) { int i; for (i=0; i<n; i++) tab[i] = NULL; 9/8/2005 (c) Dept. Informática - PUC-Rio 25

Preenche - função para armazenar novo aluno na tabela: recebe a posição onde os dados serão armazenados dados são fornecidos via teclado se a posição da tabela estiver vazia, função aloca nova estrutura caso contrário, função atualiza a estrutura já apontada pelo ponteiro void preenche (int n, Aluno** tab, int i) { if (i<0 i>=n) { printf("indice fora do limite do vetor\n"); exit(1); /* aborta o programa */ if (tab[i]==null) tab[i] = (Aluno*)malloc(sizeof(Aluno)); printf("entre com a matricula:"); scanf("%d", &tab[i]->mat);... 9/8/2005 (c) Dept. Informática - PUC-Rio 26

Retira - função para remover os dados de um aluno da tabela: recebe a posição da tabela a ser liberada libera espaço de mémória utilizado para os dados do aluno void retira (int n, Aluno** tab, int i) { if (i<0 i>=n) { printf("indice fora do limite do vetor\n"); exit(1); /* aborta o programa */ if (tab[i]!= NULL) { free(tab[i]); tab[i] = NULL; /* indica que na posição não mais existe dado */ 9/8/2005 (c) Dept. Informática - PUC-Rio 27

Imprimi - função para imprimir os dados de um aluno da tabela: recebe a posição da tabela a ser impressa void imprime (int n, Aluno** tab, int i) { if (i<0 i>=n) { printf("indice fora do limite do vetor\n"); exit(1); /* aborta o programa */ if (tab[i]!= NULL) { printf("matrícula: %d\n, tab[i]->mat); printf("nome: %s\n, tab[i]->nome); printf("endereço: %s\n, tab[i]->end); printf("telefone: %s\n, tab[i]->tel); 9/8/2005 (c) Dept. Informática - PUC-Rio 28

Imprimi_tudo - função para imprimir todos os dados da tabela: recebe o tamanho da tabela e a própria tabela void imprime_tudo (int n, Aluno** tab) { int i; for (i=0; i<n; i++) imprime(n,tab,i); 9/8/2005 (c) Dept. Informática - PUC-Rio 29

Programa de teste #include <stdio.h> int main (void) { Aluno* tab[10]; inicializa(10,tab); preenche(10,tab,0); preenche(10,tab,1); preenche(10,tab,2); imprime_tudo(10,tab); retira(10,tab,0); retira(10,tab,1); retira(10,tab,2); return 0; 9/8/2005 (c) Dept. Informática - PUC-Rio 30

Tipo União union localização de memória compartilhada por diferentes variáveis, que podem ser de tipos diferentes uniões usadas para armazenar valores heterogêneos em um mesmo espaço de memória union exemplo { int i; char c; union exemplo v; não declara nenhuma variável apenas define o tipo união campos i e c compartilham o mesmo espaço de memória variável v ocupa pelo menos o espaço necessário para armazenar o maior de seus campos (um inteiro, no caso) 9/8/2005 (c) Dept. Informática - PUC-Rio 31

Tipo União union acesso aos campos: operador ponto (.) para acessar os campos diretamente operador seta (->) para acessar os campos através de ponteiro union exemplo { int i; char c; union exemplo v; v.i = 10; /* alternativa 1 */ v.c = x ; /* alternativa 2 */ 9/8/2005 (c) Dept. Informática - PUC-Rio 32

Tipo União union armazenamento: apenas um único elemento de uma união pode estar armazenado num determinado instante a atribuição a um campo da união sobrescreve o valor anteriormente atribuído a qualquer outro campo union exemplo { int i; char c; union exemplo v; v.i = 10; /* alternativa 1 */ v.c = x ; /* alternativa 2 */ 9/8/2005 (c) Dept. Informática - PUC-Rio 33

Tipo Enumeração enum declara uma enumeração, ou seja, um conjunto de constantes inteiras com nomes que especifica os valores legais que uma variável daquele tipo pode ter oferece uma forma mais elegante de organizar valores constantes 9/8/2005 (c) Dept. Informática - PUC-Rio 34

Tipo Enumeração Exemplo tipo Booleano: bool Bool resultado declara as constantes FALSE e TRUE associa TRUE ao valor 1 e FALSE ao valor 0 declara um tipo cujos valores só podem ser TRUE (1) ou FALSE (0) variável que pode receber apenas os valores TRUE ou FALSE enum bool { TRUE = 1, FALSE = 0 ; typedef enum bool Bool; Bool resultado; 9/8/2005 (c) Dept. Informática - PUC-Rio 35

Resumo struct struct ponto { float x; float y; ; typedef typedef struct ponto Ponto; typedef struct ponto *PPonto; union union exemplo { int i; char c; union exemplo v; enum enum bool { TRUE = 1, FALSE = 0 ; typedef enum bool Bool; Bool resultado; 9/8/2005 (c) Dept. Informática - PUC-Rio 36