INF1005: Programação 1 Repetições 08/03/10 (c) Paula Rodrigues 1 Tópicos Principais • • • • Construção de Laços com while Algoritmos com Repetição Construção de Laços com for Repetição com Teste no Final 08/03/10 (c) Paula Rodrigues 2 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). Construção de Laços • Em C, uma das formas de se trabalhar com repetições é através do comando while. 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++; } return 0; } Computar nota de n alunos float maior_valor(float a, float b) { if (a>=b) return a; else return b; } float media_nums(float a, float b) { return (a+b)/2.0; } int main(void) { int n_alunos; float P1, P2, P3; float media; int i=1; printf("Entre com o numero de alunos:"); scanf("%d", &n_alunos); while(i<=n_alunos) { printf("Entre com a nota da P1 do aluno %d:", i); scanf("%f", &P1); printf("Entre com a nota da P2 do aluno %d:", i); scanf("%f", &P2); media = media_nums(P1, P2); if ((media >=5.0) && (P1>=3) && (P2>=3.0)){ printf("Aluno %d aprovado por media com media = %.2f\n", i, media); }else { printf("Entre com a nota da P3 do aluno %d:", i); scanf("%f", &P3); P1 = maior_valor(P1,P2); media = media_nums(P1, P3); if (media >=5.0) printf("Aluno %d aprovado por P3 com media = %.2f", i, media); else printf("Aluno %d reprovado com media = %.2f", i, media); } i++; } } Fatorial de um número não-negativo • Exemplo: Fatorial de um número não-negativo. Algoritmos com Repetição • Exemplo: 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 Algoritmos com Repetição 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, 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; } 1 se for)*/ 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; } } Avaliação de Séries • Exemplo: algoritmo adicional avaliar o valor de pi. O número pi pode ser dado a partir do calculo da serie: Avaliação de Séries float pow_1(int n) { if (n%2 ==0) return 1.0; else return -1.0; } float valor_pi(int n) { int i; float soma = 0.0; i = 0; while(i<n) { soma = soma + (pow_1(i)/(2*i+1)); i++; } return 4*soma; } Exercícios • Escreva um programa em C que calcule e imprima o produto dos inteiros mpares de 1 a 15. • Escreva um programa em C que recebe um numero n como entrada, com n > 0. Seu programa deve imprimir, como sada, os divisores de n. • Escreva um programa em C para calcular a media de n valores reais entrados via teclado. Inicialmente, deve-se capturar o numero de valores n que serão fornecido. Em seguida, usando um comando de repeticão, o programa deve capturar os valores reais e exibir, ao final, a media calculada. Construção de Laços (cont.) • Usando o comando for – que é equivalente ao comando while sendo que com uma sintaxe mais compacta. • Sintaxe: Construção de Laços • Exemplo: imprimir na tela os valores de 0 a 99: Construção de Laços • 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: MDC usando FOR int mdc(int x, int y) { int r; for(r = x%y; r!=0; r = x%y) { x=y; y=r; } return y; } Número Primo usando FOR • 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; } Série de Fibonacci usando FOR Avaliação de Séries • Exemplo: algoritmo adicional avaliar o valor de pi. O número pi pode ser dado a partir do calculo da serie: Avaliação de Séries • Nossa função pode receber como parâmetro o número de termos da série, n, que se deseja usar na avaliação. – Para melhor visualizar a implementação da função, podemos reescrever a serie acima como um somatório: Avaliação de Séries 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! Repetição com Teste no Final Referências Waldemar Celes e Roberto Ierusalimschy, Apostila de Programação (disponível para download no site da disciplina) • Capítulo 5 – Repetições 26