27
1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE SISTEMA

1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

Embed Size (px)

Citation preview

Page 1: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

1

Linguagem C

Linguagem de Programação VI

Tipos de Dados Compostos - structs

Joseane Alves Freire2º Semestre 2009

CST EM ANÁLISE E DESENVOLVIMENTO DE SISTEMA

Page 2: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

2

Sumário

• Estruturas

• Enumerações

• Typedef

Page 3: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

3

Resumo dos tipos de dados

Page 4: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

4

Tipos de dados compostos

• Além dos tipos de dados já discutidos anteriormente, o programador pode criar tipos personalizados.

• Permitem organizar os dados e dão mais versatilidade ao programa.

• São chamados genericamente de “estruturas” ou, em alguns casos, de “registros”.

• Em C o usuário definir dados de cinco formas diferentes:– Estrutura;– Campo de bit;– União;– Enumeração;– Typedef.

Page 5: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

5

Estruturas

– Uma estrutura, serve para agrupar um conjunto de

dados não similares, mas que são associados a um

mesmo tipo de informação, de modo a criar um

novo tipo.– A definição de uma estrutura, serve de modelo ou pré

definição para se criar variáveis daquele tipo de estrutura.

– Cada variável de uma estrutura é chamada membro da estrutura.

Page 6: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

6

Estruturas

– Forma geral:struct tipo_da_estrutura

{

tipo_1 nome_1;

tipo_2 nome_2;

......

tipo_n nome_n;

} variáveis_deste_tipo_de_estrutura;

Opcional

Page 7: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

7

Estruturas - exemplos– Definição de tipo de dados + declaração de variável (variáveis) em

instruções diferentesstruct CLIENTE{

char nome[40];char morada[60];long telefone;

};struct CLIENTE x;

– Definição de tipo de dados + declaração de variável (variáveis) na mesma instrução

struct CLIENTE{

char nome[40];char morada[60];long telefone;

} x;

Page 8: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

8

Estruturas - exemplos

• Exemplo:struct est{

int i;float f;

} a, b;• Ou então:struct est{

int i;float f;

};struct est a,b;

• Exemplo estrutura tipo de endereço:

struct tipo_endereco{

char rua[50];int numero;char bairro[20];char cidade[30];char sigla_estado[3];long int CEP;

};struct tipo_endereco enderecos;

Page 9: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

9

Estruturas - exemplos

• Exemplo de um estrutura de dados pessoais:struct ficha_pessoal

{char nome[50];

long int telefone;

struct tipo_endereço endereco;

} ;

struct ficha_pessoal ficha;

• Note que neste caso declaramos uma estrutura dentro de outra.

Page 10: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

10

Estruturas – Acessando os dados

• Para acessar cada membro da estrutura separadamente, é utilizado o operador de seleção “ponto” (.)

• Por exemplo:struct data{

int dia;char mes[10];int ano;

};struct data hoje;hoje.ano=2003;hoje.dia++;strcpy(hoje.mes,”Novembro”);

Page 11: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

11

Estruturas – Acessando os dados

#include <stdio.h>#include <string.h>

struct tipo_endereco{

char rua[50];int numero;char bairro[20];char cidade[30];char sigla_estado[3];long int CEP;

};struct ficha_pessoal{

char nome[50];long int telefone;struct tipo_enderecoendereco;

};

main (void)

{

struct ficha_pessoal ficha;

strcpy (ficha.nome, “Luiz Osvaldo Silva”);

ficha.telefone = 4921234;

strcpy (ficha.endereco.rua, “Rua das Flores”);

ficha.endereco.numero = 10;

strcpy (ficha.endereco.bairro, “Cidade Velha”);

strcpy (ficha.endereco.cidade, “Belo Horizonte”);

strcpy (ficha.endereco.sigla_estado, “MG”);

ficha.endereco.CEP = 31340230;

return 0;

}

Page 12: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

12

Estruturas – Atribuição• A atribuição pode ser feita campo a campo conforme exemplo anterior

ficha.telefone = 4921234;

• Mas, ao contrário dos arrays,também pode ser feita entre estruturasint main (){ struct ficha_pessoal ficha; struct ficha_pessoal ficha2; strcpy (ficha.nome, "Luiz Osvaldo Silva"); ficha.telefone = 4921234; strcpy (ficha.endereco.rua, "Rua das Flores"); ficha.endereco.numero = 10; strcpy (ficha.endereco.bairro, "Cidade Velha"); strcpy (ficha.endereco.cidade, "Belo Horizonte"); strcpy (ficha.endereco.sigla_estado, "MG"); ficha.endereco.CEP = 31340230; ficha2=ficha;}

Page 13: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

13

Estruturas - exemplo#include <stdlib.h>#include <stdio.h>

struct est1{ int i; float f;};

int main (){ struct est1 primeira, segunda; primeira.i = 10; primeira.f = 3.1415; segunda = primeira; printf ("Os valores armazenados na segunda struct sao: %d e %f ",

segunda.i, segunda.f); system ("pause"); return (0);}

Page 14: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

14

Matrizes de Estruturas

• Uma estrutura é como qualquer outro tipo em C.• Logo, podemos definir um vetor de estruturas.• Exemplo:

struct ficha_pessoal fichas[100];

– Para acessarmos a segunda letra da sigla de estado da décima terceira ficha, fazendo:

fichas[12].endereco.sigla_estado[1];

Page 15: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

15

Exercício

• Escreva um programa que crie um estrutura do tipo ponto, contendo os campos x e y.Declare dois pontos, leia a posição de cada um e apresente, como saída (na tela ) a distância entre os dois.

***Pesquisar a fórmula que retorna a distância entre dois pontos!!

Page 16: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

16

Passando uma estrutura como parâmetro de função

• Podemos passar uma estrutura inteira para uma função, assim como passamos uma variável de outro tipo.

void PreencheFicha (struct ficha_pessoal ficha)

{

.....

}

Page 17: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

17

Exemplo#include <stdlib.h>#include <stdio.h>struct VECTOR {

float x; float y;

};float produtoInterno(struct VECTOR a, struct VECTOR b);int main (){ struct VECTOR p = {5.0,10.0}; struct VECTOR q = {6.0,9.0}; float p_q; p_q = produtoInterno(p,q); printf("Poduto interno = %f",p_q); system ("pause"); return (0);}

float produtoInterno(struct VECTOR a, struct VECTOR b){ return (a.x * b.x + a.y * b.y);}

Obs.: Passagem de parâmetros é feita por cópia!!!

Page 18: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

18

Exemplostruct VECTOR{ float x; float y;};

float produtoInterno(struct VECTOR *a, struct VECTOR *b);void alteraCoordenadaX(struct VECTOR *a, float novoX);

int main (){ struct VECTOR p = {5.0,10.0}; struct VECTOR q = {6.0,9.0}; float p_q; p_q = produtoInterno(&p,&q); printf("Poduto interno = %f\n",p_q); printf("Vector X antes: (%.2f, %.2f)\n", p.x, p.y); alteraCoordenadaX(&p, 6.0); printf("Vector X depois: (%.2f, %.2f)\n", p.x, p.y); system ("pause"); return (0);}

float produtoInterno(struct VECTOR *a, struct VECTOR *b){ return (a->x * b->x + a->y * b->y);}

void alteraCoordenadaX(struct VECTOR *a, float novoX){ a->x = novoX;}

Passagem por referência !!!

Page 19: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

19

Comparação entre vetor e estruturas

• ESTRUTURAS: – RECEBE CÓPIAS DE 2 ESTRUTURAS

float produtoInterno(VECTOR a, VECTOR b);

– RECEBE CÓPIAS DE 2 ENDEREÇOS PARA ESTRUTURASfloat produtoInterno(VECTOR *a, VECTOR *b);

• ARRAYS:– RECEBE CÓPIAS DE 2 ENDEREÇOS DE ARRAYS

float produtoInterno(float a[], float b[]);

– RECEBE CÓPIAS DE 2 ENDEREÇOS DE ARRAYSfloat produtoInterno(float *a, float *b);

Page 20: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

20

Retorno de uma estrutura

• O retorno ou saída duma estrutura :– alternativa 1: retorna-se o nome da estrutura,

o que implica a cópia da estrutura local da função para uma estrutura local da função invocadora (p.ex. main).

– alternativa 2: retorna-se o endereço da estrutura local à função para uma variável apontadora que é local à função invocadora (p.ex. main). (Veremos mais tarde).

Page 21: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

21

Retorno de uma estrutura#include <stdlib.h>#include <stdio.h>

struct VECTOR{ float x; float y;};

struct VECTOR soma(struct VECTOR, struct VECTOR);

int main(){ struct VECTOR p = {5.0,10.0};VECTOR q = {6.0,9.0}; struct VECTOR s; s = soma(p,q); printf("Vector soma = {%f,%f}",s.x, s.y); system ("pause"); return (0);}

struct VECTOR soma(struct VECTOR a, struct VECTOR b){ VECTOR vs; vs.x = a.x + b.x; vs.y = a.y + b.y; return vs;}

É retornada uma CÓPIA dos dados de vs para s.

Page 22: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

22

Enumerações

• Numa enumeração podemos dizer ao compilador, quais os valores uma variável pode assumir.

• Forma geral:enum nome_do_tipo_da_enum {lista_valores};

• Exemplo:enum dias_da_semana {segunda, terca, quarta,quinta, sexta, sabado, domingo};

Page 23: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

23

Enumerações#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 é o mesmo\n"); } else { printf ("Sao dias diferentes !\n"); } system ("pause"); return (0);}

Page 24: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

24

Enumerações

• O compilador pega a lista de valores a associa cada um, a um valor inteiro, iniciando por 0.

• Assim, no exemplo, segunda recebe 0, terca recebe 1, e assim sucessivamente.

• As variáveis declaradas são do tipo int.

Page 25: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

25

Comando typedef

• Permite ao programador que defina um novo nome a um determinado tipo.

• Forma geral:typedef antigo_nome novo_nome;

• Exemplo:– typedef int inteiro;

Page 26: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

26

Comando typedef#include <stdio.h>typedef struct tipo_endereco{ char rua[50]; int numero; char bairro[20]; char cidade[30]; char sigla_estado[3]; long int CEP;} TEndereco;

typedef struct ficha_pessoal{ char nome[50]; long int telefone; TEndereco endereco;} TFicha;

int main (void){ TFicha *ex; .... .... return (0);}**Refaça o exemplo do slide 17 usando typedef

Page 27: 1 Linguagem C Linguagem de Programação VI Tipos de Dados Compostos - structs Joseane Alves Freire 2º Semestre 2009 CST EM ANÁLISE E DESENVOLVIMENTO DE

27

Exemplo#include <stdio.h>#include <stdlib.h>#include <string.h>

typedef struct endereco { char rua[40]; int num; int complemento;}TEndereco;

TEndereco InicDados(void);

int main() { TEndereco e; e = InicDados(); printf("\n%s %d/%d", e.rua, e.num, e.complemento); system ("pause"); return (0);}

TEndereco InicDados(void) { TEndereco e; strcpy(e.rua, "Rua Ferreira Viana"); e.num = 893; e.complemento = 101; return e;}