INF 1007 Programação II



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

INF 1007 Programação II

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

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

INF 1007 Programação II

INF 1005 Programação I

INF 1007 Programação II

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

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 4

INF 1007 Programação II

Introdução a POO. Introdução a Linguagem C++ e POO

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

INF 1005 Programação I

Linguagens de Programação I

Estruturas (Registros)

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Introdução a Computação

Registros. Técnicas de Programação. Rafael Silva Guimarães

Métodos Computacionais. Tipos Estruturados

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Linguagem C: Árvores Binarias

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

Princípios de programação em Linguagem C Cesar Tadeu Pozzer UFSM 16/08/2010

Capítulo 2: Introdução à Linguagem C

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

MC-102 Aula 19 Registros

ponteiros INF Programação I Prof. Roberto Azevedo

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Métodos Computacionais. Tipos Abstratos de Dados

10. Listas Encadeadas

Alocação dinâmica de memória

Métodos Computacionais. Fila

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

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

Fundamentos de Programação

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

Curso de C. Procedimentos e Funções. 6/4/200901/04/09 09:42 Copyright@Arnaldo V Moura, Daniel F Ferber 1

Estruturas (registros)

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

Expressões. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Métodos Computacionais. Árvores

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

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

Tipos de Dados Simples

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Introdução à Programação

Unidade IV: Ponteiros, Referências e Arrays

Algoritmos e Estruturas de dados

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Programação Estruturada I

Aula 3 Alocação Dinâmica

Tabela ASCII de caracteres de controle

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Aula 1 Tipo Abstrato de Dados

Programação 1. Rafael Vargas Mesquita. ftp://ftp.ci.ifes.edu.br/informatica/rafael/

17 - Funções e Procedimentos em C Programação Modular

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

Programação científica C++

INF 1620 P2-01/11/03 Questão 1 Nome:

Estruturas de entrada e saída

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Conceitos de Linguagens de Programação

struct LISTA item quant

Técnicas de Programação I

PROGRAMA DE DISCIPLINA

14. Arquivos. W. Celes e J. L. Rangel. Estruturas de Dados PUC-Rio 13-1

2ª Lista de Exercícios

PROGRAMA DE DISCIPLINA

CIÊNCIA DA COMPUTAÇÃO PROVA PARA TRANSFERÊNCIA

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

DAS5102 Fundamentos da Estrutura da Informação

Programação de Computadores I. Ponteiros

Transcrição:

INF 1007 Programação II Aula 06 Tipos Estruturados Edirlei Soares de Lima <elima@inf.puc-rio.br>

Dados Compostos Até agora somente utilizamos tipos de dados simples: char, int, float, double. Muitas vezes precisamos manipular dados compostos ou estruturados. Exemplos: pontos no espaço bidimensional representado por duas coordenadas (x e y), mas tratado como um único objeto (ou tipo) registros de alunos; aluno representado pelo seu nome, número de matrícula, endereço, etc., estruturados em um único objeto (ou tipo)

Tipo Estrutura Struct Tipo estrutura (struct): tipo de dado com campos compostos de tipos mais simples elementos acessados através do operador de acesso ponto (.) struct ponto /* declaração da estrutura ponto */ float x; float y; ; int main(void) 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; printf("%f %f", p.x, p.y);

Tipo Estrutura Exemplo /* 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;

Ponteiro de Estruturas É possível utilizar ponteiros para estruturas: struct ponto p; struct ponto *pp=&p;... (*pp).x = 12.0; pp->x = 12.0; p.x = 12.0; (&p)->x =12.0; formas equivalentes de acessar o valor de um campo x 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

Ponteiro de Estruturas struct ponto float x; float y; ; int main(void) struct ponto p = 10, 20; struct ponto *pp; pp = &p; Qual o valor de? p.y pp.x pp->x (&p)->x &(pp->y) &(p.y)

Passagem de Estruturas por Valor para Funções A passagem de estruturas para funções funciona de forma semelhante a passagem de variáveis simples: /* função que imprime as coordenadas do ponto */ void imprime(struct ponto p) printf("o ponto fornecido foi: (%.2f,%.2f)\n", p.x, p.y); A 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

Estruturas Passagem por Referência Assim como acontece com variáveis simples, também é possível passar estruturas por referencia: /* função que imprima as coordenadas do ponto */ void imprime(struct ponto* pp) printf("o ponto fornecido foi: (%f, %f)\n", pp->x, pp->y); A função recebe o endereço da estrutura como parâmetro: a função pode alterar os valores dos campos da estrutura original operação menos custosa do que a passagem por valor

Estruturas Passagem por Referência void imprime(struct ponto* pp) printf("o ponto fornecido foi: (%f, %f)\n", pp->x, pp->y); void captura(struct ponto* pp) printf("digite as coordenadas do ponto(x y): "); scanf("%f %f", &pp->x, &pp->y); int main(void) struct ponto p; captura(&p); imprime(&p); return 0;

Alocação Dinâmica de Estruturas É possível alocar estruturas dinamicamente: o tamanho do espaço de memória alocado dinamicamente é dado pelo operador sizeof aplicado sobre o tipo estrutura; a 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; free(p);

Definição de Novos Tipos A linguagem C permite a definição de nomes para novos tipos de dados através do comando typedef: Exemplo: typedef int* PInt; typedef float Vetor[4]; Vetor v; /* exemplo de declaração usando Vetor */ v[0] = 3; PInt : um tipo ponteiro para int; Vetor : um tipo que representa um vetor de quatro elementos; Útil para abreviar nomes de tipos e para tratar tipos complexos

Definição de Novos Tipos É possível utilizar o comando typedef para definir o nome de um tipo estruturado: struct ponto float x; float y; ; typedef struct ponto Ponto; typedef struct ponto *PPonto; Representa a estrutura ponto Representa o tipo ponteiro para a estrutura ponto Simplifica a utilização da estrutura ponto: Ponto p1; PPonto p2; p1.x = 10.0; p2 = (PPonto)malloc(sizeof(Ponto)); p2->x = 5.0;

Definição de Novos Tipos É possível combinar o comando typedef com a declaração da estrutura: typedef struct ponto float x; float y; Ponto;

Estruturas Aninhadas Os campos de uma estrutura podem ser outras estruturas Exemplo: Definição de um círculo composto por um ponto central e um raio. struct ponto ; float x; float y; typedef struct ponto Ponto; struct circulo Ponto p; /* centro do círculo */ float r; /* raio do círculo */ ; typedef struct circulo Circulo;

Estruturas Aninhadas Função para a calcular distância entre 2 pontos: float distancia(ponto* p, Ponto* q) float d = sqrt(pow(q->x - p->x, 2) + pow(q->y - p->y, 2)); return d; Função para determinar se um ponto está ou não dentro de um círculo: int interior (Circulo* c, Ponto* p) float d = distancia(&c->p, p); if (d < c->r) return 1; else return 0;

Estruturas Aninhadas Função principal: 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); if (interior(&c,&p) == 1) printf("pertence ao interior!\n"); else printf("não pertence ao interior!\n"); return 0;

Estruturas Aninhadas Estrutura de um retângulo: struct ponto float x; float y; ; typedef struct ponto Ponto; struct retangulo Ponto pt1; Ponto pt2; ; typedef struct retangulo Retangulo; Retangulo meu_retangulo; meu_retangulo.pt1.x = 1.0; meu_retangulo.pt1.y = 1.0; meu_retangulo.pt2.x = 4.0; meu_retangulo.pt2.y = 3.0;

Funções para Criação de Estruturas Função para criar a estrutura de um Ponto: Ponto criaponto(int x, int y) Ponto p; p.x = x; p.y = y; return p; Função para criar dinamicamente a estrutura de um Retângulo: Ponto* criaretangulo(ponto p1, Ponto p2) Retangulo *rect = (Retangulo*)malloc(sizeof(Retangulo)); rect->pt1 = p1; rect->pt2 = p2; return rect;

Funções para Criação de Estruturas Função Principal: int main (void) Retangulo *r1; r1 = criaretangulo(criaponto(10,10), criaponto(20,25)); printf("p1: %d %d", r1->pt1.x, r1->pt1.y); printf("p2: %d %d", r1->pt2.x, r1->pt2.y); free(r1); return 0;

Vetores de Estruturas É possível criar vetores de estruturas; Exemplo: criar uma 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:

Vetores de Estruturas Ponto centro_geometrico(int n, Ponto *v) int i; Ponto p = 0, 0; for (i=0; i<n; i++) p.x += v[i].x; p.y += v[i].y; p.x = p.x/n; p.y = p.y/n; return p; v é um vetor de estruturas Ponto 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 cara

Vetores de Estruturas int main (void) Ponto vet_pontos[3] = 10,15, 50, 30, 20, 30; Ponto centro; centro = centro_geometrico(3, vet_pontos); Vetor de estrutura inicializado estaticamente. printf("centro Geometrico: %f, %f\n", centro.x, centro.y); return 0;

Vetores de Estruturas Usando Alocação Dinâmica Ponto *centro_geometrico(int n, Ponto* v) int i; Ponto *p = (Ponto*)malloc(sizeof(Ponto)); p->x = 0; p->y = 0; for (i=0; i<n; i++) p->x += v[i].x; p->y += v[i].y; p->x = p->x/n; p->y = p->y/n; return p; Função retornando ponteiro para estrutura.

Vetores de Estruturas Usando Alocação Dinâmica int main (void) int x; Ponto *vet_pontos; Ponto *centro; vet_pontos = (Ponto*)malloc(3 * sizeof(ponto)); for (x = 0; x < 3; x++) printf("digite o ponto %d: ", x+1); scanf("%f %f", &vet_pontos[x].x, &vet_pontos[x].y); centro = centro_geometrico(3, vet_pontos); printf("centro Geometrico: %f, %f\n", centro->x, centro->y); free(centro); free(vet_pontos); return 0; Vetor de estrutura inicializado dinamicamente.

Leitura Complementar Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004). Capítulo 8 Tipos Estruturados

Exercícios Lista de Exercícios 04 Tipos Estruturados http://www.inf.puc-rio.br/~elima/prog2/