Capítulo 5: Repetições INF1004 e INF1005 Programação 1 Pontifícia Universidade Católica Departamento de Informática Construção de Laços Repetição: Diversos problemas de difícil solução podem ser resolvidos numericamente por um computador se dividido em partes. Acumulando o resultado de pequenas computações, podemos chegar à solução do problema como um todo. Precisamos de mecanismos de programação que nos permitam requisitar que um conjunto de instruções seja repetidamente executado, até que uma determinada condição seja alcançada. REPETIÇÕES SÃO PROGRAMADAS ATRAVÉS DA CONSTRUÇÃO DE LAÇOS (OU CICLOS). 1
Construção de Laços: o comando while Em C, uma das formas de se trabalhar com repetições é através do comando while. while(_expressao_booleana) { _bloco_de_comandos_ Enquanto uma determinada _expressão_booleana_ for verdadeira, o _bloco de comandos_ é executado! Depois, a execução procede nos comandos subsequentes ao bloco while. Imprimir 100 números: 0 a 99 #include <stdio.h> int main(void) { int x = 0; while(x < 100){ printf("%d\n", x); x++; 2
Fatorial de um número não-negativo Fatorial de um número não-negativo. int fatorial(int n) { int f = 1; while(n > 1){ f = f * n; n = n 1; return f; Cálculo do MDC entre dois números inteiros positivos MDC (máximo divisor comum entre dois números inteiros positivos usando o algoritmo de Euclides) MDC entre 42 e 24: MDC entre 42 e 23: x = 42, y = 24 Na etapa seguinte o y passa a ser x e o resto passa a ser y. O processo se repete até que o resto da divisão seja 0. e o valor em y é o MDC desejado 3
Cálculo do MDC entre dois números inteiros positivos int mdc(int x, int y) { int r = x%y; while(r!= 0){ x = y; y = r; r = x%y; return y; Verificar se um Número é Primo determinar se um dado número inteiro positivo é ou não primo. Como se sabe, um número é dito primo se for divisível apenas pelo número 1 e pelo próprio número, sendo que 1 não é primo (2 é o primeiro número primo) /* retorna 0 se n nao for primo, 1 se for)*/ int primo(int n) { int i; if (n<2) i=2; while(i<n) { if (n%i == 0) i++; return 1; 4
Imprimir o n-ésimo termo da Série de Fibonacci /* retorna o n-esimo termo da serie de fibonacci */ int fibonacci(int n) { if (n <=2) { return (n-1); else { int a = 1; /* primeiro termo */ int b = 1; /* segundo termo */ int c; /* termo atual */ int cont = 3; while(cont <=n) { c = a+b; a = b; b = c; cont++; return c; Construção de Laços: o comando for Usando o comando for que é equivalente ao comando while sendo que com uma sintaxe mais compacta. Sintaxe: for(_expr_inicial; _expr_booleana; _expr_atualizacao) { _bloco_de_comandos_ 5
Imprimir 100 números: 0 a 99 imprimir na tela os valores de 0 a 99: #include <stdio.h> int main(void) { int x = 0; while(x < 100){ printf("%d\n", x); x++; #include <stdio.h> int main(void) { int x; for(x=0;x<100;x++){ printf("%d\n", x); Fatorial de um número não-negativo Na prática, uma das vantagens do comando for é que escrevemos a expressão de atualização logo no início da construção. Com o comando while, muitas vezes o programadores acabam esquecendo de escrever a expressão de atualização, criando um laço infinito. Exercício: escrever o fatorial usando for: int fatorial (int n) { int i; int f = 1; for(i=2; i<=n; i++) { f = f * i; return f; 6
Cálculo do MDC entre dois números inteiros positivos int mdc(int x, int y) { int r; for(r=x%y; r!=0; r = x%y) { x=y; y=r; return y; Verificar se um Número é Primo determinar se um dado número inteiro positivo é ou não primo. Como se sabe, um número é dito primo se for divisível apenas pelo número 1 e pelo próprio número, sendo que 1 não é primo. #include <stdio.h> int primo(int n){ int i; if (n <2) for (i=2;i<n;i++) { if (n%i == 0) return 1; 7
Imprimir o n-ésimo termo da Série de Fibonacci Repetição com Teste no Final while e for: avaliam a expressão booleana que controla a execução do bloco de comandos no início do laço. A linguagem C oferece uma terceira construção de laços através do comando do-while: A expressão booleana é avaliada no final do laço. Isso significa que o bloco de comandos é avaliado pelo menos uma vez! 8