Você está na página 1de 25

Na aula passada....

Comandos iterativos ou de repetição (loop)

n  para tantas vezes repita ...

n  enquanto ......

n  faça ... enquanto

1 INF 01202 - Prof. Marcelo Walter – Aula 10


Comando while : sintaxe
while (expressão condicional)
ATENÇÃO:
{
as chaves só são
// comando(s) a serem repetidos obrigatórias quando
mais de um comando
} for controlado pelo
// comandos após o while while (laço de
repetição).

1. A condição definida em expressão condicional é avaliada:


ü se verdadeira:
i-comando(s) do bloco subordinado é (são) executado(s);
ii-retorna ao ponto (1).
ü se falsa:
i-encerra comando while.
Observação: A avaliação da condição do comando while ocorre antes do início
do trecho a ser repetido:
bloco subordinado pode não ser executado nenhuma vez!

2 INF 01202 - Prof. Marcelo Walter – Aula 10


Comandos iterativos ou de repetição (loop)

n  para tantas vezes repita ...

n  enquanto ......

n  faça ... enquanto

3 INF 01202 - Prof. Marcelo Walter – Aula 10


Comando do-while : sintaxe
do
ATENÇÃO:
{
as chaves só são
// comando(s) a ser(em) repetido(s) obrigatórias quando
mais de um comando
} for controlado pelo
while (expressão condicional); do-while (laço de
// comandos após o while
repetição).

1.  O(s) comando(s) do bloco subordinado é (são) executado(s);


2.  A condição definida em expressão condicional é avaliada:
ü se verdadeira:
i-retorna ao ponto (1).
ü se falsa:
i-encerra comando do-while.
Observação: A execução do trecho a ser repetido ocorre antes da avaliação
da expressão de controle do comando do while :
sempre executa pelo menos 1 vez!.

4 INF 01202 - Prof. Marcelo Walter – Aula 10


Da última prática (turma A)

n  Um determinado material radioativo perde metade de


sua massa a cada 50 segundos. Faça um programa que lê
do usuário a massa inicial em gramas, maior do que 0.5
gramas, e determine o tempo necessário para que essa
massa se torne menor do que 0.5 grama.
n  Escreva a massa inicial, a massa final e o tempo calculado
em horas, minutos e segundos para que a massa inicial
lida se torne menor do que 0.5 grama. Você pode testar
seu programa com os valores abaixo:

Massa inicial (gramas):100 Massa inicial (gramas):200


Total segundos 400 Total segundos 450
Massa inicial: 100.000000 Massa inicial: 200.000000
massa final: 0.390625 massa final: 0.390625
tempo: 0 horas, 6 min e 40 s tempo: 0 horas, 7 min e 30 s

5 INF 01202 - Prof. Marcelo Walter – Aula 10


#include <stdio.h>

Uma possível solução


int main(){
float massaInicial, massa;
int tempo, horas, minutos, segundos;
printf("Massa inicial (gramas):");
scanf("%f", &massaInicial);
massa = massaInicial;
segundos = 0;
while (massa >= 0.5) {
massa = massa / 2;
segundos += 50;
}
printf("Total segundos %d\n", segundos);
horas = segundos/3600;
minutos = (segundos % 3600) / 60;
segundos = (segundos % 3600) % 60;
printf("Massa inicial: %f \n massa final: %f\n tempo: %d horas, %d
minutos e %d segundos\n", massaInicial, massa, horas,
minutos, segundos);
return 0; }
6 INF 01202 - Prof. Marcelo Walter – Aula 10
Da última prática (turma B)

n  Leia do usuário um determinado número inteiro M


diferente de zero. A seguir leia um número
indeterminado de valores inteiros até que o usuário
digite o valor 0 (zero é sinal de parada de leitura de
números). O programa deve exibir o número lido da
lista que mais se aproxima do número M dado no início.
Você pode testar seu programa com os valores abaixo:
Entre com o numero M:5
Entre com o numero M:5 Entre com o numero da lista:1
Entre com o numero da lista:-1 Entre com o numero da lista:2
Entre com o numero da lista:-2 Entre com o numero da lista:3
Entre com o numero da lista:-3 Entre com o numero da lista:4
Entre com o numero da lista:-4 Entre com o numero da lista:6
Entre com o numero da lista:-5 Entre com o numero da lista:7
Entre com o numero da lista:0 Entre com o numero da lista:8
Entre com o numero da lista:0
O numero mais proximo de 5 eh -1
O numero mais proximo de 5 eh 4

7 INF 01202 - Prof. Marcelo Walter – Aula 10


#include <stdio.h>
#include <math.h> // para usar abs
#include <limits.h> // para usar INT_MIN abaixo
int main(){
int num,n, m;
Uma solução possível

printf("Entre com o numero M:");


scanf("%d", &m);
num=INT_MIN;
printf("Entre com o numero da lista:");
scanf("%d", &n);
if (n!=0){ //n==0 é sinal de parada
do{
if (abs(n-m) < abs(num-m))
num=n;
printf("Entre com o numero da lista:");
scanf("%d", &n);
}while(n!=0);
}
printf("O numero mais proximo de %d eh %d\n", m, num);
return 0;
}
8 INF 01202 - Prof. Marcelo Walter – Aula 10
1 – Complete o programa abaixo, de forma que os números pares
entre 10 e 100 sejam gerados, somado, e que a soma obtida seja
informada na tela. Para isto, utilize o comando while, o comando do_while
e o comando for. A tela de execução do programa deve ser como
mostrada abaixo.
/* soma pares e mostra equivalências entre for, while e do while: */
#include <stdio.h>
int main ( )
{
int par, soma;
// usando while:
...........
// usando do while:
...........
// usando for:
............
return 0;
}

9 INF 01202 - Prof. Marcelo Walter – Aula 10


/* soma pares e mostra equivalências entre for, while e do while: */
#include <stdio.h>
int main ( )
{
int par, soma;
// usando while:
soma = 0;
par = 10; // valor inicial
while (par <=100)
{
soma = soma + par;
par=par + 2;
}
printf("\n\nWhile - soma = %d", soma);
// usando do while:
soma = 0;
par = 10; // valor inicial
do
{
soma = soma + par;
par=par + 2;
} while (par <=100);
printf("\n\nDo-while - soma = %d", soma);
// usando for:
soma = 0;
for ( par = 10; par <=100; par=par + 2)
soma = soma + par;
printf("\n\nFor - soma = %d\n\n", soma);
return 0;
}
10 INF 01202 - Prof. Marcelo Walter – Aula 10
No exemplo anterior, as três estruturas de laço (while,
do-while, for) foram empregadas para resolver o
mesmo problema.

Se tivermos que optar por apenas uma, qual seria a mais


clara?

Nesse exemplo, o número de iterações é conhecida antes


do laço. Assim, o uso do for gera uma solução mais
clara (o cabeçalho do for já indica toda estrutura do
laço)

11 INF 01202 - Prof. Marcelo Walter – Aula 10


Ex: Processar e informar a média de valores inteiros lidos do teclado. Para
encerrar, digitar 9999. Analisar solução com do_while e com while.
//Calcula media de um numero indeterminado de valores lidos
#include <stdio.h>
int main ( )
{
int numero, lidos = 0;
long int soma = 0;
printf(“Digite um numero inteiro de cada vez.”);
printf (“\nPara terminar, digite o valor 9999.”);
do // sempre executa 1 vez!
{ // solução com while
printf(“\nNumero? “);
printf(“\nNumero? “); scanf(“%d”, &numero);
scanf(“%d”,&numero); while (numero != 9999) // pode nunca entrar
if (numero !=9999) {
{ soma = soma + numero;
soma = soma + numero; lidos = lidos + 1;
lidos = lidos + 1; printf(“\nNumero? “);
scanf(“%d”, &numero);
} }
} while (numero != 9999);
printf (“\nMedia dos valores lidos: %5.2f\n”, (float)soma/lidos);

return 0;
}

12 INF 01202 - Prof. Marcelo Walter – Aula 10


Comparação entre os Comandos de Repetição

verifica execução do(s)


comando repetições
condição comando(s)

for início 0 ou + condição = V

while início 0 ou + (?) condição = V

do-while final 1 ou + (?) condição = V

13 INF 01202 - Prof. Marcelo Walter – Aula 10


De um modo geral, quando usar for e quando usar while
(ou do-while)?

•  Quando o final do laço é bem determinado (número de


iterações pré-determinado), o for é mais recomendado.
Normalmente aparecem em problemas de contagem.
Exemplos:
–  Varrer os números inteiros entre 1 e 50
–  Varrer os múltiplos de 3 entre 30 e 9 (ordem decrescente)

•  Quando o final do laço não é bem determinado (número


desconhecido de iterações), o while (ou do-while) é mais
recomendado. Em geral, o critério de parada envolve um
teste. Ex:
–  Faça tal operação até que cos(x) > 0.5
–  Enquanto erro < 0.001, faça tais operações...

14 INF 01202 - Prof. Marcelo Walter – Aula 10


Uso adequado de Comandos Iterativos
§  Controle da repetição:
ü  for :
n  Repetir um determinado número de vezes ou para valores em
um dado intervalo;
n  As repetições devem ser inteiramente controladas através do
cabeçalho do comando, sem que as variáveis de controle e as
utilizadas na expressão condicional sejam modificadas no
bloco sendo repetido (Programação Estruturada).
ü  while ou do-while :
n  Repetir enquanto uma condição for verdadeira.
n  O encerramento das repetições deve ocorrer a partir da
modificação de alguma variável utilizado na expressão de
controle de repetições, executada no bloco sendo repetido.
n  Se o bloco de repetições pode não ser executado nem uma
vez: while mais recomendado.
n  Se o bloco de repetições deve sempre ser executado pelo
menos uma vez: do-while mais recomendado.

15 INF 01202 - Prof. Marcelo Walter – Aula 10


Comparação entre os Comandos de Repetição

Programação Estruturada - observações importantes:


ü  Comandos de repetição só devem ser interrompidos através
de modificações:
1.  detectadas a partir do cabeçalho do for ( modificações
especificadas para variável(eis) de controle só no cabeçalho )
ou
2.  por modificações que se reflitam nas condições das
expressões de controle do while e do-while.

ü  O uso de break como mecanismo de interrupção de uma


repetição é totalmente vetado!!!

ü  A(s) variável(is) de controle do for só deve(m) ser alterada(s)


pela(s) operação(ões) definida no cabeçalho do comando!

16 INF 01202 - Prof. Marcelo Walter – Aula 10


Exercício

n  Uma das várias representações de π é:



(−1) k ⎛ 1 1 1 ⎞
π = 4∑ = 4⎜1 − + − + ... ⎟
k =0 (2k + 1) ⎝ 3 5 7 ⎠

n  Escreva um programa em C que calcule


aproximadamente o valor de π. O programa deve
solicitar a leitura de uma tolerância tol, e inserir
termos na série enquanto o valor absoluto do termo
a ser inserido é maior do que o valor tol.

17 INF 01202 - Prof. Marcelo Walter – Aula 10


Solução
/* Programa que calcula o valor aproximado de PI, inserindo termos na serie ate que o termo
seja menor que uma tolerancia tol
Entrada: tolerancia tol
Saida: valor aproximado de PI */
#include <stdio.h>
#include <math.h>
int main ( )
{
double pi, tol, termo;
int sinal = 1; //variavel para alternar o valor da serie
int cont; // contador que percorre os termos da serie
printf("Entre a tolerancia:\n");
scanf("%lf", &tol);
pi = 0; //inicializa pi
cont = 0; //inicializa contador
termo = 4; //inicializa termo com primeiro valor da serie
while (fabs(termo) > tol)
{
pi += termo; //atualiza a serie
cont++; //incrementa contador
sinal = -sinal; //troca o sinal
termo = 4.0*sinal/(2*cont+1); // atualiza termo (foi usado 4.0 ao inves de
// 4 para evitar o cast)
}
printf("Valor aproximado de PI: %lf", pi);
return 0;
} 18 INF 01202 - Prof. Marcelo Walter – Aula 10
Exercício

19 INF 01202 - Prof. Marcelo Walter – Aula 10


Considere o problema abaixo:

Foi realizada uma pesquisa em Porto Alegre. De cada


entrevistado foram colhidos os seguintes dados:
a) clube de preferência (1-Grêmio; 2-Internacional; 3-Outros);
b) salário;
c) cidade de origem (1-Porto Alegre; 2-Outras).
Deseja-se saber:
1) número de torcedores por clube;
2) média salarial dos torcedores do Grêmio e do
Internacional;
3) número de pessoas nascidas em Porto Alegre que não
torcem por nenhum dos dois primeiros clubes;
4) número de pessoas entrevistadas.

20 INF 01202 - Prof. Marcelo Walter – Aula 10


Escreva um algoritmo (passos gerais) e um programa em C
que resolva o problema descrito no slide anterior.

O programa deve solicitar o clube de preferência, o salário e


a cidade de origem para cada entrevistado, e perguntar se
o usuário deseja informar mais dados.

O programa deve calcular e informar na tela os 4 itens


listado no slide anterior

21 INF 01202 - Prof. Marcelo Walter – Aula 10


Uma possível solução (já codigo em C)
/* Programa que calcula estatisticas sobre preferencia de clubes, salario e
cidade de origem para um grupo de torcedores
Entradas: clube de preferencia, salario e cidade de origem de varias
pessoas
Saidas: número de torcedores por clube, media salarial dos torcedores de
cada
time, numero de pessoas nascidas na capital que não torcem por nenhum
dos dois primeiros clubes, e número de pessoas entrevistadas.
*/

#include <stdio.h>
#include <ctype.h> // para o toupper
int main()
{
//Entradas
float salario;
int clube,cidade;
//Saidas
int NumGremio, NumInter, NumOutros, NumPoaOutros, NumTotal;
float TotSalGremio, TotSalInter;
char resposta;
... INF 01202 - Prof. Marcelo Walter – Aula 10
22
Uma possível solução (já codigo em C)

//Inicializa variaveis de acumulacao


NumGremio = 0;
NumInter = 0;
NumOutros = 0;
NumPoaOutros = 0;
TotSalGremio = 0;
TotSalInter = 0;
// Leitura dos dados das pessoas entrevistadas
do
{
printf ("Clube (1-Gremio; 2-Internacional; 3-Outros) : ");
scanf("%d", &clube);
printf ("Salario : ");
scanf("%f", &salario);
printf ("Cidade : (1-Porto Alegre; 2-Outras) ");
scanf("%d", &cidade);
...

23 INF 01202 - Prof. Marcelo Walter – Aula 10


Uma possível solução (já codigo em C)
switch (clube) // Realiza a acumulacao das variaveis
{
case 1 : NumGremio += 1;
TotSalGremio += salario;
break;
case 2 : NumInter += 1;
TotSalInter += salario;
break;
case 3 : NumOutros += 1;
if (cidade == 1)
NumPoaOutros += 1;
break;
default: printf("Clube informado invalido!");
}
do // verifica se usuario quer entrar mais dados
{
printf("Entrar outro dado? (S/N) ");
scanf(" %c", &resposta);
resposta = toupper (resposta);
} while (resposta != 'S' && resposta != 'N');
} while (resposta == 'S');

24 INF 01202 - Prof. Marcelo Walter – Aula 10


Uma possível solução (já codigo em C)
//Acumula total de entrevistados
NumTotal = NumGremio + NumInter + NumOutros;

//Saidas
printf("\n\n-------------------------");
printf("Resumo dos dados\n");
printf("-------------------------\n\n");
printf("Torcedores:\n");
printf ("Gremio: %d \n",NumGremio) ;
printf ("Inter: %d \n", NumInter ) ;
printf ("Outros: %d \n",NumOutros ) ;

printf("\nMedia Salarial:\n");
printf ("Gremio: R$%4.2f \n",TotSalGremio / NumGremio);
printf ("Inter: R$%4.2f \n", TotSalInter / NumInter);

printf ("\nPortoalegrenses que nao torcem para inter ou gremio: %d\n",


NumPoaOutros);
printf ("Numero total de entrevistados: %d\n\n", NumTotal);
return(0);
}

25 INF 01202 - Prof. Marcelo Walter – Aula 10

Você também pode gostar