Estruturas de dados complexas: cell arrays e structures · Miguel Pedro Silva –José Borges...
-
Upload
truongquynh -
Category
Documents
-
view
215 -
download
0
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