Estruturas de dados complexas: cell arrays e structures · Miguel Pedro Silva –José Borges...

44
Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII Estruturas de dados complexas: cell arrays e structures Structures (estruturas) Criação de estruturas Alterar, acrescentar e remover campos (fields) Visualizar (apresentar) uma estrutura Estruturas como argumentos de uma função Funções pré-definidas que operam sobre estruturas Arrays de estruturas Estruturas que possuem campos que são estruturas (nested structures) Arrays de nested structures (estruturas encadeadas)

Transcript of Estruturas de dados complexas: cell arrays e structures · Miguel Pedro Silva –José Borges...

Instituto Superior Técnico,

Dep. de Engenharia Mecânica - ACCAII

Estruturas de dados complexas:

cell arrays e structures

• Structures (estruturas)

• Criação de estruturas

• Alterar, acrescentar e remover campos (fields)

• Visualizar (apresentar) uma estrutura

• Estruturas como argumentos de uma função

• Funções pré-definidas que operam sobre estruturas

• Arrays de estruturas

• Estruturas que possuem campos que são estruturas (nested structures)

• Arrays de nested structures (estruturas encadeadas)

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas (structures)

2

• Os diferentes tipos de dados em MATLAB:MATLAB Data Types

double precision

(real and complex)

single precision

(real and complex)integer and unsigned

integer data types

logical data character strings

cell arrays structures objects

double single logical char

cell structureuser

classes

int8, unit8

int16, uint16

int32, unit32

int64, unint64

function

handles

function handles

int8, uint8

int16, uint16

int32, uint32

int64, uint64

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas (structures)

3

• Definição de uma estrutura (structure):

• Uma estrutura agrupa dados que estão logicamente

relacionados , denominados campos da estrutura.

• Uma das vantagens das estruturas é que os campos

possuem identificadores, o que torna mais claro que tipo

de informação contêm.

• Contudo, as estrutura não são arrays, logo a indexação

numérica não é possível.

• É comum existir em outras linguagens de programação.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de uma estrutura

4

• Uma estrutura é um tipo de dados complexo (oucomposto).

student

123 Main Street

John Doe

71211

LA

Anytown

name

addr1

city

state

zip

Identificador da estrutura

Identificadores do(s) campo(s)

“valor” atribuído ao campo

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de uma estrutura

5

• O construtor de uma estrutura é a função struct .

• A utilização da função struct pré-aloca espaço em memória

• Exemplo:

>> estrutura_1 = struct(‘campo1’,val1,‘campo2’,val2,...)

• Pré-alocação:

>> student = struct(‘name’,[],‘addr1’,[],...

‘city’,[],‘state’,[],‘zip’,[])

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de uma estrutura

6

• O construtor de uma estrutura é a função struct .

• Pré-alocação:

>> student = struct('name',[],'addr1',[],...

'city',[],'state',[],'zip',[])

student =

name: []

addr1: []

city: []

state: []

zip: []

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de uma estrutura

7

• O construtor de uma estrutura é a função struct .

• Pré-alocação com inicialização na construção:

>> student = struct('name','John Doe','addr1',...

'123 Main Street','city','Anytown','state','LA','zip','71211')

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'Anytown'

state: 'LA'

zip: '71211'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de uma estrutura

8

• Utilização do operador . (ponto) para construir uma

estrutura:

• Menos eficiente que a pré-alocação.

>> student.name = 'John Doe';

>> student.addr1 = '123 Main Street';

>> student.city = 'Anytown';

>> student.state = 'LA';

>> student.zip = '71211‘;

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'Anytown'

state: 'LA'

zip: '71211'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Adicionar campos a uma estrutura

9

• Exemplo:

>> student.erasmus=logical(1)

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'Anytown'

state: 'LA'

zip: '71211'

erasmus: 1

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Alterar o valor dos campos de uma estrutura

10

• Utilização do operador . (ponto) alterar (ou aceder) os

campos de uma estrutura:

>> student.city='My Town'

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'My Town'

state: 'LA'

zip: '71211'

erasmus: 1

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Apresentar uma estrutura

11

• Exemplo (função disp):

• Toda a estrutura é apresentada:

>> disp(student)

name: 'John Doe'

addr1: '123 Main Street'

city: 'My Town'

state: 'LA'

zip: '71211'

erasmus: 1

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Apresentar uma estrutura

12

• Exemplo (função fprintf):

• Apenas os campos podem ser apresentados:

>> fprintf('\n%s é aluno de Erasmus?: %d\n', ...

student.name,student.erasmus)

John Doe é aluno de Erasmus?: 1

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Remover campos de uma estrutura

13

• Exemplo (função rmfield):

• Retorna uma nova estrutura com o campo removido, mas não

altera a estrutura original. Para tal, é necessário fazer uma

atribuição à mesma estrutura:

>> rmfield(student,'erasmus')

ans =

name: 'John Doe'

addr1: '123 Main Street'

city: 'My Town'

state: 'LA'

zip: '71211'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Remover campos de uma estrutura

14

• Exemplo (função rmfield) [continuação]:

>> student

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'My Town'

state: 'LA'

zip: '71211'

erasmus: 1

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Remover campos de uma estrutura

15

• Exemplo (função rmfield) [continuação]:

>> student = rmfield(student,'erasmus')

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'My Town'

state: 'LA'

zip: '71211'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas como argumentos de uma função

16

• Uma estrutura pode ser um argumento de uma função ou

apenas alguns dos seus campos.

• Exemplo 1:

>> student.grades =[15 17]

student =

name: 'John Doe'

addr1: '123 Main Street'

city: 'My Town'

state: 'LA'

zip: '71211'

grades: [15 17]

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas como argumentos de uma função

17

• Exemplo 1(continuação):

>> nota = calculaMedia(student)

nota =

16

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas como argumentos de uma função

18

• Exemplo 2:

>> nota = calculaMedia_2(student.grades(1),student.grades(2))

nota =

16

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas como argumentos de uma função

19

• Exemplo 3:

>> aFrase = constroiFrase(student.name,student.city)

aFrase =

John Doe is from My Town

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Funções pré-definidas que operam sobre estruturas

20

• Existem um conjunto de funções pré-definidas, no

MATLAB, que podem ser utilizadas em estruturas:

Função Descrição

isstruct Retorna o valor lógico true se o argumento for uma variável do tipo estrutura.

isfield Retorna o valor lógico true se o 1º argumento (uma estrura), possuir um campo com o mesmo identificador que o 2º argumento (‘nome_campo’).

fieldnames Retorna um cell array contendo os nomes dos campos da estrutura (o argumento).

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Funções pré-definidas que operam sobre estruturas

21

• Exemplo 4:

• Escreva uma função que possui como parâmetros de entrada uma estrutura e uma string, e que retorne true se a string for um campo da estrutura, e false caso contrário. Se os parâmetros de entrada não forem os especificados, a função deve abortar com uma mensagem de erro.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Funções pré-definidas que operam sobre estruturas

22

• Exemplo 4 (cont.):

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas como argumentos de uma função

23

• Exemplo 4 (cont.): >> a=testaCampo(student,'city')

a =

1

>> a=testaCampo(a,'city')

??? Error using ==> testaCampo at 4

O 1º argumento não é uma estrutura!

>> a=testaCampo(student,a)

??? Error using ==> testaCampo at 6

O 2º arumento não é uma string!

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas como argumentos de uma função

24

• Exemplo 5: >> campos=fieldnames(student)

campos =

'name'

'addr1'

'city'

'state'

'zip'

'grades'

>> whos campos

Name Size Bytes Class Attributes

campos 6x1 414 cell

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Arrays de estruturas

25

• Em muitas aplicações, em especial as que operam com

base de dados, a informação é normalmente armazenada

num array uni-dimensional (vector) de estruturas.

• Ou seja, cada elemento do array é uma estrutura.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Arrays de estruturas

26

• Ou seja, cada elemento do array é uma estrutura.

studentstudent

.name

.addr1

.city

.state

.zip

.exams

.name.name

.addr1.addr1

.city .city

.state.state

.zip.zip

.exams.exams

'John Doe' 'Big Bird''Jane Q. Public'

'123 Sesame Street''P. O. Box 17''123 Main Street'

'Nowhere' 'New York''Anytown'

'NY''MS''LA'

'68888' '10018''71211'

[65 84 81][90 82 88][80 95 84]

student(1)student(1) student(2)student(2) student(3)student(3)

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de arrays de estruturas

27

• Criar uma estrutura e depois ir definido os vários

elementos do array:

>> student = struct('name','John Doe','addr1',...

'123 Main Street','city','Anytown','state','LA','zip','71211', ...

'exams', [80 95 84]);

>> student(2) = struct('name','Jane Q. Public','addr1',...

'P. O. Box 17','city','Nowhere','state','MS','zip','68888', ...

'exams', [90 82 88]);

>> student(3) = struct('name','Big Bird','addr1',...

'123 Sesame Street','city','New York','state','NY','zip','10018', ...

'exams', [65 84 81]);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de arrays de estruturas

28

• Criar uma estrutura e depois ir definido os vários

elementos do array: studentstudent

.name

.addr1

.city

.state

.zip

.exams

.name.name

.addr1.addr1

.city .city

.state.state

.zip.zip

.exams.exams

'John Doe' 'Big Bird''Jane Q. Public'

'123 Sesame Street''P. O. Box 17''123 Main Street'

'Nowhere' 'New York''Anytown'

'NY''MS''LA'

'68888' '10018''71211'

[65 84 81][90 82 88][80 95 84]

student(1)student(1) student(2)student(2) student(3)student(3)

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de arrays de estruturas

29

• Criar o primeiro elemento do array como sendo do tipo

estrutura, e depois ir definido os vários elementos do array:

>> student(1) = struct('name','John Doe','addr1',...

'123 Main Street','city','Anytown','state','LA','zip','71211', ...

'exams', [80 95 84]);

>> student(2) = struct('name','Jane Q. Public','addr1',...

'P. O. Box 17','city','Nowhere','state','MS','zip','68888', ...

'exams', [90 82 88]);

>> student(3) = struct('name','Big Bird','addr1',...

'123 Sesame Street','city','New York','state','NY','zip','10018', ...

'exams', [65 84 81]);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de arrays de estruturas

30

• Criar o primeiro elemento do array como sendo do tipo

estrutura, e depois ir definido os vários elementos do array:

studentstudent

.name

.addr1

.city

.state

.zip

.exams

.name.name

.addr1.addr1

.city .city

.state.state

.zip.zip

.exams.exams

'John Doe' 'Big Bird''Jane Q. Public'

'123 Sesame Street''P. O. Box 17''123 Main Street'

'Nowhere' 'New York''Anytown'

'NY''MS''LA'

'68888' '10018''71211'

[65 84 81][90 82 88][80 95 84]

student(1)student(1) student(2)student(2) student(3)student(3)

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de arrays de estruturas

31

• Como fazer a pré-alocação?

• Criar o último elemento do array como sendo do tipo estrutura!

>> student(1000) =

struct('name',[],'addr1',[],'city',[],'state',[],'zip',[], ...

'exams',[]);

>> whos student

Name Size Bytes Class Attributes

student 1x1000 26034 struct

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Criação de arrays de estruturas

32

• Como fazer a pré-alocação?

• Utilizar a função repmat para replicar o elemento!

>> student= repmat(struct('name',[],'addr1',[],'city',[],...

'state',[],'zip',[],'exams',[]), 1 , 2000);

>> whos student

Name Size Bytes Class Attributes

student 1x2000 720384 struct

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Como percorrer um arrays de estruturas

33

• Utilização da instrução FOR:

>> clear all;

>> student(1) = struct('name','John Doe','addr1',...

'123 Main Street','city','Anytown','state','LA','zip','71211', ...

'exams', [80 95 84]);

>> student(2) = struct('name','Jane Q. Public','addr1',...

'P. O. Box 17','city','Nowhere','state','MS','zip','68888', ...

'exams', [90 82 88]);

>> student(3) = struct('name','Big Bird','addr1',...

'123 Sesame Street','city','New York','state','NY','zip','10018', ...

'exams', [65 84 81]);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Como percorrer um arrays de estruturas

34

• Utilização da instrução FOR:

for k=1:length(student)

fprintf('\nNome: %s',student(k).name);

end

fprintf('\n');

Nome: John Doe

Nome: Jane Q. Public

Nome: Big Bird

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Como percorrer um arrays de estruturas

35

• Utilização da vectorização existente no MATLAB:

• Mais eficiente!

fprintf('\nNome: %s',student.name);

fpinttf('\n');

Nome: John Doe

Nome: Jane Q. Public

Nome: Big Bird

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Como manipular os dados contidos num array de estruturas

36

• EXEMPLO: Calcular média de todos os exames, de todos os

estudantes.

lista_exames = [];

for k = 1:length(student)

lista_exames = [lista_exames, student(k).exams];

end

media_total=mean(lista_exames);

disp(media_total);

83.2222

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas encadeadas (nested)

37

• Uma estrutura pode conter um mais campos, em que

também eles são estruturas.

• Nesse caso, temos estruturas encadeadas.

• Exemplo :

>> student(1).class(1).name = ‘Analise I’;

>> student(1).class(2).name = ‘Fisica I’;

>> student(1).class(1).instructor = ‘Mr. Jones’;

>> student(1).class(2).instructor = ‘Mr. Smith’;

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas encadeadas (nested)

38

• Exemplo (cont.):

>> student(1)

ans =

name: 'John Doe'

addr1: '123 Main Street'

city: 'Anytown'

state: 'LA'

zip: '71211'

exams: [80 95 84]

class: [1x2 struct]

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas encadeadas (nested)

39

• Exemplo (cont.):

>> student(1).class

ans =

1x2 struct array with fields:

name

instructor

>> student(1).class(1)

ans =

name: 'Analise I'

instructor: 'Mr. Jones'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas encadeadas (nested)

40

• Exemplo (cont.):

>> student(1).class(2)

ans =

name: 'Fisica I'

instructor: 'Mr. Smith‘

>> student(1).class(2).name

ans =

Fisica I

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas encadeadas (nested)

41

• Exemplo (cont.):

>> student(1).class(2)

ans =

name: 'Fisica I'

instructor: 'Mr. Smith‘

>> student(1).class(2).name

ans =

Fisica I

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Arrays de estruturas encadeadas

42

• Operam exactamente do mesmo modo que arrays de

estruturas.

• Notar que o array student é uma array constituído

por estruturas encadeadas!

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Arrays de estruturas encadeadas

43

• Notar que o array student é uma array constituído

por estruturas encadeadas!

>> student(1)

ans =

name: 'John Doe'

addr1: '123 Main Street'

city: 'Anytown'

state: 'LA'

zip: '71211'

exams: [80 95 84]

class: [1x2 struct]

>> student(2)

ans =

name: 'Jane Q. Public'

addr1: 'P. O. Box 17'

city: 'Nowhere'

state: 'MS'

zip: '68888'

exams: [90 82 88]

class: []

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Referências

44

• Capítulo 7 de Stormy Attaway (2009), “Matlab: A Practical Introduction to Programming and Problem Solving”, Elsevier.

• Getting started with MATLAB: http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/getstart.pdf