Вы находитесь на странице: 1из 21

Programao

5374 : Engenharia Informtica


6638 : Tecnologias e Sistemas de Informao
9099 : Bioengenharia
10135 : Cincias Biomdicas

Cap. 10 Estruturas (Structs)


Module Introduction
5375, 6619, 9099, 10135
Structs

Programao

Sumrio:

5375, 6619, 9099, 10135
Structs

Programao

Taxonomia de tipos de dados


Tipos de Dados

void Tipos Simples Tipos Compostos

Tipos Tipos Tipos


Numricos Apontadores Enumerados

* enum

array struct FILE


char int float double 3

5375, 6619, 9099, 10135
Structs

Programao

Caractersticas dos tipos de dados compostos


?
5375, 6619, 9099, 10135
Structs

Programao

Structs: motivao

Exemplo:

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

5375, 6619, 9099, 10135
Structs

Programao

Struct: definio

x.nome
inicializao semelhante aos
arrays
x.morada x
x.telefone

6

5375, 6619, 9099, 10135
Structs

Programao

Struct: diagrama de sintaxe


struct nome { tipo elemento1 } ;

tipo elemento2

tipo elementon

7

5375, 6619, 9099, 10135
Structs

Programao

Declarao de variveis estruturadas


Definio de tipo de dados + Definio de tipo de dados c/


declarao de varivel
typedef + declarao de varivel

struct CLIENTE typedef struct


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

struct CLIENTE x; CLIENTE x;


5375, 6619, 9099, 10135
Structs

Programao

Inicializao de variveis estruturadas



5375, 6619, 9099, 10135
Structs

Programao

Structs: caractersticas especficas


Acesso para Acesso para


escrita leitura
5375, 6619, 9099, 10135
struct CLIENTE Structs

Programao
{
char *nome;
char *morada;
Operadores de acesso
long telefone;
};

Operador .
Operador

struct CLIENTE x; struct CLIENTE *x;

x.nome = Joaquim Mira; xnome = Joaquim Mira;


x.morada = R. Ag.Cima, 2, xmorada = R. Ag.Cima, 2,
2456-001 gueda; 2456-001 gueda;
x.telefone = 239675413; xtelefone = 239675413;

struct CLIENTE *x;

(*x).nome = Joaquim Mira;


(*x).morada = R. Ag.Cima, 2,
2456-001 gueda;
(*x).telefone = 239675413;
11

5375, 6619, 9099, 10135
struct CLIENTE Structs

Programao
{
char *nome;
char *morada;
Operadores de atribuio
long telefone;
};

struct CLIENTE x, y;

// a atribuio pode ser feita membro a membro

x.nome = Joaquim Mira;


x.morada = R. Ag.Cima, 2,
2456-001 gueda;
x.telefone = 239675413;

// mas, ao contrrio dos arrays,


// tambm pode ser feita entre estruturas

y = x;
5375, 6619, 9099, 10135
Structs

Programao

#include<stdio.h>
Exemplo
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);
OUTPUT:
printf("Tel.: %d\n", y.telefone);
}
(ecr)

Nome: Joaquim Mira
Morada: R. Ag.Cima, 2, 2456-001 Agueda
Tel.: 239675413

5375, 6619, 9099, 10135
Structs

Programao

Estruturas como parmetros de funes


O mtodo escolhido determina que operador (. ou ) deve ser usado


no corpo da funo para aceder aos membros da estrutura:

" Passagem por cpia de valor da estrutura

" Passagem por cpia de valor de endereo da estrutura



5375, 6619, 9099, 10135
Structs

Programao

Exemplo: passagem por cpia de valor da estrutura



#include <stdio.h>
typedef struct {
float x;
float y;
} VECTOR;
main
float produtoInterno(VECTOR, VECTOR); p_q p q

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

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);
}
5375, 6619, 9099, 10135
Structs

Programao

Exemplo: passagem por cpia de valor de endereo da estrutura



#include <stdio.h>
typedef struct {
float x;
float y;
} VECTOR;
main
float produtoInterno(VECTOR*, VECTOR*); p_q &p &q

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

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);
}
5375, 6619, 9099, 10135
Structs

Programao

Comparao entre passagem de arrays e passagem de
estruturas para funes

Passagem de estruturas

" alternativa 1: passa-se o nome da estrutura, o que implica a cpia do contedo da
estrutura para uma estrutura local da funo.

" alternativa 2: passa-se o endereo da estrutura para uma varivel apontadora que
local funo.

Passagem de arrays:

" alternativa 1: no existe!!! No possvel copiar ou passar o contedo
dum array para um array local duma funo. De facto, ao passar o nome do
array, no feita a cpia do contedo do array, mas sim a cpia do endereo do
array.

" alternativa 2: passa-se o endereo do array (i.e. do primeiro elemento), mas como
o compilador interpreta o nome do array como apontador para si prprio, basta
escrever o nome do array (sem ndice).

5375, 6619, 9099, 10135
Structs

Programao

Exemplo: passagem de estruturas e passagem de arrays
para funes

ESTRUTURAS:

Exemplo: passagem de estruturas e passagem de arrays

// RECEBE CPIAS DE 2 ESTRUTURAS
float produtoInterno(VECTOR a, VECTOR b);

// RECEBE CPIAS DE 2 ENDEREOS PARA ESTRUTURAS


float produtoInterno(VECTOR *a, VECTOR *b);

ARRAYS:

// RECEBE CPIAS DE 2 ENDEREOS DE ARRAYS


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

// RECEBE CPIAS DE 2 ENDEREOS DE ARRAYS


float produtoInterno(float *a, float *b);

18

5375, 6619, 9099, 10135
Structs

Programao

Exemplo: passagem por cpia de valor de endereo de
array

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

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

p_q = produtoInterno(p,q); a
float b
printf(Produto interno = %f,p_q); produtoInterno
}

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


{
return (a[0] * b[0] + a[1] * b[1]);
}
19

5375, 6619, 9099, 10135
Structs

Programao

Exemplo equivalente: passagem por cpia de valor de
endereo de array

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

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

p_q = produtoInterno(p,q); a
float b
printf(Produto interno = %f,p_q); produtoInterno
}

float produtoInterno(float *a, float *b)


{
return (a[0] * b[0] + a[1] * b[1]);
}
20

5375, 6619, 9099, 10135
Structs

Programao

Retorno de estrutura a partir de funo: exemplo



#include <stdio.h>
typedef struct {
float x;
float y;
} VECTOR;
VECTOR soma(VECTOR, VECTOR); main
s p q
main(){
VECTOR p = {5.0,10.0}; VECTOR q = {6.0,9.0};
VECTOR s; vs a b
s = soma(p,q); soma
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;
} 21

FIM

Вам также может понравиться