Anda di halaman 1dari 15

Linguagem de programao I A

Carlos Oberdan Rolim


Cincia da Computao Sistemas de Informao

Estrutura de Dados Compostos (Structs)

Definio
Uma estrutura (struct) ou registro em C uma coleo de um ou mais valores, agrupados sob um nico nome. Estruturas constituem um recurso importante para organizar os dados utilizados por um programa graas possibilidade de tratar um grupo de valores como uma nica varivel

Exemplo de uso
struct ponto { int x; int y; }; struct funcionario { int registro; char nome[30]; char depto[5]; float salario; };

Exemplo de uso
As declaraes de ponto e funcionario, definem os respectivos tipos de dados, que podem ser utilizados em declaraes de variveis. Exemplos: struct ponto p1, p2, p3; struct funcionario Joao;

Na primeira declarao, esto sendo declaradas as variveis p1, p2 e p3 do tipo ponto. Na segunda declarao, declarada a varivel Joao do tipo funcionrio.

Exemplo de uso
Para uma varivel do tipo ponto, dizemos que x e y so seus campos ou membros. Os campos de uma varivel podem ser acessados individualmente como variveis usando-se o nome da varivel seguido de "." e o nome do campo. Exemplos: p1.x = 10; p1.y = 20; p2.x = p1.x + 5; p2.y = p2.y + 5; Alm disso, possvel atribuir a uma estrutura o valor de outra estrutura do mesmo tipo. Exemplos: funcionario f = Joao; p3 = p2;

Estruturas complexas
Os campos de uma estrutura podem ser de qualquer tipo: tipos simples (int, char, float, etc), vetores, ou at mesmo estruturas. Exemplo:

struct retangulo { struct ponto pa; struct ponto pb; }

Uso de estruturas com funes


Uma vez que o tipo de uma estrutura foi declarado, possvel utiliz-lo em outras declaraes (variveis simples, vetores, funes, etc). ... struct ponto poligono[10]; ... float dist(struct ponto p, ponto q) { int dx = p.x - q.x; int dy = p.y - q.y; return sqrt((double)dx*dx + (double)dy*dy); }

Passagem de estrutura por referncia


Uma estrutura pode ser passada como parmetro por referncia numa funo. Quando se usa uma referncia (apontador), o acesso aos campos da mesma feito atravs do operador "->" ao invs de ".". Exemplo: void moveP(struct ponto* p, int dx, int dy){ p -> x += dx; p -> y += dy; } ... void moveR(struct retangulo* r, ind dx, ind dy){ moveP(&(r -> pa), dx, dy); moveP(&(r -> pb), dx, dy); }

Retornando uma estrutura


Uma funo pode ter uma estrutura como valor de retorno

struct ponto constroiPonto(int x, int y){ struct ponto temp; temp.x = x; temp.y = y; return temp; }
... struct ponto Origem = constroiPonto(0,0);

Declarao com valores iniciais


Ao declararmos uma estrutura, podemos tambm definir o seu valor inicial, de forma anloga a aquela utilizada para vetores. Exemplos:

struct ponto origem = {0,0}; ... struct ponto trapezio[] = { { 5,5}, {5, 10}, {10,5}, {10,13} }; ...

Criando um tipo baseado em estruturas


possvel criar um tipo baseado em uma estrutura
Para isso utiliza-se typedef na declarao
struct tipo_data{
int dia, mes, ano; }; typedef struct tipo_data DATA; ATENO:

DATA o nome to tipo


Agora pode ser declarada uma varivel dessa forma DATA d;

Outra forma de declarao


typedef struct tipo_data{

int dia, mes, ano;


} DATA; Forma mais comum de declarar

No existe mais a necessidade de struct tipo_data d;

Usando ponteiros com structs


struct data{ int dia; int ms; int ano; }; Definindo uma varivel do tipo data struct data dt; Definindo um ponteiro para dt struct data *pdt=&dt; Fazendo referncia a um elemento da estrutura dt.dia ou (*pdt).dia ou pdt->dia dt.mes ou (*pdt).mes ou pdt->ms dt.ano ou (*pdt).ano ou pdt->ano

Alocao dinmica de estruturas

preciso armazenar esse endereo retornado pela malloc num ponteiro de tipo apropriado Para alocar um tipo de dado que ocupa vrios bytes, preciso recorrer ao operador sizeof, que diz quantos bytes o tipo especificado tem

DATA *d; d = malloc (sizeof (DATA)); d->dia = 31; d->mes = 12; d->ano = 2008;

#include <stdio.h> typedef struct tipo_data{ int dia, mes, ano; } DATA; int main (void) { DATA *d; d = malloc (sizeof (DATA)); d->dia = 31; d->mes = 12; d->ano = 2008; printf("Data: %d / %d / %d \n", d->dia, d->mes, d->ano); free(d); return 0; }

Anda mungkin juga menyukai