Informática para Ciências e
Engenharias (B)
Ciclo For
Ciclo For
• Instrução muito útil se precisarmos de repetir algo um número conhecido de vezes
•
conhecido na altura em que o código for executado, não necessariamente quando o código é escrito.
Ciclo For
• Sintaxe mais geral
for var = vector ...
(corpo do for) ...
end
Vectores
l um vector é uma estrutura de dados que guarda um número
pré-definido de valores do mesmo tipo.
l corresponde a uma sequência de posições de memória,
•
o comprimento do vector é fixo.
l acede-se a cada posição do vector indicando o índice desse
elemento
Criação de Vectores
l Criação de um vector
•
Opção 1:
• enumerar os elementos, separados por vírgula ou espaço, entre parênteses rectos
octave:40> v = [1, 3, 8, -6, -9] v =
Criação de Vectores
l Criação de um vector
•
Opção 1:
• enumerar os elementos, separados por vírgula ou espaço, entre parênteses rectos
octave:40> v = [1, 3, 8, -6, -9] v =
Criação de Vectores
l Criação de um vector
•
Opção 1:
• enumerar os elementos, separados por vírgula ou espaço, entre parênteses rectos
octave:40> v = [1, 3, 8, -6, -9] v =
Criação de Vectores
l Criação de um vector
•
Opção 1:
• enumerar os elementos, separados por vírgula ou espaço, entre parênteses rectos
octave:40> v = [1, 3, 8, -6, -9] v =
Criação de Vectores
l Criação de um vector
•
Opção 2:
• indicar uma sequência com:
• início : passo : fim
Criação de Vectores
l Criação de um vector
•
Opção 2:
• Nota 1: o passo é opcional (por omissão vale 1)
• Nota 2: o valores podem ser reais
octave:7> v2 = 1:5
v2 = 1 2 3 4 5
octave:6> v6=0:pi/3:pi v6 =
Acesso a Vectores
l Aceder a elementos de um vector
•
indicar o índice do elemento entre parênteses curvos
• v(3)
•
o índice tem de ser um inteiro entre 1 e o comprimento do vector
Acesso a Vectores
l Exemplo:
v =
1 3 8 20 -9 octave:44> v(12)
error: A(I): index out of bounds; value 12 out of bound 5
octave:44> v(length(v))
ans = -9
octave:45> v(end)
Acesso a Vectores
l Aceder a elementos de um vector
•
indicar o índice do elemento entre parênteses
•
indicar vários índices como vector
• v([1,2,5])
• v(3:length(v))
• v(3:end)
• quando usada para indexar elementos de um vector, o end corresponde ao índice do último (ao
Ciclo For
l Sintaxe mais geral
•
A variável toma, a cada iteração, o valor do elemento correspondente do vector
l O vector pode ser criado/referido de várias formas:
•
1:N % criado•
vec % referido•
3:length(vec)-1 % criado (e restringido)for var = vector ...
Acesso a Vectores
l Exemplo:
•
Fazer algo 5 vezes (escrever um texto)
• não é preciso usar a variável do ciclo dentro do ciclo.
Acesso a Vectores
l Exemplo:
•
Substituir todos os caracteres de s por *
• uma string é um vector de caracteres
• length(v) devolve o comprimento de v
• 1:length(v) cria vector [1, 2, 3, … length(v)]
Fibonacci
l Obter uma sequência de Fibonacci (os primeiros n termos)
Fibonacci
l Várias repetições do mesmo código
Fibonacci
l Esta repetição pode ser feita com um ciclo
Fibonacci
l Esta repetição pode ser feita com um ciclo
Fibonacci
l Esta repetição pode ser feita com um ciclo
•
Mais vale prevenir para o caso N < 2!
•
em geral, convém garantir que a variável com o valor a devolver é sempre bem definida,
Inverter uma String
Exemplo 2:
Inverter uma String
l Criar uma função, inverte, que
•
recebe uma string
•
devolve a string escrita do fim para o princípio
Inverter uma String
l Em MATLAB as strings são vectores de (códigos de)
caracteres.
•
na função inverte nada obriga a que seja uma string octave:23> inverte([1,2,3,4,5])
ans =
Inverter uma String
l Dimensionar o vector
•
em MATLAB, o interpretador dimensiona o vector automaticamente
•
Mas cada vez que o faz tem de
• reservar novo espaço em memória • copiar o conteúdo do original
•
Não convém fazer muitas vezes, se evitável
octave:22> vec(5)=12 vec =
Inverter uma String
l Dimensionar o vector
•
Se soubermos qual o tamanho final, o melhor é reservar inicialmente a memória necessária
• blanks(N) string com N espaços
• zeros(1,M) vector (1 linha) com M zeros • ones(1,M) vector (1 linha) com M uns
•
No nosso exemplo, podemos usar
Inverter uma String
l Implementação (opção 1)
•
Obter os elementos da string 1 a 1
•
Obter os índices da string inversa a partir dos da inicial
Inverter uma String
l Forma mais simples de inverter
Inverter uma String
l Forma mais simples de inverter (opção 2)
•
para inverter podemos pedir os elementos desde o último ao primeiro
octave:27> s='gnirts amu retrevnI' s = gnirts amu retrevnI
Inverter uma String
l Forma mais simples de inverter (opção 2)
•
para inverter podemos pedir os elementos desde o último ao primeiro
•
podemos usar a variável end dentro dos parênteses para indicar o último índice do vector.
octave:27> s='gnirts amu retrevnI' s = gnirts amu retrevnI
octave:28> s(end:-1:1)
Quadrado dum Vector
Exemplo 3:
Quadrado dum Vector
l Queremos uma função que recebe um vector e devolve um
vector com os quadrados dos elementos do argumento
•
function res = quadrado(vec)
l Precisamos
•
dimensionar res
•
ciclo de um até ao comprimento de res
Quadrado dum Vector
l Pode ser implementada desta forma ?
l O que está errado?
•
a variável vec é local, e
Quadrado dum Vector
l O erro anterior pode ser corrigido?
•
a variável res é declarada localmente; mas agora
Quadrado dum Vector
l Mas mais prático assim
•
a variável vec, “passada” para a saída da função,
Quadrado dum Vector
l A função pode ser testada, na forma habitual (texto)
l Ou, em alternativa, através do seu aspecto gráfico
Quadrado dum Vector
l Nota: Gráficos em MATLAB serão abordados mais tarde octave:45> x=-1:0.1:1;
Média e Desvio Padrão
Estatísticas:
Problema
Problema: O vector contaminantes contém a concentração medida de Pb num rio, em ppb, em 50 amostras
l Qual a média e desvio padrão dos valores?
•
Questões:
• Como calcular os dois valores numa função? • Como fazer essa função devolver 2 valores?
Problema
l Objectivo mais geral: programa que
•
recebe um vector com N valores • (assumimos que N>1)
•
devolve média e desvio padrão • dois valores reais
•
Como devolver os 2 valores?
function res = nome (arg1, arg2, … )
Problema
l Decompor o problema
•
Três tarefas, três funções
• calcular a média do vector
• calcular o desvio padrão do vector
Problema
l Perceber, abstrair e generalizar
•
média de um vector
•
desvio padrão de um vector • precisamos da média
d.p. da amostra
Média e Desvio Padrão
l Primeira abordagem
function aMedia = media(vec) function desviopad =(vec)
function [aMedia,dPad] = mediadp(vec)
•
usa media(vec) para calcular a média
•
usa desviopad(vec) para calcular o desvio padrão
•
Utiliza as duas funções em mediadp(vec)
Média e Desvio Padrão
l Para evitar repetir cálculos
function aMedia = media(vec)
function dPad = desviopadaux(vec, aMedia)
•
desviopadaux recebe a média previamente calculada
•
não é genérica; noutros casos não é útil dar a média. • O sufixo “aux” é usado para identifcar isto.
function [aMedia,desvPad] = mediadp(vec)
•
usa media(vec) para calcular a média
Média
function aMedia = media(vec)
•
somar todos os elementos de vec
Média
function aMedia = media(vec)
•
somar todos os elementos de vec num ciclo for var = 1:length(vec)
•
somar vec(f) ???•
ou, melhor,
for var = vec e somar f.
•
Mas somar onde?
• noutra variável, começando a zero
Média
Média
function aMedia = media(vec)
•
A variável do ciclo, umValor, adopta sequencialmente o valor de cada elemento de vec.
•
Em alternativa, podia identificar-se esse valor pelo seu índice for j = 1:length(vec)
… umVal = vec(j) … end
for umVal = vec … umVal …
Média
function aMedia = media(vec)
•
A função deve ser testada individualmente (testes unitários)
octave:26> media([1,2,3,4,5]) ans = 3
Desvio Padrão
function desviopadaux.m
Desvio Padrão
function desviopadaux(vec, amedia)
•
A função deve ser testada individualmente (testes unitários)
•
Deveriam ser feitos mais testes. Quais? octave:7> vtest = ones(1,6)
vtest =
1 1 1 1 1 1
octave:8> med = media(vtest) med = 1
Média e Desvio Padrão
l As duas funções anteriores podem agora ser combinadas na
função
function [amedia, desvPad] = mediadp(vec)
Média e Desvio Padrão
l Alguns testes unitários podem ser feitos
octave:13> vtest = ones(1,6) vtest =
1 1 1 1 1 1
octave:14> [med,dp] = mediadp(vtest) med = 1
dp = 0
Média e Desvio Padrão
l Alguns testes unitários podem ser feitos (cont.)
octave:17> vtest = [1, 2, 3] vtest =
1 2 3
octave:18> [med,dp] = mediadp(vtest) med = 2
dp = 1
Média e Desvio Padrão
l Um teste mais complexo (a partir de uma vector amostras)
Média e Desvio Padrão
l Um teste mais complexo (a partir de uma vector amostras)
•
Nota: para receber ambos os valores é preciso fornecer duas variáveis
octave:25> mediadp(amostras) ans = 7.1556
octave:24> [med,dp] = mediadp(amostras) med = 7.1556
Média e Desvio Padrão
l Na implementação anterior, o cálculo do desvio padrão é feito numa
função auxiliar.
l Mas poderia ser feito numa variante pública:
•
desviopad(vec)
Resumo
l Funções que devolvem vários valores
•
têm de ser chamadas com variáveis suficientes para todos os valores
function [a,b,c …] = nome( arg1, arg2, … )
•
ou então só recebemos os primeiros n [x,y] = nome(v1, v2, v3 …) nome(v1, v2, v3 …)
Resumo
l Ciclos for
•
a variável do ciclo toma, por ordem, o valor de cada elemento do vector
• numérico, string, etc
•
o corpo do ciclo é repetido para cada valor
for variavel = vector (corpo)
Resumo
l Ciclos for
•
se usamos o ciclo para preencher um vector devemos criar primeiro o vector com o tamanho certo
• só é preciso dimensionar o vector em memória uma vez
Resumo
l Vectores
•
podemos definir especificando cada elemento
• v= [1,2,3]; s='abc'
•
ou pelo intervalo
• v=1:30 s='a':'z'
•
podemos aceder a cada elemento ou conjunto de elementos especificando os índices como vector entre parênteses
• v([1,3,4]) s(10:end)
Resumo
l Decomposição de um problema
•
pensar nas várias tarefas
• abstrair do problema concreto e generalizar
•
perceber o que têm de cumprir e como implementar
•
fazer o mesmo para cada tarefa complexa
Resumo
l Decomposição de um problema
•
só implementar a função quando essa tarefa for suficientemente simples
•
só implementar a função quando for claro como se vai executar essa tarefa
• só depois de saber a assinatura da função
Desafio: Cálculo da Massa Molecular
l O que já sabemos fazer
•
operações, variáveis (números e strings)
•
funções, guardar e reutilizar código
•
decompor problemas
•
vectores (de números e de caracteres)
Para estudar a aula de hoje
l Recomendado
•
Physical Modeling in MATLAB
•
Capítulos 3 e 4l Opcional