Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I – BCC701 www.decom.ufop.br/moodle Andréa Iabrudi [email protected] 1 while <condição> <bloco while> end Execução do comando while: 1. primeiro, a condição é avaliada 2. se a condição for verdadeira, então o bloco de comandos dentro do while é executado, e volta-se ao passo 1. 3. se a condição for falsa, o comando while termina, e a execução prossegue a partir do comando imediatamente subsequente ao comando while. n ! = 1 ´ 2 ´ ´ (n - 1) ´ n n ! = (n - 1) ! ´ n n n ! = Õi Faça i=1 um programa que leia um valor inteiro não negativo n e imprima o fatorial de n. 3 n = input(“n = “) k = 1; fat = 1; while k <= n fat = fat * k; k = k + 1; end O número de iterações é conhecido a priori = n Em cada passo do loop, multiplicamos fat por k e incrementamos k Quando o número de iterações de um loop é conhecido a priori, podemos usar uma forma mais simples de comando de repetição: for i = <incio>:<incr>:<fim> <bloco for> end i é variável de controle do for 5 for i = <incio>:<incr>:<fim> <bloco for> end O comando for é executado do seguinte modo: 1. o valor de <início> é atribuído à variável i 2. testa-se se i <= <fim> 3. se for, o <bloco for> é executado, a variável i é incrementada de <incr> e volta-se ao passo 2 4. se não for, o comando for termina 6 n = input(“n = “) fat = 1; for k = 1:n fat = fat * k; end n = input(“n = “) k = 1; fat = 1; while k <= n fat = fat * k; k = k + 1; end compare as duas formas Qual seriam os valores impressos pelos seguintes trechos de programas? for i = 3:3:10 printf(“%g\n”,i) end for i = 7:-2:1 printf(“%g\n”,i) end for i = 10:5 printf(“%g\n”,i) end for i = 7:-2:8 printf(“%g\n”,i) end 8 for i = <incio>:<incr>:<fim> <bloco for> end Qual é o número de iterações do comando? int((fim – inicio)/incr) + 1) 9 Escreva um programa que leia um vetor e imprima a soma e o produto de todos os elementos desse vetor. O cálculo da soma e do produto dos elementos do vetor deve ser feito usando-se o comando for 10 v = input(“VETOR: “) soma = 0; produto = 1; for k = 1:length(v) soma = soma + v(k); produto = produto * v(k) end printf(“soma = %g\n”,soma) printf(“produto = %g\n”,produto) Sabemos que Scilab provê funções para computar a soma e o produto de vetores ou matrizes. sum(M) soma de todos os elementos de M prod(M) produto de todos os elementos de M Agora você sabe como essas funções podem ser implementadas, usando-se um comando for Em Scilab, essas funções são implementadas em paralelo, o que resulta em código mais eficiente do que a implementação usando o for 12 Escreva um trecho de programa para calcular o elemento máximo de um vetor v e a posição em que esse elemento ocorre no vetor, usando o comando for 13 maximo = -%inf; pos = 0; for k = 1:length(v) if v(k) > maximo then maximo = v(k); pos = k end end Sabemos que Scilab provê funções para computar o máximo e o mínimo de uma matriz. [m,p] = max(M) m é o máximo de M e p é a posição em que ele ocorre [m,p] = min(M) m é o míximo de M e p é a posição em que ele ocorre Em Scilab, essas funções são implementadas em paralelo, o que resulta em código mais eficiente do que a implementação usando o for 15 O que é impresso pelo programa abaixo? i=1, j=1 i=1, j=2 for i = 1:3 for j = 1:2 i=2, printf("i=%g, j=%g\n",i,j) i=2, end i=3, end i=3, j=1 j=2 j=1 j=2 16 Obter a tabuada de multiplicação: 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 // tabela de multiplicação for linha = 1:9 for coluna = 1:9 printf("%g",linha*coluna); end end Corpo do loop externo: imprime uma linha Corpo do loop interno: imprime uma coluna de uma linha Ao executar este programa verificamos entretanto que sua saída está ininteligível: 12345678924681012141618369121518212... Esquecemos de: ◦ Mudar de linha, com o \n, e ◦ Dentro de cada linha, imprimir cada valor com um número fixo de colunas // Tabuada de multiplicação for linha = 1:9 for coluna = 1:9 printf("%3g",linha*coluna); end printf("\n"); Fora do loop interno! end Produzir uma tabela como esta, com x variando de 0 a 2π, com intervalos de 0.2 x 0.0 0.2 0.4 0.6 0.8 seno(x) 0.0000 0.1987 0.3894 0.5646 0.8415 UFMG DCC001 2013-1 // Tabela da função Seno for x = 0:0.2:2*%pi printf("%g %g",x, sin(x)) end --> 0 00.2 0.1986690.4 0.3894180.6 0.5646420.8 0.7173561 0.841471 UFMG DCC001 2013-1 // Tabela da função Seno for x = 0:0.2:2*%pi printf("\n %g %g",x, sin(x)) end UFMG DCC001 2013-1 0 0 0.2 0.198669 0.4 0.389418 0.6 0.564642 0.8 0.717356 1 0.841471 1.2 0.932039 UFMG DCC001 2013-1 // Tabela da função Seno // Impressão do cabeçalho printf("\n x seno(x)") // Impressão das linhas da tabela for x = 0:0.2:2*%pi printf("\n%3.1f %7.4f",x, sin(x)) end Coefs2g.txt UFMG DCC001 2013-1 printf("\n%3.1f %7.4f",x, sin(x)) 3 colunas, 1 casa decimal 7 colunas, 4 casas decimais UFMG DCC001 2013-1 // Tabela da função Seno // Impressão do cabeçalho printf("\n x seno(x)") // Impressão das linhas da tabela xs = 0:0.2:2*%pi sinxs = sin(xs) printf("\n%3.1f %7.4f",[xs’ sinxs’]) 27 A sequência de números de Fibonacci1 é: 0 1 1 2 3 5 8 13 21 34 55 … Essa sequência tem inúmeras aplicações em matemática e computação e ocorre com frequência em fenômenos da natureza. Para saber mais, veja http://en.wikipedia.org/wiki/Fibonacci_number 28 Ladrilhamento de Fibonacci: quadrados cujos lados são números de Fibonacci. Aproximação para a espiral áurea, criada desenhando arcos circulares conectando cantos opostos de quadrados do labrilhamento de Fibonacci 1,1,2,3,5,8,13,21,34. Espiral áurea é uma espiral logaritmica cujo fator de crescimento é a razão áurea. A razão áurea é a raiz da equação x2 = x + 1 29