BC-0005 Bases Computacionais da Ciência Aula 07 – Lógica de Programação: Estruturas de repetição Prof. Rodrigo Hausen (com base nos slides do prof. Jesús P. Mena-Chalco) 1 Laços (estruturas de repetição) Usado em situações em que é necessário repetir um determinado trecho de um programa, um determinado número de vezes. Duas formas: Escrever o trecho quantas vezes for necessário, ou Utilizar o conceito de laço de repetição ou laço de iteração. 2 Laço de repetição (for) Single Ladies – Beyoncé All the single ladies! All the single ladies! All the single ladies! All the single ladies! All the single ladies! All the single ladies! All the single ladies! 3 Laço de repetição (for) Single Ladies – Beyoncé All the single ladies! All the single ladies! No editor do Scilab: All the single ladies! disp("Single Ladies - Beyoncé"); disp("All the single ladies!"); disp("All the single ladies!"); disp("All the single ladies!"); disp("All the single ladies!"); disp("All the single ladies!"); disp("All the single ladies!"); disp("All the single ladies!"); All the single ladies! All the single ladies! All the single ladies! All the single ladies! 4 Estruturas de repetição: o laço for 5 Laços (for) Em vez de copiar e colar a linha disp("All the single ladies!"); sete vezes, troque por for i = 1:7 disp("All the single ladies!"); end Execute e veja o resultado. 6 Laços (for) for variavel = instrução instrução instrução … end inicio:fim 1; 2; 3; Atribui à variável os valores inicio, inicio+1, inicio+2, …, fim. Para cada vez que um valor é atribuído à variável, o bloco de instruções é executado. for n = 5:9 disp("O valor de n é:"); disp(n); end 7 (1) Soma de números Crie uma função soma_intervalo(x,y) que calcule a soma: x + (x+1) + (x+2) + … + y Considere x < y -->soma_intervalo(0,4) 10. -->soma_intervalo(-4,4) 0. -->soma_intervalo(10,12) 33. 8 (1) Soma de números Crie uma função soma_intervalo(x,y) que calcule a soma: x + (x+1) + (x+2) + … + y Considere x < y 9 (2) Somatório de quadrados Crie uma função somaQ(n), que dado um inteiro n>0, retorne a seguinte soma: 1² + 2² + 3² + … + n² 10 (2) Somatório de quadrados function soma = somaQ(n) soma = 0; for i = 1:n soma = soma + i^2; end endfunction -->somaP(0) 0. -->somaP(1) 1. -->somaP(2) 5. -->somaP(3) 14. -->somaP(4) 30. 11 (3) Somatório de quadrados Modifique a função somaQ para que ela receba dois parâmetros, m e n, de tal forma que ela calcule o somatório: n ∑i 2 i=m 12 (3) Somatório de quadrados Modifique a função somaQ para que ela receba dois parâmetros, m e n, de tal forma que ela calcule o somatório: n 2 2 2 2 ∑ i =m +(m+1) +(m+2) +...+ n 2 i=m 13 (3) Somatório de quadrados Modifique a função somaQ para que ela receba dois parâmetros, m e n, de tal forma que ela calcule o somatório: n ∑i i=m 2 function soma = somaQ(m,n) soma = 0; for i = m:n soma = soma + i^2; end endfunction 14 Outras sequências Até agora, a variável do laço era incrementada de apenas 1 unidade. Para incrementos diferentes (mais de uma unidade, ou para decrementar a variável), usamos o laço for desta forma: for variavel = inicio:incremento:fim ... end Ex.: imprime contagem regressiva de 10 até 1 for i = 10:-1:1 disp(i) end 15 Estruturas de repetição: o laço while 16 Soma de quadrados function soma = somaQ(m,n) soma = 0; for i = m:n soma = soma + i^2; end endfunction 17 Soma de quadrados function soma = somaQ(m,n) soma = 0; for i = m:n soma = soma + i^2; end endfunction function soma = somaQ(m,n) soma = 0; i = m while i <= n soma = soma + i^2; i = i + 1 end endfunction 18 Estrutura: While while condição instrução 1; instrução 2; ... instrução n; end O laço while (enquanto) repete uma sequência de instruções enquanto uma condição for satisfeita. Útil quando não se sabe, a priori, o número de iterações. 19 (4) Fatorial Crie uma função em que, dado um inteiro não-negativo n, determine n! 20 (4) Fatorial Crie uma função em que, dado um inteiro não-negativo n, determine n! Com laço for: 21 (4) Fatorial Crie uma função em que, dado um inteiro não-negativo n, determine n! Com laço for: Com laço while: 22 (5) Jogo da adivinhação function adivinhacao() // sorteia um inteiro entre 1 e 10 n = floor(rand()*10 + 1); disp('Pensei num inteiro entre 1 e 10.'); disp('Tente adivinhá-lo.'); chute = 0; while chute ~= n chute = input('seu chute: '); end disp('Você acertou! Fim de jogo.'); endfunction 23 (6) Número triangular Dizemos que um número natural é triangular se ele é produto de três números naturais consecutivos. Exemplo: 120 é triangular, pois 4*5*6 = 120. 2730 é triangular, pois 13*14*15 = 2730. Dado um inteiro não negativo n, verificar se n é triangular. Definição da função: numeroTriangular(n): Devolve “True” se o número for triangular, caso contrário “False”. 24 (6) Número triangular -->numeroTriangular(2730) T -->numeroTriangular(29760) T 25 (6) Número triangular interrompe imediatamente a execução da função (retorno imediato da função) -->numeroTriangular(2730) T -->numeroTriangular(29760) T 26 (6) Número triangular Com laço for: 27 (7) Soma de dois quadrados Dizemos que um inteiro positivo n pode ser escrito como a soma de dois quadrados se existem a, b inteiros tais que: n = a² + b² Crie uma função somaDeDoisQuadrados(n) que retorna os fatores a e b caso n possa ser escrito como a soma de dois quadrados, ou o valor verdade falso caso não possa. Para os inteiros a e b, precisamos testar todas as possibilidades entre 1 e √ n−1 28 (7) Soma de dois quadrados --> somaDeDoisQuadrados(2) ans = 1. 1. --> somaDeDoisQuadrados(245) ans = 7. 14. --> somaDeDoisQuadrados(30) ans = F 29 (7) Soma de dois quadrados function resp = somaDeDoisQuadrados(n) for a = 1:sqrt(n-1) for b = 1:sqrt(n-1) if n == a^2 + b^2 then resp = [a,b] return end end end resp = %f endfunction 30 (7) Soma de dois quadrados function resp = somaDeDoisQuadrados(n) for a = 1:sqrt(n-1) for b = 1:sqrt(n-1) if n == a^2 + b^2 then resp = [a,b] return end end end resp = %f endfunction 31 (7) Soma de dois quadrados function resp = somaDeDoisQuadrados(n) for a = 1:sqrt(n-1) for b = 1:sqrt(n-1) if n == a^2 + b^2 then resp = [a,b] return end end end resp = %f endfunction laços aninhados 32 Atividade 08: Tidia-ae Adapte a função do jogo da adivinhação para: ● ● Receber como parâmetro um inteiro n, que determinará a faixa de valores de 1 a n Para cada chute dado, mostrar se o número escolhido pelo computador é maior ou menor que o chute do jogador. Definição da função: adivinhacao(n) Nome do arquivo a ser enviado: adivinhacao.sci 36 Atividade 08: Tidia-ae --> adivinhacao(50) Pensei num inteiro entre 1 e 50 Tente adivinhá-lo. Seu chute: 25 Meu número é menor. Seu chute: 12 Meu número é maior. Seu chute: 18 Meu número é maior. Seu chute: 21 Meu número é menor. Seu chute: 19 Você acertou! Fim de jogo. 37 Atividade 09: Tidia-ae Faça uma função arcotangente que recebe um número real x ∈ [0,1] e devolve uma aproximação do arco tangente de x (em radianos), calculada através da série: Definição: arcotangente(x) Nota: Considere somente os 100 primeiros termos da série. - Nome do arquivo a ser enviado: arcotangente.sci 38 Atividade 10: Tidia-ae Crie uma função que, dados dois inteiros positivos x e y tais que x < y, some apenas os números que são quadrados perfeitos na sequência: x, x+1, x+2, … , y A função deve ser definida como: soma_quadrados(x,y) Ex.: soma_quadrados(1, 10) deve retornar 14, pois na sequência: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Apenas 1 = 1², 4 = 2² e 9 = 3² são quadrados perfeitos. - Nome do arquivo a ser enviado: soma_quadrados.sci 39