Aula Teórica 16:
Estruturas de Dados
Heterogêneas
Material Didático UnificadoUniversidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC 701 www.decom.ufop.br/bcc701 2014-1 1
Agenda
• Introdução • Struct • List • Cell• Leitura de Planilhas do Excel
Introdução
• Problema exemplo:
• Suponha que você deseje armazenar os dados (nome, matrícula, endereço, data de nascimento e coeficiente de rendimento) dos 400 alunos matriculados em BCC 701.
• Possível solução:
• Seu programa poderia armazenar um vetor para cada dado do problema.
• Porém, manipular de forma adequada os vetores, mantendo
seus dados consistentes, se torna trabalhoso. Podemos resolver problemas dessa natureza agrupando os dados relacionados em uma única variável. Isso é possível através da utilização de Variáveis Compostas Heterogêneas.
3
Introdução
• Problema exemplo:
• Suponha que você deseje armazenar os dados (nome, matrícula, endereço, data de nascimento e coeficiente de rendimento) dos 400 alunos matriculados em BCC 701.
• Possível solução:
• Seu programa poderia armazenar um vetor para cada dado do problema.
• Porém, manipular de forma adequada os vetores, mantendo
seus dados consistentes, se torna trabalhoso. Podemos resolver problemas dessa natureza agrupando os dados relacionados em uma única variável. Isso é possível através da utilização de Variáveis Compostas Heterogêneas.
4 for i = 1 : 400
nome(i) = input(“Digite o nome do aluno: ”); matricula(i) = input(“Digite a matricula do aluno: ”); endereco(i) = input(“Digite o endereço do aluno: ”); data(i) = input(“Digite a data de nascimento do aluno: ”); coef(i) = input(“Digite o coeficiente do aluno: ”); end
Introdução
• Problema exemplo:
• Suponha que você deseje armazenar os dados (nome, matrícula, endereço, data de nascimento e coeficiente de rendimento) dos 400 alunos matriculados em BCC 701.
• Possível solução:
• Seu programa poderia armazenar um vetor para cada dado do problema.
• Porém, manipular de forma adequada os vetores, mantendo
seus dados consistentes, se torna trabalhoso. Podemos resolver problemas dessa natureza agrupando os dados relacionados em uma única variável. Isso é possível através da utilização de Variáveis Compostas Heterogêneas.
5
Introdução
• Variáveis Compostas Heterogêneas (Estruturas Heterogêneas):
• São variáveis que podem armazenar um conjunto de informações de tipos diferentes (números inteiros, números reais, strings, vetores, matrizes, etc.) em uma mesma estrutura.
• Tipos que serão tratados nessa aula:
• Registro (struct)
• Lista (list)
• Célula (cell)
Struct
7Struct
• Em alguns problemas há necessidade de definirmos conjuntos onde elementos não sejam do mesmo tipo.
• No exemplo anterior armazenamos as informações dos alunos de BCC 701:
• Nome (conjunto de caracteres)
• Matrícula (número inteiro)
• Endereço (conjunto de caracteres)
• Data de nascimento (conjunto de caracteres)
• Coeficiente de rendimento (número real)
• Uma alternativa à utilização de um vetor para cada dado é a utilização de um registro (struct). Um registro agrupa todas as informações necessárias para representar um conjunto,
Struct
• A forma padrão para a criação de um registro em Scilab é: -->reg = struct(campo1, valor1, campo2, valor2, ..., campon, valorn);
• Essa função retorna um registro com campos de nomes
campo1, campo2, ..., campon e valores correspondentes valor1, valor2, ..., valorn.
9 Cada variável campo representa um
nome para um dado (informação) do registro e cada variável valor representa o valor para esse dado.
Cada dupla (campo, valor) está associada a uma informação do
conjunto.
Struct
• Criando uma estrutura (registro) para armazenar as informações de um aluno:
-->aluno = struct("nome", "Jose da Silva", "matricula", 2014001, "endereco", "Rua Alfa 15", "nasc", "10/01/1995", "coef", 8.7) aluno =
nome: "Jose da Silva" matricula: 2014001 endereco: "Rua Alfa 15" nasc: "10/01/1995" coef: 8.7
Struct
• Para acessar um valor de um campo do registro, usamos o nome da variável seguido por um ponto e o nome do campo:
-->aluno.coef ans =
8.7
• Para alterar um valor de um campo: -->aluno.endereco = "Rua Beta 35" aluno =
nome: "Jose da Silva" matricula: 2014001 endereco: "Rua Beta 35" nasc: "10/01/1995" coef: 8.7 11 Acessando o campo do coeficiente de rendimento do aluno.
Struct
• Inserindo um campo no registro: -->aluno.cpf = "123.456.789-00" aluno =
nome: "Jose da Silva" matricula: 2014001 endereco: "Rua Beta 35" nasc: "10/01/1995" coef: 8.7
cpf: "123.456.789-00"
12 Nesse exemplo é criado
um campo para representar o CPF do aluno. A criação é feita da
mesma forma que a alteração de um valor de
um campo. Se o campo acessado não existe, ele é
Struct
• Criando um vetor de registros:
-->aluno1 = struct("nome", "Jose da Silva", "coef", 7.9); -->alunos(1) = aluno1;
-->aluno2 = struct("nome", "Maria", "coef", 8.3); -->alunos(2) = aluno2;
-->aluno3 = struct("nome", "Joao", "coef", 6.4); -->alunos(3) = aluno3;
-->alunos alunos =
3x1 struct array with fields: nome
coef
13 Cria um vetor de alunos com campos nome e coeficiente de rendimento. A criação e manipulação é feita da
mesma forma vista na aula de vetores.
Struct
• Acessando elementos do vetor de registros: -->alunos.nome ans = ans(1) Jose da Silva ans(2) Maria ans(3) Joao
• Acessando elementos por índice: -->alunos(2).nome
ans = Maria
14 Retorna todos os valores
do campo nome, armazenados no vetor
Struct - Exemplo
• Crie um programa que armazene os dados (nome, matrícula,
endereço, data de nascimento e coeficiente de rendimento) de 10 alunos de uma turma. O programa deve calcular a média dos coeficientes dos alunos. Em seguida, o programa deve mostrar o nome e coeficiente de rendimento dos alunos que estão com coeficiente abaixo da média da turma.
15
Struct - Exemplo
List
17List
• Uma lista é um conjunto de dados não necessariamente do mesmo tipo:
• Matrizes, listas, tipos primitivos, etc.
• São úteis para definir dados estruturados:
• Dados que possuam uma série de informações que devem ser armazenadas.
• Uma lista é definida no Scilab pelo comando list, que possui a seguinte forma geral:
list(a1, a2, ... , an)
• Onde a1, a2, ... , an são elementos da lista.
List
• Uma lista é um conjunto de dados não necessariamente do mesmo tipo:
• Matrizes, listas, tipos primitivos, etc.
• São úteis para definir dados estruturados:
• Dados que possuam uma série de informações que devem ser armazenadas.
• Uma lista é definida no Scilab pelo comando list, que possui a seguinte forma geral:
list(a1, a2, ... , an)
• Onde a1, a2, ... , an são elementos da lista.
19 Dados de um aluno (Nome, matrícula,
endereço, etc.), livro (Título, Autores, Ano, Editora, Volume, etc.), funcionários (Nome, Endereço, Data de Nascimento, Cargo, Data
de admissão, salário, etc.)
List
• Criando uma lista:
-->nome = “Fulano”; -->matricula = 12345; -->notas = [ 8.7 9.2 7.5 10 ];
-->lista = list(nome, matricula, notas);
• Uma vez criada, é possível acessar o i-ésimo elemento da lista:
-->lista(1) ans = Fulano -->lista(2) ans = 12345. -->lista(3) ans = 8.7 9.2 7.5 10. -->lista(3)(2) 20
O acesso aos elementos é feito de forma similar a um vetor.
O terceiro elemento da lista é um vetor de 4 posições. Nesse exemplo é acessada a segunda posição do terceiro
List
• Da mesma forma, é possível atribuir valores aos elementos da lista: -->lista(2) = 54321 lista = lista(1) Fulano lista(2) 54321. lista(3) 8.7 9.2 7.5 10.
• O número de elementos em uma lista pode ser obtido com a função
size: -->size(lista) ans = 3. 21 Resultado da atribuição do número 54321 ao segundo elemento da lista. Retorna um único inteiro, que representa o tamanho da lista.
List
• É possível percorrer os elementos de uma lista através de um laço de repetição: for i = 1 : size(lista) elem = lista(i); printf("Elemento #%g: ", i); disp(elem); end • De forma direta:
for elem = lista disp(elem); end
22 A cada iteração, o valor de
elemé alterado para o próximo elemento da lista. Essa forma elimina o uso de
List
• Uma lista permite a inserção de elementos dinamicamente, inserindo elementos no final:
-->lista($+1) = "30/06/2014"; -->lista($+1) = sum(lista(3));
23 ($+1) indica que um elemento
será inserido ao final da lista. Se a lista possuía tamanho 3, agora ela terá tamanho 4. O último elemento (índice 4) será definido
pelo valor da expressão do lado direito da igualdade.
List - Exemplo
• Codifique um programa para manipular os dados dos alunos de uma turma. Para isso, o programa deve pedir ao usuário a quantidade de alunos da turma e depois deve preencher uma lista com os números de matrículas dos alunos e suas
respectivas notas finais. O programa deve informar as matrículas de todos os alunos que obtiveram nota acima da média da turma. Não é necessário validar os dados.
• Dica: cada dupla (matrícula, nota) também pode ser representada por uma lista.
List - Exemplo
25
Cell
• Uma célula é um tipo de variável que permite armazenar matrizes de naturezas diferentes em uma única estrutura. • Para criar uma célula, utiliza-se o comando cell:
-->celula = cell(2, 2) celula = !{} {} ! ! ! !{} {} ! 27 Cria uma célula de dimensão 2x2.
Nota: aqui os parâmetros usados na construção da célula (2, 2)
indicam as dimensões, diferentemente da lista, em que os parâmetros são os elementos
que irão compor a lista.
Cell
• Inserindo elementos:
-->celula(1, 1).entries = eye(2, 2);
-->celula(1, 2).entries = “matriz identidade 2x2”; -->celula(2, 1).entries = 2;
-->celula(2, 2).entries = [ 1 2 3 ]; -->celula
!{2x2 constant} "matriz identidade 2x2" !
! !
!2 [1,2,3] !
28 Para alterar os valores da
célula é necessário usar o campo entries.
A função eye cria uma matriz identidade com as dimensões passadas
Cell
• Acessando elementos: -->celula(1, 1).entries ans = 1. 0. 0. 1. • Removendo elementos: -->celula(2, 1).entries = [ ] celula =!{2x2 constant} "matriz identidade 2x2" ! ! ! !{} [1,2,3] !
• Retornando o tamanho da célula: -->size(celula)
ans =
2. 2. 29
Para acessar os valores da célula é necessário usar o campo
entries.
Deleta um elemento, usando uma matriz vazia.
A função size retorna o tamanho de cada dimensão da célula.
Cell
• É possível extrair uma parte da célula, de forma similar à usada em matrizes:
-->x = celula(1, 1:2); -->x
x =
!{2x2 constant} "matriz identidade 2x2" ! • O comando anterior retorna uma nova célula.
• É possível retornar os elementos em formato de lista, utilizando entries.
30 Atribui à variável x os
elementos contidos na linha 1 e colunas 1 e 2 da célula.
Cell
• Uma célula pode ser usada para representar arrays multi-indexados (matrizes):
-->m = cell(2, 3, 4)
• Esse comando cria uma matriz tridimensional 2x3x4.
• Vantagem em relação à matrizes: célula pode conter tipos diferentes.
• Vantagem em relação à lista: célula pode ser acessada da mesma forma que uma matriz.
31
Cell - Exemplo
• Faça um programa que gerencie o consumo de energia
elétrica dos eletrodomésticos de uma casa. O programa deve pedir ao usuário a quantidade de eletrodomésticos contidos na casa. Em seguida, o usuário deve informar o nome, potência(em kW) e o tempo ativo por dia (em horas) de cada um dos eletrodomésticos. Ao final, o usuário deve informar o tempo decorrido (em dias). O programa deve calcular e mostrar o consumo total de energia elétrica da casa e o consumo relativo (porcentagem) de cada eletrodoméstico (consumo/consumo total) nesse período de tempo.
Cell - Exemplo
33
Leitura de Planilhas do Excel
•
O Scilab permite que as planilhas gravadas em
arquivos do MS-Excel (extensão .xls) possam ser
acessadas e lidas no seu ambiemte de trabalho.
•
O comando usado para isto é:
• readxls(“caminho_do_arquivo/nome_do_arquivo.xls”);
•
O valor retornado é uma variável que contém
todas planilhas do documento xls.
35
Leitura de Planilhas do Excel
• Exemplo de manipulação:
-->planilhas = readxls('caminho_do_arquivo/nome_do_arquivo.xls'); -->plan1 = planilhas(1);
• Agora temos na variável plan1 uma matriz 4x6, onde a primeira linha é o cabeçalho da matriz e as outras linhas são: o número de
matrícula, nota da prova 1, nota da prova 2, nota da prova 3 e
atividades dos alunos. 36
Matrícula Nome Prova 1 Prova 2 Prova 3 Atividades
2014227 Joao da
Silva 8,00 9,50 7,50 6,00
2014331 Carlos
Eduardo 7,80 7,30 9,00 7,00
Leitura de Planilhas do Excel
•
Considerando a tabela apresentada com as notas
das provas e atividades da disciplina, vamos
construir um programa em Scilab para
apresentar a situação de cada aluno. Isto é, se
ele está aprovado ou reprovado, considerando a
média igual a 7.
37
Leitura de Planilhas do Excel
38
Matrícula Nome Prova 1 Prova 2 Prova 3 Atividades
2014227 Joao da
Silva 8,00 9,50 7,50 6,00
2014331 Carlos
Eduardo 7,80 7,30 9,00 7,00
Referências
• Programming in Scilab. Michael Baudin. Setembro, 2011.
http://forge.scilab.org/index.php/p/docprogscilab/downloads /get/progscilab_v0.9.pdf
• Fundamentos de Scilab. Frederico F. Campos Filho. Universidade Federal de Minas Gerais. Agosto, 2010.
http://homepages.dcc.ufmg.br/~ffcampos/Numerico/scilab_2 01008.pdf