Slides Computação e Programação MEMec+LEAN · 05/10/2015 3 Alinhamento da AT 6 • Estruturas...
Transcript of Slides Computação e Programação MEMec+LEAN · 05/10/2015 3 Alinhamento da AT 6 • Estruturas...
05/10/2015
1
D.E.M. – Área Científica de Controlo Automação e Informática Industrial
Computação e ProgramaçãoMEMec, LEAN - 1º Semestre 2015-2016
Aula Teórica 6
• Estruturas de Repetição (FOR, WHILE)• A instrução break• Pré-alocação de variáveis
Expressão relacional
• É uma expressão que analisa a relação entre duas ou mais entidades, resolvendo-se num valor verdadeiro ou falso
Para que serve?
• Pode ser ela própria a tarefa de computação
• Mais frequentemente utiliza-se numa estrutura de selecção para decidir qual das sequências de código executar
Computação e Programação 2015 / 2016 2
Wrap Up da última aula
05/10/2015
2
Quais as estruturas de selecção do
MATLAB?
• if (possivelmente complementada com else, ou elseif), avalia qualquer condição lógica
• switch avalia uma expressão contra um conjunto de casos possíveis
Quando se utiliza uma e
outra?
• if quando:
• se avalia um intervalo de valores
• a selecção depende de várias expressões lógicas distintas
• switch quando:
• Os casos a avaliar são enumeráveis e não podem ser expressos na forma de um intervalo
Computação e Programação 2015 / 2016 3
Wrap Up da última aula
Computação e Programação 2015 / 2016
Implementação de Algoritmos em MATLAB
• Sequenciação
• Selecção
•
•
•
• Repetição
•
• Módulos
Ficheiros script
Estruturas: if
if – else
if – elseif
switch – case
Estruturas: for
while
Funções definidas pelo programador
4
05/10/2015
3
Alinhamento da AT 6
• Estruturas de Repetição
• Estrutura FOR
• Ciclos FOR encadeados
• Estrutura WHILE
• A instrução break
• Pré-alocação de variáveis
Computação e Programação 2015 / 2016
Computação e Programação 2015 / 2016
Estrutura for
Descrição: Repete um bloco de instruções um número específico de vezes
Sintaxe: for var_ctrl = expressão
sequência
end
• No MATLAB expressão pode ser qualquer vector, matriz ou escalar. A forma mais comum (também a outras linguagens de programação) é definir a expressão como um intervalo
limite_inicial : passo : limite_final
6
05/10/2015
4
Computação e Programação 2015 / 2016
Estrutura for (utilização comum)
• A variável de controlo começa por tomar o valor inicial
var_ctrl = limite_inicial
• E por cada execução do ciclo vai sendo incrementada do passo
var_ctrl = var_ctrl + passo
• O ciclo termina quando var_ctrl estiver fora do intervalo
var_ctrl ∈ [limite_inicial, limite_final]
Tudo isto é feito de forma automática
7
Computação e Programação 2015 / 2016
Estrutura for
>> for i = 1:4
fprintf('%d\n', i);
end
1
2
3
4
>> for i = 10:5:28
fprintf('%d\n', i);
end
10
15
20
25
>> for i = 100:-20:40
fprintf('%d\n', i);
end
100
80
60
40
>> x = [12 34 55 23];>> for i = 1:length(x)
fprintf('%d\n', x(i));end
12
34
55
23
Percorrer vectores
8
05/10/2015
5
Computação e Programação 2015 / 2016
Percorrer vectores
>> x = [2 4 6 8 10];
>> for i = 1:length(x)
y(i) = x(i)^2 + 2;
end
>> y
y =
6 18 38 66 102
1ª passagem pelo cicloy(1) = x(1)^2 + 2;
2ª passagem pelo cicloy(2) = x(2)^2 + 2;
3ª passagem pelo cicloy(3) = x(3)^2 + 2;
4ª passagem pelo cicloy(4) = x(4)^2 + 2;
5ª passagem pelo cicloy(5) = x(5)^2 + 2;
9
Computação e Programação 2015 / 2016
Percorrer vectores (ordem contrária)
>> x = [2 4 6 8 10];
>> for i = length(x):-1:1
y(i) = x(i)^2 + 2;
end
>> y
y =
6 18 38 66 102
Não faz o que se pretende
1ª passagem pelo cicloy(5) = x(5)^2 + 2;
2ª passagem pelo cicloy(4) = x(4)^2 + 2;
3ª passagem pelo cicloy(3) = x(3)^2 + 2;
4ª passagem pelo cicloy(2) = x(2)^2 + 2;
5ª passagem pelo cicloy(1) = x(1)^2 + 2;
10
05/10/2015
6
Computação e Programação 2015 / 2016
>> x = [2 4 6 8 10];
>> comp = length(x);
>> for i = 1:comp
y(i) = x(comp-i+1)^2+2;
end
>> y
y =
102 66 38 18 6
Percorrer vectores (ordem contrária)
Foi necessário trocar os índices!
1ª passagem pelo cicloy(1) = x(5)^2 + 2;
2ª passagem pelo cicloy(2) = x(4)^2 + 2;
3ª passagem pelo cicloy(3) = x(3)^2 + 2;
4ª passagem pelo cicloy(4) = x(2)^2 + 2;
5ª passagem pelo cicloy(5) = x(1)^2 + 2;
11
Computação e Programação 2015 / 2016
Exemplo: soma elementos*
• Entradas: x – vectorn – número de elementos a somar (inteiro)
• Saídas: apresenta resultado na variável somatorio
Algoritmo:
1. Obter do utilizador o vector x
2. Obter do utilizador o valor n
3. Inicializar somatorio = 0
4. Repetir para i entre 1 e n com passo unitário
a) Acrescentar o valor de x(i) ao valor do somatorio
5. Apresentar valor de somatorio
* Está implementado na forma de script. Para uma
implementação mais útil ver a aula de funções
12
05/10/2015
7
Computação e Programação 2015 / 2016
>> soma
Introduza o vector: [1 2 3 4 5]
Introduza n: 3
A soma é: 6.00
>> soma
Introduza o vector: [3 5 1 1]
Introduza n: 4
A soma é: 10.00
Exemplo: soma elementos*
13
Computação e Programação 2015 / 2016
Exemplo: factorial*
• Entradas: n – valor cujo factorial se prentede calcular (inteiro)
• Saídas: apresenta resultado na variável factorial_n
Algoritmo:
1. Obter do utilizador o valor n
2. Inicializar factorial_n = 1
3. Repetir para k entre 1 e n com passo unitário
a) factorial_n = factorial_n × k
4. Apresentar valor de factorial_n
* Está implementado na forma de script. Para uma
implementação mais útil ver a aula de funções
14
05/10/2015
8
Computação e Programação 2015 / 2016
Exemplo: factorial*
>> fact
Introduza n: 4
O valor do factorial é: 24
15
Computação e Programação 2015 / 2016
Exemplo: encontra mínimo*
• Entradas: obter do utilizador o vector x
• Saídas: apresenta o valor mínimo dos elementos de x
Algoritmo:
1. Obter do utilizador o vector x
2. Inicializar minimo com o valor de x(1)
3. Repetir para i entre 2 e o comprimento de x com passo unitário
a) Se x(i) < minimo
i. minimo = x(i)
4. Apresentar valor de minimo
* Está implementado na
forma de script. Para uma implementação mais útil ver a aula de funções.
16
05/10/2015
9
Computação e Programação 2015 / 2016
Exemplo: encontra mínimo*
>> encontra_minimo
Introduza o vector: [2 12 -3 1 4]
O valor mínimo em x é: -3.000000
>> encontra_minimo
Introduza o vector: [0.05 1.12 0.3]
O valor mínimo em x é: 0.050000
17
Computação e Programação 2015 / 2016
As funções sum e factorial
>> sum([1 2 3 4 5])
ans =
15
>> x = [1 2 3 4 5];
>> sum(x(1:3)) % soma dos primeiros 3 elementos de x
ans =
6
>> factorial(4)
ans =
24
• No MATLAB as funções sum e factorial estão pré-definidas não sendo necessário programá-las com ciclos
18
05/10/2015
10
Computação e Programação 2015 / 2016
>> soma
Introduza o vector: [1 2 3]
Introduza n: 5
??? Attempted to access x(4); index out of bounds becausenumel(x)=3.
Error in ==> soma at 10
somatorio = somatorio + x(i);
>>
Exemplo: soma elementos*
É preciso verificar n antes de somar os elementos
19
Computação e Programação 2015 / 2016
Exemplo: soma elementos mais robusto
Algoritmo:
1. Obter do utilizador o vector x
2. Obter do utilizador o valor n
3. Se n < 1 ou n > comprimento de x
a) Apresentar mensagem de erro
Caso contrário
a) Inicializar somatorio = 0
b) Repetir para i entre 1 e n com passo unitário
i. Acrescentar o valor de x(i) ao valor do somatorio
c) Apresentar valor de somatorio
20
05/10/2015
11
Computação e Programação 2015 / 2016
>> soma
Introduza o vector: [1 2 3]
Introduza n: 5
O valor de 'n' não é válido!
>>
Exemplo: soma elementos mais robusto
21
Alinhamento da AT 8
• Estruturas de Repetição
• Estrutura FOR
• Ciclos FOR encadeados
• Estrutura WHILE
• A instrução break
• Pré-alocação de variáveis
Computação e Programação 2015 / 2016
05/10/2015
12
Computação e Programação 2015 / 2016
Ciclos for encadeados
• A sequência de instruções dentro de um ciclo for pode conter outro ciclo for (e outro dentro deste, e outro, etc.)
• Quando tal acontece, fala-se em ciclos for encadeados
for var_ctrl_1 = expressão_1
sequência_1
for var_ctrl_2 = expressão_2
sequência_2
end
sequência_3
end
23
Computação e Programação 2015 / 2016
Ciclos for encadeados
• Os ciclos for encadeados são muitas vezesutilizados para aceder a estruturas dedados com mais de que uma dimensão,como por exemplo matrizes.
>> mat = [0.95 0.49 10.23 0.89 50.61 0.76 3];
>> [linhas, colunas] = size(mat);
>> for k = 1:linhasfor j = 1:colunas
fprintf('%.2f ', mat(k,j));end
end
0.95 0.49 1.00 0.23 0.89 5.00 0.61 0.76 3.00
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)
Exemplo de como percorrer por linha
24
05/10/2015
13
Computação e Programação 2015 / 2016
Exemplo: tabela multiplicativa
• Entradas: –
• Saídas: apresenta tabela multiplicativa dos valores de 1 a 10
Algoritmo:
1. Repetir para i entre 1 e 10 com passo unitário
a) Repetir para j entre 1 e 10 com passo unitário
i. Apresentar resultado de i × j seguido de espaço
b) Mudar de linha
25
Computação e Programação 2015 / 2016
Ciclos for encadeados
>> tabuada1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Depois de percorrer todos os j muda de linha
26
05/10/2015
14
Alinhamento da AT 8
• Estruturas de Repetição
• Estrutura FOR
• Ciclos FOR encadeados
• Estrutura WHILE
• A instrução break
• Pré-alocação de variáveis
Computação e Programação 2015 / 2016
Computação e Programação 2015 / 2016
Estrutura while
Descrição: Repete um bloco de instruções um número indefinido de vezes, enquanto uma dada expressão for verdadeira
Sintaxe: while expressão
sequência
end
• ATENÇÃO: A sequência deve permitir a modificação da expressão para o valor falso, caso contrário o ciclo nunca termina denominando-se CICLO INFINITO
• Nesse caso o utilizador perde o controlo da execução do programa
28
05/10/2015
15
Computação e Programação 2015 / 2016
>> condicao = true;>> ciclos = 0;>> while condicao
ciclos = ciclos + 1;fprintf('Este é o %dº ciclo!\n', ciclos);
endEste é o 1º ciclo!Este é o 2º ciclo!Este é o 3º ciclo!...Este é o 30000º ciclo!...Este é o 300000º ciclo!
Estrutura while
Em caso de ciclo infinito, ou qualquer outro problema na
execução do MATLAB pressionar Ctrl+C
29
>> condicao = true;>> ciclos = 0;>> while condicao
ciclos = ciclos + 1;fprintf('Este é o %dº ciclo!\n', ciclos);condicao = input('Deseja repetir (true/false)? ');
endEste é o 1º ciclo!Deseja repetir? trueEste é o 2º ciclo!Deseja repetir? false>>
Computação e Programação 2015 / 2016
Estrutura while
A condição de repetição deve poder mudar de valor
dentro do ciclo
30
05/10/2015
16
Computação e Programação 2015 / 2016
Exemplo: soma parcelas
• Entradas: x – parcela
• Saídas: apresenta resultado na variável soma
Algoritmo:
1. Inicializar condicao = verdadeiro e soma = 0
2. Repetir enquanto condicao = verdadeiro
a) Obter valor para x
b) Se x = 0
A. condicao = falso
B. Apresentar soma
Caso contrário
A. soma = soma + x
B. Apresentar soma (parcial)
31
Computação e Programação 2015 / 2016
Exemplo soma parcelas
>> soma_while
Calcula uma soma.
Introduza 0 para terminar
Introduza um valor: 0.5
A soma já vai em 0.500000
Introduza um valor: 1.4
A soma já vai em 1.900000
Introduza um valor: -0.2
A soma já vai em 1.700000
Introduza um valor: 0
O resultado é 1.700000
>>
32
05/10/2015
17
Computação e Programação 2015 / 2016
Exemplo verificação de entrada
>> garante_inteiro
Introduza um inteiro positivo: 2.2
Invalido! Introduza um inteiro positivo: -1
Invalido! Introduza um inteiro positivo: 5
Obrigado, o valor introduzido foi: 5
33
Alinhamento da AT 8
• Estruturas de Repetição
• Estrutura FOR
• Ciclos FOR encadeados
• Estrutura WHILE
• A instrução break
• Pré-alocação de variáveis
Computação e Programação 2015 / 2016
05/10/2015
18
Computação e Programação 2015 / 2016
Instrução break
Descrição: Interrompe imediatamente o ciclo a que pertence (o mais interior). Não está definida fora de um ciclo.
Exemplo de utilização típica:
while true
sequência_1
if condição
break;
end
sequencia_2
end
Ao não colocar a condição no início do ciclo permite que a
sequência_1 seja sempre executada pelo menos 1 vez
35
Computação e Programação 2015 / 2016
Exemplo: soma parcelas com break
• Entradas: x – parcela
• Saídas: apresenta resultado na variável soma
Algoritmo:
1. Inicializar soma = 0
2. Repetir indefinidamente
a) Obter valor para x
b) Se x = 0
i. Apresentar soma
ii. Terminar repetição (2.)
c) soma = soma + x
d) Apresentar soma (resultado parcial)
36
05/10/2015
19
Computação e Programação 2015 / 2016
Exemplo soma parcelas com break
• Faz exactamente o mesmo que o exemplo soma
parcelas sem break
• As condições de fim de um ciclo devem ser facilmente legíveis, logo:
• Não é boa prática usar várias condições espalhadas pelo ciclo!
• Não é boa prática usar break em ciclos FOR!
37
Alinhamento da AT 8
• Estruturas de Repetição
• Estrutura FOR
• Ciclos FOR encadeados
• Estrutura WHILE
• A instrução break
• Pré-alocação de variáveis
Computação e Programação 2015 / 2016
05/10/2015
20
Computação e Programação 2015 / 2016
A pré-alocação de um array
• Os ciclos criam a possibilidade de um vector ou matriz se expandirem sucessivamente durante a execução
• Devido à maneira como o MATLAB realiza a gestão de memória esta forma é ineficaz. O próprio editor de código gera um warning quando detecta uma situação destas
39
Computação e Programação 2015 / 2016
A pré-alocação de um array
• Outra forma de expansão é a concatenação dentro de um ciclo
Concatenação
40
05/10/2015
21
Computação e Programação 2015 / 2016
A pré-alocação de um array
>> tic, exp_iterado, tocElapsed time is 0.324486 seconds.
>> tic, exp_iterado, tocElapsed time is 0.006287 seconds.
Pré-alocação de memória
41
Computação e Programação 2015 / 2016
A pré-alocação de um array
>> tic, exp_concate, tocElapsed time is 0.615073 seconds.
>> tic, exp_concate, tocElapsed time is 0.006146 seconds.
Outra forma de Pré-alocação
42
05/10/2015
22
• Utilize ciclos for para repetições controladas por contador, e ciclos while para repetições controladas por uma condição (isto implica não utilizar break para terminar um ciclo for)
• Faça pré-alocação de memória: defina vectores e matrizes já com o seu número de elementos final, sempre que este número seja previsível. Evite sempre que possível acrescentar novos elementos dentro dos ciclos.
• Se um ciclo servir para introdução ou leitura de dados, guarde os dados num vector apenas se houver necessidade de voltar a aceder novamente aos valores individuais
Boas práticas de Programação
Computação e Programação 2015 / 2016 43
Computação e Programação 2015 / 2016
Referências
• Capítulo 4 de Stormy Attaway (2012), “Matlab: A Practical
Introduction to Programming and Problem Solving”, Elsevier.
44
As aulas teóricas contêm contribuições dos profs. José Borges e Miguel Silva