Baixe o app para aproveitar ainda mais
Prévia do material em texto
Comandos de Repetição Comandos de Repetição for while do-while 9 Estruturas de Controle de repetição permitem controlar a execução uma instrução, ou um conjunto de instruções/comandos, repetidas vezes, até que uma dada condição seja satisfeita. P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C 9 9 Comandos de Repetição P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Comando for Æ Deve ser usado (em geral) quando você conhece “a priori” exatamente o número de vezes (ou o número máximo de vezes) em que a(s) instrução(ões) será(ão) executada(s), ou seja, você sabe a quantidade de repetições antes do início do laço (loop), a partir do enunciado do problema; Exemplos de problemas: ¾ Obter a soma dos n primeiros números pares ou ímpares; ¾ Obter o fatorial de n, (n≥0); ¾ Obter a soma dos n primeiros números naturais; ¾ Obter os divisores de um número inteiro positivo p (p>0); ¾ Verificar se um número inteiro positivo p é primo; ¾ Verificar se um número inteiro positivo p é perfeito Comandos de Repetição P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Comandos while ou do-while)Æ É usado (em geral) em situações em que você não consegue determinar “a priori”, a partir do enunciado, o número de vezes em que a(s) instrução(ões) no interior do loop (laço) será(ão) executada(s), ou seja, o número de iterações que serão necessárias para a resolução do problema. Exemplo de um problema que vamos resolver de forma algorítmica e não sabemos “a priori” o número de vezes que uma ou mais instrução(ões) será(ão) executada(s). Quantos termos eu devo somar da Série harmônica de modo que a soma acumulada seja maior que um dado limite LIM. Em linguagem matemática 1 1 H i S LIM i ∞ = = >∑ Comandos de Repetição P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C 1 1 1 1 11 2 3 4H S LIM k n = + + + + + + + >" " expandindo a série, temos: Qual o número de iterações necessárias para resolver o problema para esses valores de LIM?LIM 0 -------------Æ 1 -------------Æ 10 -------------Æ 15 -------------Æ 16 -------------Æ 17 -------------Æ 18 -------------Æ 19 -------------Æ 1 2 12.367 1.835.421 4.989.191 13.562.027 36.865.412 100.210.581 ATENÇÃO!!! Dependendo do valor de LIM, você terá que esperar algumas horas de processamento. Além disso, poderemos ter problemas decorrentes da aritmética flutuante. Analogia entre os Comandos de Repetição P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C ... enquanto (expressão boleana) faça inicio comandos; fim proxima_instrucao; ... Pseudocódigo Linguagem C ... while ( expressão ) { comando1; comando2; comando3; comando4; ... comandon; } proxima_instrução; ... Lembre-se que na linguagem C, toda expressão diferente de 0 (zero) é verdadeira. Comandos de Repetição - while P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C ... while ( expressão ) { comando1; comando2; comando3; comando4; ... comandon; } proxima_instrução; ... Forma geral Æ Bloco de Comandos associado ao while (instruções internas). Comandos de Repetição - while P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Onde: ¾ Observe que a condição de terminação do comando while, ocorre no início do laço. Isso significa que esse comando é capaz de executar zero vezes; ¾ comando1, comando2, ..., comandon: podem ser quaisquer comandos da linguagem; ¾ expressão: pode ser qualquer expressão válida em C (expressão aritmética, lógica, variável, constante). Muitas vezes, expressão também é referenciada por condição de terminação do laço (loop); ¾ Pelo menos um dos comandos no interior do bloco de instruções associados ao comandos while, deve alterar a condição de terminação de forma consistente, garantindo que o laço seja finito; ¾ Os comandos de 1 a n serão executados enquanto expressão for verdadeira (qualquer valor diferente de zero); ¾ Quando expressão for avaliada e o resultado for falso (igual a zero), então, a proxima_instrução, após o laço while, será executada. P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Exemplos de trechos de códigos Comandos de Repetição - while ... i = 1; while ( i <= 20 ) { printf(‘\n Valor de i = %d’, i); i = i + 3; } printf(‘\n Acabei de sair do Laço While’); ... Valor de i = 1 Valor de i = 4 Valor de i = 7 Valor de i = 10 Valor de i = 13 Valor de i = 16 Valor de i = 19 Acabei de sair do Laço While Saída correspondente a execução do código acima. P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Os códigos abaixo com o comandos while e for, produzem os mesmos resultados lógico. ... i = 1; while ( i <= 20 ) { printf(‘\n Valor de i = %d’, i); i = i + 3; } printf(‘\n Acabei de sair do Laço While’); ... ... for (i = 1; i <= 20; i = i+3) printf(‘\n Valor de i = %d’, i); printf(‘\n Acabei de sair do Laço While’); ... Comandos de Repetição - while P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C ... i = 1; while( i <= n ){ s = s + i; // s += i; i = i + 1; // i++; } proxima_instrucao; ... ... for (i=1; i <= n; i++) s Å s + i; proxima_instrucao; ... Os códigos abaixo com o comandos while e for, produzem os mesmos resultados lógicos. Comandos de Repetição - while P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Exemplo de código: Problema anterior da Série Harmônica, resolvido com o comando while. #include <stdio.h> #include <stdlib.h> #define STR1 “\n\n Introduza um valor real: “ #define STR2 “\n\n O número de termos necessários é: %d” int main(void){ int cont=0; //contagem do número de termos somados double soma = 0.0, limite; printf(STR1); scanf(“%lf”,&limite); //Leitura de um valor real (double) while (soma <= limite){ cont++; soma = soma + 1.0/(double)cont; } // while printf(STR2,cont); system(“pause”); return(0); } Comandos de Repetição - while Comandos de Repetição – do-while P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C ... do { comando1; comando2; comando3; comando4; ... comandon; } while( expressão ); proxima_instrução; ... Forma geral Æ Onde: ¾ Como expressão (condição de terminação) está no final do laço, este comando executa o bloco de instruções internas pelo menos uma vez. Assim, você deve garantir que a consistência dessas operações (correção dos resultados); ¾ Os comandos no interior do bloco de instruções do laço do-while são executados, enquanto o valor da expressão for verdadeira; ¾ As demais observações já feitas para o comando while, valem também para este comando Bloco de comandos associado ao do-while (instruções internas). Comandos de Repetição do-while P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Se app é uma boa aproximação para , então ( ) / 2x app app + é melhor ainda. x Você saberia dizer “a priori” o número de iterações necessárias para resolver o problema com uma boa aproximação? Problema: Dado um número real positivo x≥0, determinar usando a relação abaixo. Compare o resultado obtido com a função primitiva sqrt(x) da biblioteca <math.h>. x P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Comandos de Repetição do-while Se app é uma boa aproximação para , então ( ) / 2x app app + é melhor ainda. x Análise básica do problema: \0 1 0 1 x app app app app app P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Comandos de Repetição do-while Vamos analisar a condição de terminação,ou seja, até quando eu devo continuar com minhas aproximações? Em outras palavras, quando eu devo parar. Análise básica do problema: x app≅ 2| |x app eps− < 2 0x app− ≅ 2x app≅ 10 , 6 12.(suficientemente pequeno)neps n−= ≤ ≤ P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Comandos de Repetição #include <stdio.h> #include <stdlib.h> #include <math.h> // fabs() e sqrt() #define ERRO 1.0E-06 //0.000001 int main(void) { double x, app = 1.0; printf('Introduza um valor real positivo: '); scanf(“%lf”,&x); if ( x >= 0) { // garantindo entrada positivo (raiz quadrada) while ( fabs(x - app*app) >= ERRO ) app = (x/app + app)/2.0; printf('\n\nRaizQuadrada(%15.12lf) = %15.12lf\n\n',x,app); printf('\n\n SQRT(%15.12lf) = %15.12lf \n\n',x, sqrt(x)); } else fprintf('Erro de Entrada!!!'); } Uso do comando while para resolver o problema da raiz quadrada. P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Comandos de Repetição #include <stdio.h> #include <stdlib.h> #include <math.h> // fabs() e sqrt() #define ERRO 1.0E-06 //0.000001 int main(void) { double x, app = 1.0; printf('Introduza um valor real positivo: '); scanf(“%lf”,&x); if ( x >= 0) { // garantindo x positivo (raiz quadrada) do app = (x/app + app)/2.0; while ( fabs(x - app*app) >= ERRO ); printf('\n\nRaizQuadrada(%15.12lf) = %15.12lf\n\n',x,app); printf('\n\n SQRT(%15.12f) = %15.12f \n\n',x, sqrt(x)); } else fprintf('Erro de Entrada!!!'); } Uso do comando do-while para resolver o problema da raiz quadrada. Comandos de Repetição P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Observações : Æ A linguagem de programação C possui três comandos de repetição. Dependendo da situação, pode ser mais adequado utilizar um ou outro, mas na verdade, sempre é possível reescrever o código, utilizando um outro comando de repetição; Æ Reescreva o problema da Série Harmônica trabalhado nos slides anteriores, utilizando os comandos de repetição for e do-while; Æ Os comandos break e continue quando executados no interior do bloco de instruções associado aos comandos while e do-while, produzem os mesmos efeitos que os já discutidos quando falamos do comando de repetição for; Exercícios P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C 01) Reescreva em C, todos os exemplos desenvolvidos em pseudocódigo usando o comando enquanto-faça; 02) 02) Elabore programas em C associados aos exercícios (problemas) da Lista 01; P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C Certamente que você já se perguntou se não seria possível, repetir a execução de um programa várias vezes, sem a necessidade de compilá-lo novamente, ou clicar sobre o respectivo executável. Comandos de Repetição do-while Um uso muito comum para resolver o problema acima é por meio do comando de repetição do-while, através do seguinte código: ... int main(void){ do{ .... //instruções do seu programa do { // lendo somente os caracteres aceitáveis system("cls"); //limpeza da tela printf("Deseja continuar executando? <S,N>: "); ch = getchar(); } while( (ch != 'S')&&(ch != ‘s’)&&(ch != 'N’)&&(ch != ‘n’) ); if ( (ch =='S‘) || (ch==‘s’) ) i=1; else i=0; } while(i); ... Desafios Adicionais P r o f . P i t e r i - 5 ª A u l a – L i n g u a g e m C A idéia anterior pode ser aplicada para encontrarmos a raiz cúbica de um número real qualquer (lembre-se que raízes cúbicas podem ser negativas), sabendo-se que: A exemplo do programa da raiz quadrada, compare os resultados obtidos de seu código, com a função primitiva pow(a, 0.333333333333333) da biblioteca <math.h>. Defina uma constante para representar o valor 0.333333333333333. Se app é uma boa aproximação para , então 2( 2 ) / 3 x app app + é melhor ainda. 3 x
Compartilhar