Buscar

Comandos de Repetição em C

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Comandos de Repetição
Comandos de Repetição
for
while
do-while
9 
Estruturas de Controle de repetição permitem controlar a execução uma 
instrução, ou um conjunto de instruções/comandos, repetidas vezes, até que uma 
dada condição seja satisfeita. 
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
9 
9 
Comandos de Repetição
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Comando for Æ Deve ser usado (em geral) quando você conhece “a priori”
exatamente o número de vezes (ou o número máximo de vezes) em que a(s) 
instrução(ões) será(ão) executada(s), ou seja, você sabe a quantidade de repetições 
antes do início do laço (loop), a partir do enunciado do problema; 
Exemplos de problemas: 
¾ Obter a soma dos n primeiros números pares ou ímpares; 
¾ Obter o fatorial de n, (n≥0);
¾ Obter a soma dos n primeiros números naturais;
¾ Obter os divisores de um número inteiro positivo p (p>0);
¾ Verificar se um número inteiro positivo p é primo;
¾ Verificar se um número inteiro positivo p é perfeito
Comandos de Repetição
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Comandos while ou do-while)Æ É usado (em geral) em situações em que 
você não consegue determinar “a priori”, a partir do enunciado, o número de vezes 
em que a(s) instrução(ões) no interior do loop (laço) será(ão) executada(s), ou seja, 
o número de iterações que serão necessárias para a resolução do problema.
Exemplo de um problema que vamos resolver de forma algorítmica e não 
sabemos “a priori” o número de vezes que uma ou mais instrução(ões) 
será(ão) executada(s).
Quantos termos eu devo somar da Série harmônica de modo que a soma 
acumulada seja maior que um dado limite LIM. Em linguagem matemática
1
1
H
i
S LIM
i
∞
=
= >∑
Comandos de Repetição
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
1 1 1 1 11
2 3 4H
S LIM
k n
= + + + + + + + >" "
expandindo a série, temos:
Qual o número de 
iterações necessárias 
para resolver o 
problema para esses 
valores de LIM?LIM
0 -------------Æ
1 -------------Æ
10 -------------Æ
15 -------------Æ
16 -------------Æ
17 -------------Æ
18 -------------Æ
19 -------------Æ
1
2
12.367
1.835.421
4.989.191
13.562.027
36.865.412
100.210.581
ATENÇÃO!!! Dependendo do valor 
de LIM, você terá que esperar algumas 
horas de processamento. Além disso, 
poderemos ter problemas decorrentes 
da aritmética flutuante.
Analogia entre os Comandos de Repetição
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
...
enquanto (expressão boleana) faça
inicio
comandos;
fim
proxima_instrucao;
...
Pseudocódigo Linguagem C
...
while ( expressão ) {
comando1;
comando2;
comando3;
comando4;
...
comandon;
}
proxima_instrução;
...
Lembre-se que na linguagem C, toda expressão 
diferente de 0 (zero) é verdadeira.
Comandos de Repetição - while
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
...
while ( expressão ) {
comando1;
comando2;
comando3;
comando4;
...
comandon;
}
proxima_instrução;
...
Forma geral Æ
Bloco de Comandos
associado ao while
(instruções internas).
Comandos de Repetição - while
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Onde:
¾ Observe que a condição de terminação do comando while, ocorre no início 
do laço. Isso significa que esse comando é capaz de executar zero vezes;
¾ comando1, comando2, ..., comandon: podem ser quaisquer comandos da 
linguagem; 
¾ expressão: pode ser qualquer expressão válida em C (expressão aritmética, 
lógica, variável, constante). Muitas vezes, expressão também é referenciada 
por condição de terminação do laço (loop);
¾ Pelo menos um dos comandos no interior do bloco de instruções associados ao 
comandos while, deve alterar a condição de terminação de forma consistente, 
garantindo que o laço seja finito;
¾ Os comandos de 1 a n serão executados enquanto expressão for verdadeira 
(qualquer valor diferente de zero);
¾ Quando expressão for avaliada e o resultado for falso (igual a zero), então, a 
proxima_instrução, após o laço while, será executada.
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Exemplos de trechos de códigos
Comandos de Repetição - while
...
i = 1;
while ( i <= 20 ) {
printf(‘\n Valor de i = %d’, i);
i = i + 3;
}
printf(‘\n Acabei de sair do Laço While’);
...
Valor de i = 1
Valor de i = 4
Valor de i = 7
Valor de i = 10
Valor de i = 13
Valor de i = 16
Valor de i = 19
Acabei de sair do Laço While
Saída 
correspondente a 
execução do 
código acima.
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Os códigos abaixo com o comandos while e for, produzem os mesmos 
resultados lógico. 
...
i = 1;
while ( i <= 20 ) {
printf(‘\n Valor de i = %d’, i);
i = i + 3;
}
printf(‘\n Acabei de sair do Laço While’);
...
...
for (i = 1; i <= 20; i = i+3)
printf(‘\n Valor de i = %d’, i);
printf(‘\n Acabei de sair do Laço While’);
...
Comandos de Repetição - while
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
...
i = 1;
while( i <= n ){
s = s + i; // s += i;
i = i + 1; // i++;
}
proxima_instrucao;
...
...
for (i=1; i <= n; i++)
s Å s + i;
proxima_instrucao;
...
Os códigos abaixo com o comandos while e for, produzem os mesmos 
resultados lógicos. 
Comandos de Repetição - while
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Exemplo de código: Problema anterior da Série Harmônica, resolvido com o 
comando while.
#include <stdio.h>
#include <stdlib.h>
#define STR1 “\n\n Introduza um valor real: “
#define STR2 “\n\n O número de termos necessários é: %d”
int main(void){
int cont=0; //contagem do número de termos somados
double soma = 0.0, limite;
printf(STR1); 
scanf(“%lf”,&limite); //Leitura de um valor real (double)
while (soma <= limite){
cont++;
soma = soma + 1.0/(double)cont;
} // while
printf(STR2,cont);
system(“pause”);
return(0);
}
Comandos de Repetição - while
Comandos de Repetição – do-while
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
...
do {
comando1;
comando2;
comando3;
comando4;
...
comandon;
} while( expressão ); 
proxima_instrução;
...
Forma geral Æ
Onde:
¾ Como expressão (condição de terminação) está no final do laço, este comando 
executa o bloco de instruções internas pelo menos uma vez. Assim, você deve 
garantir que a consistência dessas operações (correção dos resultados); 
¾ Os comandos no interior do bloco de instruções do laço do-while são executados, 
enquanto o valor da expressão for verdadeira;
¾ As demais observações já feitas para o comando while, valem também para este 
comando
Bloco de comandos
associado ao do-while
(instruções internas).
Comandos de Repetição do-while
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Se app é uma boa aproximação para , então 
( ) / 2x app
app
+ é melhor ainda.
x
Você saberia dizer “a 
priori” o número de 
iterações necessárias para 
resolver o problema com 
uma boa aproximação?
Problema: Dado um número real positivo x≥0, determinar usando a relação 
abaixo. Compare o resultado obtido com a função primitiva sqrt(x) da biblioteca 
<math.h>. 
x
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Comandos de Repetição do-while
Se app é uma boa aproximação para , então 
( ) / 2x app
app
+ é melhor ainda.
x
Análise básica do problema:
\0 1 0 1 x
app app app app app
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Comandos de Repetição do-while
Vamos analisar a condição de terminação,ou seja, até quando eu devo continuar 
com minhas aproximações? Em outras palavras, quando eu devo parar.
Análise básica do problema:
x app≅
2| |x app eps− <
2 0x app− ≅
2x app≅
10 , 6 12.(suficientemente pequeno)neps n−= ≤ ≤
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Comandos de Repetição
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // fabs() e sqrt()
#define ERRO 1.0E-06 //0.000001
int main(void) {
double x, app = 1.0; 
printf('Introduza um valor real positivo: '); scanf(“%lf”,&x);
if ( x >= 0) { // garantindo entrada positivo (raiz quadrada)
while ( fabs(x - app*app) >= ERRO )
app = (x/app + app)/2.0;
printf('\n\nRaizQuadrada(%15.12lf) = %15.12lf\n\n',x,app);
printf('\n\n SQRT(%15.12lf) = %15.12lf \n\n',x, sqrt(x));
}
else fprintf('Erro de Entrada!!!');
}
Uso do comando while para resolver o problema da raiz quadrada. 
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Comandos de Repetição
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // fabs() e sqrt()
#define ERRO 1.0E-06 //0.000001
int main(void) {
double x, app = 1.0; 
printf('Introduza um valor real positivo: '); scanf(“%lf”,&x);
if ( x >= 0) { // garantindo x positivo (raiz quadrada)
do
app = (x/app + app)/2.0;
while ( fabs(x - app*app) >= ERRO );
printf('\n\nRaizQuadrada(%15.12lf) = %15.12lf\n\n',x,app);
printf('\n\n SQRT(%15.12f) = %15.12f \n\n',x, sqrt(x));
}
else fprintf('Erro de Entrada!!!');
}
Uso do comando do-while para resolver o problema da raiz quadrada. 
Comandos de Repetição
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Observações : 
Æ A linguagem de programação C possui três comandos de repetição. Dependendo 
da situação, pode ser mais adequado utilizar um ou outro, mas na verdade,
sempre é possível reescrever o código, utilizando um outro comando de 
repetição; 
Æ Reescreva o problema da Série Harmônica trabalhado nos slides anteriores, 
utilizando os comandos de repetição for e do-while;
Æ Os comandos break e continue quando executados no interior do bloco de 
instruções associado aos comandos while e do-while, produzem os mesmos 
efeitos que os já discutidos quando falamos do comando de repetição for;
Exercícios
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
01) Reescreva em C, todos os exemplos desenvolvidos em pseudocódigo
usando o comando enquanto-faça;
02) 02) Elabore programas em C associados aos exercícios (problemas) da
Lista 01;
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C
Certamente que você já se perguntou se não seria possível, repetir a execução de 
um programa várias vezes, sem a necessidade de compilá-lo novamente, ou clicar 
sobre o respectivo executável.
Comandos de Repetição do-while
Um uso muito comum para resolver o problema acima é por meio do comando de 
repetição do-while, através do seguinte código:
...
int main(void){
do{
.... //instruções do seu programa
do { // lendo somente os caracteres aceitáveis
system("cls"); //limpeza da tela
printf("Deseja continuar executando? <S,N>: ");
ch = getchar();
} while( (ch != 'S')&&(ch != ‘s’)&&(ch != 'N’)&&(ch != ‘n’) );
if ( (ch =='S‘) || (ch==‘s’) ) i=1;
else i=0;
} while(i);
...
Desafios Adicionais
P
r
o
f
.
 
P
i
t
e
r
i
 
-
5
ª
A
u
l
a
–
L
i
n
g
u
a
g
e
m
C A idéia anterior pode ser aplicada para encontrarmos a raiz cúbica de um número 
real qualquer (lembre-se que raízes cúbicas podem ser negativas), sabendo-se que:
A exemplo do programa da raiz quadrada, compare os resultados obtidos de seu 
código, com a função primitiva pow(a, 0.333333333333333) da biblioteca 
<math.h>. Defina uma constante para representar o valor 0.333333333333333.
Se app é uma boa aproximação para , então 
2( 2 ) / 3
x app
app
+ é melhor ainda.
3 x

Continue navegando