Linguagem de programação I A
Carlos Oberdan Rolim
Ciência da ComputaçãoSistemas de Informação
Estrutura de Dados Compostos
(Structs) e Unions
Definição
Uma estrutura (struct) ou registro em C é uma coleção de um
ou mais valores, agrupados sob um único nome.
Estruturas constituem um recurso importante para organizar
os dados utilizados por um programa graças à possibilidade
de tratar um grupo de valores como uma única variável
Estruturas anônimas
O exemplo abaixo cria uma estrutura chamada de estrutura anônima. Esse tipo de estrutura não pode ser referenciada em outras partes do programa.
struct { int dia; int mes ; int ano;} hoje;
Serve somente para declaração de variáveis do tipo da estrutura
Não será possível declarar outras variáveis do mesmo tipo da variável hoje
Para resolver isso deve-se declarar estruturas usando rótulos
Exemplo de criação de estrutura rotulada
struct ponto { int x; int y;};
struct funcionario { int registro; char nome[30]; char depto[5]; float salario;};
• As variáveis variáveis que fazem parte de uma estrutura são denominadas membros e são identificadas por nomes
O rótulo dessas estruturas são ponto e funcionario e usa-se eles para declaração de variáveis
Exemplo de uso
As declarações de ponto e funcionario, definem os respectivos tipos de dados,
que podem ser utilizados em declarações de variáveis. Exemplos:
struct ponto p1, p2, p3;
struct funcionario Joao;
Na primeira declaração, estão sendo declaradas as variáveis p1, p2 e p3 do tipo
ponto. Na segunda declaração, é declarada a variável Joao do tipo funcionário.
Exemplo de uso
Para uma variável do tipo ponto, dizemos que x e y são seus campos ou membros. Os campos de uma variável podem ser acessados individualmente como variáveis usando-se o nome da variável seguido de "." e o nome do campo. Exemplos:
p1.x = 10;p1.y = 20;p2.x = p1.x + 5;p2.y = p2.y + 5;
Além disso, é possível 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;
}
Declaração com valores iniciais
Ao declararmos uma estrutura, podemos também definir o seu valor
inicial, de forma análoga a aquela utilizada para vetores. Exemplos:
struct ponto origem = {0,0};
...
struct ponto trapezio[] = { { 5,5}, {5, 10}, {10,5}, {10,13} };
...
Exemplo de programa usando estruturas
#include <conio.h>#include <stdio.h>
// uma estrutura Pessoastruct Pessoa{ char *nome; int idade;};
int main() { // declara uma variável do tipo struct struct Pessoa cliente; cliente.nome = "Osmar J. Silva“; cliente.idade = 36;
// obtém os dados printf("O nome do cliente e: %s\n", cliente.nome); printf("A idade do cliente e: %d\n", cliente.idade);
return 0;
}
Estruturas rotuladas e nomeadas
É possível criar um tipo baseado em uma estrutura Para isso utiliza-se typedef na declaração
struct tipo_data{
int dia, mes, ano;
};
typedef struct tipo_data DATA;
Para criar uma estrutura rotulada e nomeada pode-se usar
typedef struct tipo_data{
int dia, mes, ano;
} DATA;
ATENÇÃO:
DATA é o nome to tipo
Agora pode ser declarada uma variável dessa forma
DATA d;
Não existe mais a necessidade de
struct tipo_data d;
ATENÇÃO:
DATA é o nome to tipo
Agora pode ser declarada uma variável dessa forma
DATA d;
Não existe mais a necessidade de
struct tipo_data d;
Forma mais comum de declarar
Usando ponteiros com structs
struct data{ int dia; int mês; int ano;};
Definindo uma variável do tipo datastruct data dt;
Definindo um ponteiro para dtstruct data *pdt=&dt;
Fazendo referência a um elemento da estruturadt.dia ou (*pdt).dia ou pdt->diadt.mes ou (*pdt).mes ou pdt->mêsdt.ano ou (*pdt).ano ou pdt->ano
Uso de estruturas com funções
Uma vez que o tipo de uma estrutura foi declarado, é possível utilizá-lo em outras declarações (variáveis simples, vetores, funções, 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 referência
Uma estrutura pode ser passada como parâmetro por referência numa função. Quando se usa uma referência (apontador), o acesso aos campos da mesma é feito através do operador "->" ao invés 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);}
Observe o uso de -> ao invés de .
Retornando uma estrutura
Uma função 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);
Alocação dinâmica de estruturas
É preciso armazenar esse endereço
retornado pela malloc num ponteiro
de tipo apropriado
Para alocar um tipo de dado que
ocupa vários 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;
}
Union
Uma union determina uma única localização de memória onde podem estar armazenadas várias variáveis diferentes.
A declaração de uma união é semelhante à declaração de uma estrutura:
union nome_do_tipo_da_union{ tipo_1 nome_1; tipo_2 nome_2; ... tipo_n nome_n; } variáveis_union;
Union
Exemplo
union angulo {
float graus;
float radianos;
};
As variaveis graus e radianos que, apesar de terem nomes diferentes, ocupam o mesmo local da memória.
Isto quer dizer que só gastamos o espaço equivalente a um único float.
#include <stdio.h> #define GRAUS 'G' #define RAD 'R' union angulo { int graus; float radianos; }; void main() { union angulo ang; char op; printf("\nNumeros em graus ou radianos? "); scanf("%c",&op);
if (op == GRAUS) { ang.graus = 180; printf("\nAngulo: %d\n",ang.graus);
} else if (op == RAD) { ang.radianos = 3.1415; printf("\nAngulo: %f\n",ang.radianos);
} else printf("\nEntrada invalida!!\n");
}
Exemplo de uso de union
#include <stdio.h> union numero { char Ch; int I; float F; };
main (void) { union numero N; N.graus = 123; printf ("%f",N.F);
return 0;
}
O programa acima é muito perigoso pois você está lendo uma região da memória, que foi "gravada" como um inteiro, como se fosse um ponto flutuante.
Tome cuidado! O resultado pode não fazer sentido.
CUIDADO!!!!!
Enumerações
Numa enumeração podemos dizer ao compilador quais os valores que uma determinada variável pode assumir. Sua forma geral é:
enum nome_do_tipo_da_enumeração {lista_de_valores} lista_de_variáveis;
Vamos considerar o seguinte exemplo:
enum dias_da_semana {segunda, terca, quarta, quinta, sexta,sabado, domingo};
O programador diz ao compilador que qualquer variável do tipo dias_da_semana só pode ter os valores enumerados
#include <stdio.h> enum dias_da_semana {segunda, terca, quarta, quinta, sexta, sabado, domingo};
main (void) {
enum dias_da_semana d1,d2;
d1=segunda; d2=sexta;
if (d1==d2) { printf ("O dia e o mesmo.");
} else {
printf ("São dias diferentes."); }
return 0;
}
O compilador pega a lista de valores e associa, a cada um, um número inteiro.
Então, ao primeiro da lista, é associado o número zero, o segundo ao número 1 e assim por diante. As variáveis declaradas são então variáveis int.
Enumerações
Top Related