linguagem de programação i a carlos oberdan rolim ciência da computação sistemas de...

24
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

Upload: internet

Post on 18-Apr-2015

113 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

Linguagem de programação I A

Carlos Oberdan Rolim

Ciência da ComputaçãoSistemas de Informação

Page 2: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

Estrutura de Dados Compostos

(Structs) e Unions

Page 3: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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

Page 4: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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

Page 5: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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

Page 6: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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.

Page 7: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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;

Page 8: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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;

}

Page 9: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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} };

...

Page 10: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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;

}

Page 11: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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

Page 12: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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

Page 13: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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);}

Page 14: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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 .

Page 15: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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);

Page 16: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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;

Page 17: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

#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;

}

Page 18: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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;

Page 19: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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.

Page 20: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

#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

Page 21: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

#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!!!!!

Page 22: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

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

Page 23: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

#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.

Page 24: Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

Enumerações