You are on page 1of 33

IF61C – Fundamentos de Programação 1

Prof. Bogdan Tomoyuki Nassu


Nesta aula...

Mais sobre estruturas de repetição.


● for

Estruturas de repetição aninhadas.
● break
● continue
Lembrando: while
●O while repete um bloco de comandos enquanto determinada
condição for verdadeira.

O teste da condição é feito antes da execução do bloco.

Condição
Condição éé sim
...
... faz
faz algo
algo
verdadeira?
verdadeira?

não
continua
continua
for
● O for é uma especialização do while.

... incremento
incremento
...

Condição
Condição éé
inicialização
inicialização sim faz
faz algo
algo
verdadeira?
verdadeira?

não
continua
continua
for (em C)
AA inicialização,
inicialização, aa condição
condição ee
oo incremento
incremento são
são colocados
colocados
for em
for em letras
letras minúsculas.
minúsculas. entre
entre parênteses
parênteses ee
(...) separados
separados porpor ;.
;.

for (<inicialização>; <condição>; <incremento>)


{
<comandos> Assim
Assim como
como oo if
if ee oo while,
while,
} oo for
for não
não tem
tem ;; depois
depois do
do ).
).

(...)
Enquanto
Enquanto aa condição
condição
for
for verdadeira,
verdadeira, execute
execute
os
os comandos
comandos queque estão
estão
entre
entre chaves.
chaves.
for - uso mais comum
● O uso mais comum do for é:

Definimos uma variável para controle do loop (um contador).
● Normalmente, o nome de um contador “genérico” é i.


Na inicialização, determinamos o valor inicial da variável.
● A condição é como a condição de um while.

No incremento, atualizamos o valor da variável.

Exemplo:
● “Repita n_iteracoes vezes”.
● = “Para cada valor de i entre 0 e n_iteracoes-1, faça o seguinte:”.
int i;
(...)
for (i = 0; i < n_iteracoes; i++)
{
<comandos>
}
for x while

As duas construções abaixo são equivalentes:
for (<inicialização>; <condição>; <incremento>)
{
<comandos>
}

e
<inicialização>
while (<condição>)
{
<comandos>
<incremento>
}
● A representação com o for é mais compacta.
Exemplo (for)
#include <stdio.h>

#define N_VAL 3

int main ()
{
int n, total, i;

total = 0;
for (i = 0; i < N_VAL; i++)
{
scanf ("%d", &n);
total += n;
}

printf ("%d\n", total/N_VAL);


return (0);
}
Exemplo (for)
#include <stdio.h>

#define N_VAL 3

int main ()
{ “Para
“Para ii indo
indo de
de 00 até N_VAL-1, faça...”
até N_VAL-1, faça...”
int n, total, i;

total = 0;
for (i = 0; i < N_VAL; i++)
{
scanf ("%d", &n);
total += n;
}

printf ("%d\n", total/N_VAL);


return (0);
}
Nice try
Outro exemplo (for)

#define N_VAL 10
#define INCR 3

int main ()
{
int i;

for (i = INCR; i <= INCR*N_VAL ; i += INCR)


printf ("%d\n", i);

return (0);
}
Outro exemplo (for)

#define N_VAL 10
#define INCR 3
Continua
Continua enquanto
enquanto
ii for
for menor
menor ou
ou igual
igual
int main () Começa
Começa atribuindo
atribuindo aa INCR*N_VAL
INCR*N_VAL (30) (30)
{ INCR (3)
INCR (3) aa i.
i.
int i;

for (i = INCR; i <= INCR*N_VAL ; i += INCR)


printf ("%d\n", i);

return (0);
} No
No final
final do
do loop,
loop,
aumenta
aumenta oo valor
valor
de
de ii em INCR (3).
em INCR (3).
Mais um exemplo (for)

#define MAX_N 50

int main ()
{
int n;

for (n = 0; n < MAX_N; n++)


if (n%2)
printf ("%d\n", n);

return (0);
}
Mais um exemplo (for)

#define MAX_N 50

int main ()
{
int n;

for (n = 0; n < MAX_N; n++) Estamos


Estamos testando
testando todos
todos os
os
if (n%2) números
números entre
entre 00 ee MAX_N-1.
MAX_N-1.
printf ("%d\n", n); Existe
Existe um
um jeito
jeito de
de diminuirmos
diminuirmos
oo número
número de de testes?
testes?
return (0);
}
for - usando de um jeito mais esperto

#define MAX_N 50

int main ()
{
int n;
Estamos
Estamos fazendo
fazendo aa mesma
mesma
for (n = 1; n < MAX_N; n+=2) coisa,
coisa, mas
mas com
com menos
menos testes.
testes.
printf ("%d\n", n);

return (0);
}
for
Estruturas de repetição aninhadas

O bloco de comandos de um loop pode conter qualquer tipo de
estrutura - inclusive outros loops.

Exemplo:
int i, j, foo;

foo = 0;
for (i = 0; i < 5; i++)
{
j = 0;
while (j < 4)
{
foo++;
j++;
}
}

printf ("%d\n", foo);


Estruturas de repetição aninhadas

O bloco de comandos de um loop pode conter qualquer tipo de
estrutura - inclusive outros loops.

Exemplo:
int i, j, foo;

foo = 0; Uma
Uma iteração
iteração do for mais
do for mais externo
externo
for (i = 0; i < 5; i++) só
só termina
termina depois
depois que
que todas
todas as
as
{ iterações
iterações do while mais
do while mais interno
interno
j = 0; tiverem
tiverem acabado.
acabado.
while (j < 4)
{
foo++;
j++;
} Neste
Neste exemplo,
exemplo, para
para cada
cada uma
uma das
das
} 55 iterações
iterações do for, ocorrerão
do for, ocorrerão 44
iterações
iterações do while –– ou
do while ou seja, foo será
seja, foo será
printf ("%d\n", foo); incrementado
incrementado 20
20 vezes.
vezes.
Estruturas de repetição aninhadas
Quando tiver repetições aninhadas, tome muito cuidado com

mudanças em variáveis usadas em loops mais externos!!!



Exemplo:
int i = 0, j = 0;

while (i < 10)


Este
Este loop
loop nunca
nunca vai
vai terminar!
terminar!
{
j = 0;
while (j < 4)
{
for (i = 0; i < 3; i++)
printf ("%d\n", i);
j++;
}
i++;
}
break e continue

●Os comandos break e continue servem para modificar o fluxo


de um loop.
● O break interrompe imediatamente o loop.
● O continue inicia imediatamente a próxima iteração do loop,
pulando o restante do bloco.

Nenhum dos dois é obrigatório. Tudo o que se pode fazer com estes
comandos pode ser obtido por outros meios...

... só é mais trabalhoso!
Exemplo: break
int main ()
{
int v1, v2, div;

scanf ("%d %d", &v1, &v2);

for (div = 2; div <= v1 && div <= v2; div++)


if (v1 % div == 0 && v2 % div == 0)
break;

if (div > v1 || div > v2)


printf ("Nenhum divisor maior que 1.\n");
else
printf ("O menor divisor maior que 1 eh %d\n", div);

return (0);
}
Exemplo: break
int main () Se
Se ambos
ambos os os números
números tiverem
tiverem
{ um
um divisor
divisor em
em comum,
comum, oo loop
loop
int v1, v2, div; para
para imediatamente.
imediatamente.

scanf ("%d %d", &v1, &v2);

for (div = 2; div <= v1 && div <= v2; div++)


if (v1 % div == 0 && v2 % div == 0)
break;

if (div > v1 || div > v2)


printf ("Nenhum divisor maior que 1.\n");
else
printf ("O menor divisor maior que 1 eh %d\n", div);

return (0);
}
Exemplo: sem o break
int main ()
{ Usando
Usando aa flag achou na
flag achou na condição
condição
int v1, v2, div, achou = 0; do
do loop,
loop, podemos
podemos fazê-lo
fazê-lo parar
parar
antes
antes do
do fim.
fim.
scanf ("%d %d", &v1, &v2);

for (div = 2; div <= v1 && div <= v2 && !achou; div++)
if (v1 % div == 0 && v2 % div == 0)
{
achou = 1;
div--; /* Porque logo depois vem um div++... */
}

if (!achou)
printf ("Nenhum divisor maior que 1.\n");
else
printf ("O menor divisor maior que 1 eh %d\n", div);
return (0);
}
Exemplo: continue
#define N_VALORES 10

int main ()
{
int i, total = 0;

for (i = 0; i < N_VALORES; i++)


{
if (!(i%3))
continue;

total += i;
}

printf ("%d\n", total);

return (0);
}
Exemplo: continue
#define N_VALORES 10

int main ()
{
int i, total = 0;

for (i = 0; i < N_VALORES; i++)


{
if (!(i%3))
continue; Pula
Pula oo número
número se
se ele
ele
for
for divisível
divisível por
por 3.
3.
total += i;
}

printf ("%d\n", total);

return (0);
}
Exemplo: sem o continue
#define N_VALORES 10

int main ()
{
int i, total = 0;

for (i = 0; i < N_VALORES; i++)


{
if (i%3)
total += i;
}

printf ("%d\n", total);

return (0);
}
break
● O break interrompe o loop mais interno!
(...)
while (foo)
{
while (bar)
{
(...)
if (alguma_condicao)
break;
(...)
}

(...)
}
(...)
break
● O break interrompe o loop mais interno!
(...)
while (foo)
{
while (bar)
{
(...)
if (alguma_condicao)
break;
(...)
}
OO fluxo
fluxo do
do programa
programa após
após oo
break éé mandado
break mandado para
para cá!
cá!
(...)
}
(...)
continue
● O continue pula para a próxima iteração do loop mais interno!
(...)
while (foo)
{
while (bar)
{
(...)
if (alguma_condicao)
continue;
(...)
}

(...)
}
continue
● O continue pula para a próxima iteração do loop mais interno!
(...)
while (foo)
{ O
O fluxo
fluxo do
do programa
programa após
após oo
while (bar) continue éé mandado
continue mandado para
para cá!
cá!
{
(...)
if (alguma_condicao)
continue;
(...) Esta
Esta parte
parte será
será pulada
pulada se
se
} alguma_condicao
alguma_condicao != != 0.
0.

(...)
}
Esta
Esta parte
parte não
não éé afetada
afetada
pelo
pelo continue.
continue.
continue: como não usar

while (alguma condição)


{
if (aconteceu alguma coisa)
continue;
else
faz alguma coisa interessante;
}
continue: como não usar

while (alguma condição)


{
if (aconteceu alguma coisa)
continue;
else
faz algo interessante;
}

Entulho
Entulho desnecessário!
desnecessário! Bastaria
Bastaria usar:
usar:
if
if (!aconteceu
(!aconteceu alguma
alguma coisa)
coisa)
faz
faz algo
algo interessante;
interessante;
Finalizando


Hoje vimos um pouco mais sobre estruturas de repetição.
● Como sempre, você precisa assimilar a estrutura do for – é uma
estrutura básica, que aparecerá inúmeras vezes no futuro.

Loops aninhados podem parecer confusos à primeira vista, mas após
alguns exercícios, é possível compreender como eles funcionam.

Muitos problemas só podem ser resolvidos com loops aninhados!
● O break e o continue, não são estritamente necessários, mas
podem ser úteis para deixar o seu código mais simples.

You might also like