Métodos de Programação I Departamento de Matemática, FCTUC 43 2005/06 Ciclo com Contador : instrução for for identificador de variável := downto to expressão expressão do instrução UMA INSTRUÇÃO (SIMPLES OU COMPOSTA) Neste caso o ciclo é repetido um número fixo de vezes, o que não acontecia com as estruturas anteriores. Naquelas, o número de repetições dependia da avaliação da cabeça do ciclo e, por isso, será, em princípio, desconhecido (o que pode ser muito útil). Mas, por vezes, queremos repetir exactamente N vezes as instruções, independentemente de qualquer outro factor, temos, para esse efeito, o ciclo for. Esta estrutura usa um contador do número de repetições com duas variantes: - incremento sucessivo de uma unidade - decremento “ “ “ “ A implementação da operação factorial (factorial de n, sendo n um número natural: n!) é um bom exemplo destas duas variantes: n! = 1x 2 x 3 x 4. … (n-1) n incrementa uma unidade factorial := 1; for i := 1 to n do factorial := factorial * 1; n! = n (n-1) … 4 x 3 x 2 x 1 decrementa uma unidade factorial := 1; for i := n downto 1 do factorial := factorial * 1; De notar que, o identificador de variável (contador) e as expressões têm que ser do mesmo tipo: literais não reais. Outros Exemplos: 1. Vamos implementar um programa que calcule o valor uma soma com k (dado) termos da seguinte série infinita de termos (Série Harmónica): 1 + 1/2+ 1/3 + 1/4+ 1/5 + . . . + 1/k Métodos de Programação I Departamento de Matemática, FCTUC 2005/06 Estratégia: Cada número, Hk, é obtido somando ao número anterior, Hk-1, a quantidade 1/k. Assim, basta usar um ciclo para implementar a fórmula iterativa: soma ← soma + 1/i para i a variar de 1 até k (dado). Descrição do algoritmo: ler k soma ← 0 inicialização para n a variar de 1 até k cabeça do ciclo soma ← soma + 1/n corpo do ciclo Implementação: program harmonica (input, output); var kfinal, n : 1 .. maxint; soma : real; begin read( kfinal ); soma := 0; for n := 1 to kfinal do soma := soma + 1/n ; writeln (‘ Soma de ‘, k:3, ‘ termos = ‘, soma) end. Figura 2.10: programa para somar termos da série harmónica 2. Programa para construir pirâmides de números. Por exemplo, para n=5, o efeito deverá ser: 1 121 12321 1234321 123454321 Vamos supôr que cada linha do monitor pode representar 120 caracteres. Então temos, 44 Métodos de Programação I Departamento de Matemática, FCTUC 45 2005/06 Descrição do algoritmo: ler n para cada linha i de 1 até n escrever (60 - i) vezes espaço em branco para k de 1 até i escrever k para k de (i - 1) até 1 escrever k mudar de linha Implementação: program piramide (input, output); varn, i, k : 1 .. maxint; begin read( n ); for i := 1 to n do (* para cada linha *) begin for k := 1 to 60 - i do write(‘ ‘); for k := 1 to i do write(k:1); for k := i -1 downto 1 do write(k:1); writeln (* muda de linha *) end; end. Figura 2.11: programa para construir uma pirâmide de números NOTA: for k := 1 to 60 - i do write(‘ ‘) é equivalente a write( ‘ ‘ :60-i) 3. Procurar o máximo e o mínimo de uma sequência de N inteiros (não necessariamente ordenados) Estratégia: Dado N, o primeiro número lido é o máximo e o mínimo até este momento; para um novo número lido,: se for menor que o anterior mínimo, actualizar valor de mínimo se for maior que o anterior máximo, actualizar valor de máximo. Métodos de Programação I Departamento de Matemática, FCTUC 46 2005/06 Descrição do algoritmo: ler n ler número máximo ← mínimo ← número número o primeiro número é, simultaneamente, o máximo e o mínimo para k de 1 a (n-1) ler número se número > máximo máximo ← número se número < mínimo mínimo ← número escrever máximo e mínimo Implementação: program max_min (input, output); var n, k : 1 .. maxint; numero, maximo, minimo : real; begin write( ‘Quantos numeros tem a sequencia? ‘ ); readln( n ); writeln( ‘Escreva os numeros separados por um espaco.’); read( maximo ); (* o primeiro numero e’maximo e minimo *) minimo := maximo; for k := 1 to n-1 do (* ler e testar os proximos numeros *) begin read(numero); if numero > maximo then maximo := numero; if numero < minimo then minimo := numero; end; writeln( ‘Maximo = ‘, maximo:2, ‘ Minimo = ‘, minimo:2); end. Figura 2.12: programa para encontrar o máximo e o mínimo de uma série de números