Upload
internet
View
103
Download
0
Embed Size (px)
Citation preview
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
2
Sumário
• Estruturas
• Enumerações
• Typedef
3
Resumo dos tipos de dados
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.
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.
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
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;
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;
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.
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”);
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;
}
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;}
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);}
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];
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!!
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)
{
.....
}
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!!!
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 !!!
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);
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).
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.
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};
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);}
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.
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;
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
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;}