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, 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;
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