Linguagem C LPG-I – Estruturas de Repetição Prof. Flavio Marcello http://www.joinville.udesc.br/portal/professores/flavio/ Linguagem C ESTRUTURA DE REPETIÇÃO – Repetição com Teste no Início – Repetição com Teste no Final – Repetição Contada Estrutura de Repetição Permite que uma seqüência de comandos seja executada repetidamente até que uma determinada condição de interrupção seja satisfeita. São de 3 Tipos: while do ... while for Estrutura com Teste no Início Fluxograma while .F. condição .V. Estrutura com Teste no Início (while) A variável de controle é iniciada antes do Enquanto; A variável de controle é incrementada dentro do Enquanto. Enquanto o resultado da condição é verdadeiro (!=0, 1) executa repetidamente um conjunto de instruções. Sintaxe: while (<condição>) { <Comando_1>; ... <Comando_N>; } Loop Se no primeiro teste da condição resultado for FALSO, os comandos dentro do loop NÃO serão executados NEM uma vez. while Exemplo 1: Encontrar o menor dentre um conjunto de 05 valores digitados. // ALGORITMO EncontraMenor_em5 #include <stdio.h> Então ela foi inicializada antes. int qtdenumlidos, num, menor; main () { printf (“Algoritmo Encontrar Menor Valor num conjunto de 05 valores”); prinf (“Digite 1º Valor: ”); scanf (“%i”, &num); menor = num; qtdenumlidos = 1; while (qtdenumlidos < 5) { printf (“Digite novo Valor: ”); A variável de controle deve ter um valor conhecido. scanf (“%i”, &num); if (num < menor) menor = num; qtdenumlidos = qtdenumlidos + 1; } A variável de controle deve ter seu valor modificado dentro do “laço”. Neste caso a variável foi incrementa em 1 printf (“Menor Valor Encontrado: %i ”, menor); } while Sãolernecessários Exemplo 3: Desenvolver um algoritmo para um conjunto de valores correspondentes aos pontos que 3alunos obtiveram em contadores um teste. Quando o valor fornecido for um número negativo, isto é um sinal que não existem mais pontos para serem lidos. Contar e escrever quantos alunos fizeram o teste. Contar e escrever quantos alunos tiveram nota baixa (PONTOS < 50) Contar e escrever quantos alunos tiveram nota alta (100PONTOS 150) #include <stdio.h> #include <conio.h> // Programa Estatistica_de_Testes int NUM,ALTAS,BAIXAS,PONTOS; void main () { NUM = 0; ALTAS = 0; BAIXAS = 0; printf ("FORNECA OS PONTOS OBTIDOS: "); scanf ("%i", &PONTOS); while (PONTOS > 0) { if ((PONTOS >= 100) && (PONTOS <= 150)) ALTAS = ALTAS+1; if (PONTOS < 50) BAIXAS = BAIXAS+1; NUM = NUM + 1; printf ("PONTOS: "); scanf ("%i", &PONTOS); } printf ("NUMERO DE NOTAS: %i", NUM); printf ("NUMERO DE NOTAS ALTAS: %i", ALTAS); printf ("NUMERO DE NOTAS BAIXAS:%i", BAIXAS); getch (); } Contadores Inicializados com ZERO while Exemplo 3: Desenvolver algorítmo para ler um conjunto de valores correspondentes aos pontos que alunos obtiveram em um teste. Quando o valor fornecido for um número negativo, isto é um sinal de que não existem mais pontos para serem lidos. Contar quantos alunos fizeram o teste; Escrever o media de pontos de alunos. // Algoritmo Contagem_Pontos_Alunos #include <stdio.h> #include <conio.h> int PONTOS_Teste; float SOMA_Ptos, NUM_Alunos; void main () { printf ("Algoritmo Contagem de Pontos dos Alunos"); NUM_Alunos dever ser zerado NUM_Alunos = 0; SOMA_Ptos = 0; antes do Enquanto printf ("PONTOS: "); scanf ("%i", &PONTOS_Teste); e então incrementado em 1 dentro do while (PONTOS_Teste > 0) { Laço de repetição NUM_Alunos = NUM_Alunos + 1; SOMA_Ptos = SOMA_Ptos + PONTOS_Teste; printf ("PONTOS: "); scanf ("%i", &PONTOS_Teste); } printf ("TOTAL DE ALUNOS: %i ", NUM_Alunos); if (NUM_Alunos > 0) printf ("Media de Pontos: %f ", SOMA_Ptos / NUM_Alunos); getch(); } Estrutura com Teste no Final Fluxograma do … while C1 ... C2 Cn .V. condição .F. Estrutura c/ Teste no Final (do … while) Semelhante ao while, porém, a condição é testada ao final do laço, então os comandos dentro do laço são executados pelo menos 1 vez. Enquanto que o resultado da condição for verdadeiro (!=0 , 1) executa-se um conjunto de instruções. Sintaxe: do { <Comando_1>; ... <Comando_N>; } while (<condição>); do … while Exemplo 1: Desenvolver algoritmo que permita a leitura de numeros positivos e acumule seu somatório, imprimindo o resultado no final. #include <stdio.h> #include <conio.h> //ALGORITMO SomaPositivos int numero, soma; void main () { soma = 0; printf ("Programa para somar N valores positivos"); do { printf ("Digite um valor: "); scanf ("%i", &numero); if (numero > 0) soma = soma + numero; } while (numero > 0); printf ("Soma dos Valores: %i", soma); getch (); } do … while Exemplo 2: Desenvolver um algoritmo para escrever os 05 primeiros múltiplos de 13. Variáveis Loop Condição num cont vezes cont < vezes ? ? ? ? ... ... ... ... 13 0 5 ? 26 1 5 .V. 39 2 5 .V. 52 3 5 .V. 65 4 5 .V. 78 5 5 .F. Loop Monitor //Programa Azarao #include <stdio.h> int num, cont, vezes; main () { num = 13; cont = 0; vezes = 5; do { printf ("%i ", num); num = num +13; cont = cont +1; } while (cont < vezes); } Estrutura de Repetição Contada Fluxograma for .F. Início , Cond., Incr. .V. Comando Estrutura de Repetição Contada (for) A variável de controle é iniciada da estrutura; A variável de controle é incrementada dentro da estrutura. Para o resultado da condição verdadeiro (!=0, 1) executa-se um conjunto de instruções. Então, neste tipo de estrutura manipulam-se automaticamente todos os detalhes da repetição controlada por contador. Sintaxe: for (<inicialização> ;<condição>; <incremento>) { <Comando_1>; ... <Comando_N>; } for Exemplo 1: Desenvolver algoritmo que permita imprimir os números de 1 a 5. #include <stdio.h> Condição main () { int cont; for (cont = 1; cont <= 5; cont = cont +1) { printf (“%i\n”, cont); } Loop } cont cont <= 5 ? ? ... ... 1 ? 1 .V. 2 .V. 2 .V. ... ... 6 .F. Passo1 - Inicializa a variável de controle. Passo3 - Incrementa variável de controle; retorna ao Passo2. Monitor Passo2 - Testa a condição, de for verdadeira executa o conjunto de instruções, caso contrário encerra loop. Comparativo: (for) X (while) for int i, N, Valor,Soma=0; scanf ("%i",&N); for(i= 0; i<N; i++) { scanf ("%i", &Valor); Soma = Soma + Valor; } while int i, N, Valor,Soma=0; scanf ("%i",&N); i = 0; while (i < N) { scanf ("%i", &Valor); Soma = Soma + Valor; i = i + 1; } Qual Estrutura Usar ??? for Sabe-se o número de repetições while Não sabe-se o número exato de repetições Não sabe-se o número de repetições, executando pelo menos uma vez. do ... while Toda estrutura while pode ser convertida para do...while e vice-e-versa; Toda estrutura for pode ser convertida em while, mas nem toda estrutura while pode ser convertida em for. Exercício 1 Fazer um algoritmo para ler 2 valores e executar uma das seguintes operações matemáticas, de acordo com a escolha do usuário: - 1 – soma, - 2 – subtração, - 3 – multiplicação - 4 – divisão. Exercício 2 Em uma corrida de automóveis com N voltas, foram anotados os tempos, em ordem, de um piloto a cada volta. Fazer um programa que dê o melhor e o pior tempo e em que volta aconteceram. Exercícios Propostos 01. Faça um Algoritmo para calcular o fatorial de 5, faça outro algoritmo para calcular o fatorial de um valor digitado pelo usuário. 02. Faça o algoritmo para calcular o n-ésimo termos da série de Fibonacci. A série de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... . 03. Quanto vale k no fim do seguinte procedimento (exemplo10)? k = 0; para (i 0; i <=2; i i+1) { para (j i; j<=2; j j+1) { k k + 1; K=6 } } 04. Escreva um algoritmo que lê 5 valores para A, um de cada vez, escrevendo, ao final, quantos destes valores são negativos. 05. Dado um conjunto de n notas de alunos, contar o número de alunos que foram aprovados. Considera-se aprovado o aluno que obteve nota igual ou maior que 5.0 06. Fornecer a média aritmética simples das n notas de um aluno, indicando também sua situação final (média>=9 excelente, média>=7 bom, média>=5 regular, média<5 insuficiente). Desafio A prefeitura de uma cidade fez uma pesquisa entre seus habitantes, coletando dados sobre o salário e número de filhos. A prefeitura deseja saber: Média do salário da população; Média do número de filhos; Maior salário; Percentual de pessoas com salário até R$ 100,00. O final da leitura de dados se dará com a entrada de um salário negativo. FIM Exercício 1 Fazer um algoritmo para ler 2 valores e executar uma das seguintes operações matemáticas, de acordo com a escolha do usuário: - 1 – soma, - 2 – subtração, - 3 – multiplicação - 4 – divisão. // Algoritmo Múltipla_Escolha Versao 01 #include <stdio.h> main () { float A, B, X; int Op; Op = 0; printf ("Programa Calculadora (Operacoes entre 2 valores) "); printf ("\nEntre com o valor de A: "); scanf ("%f", &A); printf ("\nEntre com o valor de B: "); scanf("%f", &B); do { printf ("\n1. Soma"); printf ("\n2. Subtração"); printf ("\n3. Multiplicação"); printf ("\n4. Divisão"); printf ("\nOpção (1 a 4): "); scanf ("%i", &Op); } while ((Op < 1) || (Op > 4)); if (Op == 1) { X = A + B; printf ("X = %.2f", X); } else if (Op == 2) { X = A - B; printf ("X = %.2f", X); } else if (Op == 3) { X = A * B; printf ("X = %.2f", X); } else if ( B != 0) { X = A / B; printf ("X = %.2f", X); } } // Algoritmo Múltipla_Escolha Versao 02 #include <stdio.h> main () { float A, B, X; int Op; Op = 0; printf ("Programa Calculadora (Operacoes entre 2 valores) "); printf ("\nEntre com o valor de A: "); scanf ("%f", &A); printf ("\nEntre com o valor de B: "); scanf("%f", &B); do { printf ("\n1. Soma"); printf ("\n2. Subtração"); printf ("\n3. Multiplicação"); printf ("\n4. Divisão"); printf ("\nOpção (1 a 4): "); scanf ("%i", &Op); } while ((Op < 1) || (Op > 4)); switch (Op){ case 1: { X = A + B; printf ("\nX = %.2f", X); break; } case 2: { X = A - B; printf ("\nX = %.2f", X); break; } case 3: { X = A * B; printf ("\nX = %.2f", X); break; } case 4: { if ( B != 0) { X = A * B; printf ("\nX = %.2f", X); break; } } } } Exercício 2 Em uma corrida de automóveis com N voltas, foram anotados os tempos, em ordem, de um piloto a cada volta. Fazer um programa que dê o melhor e o pior tempo e em que volta aconteceram. #include <stdio.h> //ALGORITMO CorridaAutomovel; int num_voltas, conta_volta, melhor_volta, pior_volta; float tempo_volta, melhor_tempo, pior_tempo; main () { printf ("Entre com o numero total de voltas da corrida: "); scanf ("%i", &num_voltas); printf ("Entre com 1o tempo: "); scanf ("%f", &tempo_volta); conta_volta = 1; melhor_volta = 1; melhor_tempo = tempo_volta; pior_volta = 1; pior_tempo = tempo_volta; while (conta_volta < num_voltas) { conta_volta = conta_volta +1; printf (“\nEntre com %io tempo : “, conta_volta +1); scanf ("%f", &tempo_volta); if (tempo_volta > pior_tempo) { pior_tempo = tempo_volta; pior_volta = conta_volta; } if (tempo_volta < melhor_tempo) { melhor_tempo = tempo_volta; melhor_volta = conta_volta; } } printf (“\nMelhor volta = %i com tempo = %.4f", melhor_volta, melhor_tempo); printf (“\nPior volta = %i com tempo = %.4f", pior_volta, pior_tempo); } #include <stdio.h> //ALGORITMO CorridaAutomovel; int num_voltas, conta_volta, melhor_volta, pior_volta; float tempo_volta, melhor_tempo, pior_tempo; main () { printf ("Entre com o numero total de voltas da corrida: "); scanf ("%i", &num_voltas); printf ("Entre com 1o tempo: "); scanf ("%f", &tempo_volta); melhor_volta = 1; melhor_tempo = tempo_volta; pior_volta = 1; pior_tempo = tempo_volta; for (conta_volta 2; conta_volta <= num_voltas; conta_volta = conta_volta +1) { printf (“\nEntre com %io tempo: “, conta_volta); scaf ("%f", &tempo_volta); if (tempo_volta > pior_tempo) { pior_tempo = tempo_volta; pior_volta = conta_volta; } if (tempo_volta < melhor_tempo) { melhor_tempo = tempo_volta; melhor_volta = conta_volta; } } printf (“\nMelhor volta = %i com tempo = %.4f", melhor_volta, melhor_tempo); printf (“\nPior volta = %i com tempo = %.4f", pior_volta, pior_tempo); } Exercícios Propostos 01. Faça um Algoritmo para calcular o fatorial de 5, faça outro algoritmo para calcular o fatorial de um valor digitado pelo usuário. 02. Faça o algoritmo para calcular o n-ésimo termos da série de Fibonacci. A série de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... . 03. Quanto vale k no fim do seguinte procedimento (exemplo10)? k = 0; for (i = 0; i <=2; i = i+1) { for (j = i; j<=2; j = j+1) { k = k + 1; K=6 } } 04. Escreva um algoritmo que lê 5 valores para A, um de cada vez, escrevendo, ao final, quantos destes valores são negativos. 05. Dado um conjunto de n notas de alunos, contar o número de alunos que foram aprovados. Considera-se aprovado o aluno que obteve nota igual ou maior que 5.0 06. Fornecer a média aritmética simples das n notas de um aluno, indicando também sua situação final (média>=9 excelente, média>=7 bom, média>=5 regular, média<5 insuficiente). Desafio A prefeitura de uma cidade fez uma pesquisa entre seus habitantes, coletando dados sobre o salário e número de filhos. A prefeitura deseja saber: Média do salário da população; Média do número de filhos; Maior salário; Percentual de pessoas com salário até R$ 100,00. O final da leitura de dados se dará com a entrada de um salário negativo. Exercícios Proposto 01a //ALGORITMO Fatorial #include <stdio.h> #include <conio.h> int fat, n, i; main () { n = 5; fat = 1; for (i = 2; i <= n; i++ ) fat = fat * i; printf ("Fatorial de %i: %i", n, fat); getch(); } Exercícios Proposto 01b //ALGORITMO Fatorial #include <stdio.h> #include <conio.h> int fat, n, i; main () { printf ("Digite o numero para calcular Fatorial: "); scanf("%i", &n); fat = 1; for (i = 2; i <= n; i++ ) fat = fat * i; printf ("\nFatorial de %i: %i", n, fat); getch(); } Exercícios Proposto 02 //ALGORITMO Fibonacci #include <stdio.h> #include <conio.h> main () { int antes, atual, aux, n; antes = 0; atual = 1; printf ("Total de termos: "); scanf ("%i", &n); while (n > 0) { printf ("%i ", atual); aux = atual; atual = atual + antes; antes = aux; n = n-1; } getch(); } Exercícios Proposto 04 //Algoritmo Quantos_Negativos #include <stdio.h> #include <conio.h> main () { float A; int i, N = 0; for (i = 0; i < 5; i++) { printf("Digite o %i numero: ",i+1); scanf("%f", &A); if (A < 0) N = N + 1; } printf ("Número de valores negativos = %i", N); getch(); } Desafio #include <stdio.h> #include <conio.h> main () { float sal, media_sal, media_filhos, maior_sal, soma_sal100, perc_sal100, soma_sal; int filhos, soma_filhos, sal100, contador; sal = 0; soma_sal = 0; maior_sal = 0; soma_filhos = 0; contador = 0; sal100 = 0; while (sal >= 0) { printf ("Salario da familia R$ "); scanf ("%f", &sal); if ( sal >= 0){ printf ("Nro de filhos: "); scanf ("%i", &filhos); soma_sal = soma_sal + sal; soma_filhos = soma_filhos + filhos; contador = contador + 1; if (sal > maior_sal) { maior_sal = sal; } ... ... if (sal <= 100) { sal100 = sal100 + 1; // soma_sal100 = soma_sal100 + sal; } } } if (contador > 0) { media_sal = (float) soma_sal / contador; media_filhos = (float) soma_filhos / contador; perc_sal100 = (float)(sal100 * 100) / contador; } else media_sal=media_filhos=perc_sal100=0; printf ( "\nMedia do salario da populacao R$ %.2f", media_sal); printf ( "\nMedia do numero de filhos = %.2f", media_filhos); printf ( "\nMaior Salario R$ %.2f", maior_sal); printf ( "\nPerc. de pessoas com salario ate' R$ 100,00 = %.2f", perc_sal100); getch(); }