INF1004/INF1005 – Programação 1 Capítulo 05: Repetições 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 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições 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. Exemplo: Imprimir 100 números: 0 a 99 #include <stdio.h> int main(void) { int x = 0; while(x < 100){ printf("%d\n", x); x++; } return 0; } 2 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições Exemplo: Fatorial de um número não-negativo Exemplo: 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; } Exemplo: Cálculo do MDC entre dois números inteiros positivos Exemplo: MDC (máximo divisor comum entre dois números inteiros positivos usando o algoritmo de Euclides) MDC entre 42 e 23: MDC entre 42 e 24: 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 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições Exemplo: 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; } Exemplo: Verificar se um Número é Primo Exemplo: 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) return 0; i=2; while(i<n) { if (n%i == 0) return 0; i++; } return 1; } 4 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições Exemplo: 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 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições Exemplo: Imprimir 100 números: 0 a 99 Exemplo: imprimir na tela os valores de 0 a 99: #include <stdio.h> #include <stdio.h> int main(void) { int x = 0; while(x < 100){ printf("%d\n", x); x++; } return 0; } int main(void) { int x; for(x=0;x<100;x++){ printf("%d\n", x); } return 0; } Exemplo: 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 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições Exemplo: 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; } Exemplo: Verificar se um Número é Primo Exemplo: 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) return 0; for (i=2;i<n;i++) { if (n%i == 0) return 0; } return 1; } 7 INF1004/INF1005 – Programação 1 Capítulo 05: Repetições Exemplo: 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