21
Structs Programação 13205: Engenharia Informática 13901: Matemática e Aplicações Cap. 11 — Estruturas (Structs)

Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Programação13205: Engenharia Informática13901: Matemática e Aplicações

Cap. 11 — Estruturas (Structs)

Page 2: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Sumário:

• Revisitação à taxonomia de tipos de dados

• Características gerais de tipos de dados compostos

• Estruturas: motivação ou a razão de ser

• Definição de estrutura (struct)

• Declaração de estruturas

• Diagrama de sintaxe de estruturas

• Inicialização de estruturas

• Características específicas de estruturas

• Operadores de acesso a estruturas

• Operador de atribuição de estruturas

• Passagem de estruturas para funções

• Comparação entre a passagem de alinhamentos e passagem de estruturas para funções

• Retorno de estruturas a partir de funções

Page 3: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Taxonomia de tipos de dados

3

Tipos de Dados

void Tipos Compostos

Tipos Apontadores

char doublefloatint

enum

Tipos Enumerados

*

Tipos Numéricos

Tipos Simples

structarray FILE

Page 4: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Características dos tipos de dados compostos

- Definição pelo utilizador

Não pertencem ao léxico da linguagem

Requerem a utilização dum mecanismo sintáctico ou duma palavra reservada ([ ], struct, FILE, ...)

- Composição

Têm valores compostos

Exemplo (clientes dum empresa):

CLIENTE x = {“Josefa Boavida”, “Rua do Vau, nº 2, 3500-089 Viseu”, 232456719};

CLIENTE y = {“Rui Silva”, “Rua da Pescada, nº 5, 1100-115 Lisboa”, 213445232};

- Não têm ordem

Um conjunto não tem ordem ou escala

Exemplo (inteiros): x < y?

Page 5: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Structs: motivação

Quando há necessidade de guardar informação de vários tipos numa só entidade (ou struct).

Exemplo: No dia-a-dia das empresas e organizações há necessidade de introduzir, alterar, eliminar e consultar dados em formulários (p.ex.: segurança social, banca, finança, bolsa, arquivo de identificação, etc). Em geral, há três dados comuns a todos estes sistemas de organização de informação:

; nome; morada; telefone

Em C (novo tipo de dados: CLIENTE):

Exemplo:typedef struct{

char *nome;char *morada;long telefone;

} CLIENTE;

Page 6: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Struct: definição

- DefiniçãoÉ uma colecção ou conjunto de elementos (ou variáveis) numa zona contígua de memória.

Ao contrário dos arrays, os elementos não são necessariamente do mesmo tipo.

Ao contrário dos arrays, os elementos não são indexados.

Os elementos são variáveis usuais identificadas por nome.

Os elementos são também designados por campos, membros ou componentes.

Exemplo (declaração dum cliente c/ inicialização):

CLIENTE x = {“Josefa Boavida”, “Rua do Vau, nº 2, 3500-089 Viseu”, 232456719};

6

inicialização semelhante aos arrays

x.nomex.moradax.telefone

x

Page 7: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Struct: diagrama de sintaxe

- Diagrama de sintaxe

7

nome { elemento1tipostruct

tipo

tipo

elemento2

elementon

} ;

Page 8: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Declaração de variáveis estruturadas

☞ Definição de tipo de dados + declaração de variável

struct CLIENTE{

char *nome;char *morada;long telefone;

};

struct CLIENTE x;

☞ Definição de tipo de dados c/ typedef + declaração de variável

typedef struct{

char *nome;char *morada;long telefone;

} CLIENTE;

CLIENTE x;

Page 9: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Inicialização de variáveis estruturadas

- É feita da mesma forma que a dos arrays.

- Exemplo (declaração dum cliente c/ inicialização):

CLIENTE x = {“Josefa Boavida”, “Rua do Vau, nº 2, 3500-089 Viseu”, 232456719};

Page 10: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Structs: características específicas

- ContiguidadeOcupa uma zona contígua de memória

- Não são homogeneamente tipadasAs componentes podem ter tipos diferentes de dados

Exemplo (clientes):

CLIENTE x = {“Josefa Boavida”, “Rua do Vau, nº 2, 3500-089 Viseu”, 232456719};

CLIENTE w;

- Acesso por identificadorCada componente tem um identificador

Exemplo (inteiros):

w.nome = “Carlos Ribeiro”;w.telefone = x.telefone;

Acesso para escrita

Acesso para leitura

Page 11: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Operadores de acesso

11

Operador . Operador ®

struct CLIENTE x;

x.nome = “Joaquim Mira”;x.morada = “R. Ag.Cima, 2,

2456-001 Águeda”;x.telefone = 239675413;

struct CLIENTE *x;

x®nome = “Joaquim Mira”;x®morada = “R. Ag.Cima, 2,

2456-001 Águeda”;x®telefone = 239675413;

struct CLIENTE *x;

(*x).nome = “Joaquim Mira”;(*x).morada = “R. Ag.Cima, 2,

2456-001 Águeda”;(*x).telefone = 239675413;

struct CLIENTE{

char *nome;char *morada;long telefone;

};

Page 12: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Operadores de atribuição

struct CLIENTE{

char *nome;char *morada;long telefone;

};

struct CLIENTE x, y;

// a atribuição pode ser feita membro a membro

x.nome = “Joaquim Mira”;x.morada = “R. Ag.Cima, 2,

2456-001 Águeda”;x.telefone = 239675413;

// mas, ao contrário dos arrays, // também pode ser feita entre estruturas

y = x;

Page 13: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Exemplo #include<stdio.h>main(){

struct CLIENTE {char *nome;char *morada;long telefone;

};

struct CLIENTE x, y;

x.nome = "Joaquim Mira";x.morada = "R. Ag.Cima, 2, 2456-001 Agueda";x.telefone = 239675413;

y=x;

printf("Nome: %s\n",y.nome);printf("Morada: %s\n",y.morada);printf("Tel.: %d\n", y.telefone);

}

Nome: Joaquim MiraMorada: R. Ag.Cima, 2, 2456-001 AguedaTel.: 239675413

OUTPUT:(ecrã)

Page 14: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Estruturas como parâmetros de funções

O método escolhido determina que operador (. ou ®) deve ser usado no corpo da função para aceder aos membros da estrutura:

Passagem por cópia de valor da estrutura

Passagem por cópia de valor de endereço da estrutura

Page 15: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Exemplo: passagem por cópia de valor da estrutura

#include <stdio.h>typedef struct {

float x;float y;

} VECTOR;

float produtoInterno(VECTOR, VECTOR);

int main(){VECTOR p = {5.0,10.0};VECTOR q = {6.0,9.0};float p_q;

p_q = produtoInterno(p,q);

printf(“Poduto interno = %f”,p_q);}

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

}

main

produtoInternoa bfloat

p_q p q

Page 16: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Exemplo: passagem por cópia de valor de endereço da estrutura

#include <stdio.h>typedef struct {

float x;float y;

} VECTOR;

float produtoInterno(VECTOR*, VECTOR*);

int main(){VECTOR p = {5.0,10.0};VECTOR q = {6.0,9.0};float p_q;

p_q = produtoInterno(&p,&q);

printf(“Poduto interno = %f”,p_q);}

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

}

main

produtoInternoa bfloat

p_q &p &q

Page 17: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Comparação entre passagem de arrays e passagem de estruturas para funções

Passagem de estruturasalternativa 1: passa-se o nome da estrutura, o que implica a cópia do conteúdo da estrutura para uma estrutura local da função.alternativa 2: passa-se o endereço da estrutura para uma variável apontadora que é local à função.

Passagem de arrays:alternativa 1: não existe!!! Não é possível copiar ou passar o conteúdo dum array para um array local duma função. De facto, ao passar o nome do array, não é feita a cópia do conteúdo do array, mas sim a cópia do endereço do array.alternativa 2: passa-se o endereço do array (i.e. do primeiro elemento), mas como o compilador interpreta o nome do array como apontador para si próprio, basta escrever o nome do array (sem índice).

Page 18: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

Exemplo: passagem de estruturas e passagem de arrays

18

ESTRUTURAS:

// RECEBE CÓPIAS DE 2 ESTRUTURASfloat 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 ARRAYSfloat produtoInterno(float a[], float b[]);

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

Exemplo: passagem de estruturas e passagem de arrays para funções

Page 19: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

19

Exemplo: passagem por cópia de valor de endereço de array

#include <stdio.h>float produtoInterno(float a[], float b[]);

main(){float p[2] = {5.0,10.0};float q[2] = {6.0,9.0};float p_q;

p_q = produtoInterno(p,q);

printf(“Produto interno = %f”,p_q);}

float produtoInterno(float a[], float b[]){return (a[0] * b[0] + a[1] * b[1]);

}

main

produtoInternoa bfloat

p_q p q

Page 20: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

20

Exemplo equivalente: passagem por cópia de valor de endereço de array

#include <stdio.h>float produtoInterno(float*, float*);

void main(){float p[2] = {5.0,10.0};float q[2] = {6.0,9.0};float p_q;

p_q = produtoInterno(p,q);

printf(“Produto interno = %f”,p_q);}

float produtoInterno(float *a, float *b){return (a[0] * b[0] + a[1] * b[1]);

}

main

produtoInternoa bfloat

p_q p q

Page 21: Cap. 11 —Estruturas (Structs) Structsagomes/programacao/teoricas/11-structs.pdf · Exemplo(declaração dum cliente c/ inicialização): CLIENTE x = {“Josefa Boavida”,“Rua

Structs

21

Retorno de estrutura a partir de função: exemplo

main

somaa bvs

s p q

#include <stdio.h>typedef struct {

float x;float y;

} VECTOR;VECTOR soma(VECTOR, VECTOR);

void main(){VECTOR p = {5.0,10.0}; VECTOR q = {6.0,9.0};VECTOR s;s = soma(p,q);printf(“Vector soma = {%f,%f}”,s.x, s.y);

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

}

FIM