Programação II. Tipos Estruturados

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

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

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

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

INF 1007 Programação II

Módulo 8 Tipos Estruturados

10. - ESTRUTURAS Características Básicas

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

Aula 25: Alocação Dinâmica

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

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

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

8. Tipos estruturados

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

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Ponteiros & tabelas (cont.) K&R: Capítulo 5

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

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

Linguagem C: Introdução

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Apontadores/ponteiros

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

Programação de Computadores II Lista de Exercícios 03

Aula 17: Ponteiros e Alocação Dinâmica em C

Ponteiros e Alocação de Memória

Ponteiros. prof. Fabrício Olivetti de França

Reinaldo Gomes Alocação Dinâmica

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

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Métodos Computacionais. Tipos Estruturados

Gilberto A. S. Segundo. 24 de agosto de 2011

Tipos Estruturados. Tipos Estruturados

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

ponteiros INF Programação I Prof. Roberto Azevedo

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:

BCC202 - Estrutura de Dados I

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

Programação II. Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio

Ponteiros. Baseado nos slides do Prof. Mauro.

Aula 27: Estruturas heterogêneas e alocação dinâmica

1 Exercícios com ponteiros

3. Linguagem de Programação C

Aula 24 Ponteiros, vetores e structs

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

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Algoritmos e Estruturas de dados

INTRODUÇÃO À LINGUAGEM C

Alocação Dinâmica em C

Vetores. e o programa deverá ler os valores separadamente:

Programação de Computadores II

Disciplina de Algoritmos e Programação

INTRODUÇÃO À LINGUAGEM C

Programação de Computadores II

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Programação de Computadores I Funções Básicas da Linguagem C PROFESSORA CINTIA CAETANO

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

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Básico: estrutura de programa, sintaxe Interface com linha de comando

Programação II. Módulos, Encapsulamento e TADs. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Introdução a Funções. Bruno Feijó Dept. de Informática, PUC-Rio

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

Introdução a Linguagem C (Parte II) UFPA Sistemas de Informação. Roberto Araujo 2013

Introdução à Programação

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

Introdução à Computação

INTRODUÇÃO À LINGUAGEM C

INF 1007 Simulado P2 Nome: Instruções

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

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

Listas ligadas/listas encadeadas

Atividade de laboratório listas encadeadas simples

Ponteiros. Introdução

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

Linguagem C Ponteiros

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

Funções em Linguagem C Parte II

Programação: Vetores

INF 1007 Programação II

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

1 Exercícios com ponteiros

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

SSC304 Introdução à Programação Para Engenharias. Estruturas. GE4 Bio

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Estrutura de Dados. TAD (Tipo Abstrato de Dados) Criando a primeira estrutura

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

Introdução a C. Para saber quais os procedimento ou funções que existem em cada biblioteca, acesse

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

Linguagem de Programação

Linguagens de Programação. Rotinas, Modos e Tipos de Passagem de Parâmetros. Carlos Bazilio

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

Computação Eletrônica. Struct (Estruturas)

Transcrição:

Programação II Tipos Estruturados Parte 1: struct Parte 2: Ponteiros para Estrutura Estruturas e Memória Bruno Feijó Dept. de Informática, PUC-Rio

struct

Dados Compostos Até agora tipos simples: char, int, float,. Necessidade por dados compostos, por tipos estruturados Ex.: pontos no espaço 2D como um objeto (ou tipo) único Ponto X Y Ex.: registros de conta bancária Cliente Nome NoContaCorrente End Rua No Compl

Struct struct ponto float x; float y; typedef struct ponto Ponto; Ponto X Y struct ponto p; ou Ponto p; se definirmos "Ponto" como "struct ponto" operador de acesso (.): p.x = 10.0; p.y = 5.0; ou lendo do teclado: scanf("%f%f",&p.x,&p.y); // ou: &(p.x)

Estruturas Aninhadas struct ponto float x; float y; typedef struct ponto Ponto; y pt1 (1,1) pt2 (4,3) x struct retangulo Ponto pt1; Ponto pt2; typedef struct retangulo Retangulo; ou: struct retangulo struct ponto pt1; struct ponto pt2; Defina um objeto chamado tela (como sendo um retângulo) e estabeleça os valores do primeiro ponto da tela (pt1), conforme figura acima: Retangulo tela; tela.pt1.x = 1.0; tela.pt1.y = 1.0;

Exemplo Ponto dentro de Retângulo Sejam p um ponto e r um retângulo. Defina uma função que retorna 1 se p r e 0 caso contrário. Considere os tipos definidos no slide anterior. 3 2 r p 1 pt1 (1,1) 0 0 1 2 3 4 #include <stdio.h> pt2 (4,3) struct ponto float x; float y; typedef struct ponto Ponto; struct retangulo Ponto pt1; Ponto pt2; typedef struct retangulo Retangulo; int pemret(ponto p, Retangulo r) return p.x >= r.pt1.x && p.x <= r.pt2.x && p.y >= r.pt1.y && p.y <= r.pt2.y; int main(void) Ponto p1 = 1, 1 Ponto p2 = 4, 3 Ponto p = 3.5, 1.5 Retangulo r; r.pt1 = p1; r.pt2 = p2; printf("%d\n", pemret(p, r)); return 0; }

typedef e struct em único comando evitar! Podemos ter definição simultânea: typedef struct ponto float x; float y; } Ponto; Mas, recomendamos definir typedef após (ou antes) struct. É bom ficarmos com a liberdade de definir struct em um módulo e o typedef em outro. Faremos isto, mais tarde no curso, em TAD (Tipo Abstrato de Dados).

Ponteiros para Estrutura

Ponteiro para Estrutura Se uma estrutura grande deve ser passada para uma função, geralmente é mais eficiente passar um ponteiro do que copiar a estrutura inteira. struct ponto * pp; Uma primeira forma de usar ponteiro para estrutura e pegar o endereço. Por exemplo: struct ponto a; struct ponto * pp; pp = &a; (*pp).x = 10.0 //. tem maior precedencia que * Alternativa de acesso: operador de acesso -> pp->x = 10.0; Exemplo: struct retangulo r, * rp; rp = &r; então, são equivalentes: r.pt1.x rp->pt1.x (r.pt1).x (rp->pt1).x Os valores dos componentes de uma estrutura podem ser definidos na inicialização ou através de scanf. Há várias maneiras de trabalhar com o ponteiro. Por exemplo: struct ponto a = 4.0,3.0 struct ponto a; struct ponto * pp; ou struct ponto * pp; pp = &a; pp = &a; printf("%f %f\n",pp->x,pp->y); scanf("%f%f",&pp->x,&pp->y); printf("%f %f\n",pp->x,pp->y);

Exemplo ponteiro como argumento de função Escreva função que imprime os valores da estrutura ponto através de seu ponteiro #include <stdio.h> struct ponto float x; float y; void imprime(struct ponto *); int main(void) struct ponto p; p.x = 4.0; p.y = 3.0; imprime(&p); return 0; } void imprime(struct ponto * pp) printf("%f %f\n", pp->x, pp->y); }

Exemplo Área Escreva função que retorna área de um retângulo. Defina um dos pontos diretamente a1 = } e o outro com o operador (.) #include <stdio.h> struct ponto float x; float y; struct retangulo struct ponto pt1; struct ponto pt2; float area(struct retangulo * pr); int main(void) struct ponto a1 = 1.0,1.0 struct ponto a2; struct retangulo r; } a2.x = 4.0; a2.y = 3.0; r.pt1 = a1; r.pt2 = a2; printf("%f\n", area(&r)); return 0; float area(struct retangulo * pr) return (pr->pt2.x - pr->pt1.x) *(pr->pt2.y - pr->pt1.y); }

Alocação Dinâmica struct ponto float x; float y; typedef struct ponto Ponto; typedef struct ponto * PPonto; Ponto p1; p1.x = 10.0; PPonto pp; pp->x = 10.0; Outra forma (com alocação dinâmica): Ponto * p; p = (Ponto *)malloc(sizeof(ponto)); p->x = 10.0;

Exemplo Estrutura Aluno usando Ponteiros Escreva um programa que primeiro lê o nome de um aluno e as suas duas notas P1 e P2 via teclado, colocando-os numa estrutura que contém um string e um vetor notas com dois floats. Depois escreva uma função que recebe um ponteiro para esta estrutura e retorna a média do aluno. Por fim, imprima nome e média no programa principal. Use três módulos (aluno.h, aluno.c e prog1.c) e decida onde colocar as definições de estrutura. Use typedef. Faça alocação dinâmica.

prog1.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "aluno.h" int main(void) Aluno * p; Exemplo Estrutura Aluno usando Ponteiros - Solução struct aluno char nome[81]; float notas[2]; typedef struct aluno Aluno; float media(aluno * p); p = (Aluno *)malloc(sizeof(aluno)); // alternativa estatica: Aluno a; p = &a; printf("entre nome aluno: "); scanf(" %80[^\n]s",p->nome); printf("entre notas P1 e P2: "); scanf("%f%f",&p->notas[0],&p->notas[1]); printf("aluno= %s Media= %.2f\n",p->nome,media(p)); aluno.h } return 0; #include "aluno.h" aluno.c outra alternativa estática (inicializando): Aluno a = "Ana Paula",8,5} p = &a; float media(aluno * p) return (p->notas[0] + p->notas[1])/2; }

Estruturas e Memória

Definir, Declarar e Acessar uma Estrutura Primeiro nós definimos um novo tipo para o computador, e.g.: struct ex1 int a; int b; char c; Isto informa ao compilador o quão grande é a nossa struct e como os diferentes itens de dados (os membros da estrutura) são colocados na memória. mas isto NÃO ALOCA memória! Para alocar memória, nós temos que declarar uma variável usando o nosso novo tipo de dados, e.g. struct ex1 x; Depois disto, podemos acessar membros específicos desta variável: x.b = 5 x 5 x.c x.b x.a Os membros de uma estrutura são colocados na ordem especificada pela definição Ao passar uma estrutura como argumento de uma função, há uma cópia temporária custosa (porque é de toda a estrutura). Torna-se muito menos custoso passar um ponteiro (pois haverá a cópia de um simples endereço), e.g.: argumento é uma estrutura: float media(aluno p) argumento é um ponteiro para estrutura: float media(aluno * p) Lembre que p é uma variável temporária que vai morrer quando a função acabar.

Structure Padding O tamanho em bytes de uma estrutura nem sempre é a soma dos tamanhos isolados dos seus membros. Por exemplo, struct ex1 int a; int b; char c; char d; float e; ocupará 16 bytes, ao invés de 4 + 4 + 1 + 1 + 4 = 14 bytes. Se mudarmos a ordem dos membros da estrutura, o gasto de bytes pode até aumentar: Por exemplo, struct ex1 int a; char c; int b; char d; float e; ocupará 20 bytes. teste com sizeof(struct ex1)! A arquitetura de um computador é otimizada para a leitura de 4 bytes por vez (em computadores de 32 bits) ou 8 bytes por vez (em máquinas de 64 bits). Desta maneira, o compilador coloca bytes vazios para completar este empacotamento dos membros de uma estrutura. Isto é chamado de structure padding. struct ex1 int a; int b; char c; char d; float e; a b c d e pad struct ex1 int a; int b; char c; char d; float e; a c b d e Em alguns compiladores (e.g. Visual Studio), você pode impor empacotamento diferente, usando diretivas #pragma Mas não as use neste curso pad1 pad2