Podemos dar um nome à estrutura e referenciar esse nome na declaração das variáveis:

Documentos relacionados
Tipos abstratos de dados

ponteiros INF Programação I Prof. Roberto Azevedo

Algoritmos e Estruturas de dados

Aula 24 Ponteiros, vetores e structs

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

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

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

Computação 2. Aula 7. Profª. Fabiany Ponteiros

Departamento de Sistemas de Computação Universidade de São Paulo Introdução a Ciência de Computação I. Aula 12 Estruturas

Reinaldo Gomes Alocação Dinâmica

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

Aula 12- Variáveis e valores reais

Métodos Computacionais. Tipos Estruturados

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

Ponteiros, ponteiros e vetores e alocação dinâmica de memória

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

Programação Estruturada Prof. Rodrigo Hausen Agregados de Dados Heterogêneos (structs)

Linguagem de Programação

MC-102 Aula 21 Registros

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

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

1/34 GESTÃO DINÂMICA DE MEMÓRIA

1) Operadores de auto incremento ++ e auto decremento --

DAS5102 Fundamentos da Estrutura da Informação

Introdução à Programação

C Estruturas. Section Summary. Adriano Cruz 1 de fevereiro de 2016

1 Exercícios com ponteiros

Princípios de Desenvolvimento de Algoritmos MAC122

Linguagem C ponteiros

Verificando corretude da triangulação

1 Exercícios com ponteiros

Introdução à Computação MAC0110

Aula 25: Alocação Dinâmica

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

Algoritmos e Programação

Introdução à Computação

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Aula 14 Funções, Estrutura de Blocos e Macros.

Programação II. Tipos Estruturados

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

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

TAD: Tipo Abstrato de Dados (parte 2)

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

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

11a. Aula Ponteiros e Vetores

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Ponteiros. Baseado nos slides do Prof. Mauro.

Tipos Abstratos de Dados. Estrutura de Dados

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

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

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Introdução à Linguagem C Variáveis e Expressões

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

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

ESTRUTURAS COMPOSTAS. REGISTROS (Struct) Introdução à Ciência da Computação I Simone Senger Souza

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

Programação: Vetores

USP - ICMC - SSC SSC o. Semestre 2010 Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

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

Subprogramas. Prof. Carlos Lopes

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

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

Linguagens de Programação I

ESTRUTURAS COMPOSTAS. REGISTROS (Struct) Introdução à Ciência da Computação I Simone Senger Souza

19 Vetores, Ponteiros e Funções

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

TAD: Tipo Abstrato de Dados (parte 2)

MAC2166 Introdução à Computação para Engenharia Escola Politécnica Segunda Prova 19 de maio de 2008

Computação 2. Aula 5. Diego Addan Estrutura de Dados Registros (structs)

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs.

Estruturas. K&R: Capitulo 6. Estruturas IAED, 2014/2015. Introdução às Estruturas Estruturas e Funções Vectores de Estruturas Typedef Exemplo

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

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

1. Listas sequenciais versus listas ligadas. Lista sequencial

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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Laboratório de Introdução à Ciência da Computação I

Fundamentos de Programação

SCC120 - Capítulo 7 Estruturas (struct) em C

INF 1620 P4-09/07/03 Questão 1 Nome:

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

Introdução à Programação C

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

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.

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

INTRODUÇÃO À PROGRAMAÇÃO

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

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

INF 1007 Simulado P2 Nome: Instruções

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

Função "malloc" e "calloc":

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Computação para Engenharia Ambiental

3. Linguagem de Programação C

Transcrição:

Estruturas (struct) Já conhecemos os tipos simples do C: char, int, short, float, double,... É possível construir-se um tipo composto de elementos destes tipos simples. Estrutura (struct) é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, que podem ser manipuladas em conjunto ou em separado. Alguns exemplos: 1) Variáveis x, y, z do tipo estrutura para conter os dados de funcionários da empresa: struct {int numero; int cpf; double salario; x, y, z; 2) Variáveis d1 e d2 do tipo estrutura para conter uma data: struct {int dia; int mes; int ano; d1, d2; 3) Variável pt do tipo estrutura para conter as coordenadas de um ponto no plano: struct {double x; double y; pt; Atribuindo um nome à estruturas Podemos dar um nome à estrutura e referenciar esse nome na declaração das variáveis: struct funcionario {int numero; int cpf; double salario; ; /* declara as variáveis x,y e z do tipo funcionário */ struct funcionario x, y, z; struct data {int dia; int mes; int ano; ; struct data d1, d2; struct ponto {double x;

double y; ; struct ponto pt; Outros exemplos: Dados de um produto: struct produto { int codigo; double custo; double preco; int quantidade; /* variáveis do tipo produto */ struct produto P1,P2; Dados de um livro: struct livro { int codigo; char titulo[60]; char autor[40]; char editora[30]; int ano; int num_exemplares; /* variáveis do tipo livro */ struct produto livro1,livro2,livro3; Como usar e como referenciar os elementos internos das estruturas? Alguns exemplos usando as declarações dos elementos acima: /* uso da variáveis do tipo struct */ x = y; d1 = d2; Como nos exemplos acima, é possível atribuir uma estrutura á outra, desde que sejam do mesmo tipo, mas não se pode comparar duas estruturas. Por exemplo, não são permitidos comando do tipo: if (x == y)...

while (x > y)... Para fazer a comparação é necessário o acesso aos elementos internos da estrutura. Para se referenciar um dos campos internos dentro de uma variável do tipo estrutura usa-se o operador. (ponto) da seguinte forma: <variável>.<campo> /* usar os elementos internos das variáveis tipo struct */ x.numero = 12345; x.salario = 1035.33; x.salario = y.salario; if (x.cpf == 8888888880)... d1.dia = 1; d1.mes = 1; d1.ano = 2001; if (d1.ano > d2.ano)... pt.x = 2.34; pt.y = -56.48; Vetores de estruturas A declaração: struct funcionario tabfunc[100]; Declara um vetor de 100 elementos, em que cada elemento é uma estrutura do tipo funcionario. Os seguintes comandos são exemplos de acesso aos elementos de tabfunc: tabfunc[i].numero = 235467; tabfunc[k].salario = 333.44; for (i=0; i<max_func; i++) { tabfunc[i].numero = -1; tabfunc[i].cpf = 0; tabfunc[i].salario = 0; for (j=0; j<40; j++) tabfunc[i].nome[j] = ; Ponteiros e estruturas Da mesma forma que outras variáveis, podemos ter ponteiros para estruturas. struct funcionario x, *pf;

struct data d, *pd; pf = &x; pd = &d; (*pf).numero = 123456; é o mesmo que x.numero = 123456; (*pd).ano = 2001; é o mesmo que d.ano = 2001; O motivo do parêntesis em (*pf) é a prioridade dos operadores * (estrela) e. (ponto). Outra forma de usar ponteiro com estrutura é usar a abreviatura p-> para (*p).. Os comandos acima ficariam: pf->numero = 123456; é o mesmo que x.numero = 123456; pd->ano = 2001; é o mesmo que d.ano = 2001; A notação p-> é mais clara e um pouco menos carregada que a notação (*p). Também um pouco mais intuitiva. Estruturas e alocação dinâmica de memória Da mesma forma que outras variáveis a alocação de espaço em memória para estruturas pode ser feito dinamicamente com malloc e free. Isso pode ser especialmente interessante no caso de estruturas, onde cada elemento pode ocupar uma região grande de memória. Considere por exemplo a estrutura funcionario acima e a tabela tabfunc. Vamos alocá-la com n elementos: #include <stdlib.h> #include <stdio.h> int main(){ int i, j, n; struct funcionario {int numero; int cpf; double salario; ; struct funcionario *tabfunc; scanf( %d, &n); /* le n */ /* aloca n elementos para v */ tabfunc = (struct funcionario *) malloc(n*sizeof(struct funcionario)); /* inicia os n elementos de tabfunc */ for (i = 0; i < n; i++){ tabfunc[i].numero = 0; tabfunc[i].cpf = 99999999999; tabfunc[i].salario = -999999.99; for (j = 0; j < 40; j++) tabfunc[i].nome[j] = x ;

/* outra forma de iniciar os n elementos de tabfunc */ for (i = 0; i < n; i++){ (tabfunc+i)->numero = 0; (tabfunc+i)->cpf = 99999999999; (tabfunc+i)->salario = -999999.99; for (j = 0; j < 40; j++) (tabfunc+i)->nome[j] = x ; /* outra forma de iniciar os n elementos de tabfunc */ for (i = 0; i < n; i++){ (*(tabfunc+i)).numero = 0; (*(tabfunc+i)).cpf = 99999999999; (*(tabfunc+i)).salario = -999999.99; for (j = 0; j < 40; j++) (*(tabfunc+i)).nome[j] = x ; /* usa os n elementos de tabfunc */... /* libera os n elementos de tabfunc */ free(tabfunc); Structs e tipo de funções Uma função pode ter como tipo uma struct. Isso até resolve o problema de uma função poder devolver em seu retorno (comando return) um só valor. Se ela for do tipo struct, pode devolver todos os valores internos à struct. Suponha uma função que calcule e devolva as raízes de uma equação do segundo grau: Podemos fazer uma estrutura contendo as duas raízes e e usar esta estrutura como tipo da função: struct raizes { double x1,x2; struct raizes calculo (double a, double b, double c) { // calcula e devolve as raizes struct raizes r; double delta; delta=b*b-4*a*c; r.x1 = (-b+sqrt(delta))/(2*a); r.x2 = (-b-sqrt(delta))/(2*a);

return r; Veja agora o exemplo abaixo. Os pontos no plano são definidos por um par de coordenadas (x, y). Vamos definir uma estrutura struct ponto para este novo tipo de dado e usá-la em algumas funções para manipular pontos. #include <stdio.h> #include <math.h> struct ponto { double x; double y; ; struct ponto define_ponto (double a, double b) { struct ponto t; t.x = a; t.y = b; return t; struct ponto soma_pontos (struct ponto u, struct ponto v) { struct ponto t; t.x = u.x+v.x; t.y = u.y+v.y; return t; double distancia(struct ponto u, struct ponto v) { return sqrt((u.x-v.x)*(u.x-v.x)+(u.y-v.y)*(u.y-v.y)); int main() { struct ponto a,b,c; a = define_ponto(0.0, 0.0); b = define_ponto(2.0, 2.0); c = soma_pontos(a,b); printf("\nsoma = (%5.1lf,%5.1lf)", c.x, c.y); printf("\ndistancia = %5.1lf", distancia(a,b)); Exercícios: 1) Um número complexo a+bi também é um par (a, b). Defina uma struct complexo e faça as seguintes funções para manipular complexos: struct complexo soma(struct complexo c1,struct complexo c2){

/* devolve a some de c1 com c2 */ struct complexo mult(struct complexo c1,struct complexo c2){ /* devolve o produto dos complexos c1 e c2 */ double modulo (struct complexo c) { /* devolve o modulo do complexo c */ 2) Refaça o exemplo da função que, as raízes do segundo grau, tratando os casos particulares, devolvendo dentro da struct um campo a mais como código de retorno: struct raizes { int retorno; /* devolve -1 se delta<0 não há raízes reais */ /* devolve 0 se a=0 não é do 2 grau */ /* devolve 1 se delta=0 raízes iguais */ /* devolve 2 se delta>0 raízes diferentes */ double x1,x2;