Mudanças entre as edições de "PRG122804 2018 2 AULA06"
(Criou página com '=Objetivos= *O aluno será capaz de implementar estruturas de repetição em linguagem C. *Criar fluxogramas ou pseudo-código na forma de estruturas em linguagem C. *Implementa...') |
|||
(8 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 82: | Linha 82: | ||
! style="color:white;background: #1E90FF;" | Comentário | ! style="color:white;background: #1E90FF;" | Comentário | ||
|- | |- | ||
− | | |[[imagem:fluxo5.jpg| | + | | |[[imagem:fluxo5.jpg|300px]] |
||<syntaxhighlight lang=c>while(contador<5) { | ||<syntaxhighlight lang=c>while(contador<5) { | ||
printf("Entre com x\n"); | printf("Entre com x\n"); | ||
Linha 102: | Linha 102: | ||
} while (condição); | } while (condição); | ||
− | Nesta variação o comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final.<br> | + | Nesta variação o comando ''do while()'' permite a repetição de uma ou <br> |
+ | mais instruções, com controle do ''loop'' no final. <br> | ||
Isto permite que o bloco seja executado pelo menos uma vez. | Isto permite que o bloco seja executado pelo menos uma vez. | ||
Linha 125: | Linha 126: | ||
! style="color:white;background: #1E90FF;" | Comentário | ! style="color:white;background: #1E90FF;" | Comentário | ||
|- | |- | ||
− | | |[[imagem:fluxoDoWhile-Eraldo.jpg| | + | | |[[imagem:fluxoDoWhile-Eraldo.jpg|300px]] |
||<syntaxhighlight lang=c> | ||<syntaxhighlight lang=c> | ||
contador = 0; | contador = 0; | ||
Linha 135: | Linha 136: | ||
contador++; | contador++; | ||
} while(contador<5); | } while(contador<5); | ||
− | </syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais | + | </syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas <br>como instruções normais |
− | que podem ser aninhadas normalmente em outros comandos. | + | que podem ser aninhadas <br>normalmente em outros comandos. |
|} | |} | ||
Linha 176: | Linha 177: | ||
! style="color:white;background: #1E90FF;" | Comentário | ! style="color:white;background: #1E90FF;" | Comentário | ||
|- | |- | ||
− | | |[[imagem:FluxogramaComandoFor-Eraldo.jpg| | + | | |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]] |
||<syntaxhighlight lang=c> | ||<syntaxhighlight lang=c> | ||
for(i=0; i<10; i++) { | for(i=0; i<10; i++) { | ||
Linha 183: | Linha 184: | ||
printf("Este é o laço 5\n"); | printf("Este é o laço 5\n"); | ||
} | } | ||
− | </syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, | + | </syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e <br>uma única VEZ, no início do comando. |
− | A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. <br>Ela é executada após a expressão | + | A expressão ''i<10'' é o controle do ''loop''. <br>Se FALSA o ''loop'' é encerrado. <br>Ela é executada após a expressão |
− | de inicialização e, na sequência, | + | de inicialização e,<br> na sequência, no início de cada ''loop''. <br>A expressão i++ é executada no final de cada ''loop''. |
|} | |} | ||
Edição atual tal como às 13h01min de 29 de agosto de 2018
Objetivos
- O aluno será capaz de implementar estruturas de repetição em linguagem C.
- Criar fluxogramas ou pseudo-código na forma de estruturas em linguagem C.
- Implementar loops infinitos.
- Uso do break associado ao comando for, do, while.
Estruturas de Repetição
Existem 4 estruturas/comandos que permitem implementar loops ou repetições de blocos de código:
- while()
- do while()
- for()
- goto label
Nota 1: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.
O comando while(): teste da repetição no começo
- O comando while tem a seguinte forma geral
while (condição) declaração;
ou
while (condição) { declaração1; declaração2; }
Podemos ver que a estrutura while testa uma condição. Se esta for verdadeira
a declaração é executada e faz-se o teste novamente, e assim por diante.
O comando while permite implementar loops com controle no início:
#include <stdio.h>
main()
{
int contador;
contador=0;
while (contador<5) {
printf("valor do contador = %d\n", contador);
contador=contador+1;
}
}
Variação do exemplo anterior:
#include <stdio.h>
main()
{
int contador;
contador=0;
while (contador<5) {
printf("valor da expressão = contador < 5 é %d\n", contador<5);
printf("valor do contador = %d\n", contador);
contador=contador+1;
}
printf("NO FINAL a expressão contador < 5 é %d\n", contador<5);
}
Vamos ver a correspondência do comando while com um fluxograma:
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.
Comando do while: controle do loop no final
- O comando do while tem a seguinte forma geral
do { declaração1; declaração2; } while (condição);
Nesta variação o comando do while() permite a repetição de uma ou
mais instruções, com controle do loop no final.
Isto permite que o bloco seja executado pelo menos uma vez.
#include <stdio.h>
main()
{
int contador;
contador=0;
do {
printf("valor do contador = %d\n", contador);
contador=contador+1;
} while (contador<5);
}
Comando for()
O comando for() permite uma forma mais elaborada de loop, com controle no início do bloco de repetição.
- Sua forma geral é
for(inicialização;condição;incremento) declaração;
- ou
for(inicialização;condição;incremento){ declaração1; declaração2; }
#include <stdio.h>
main()
{
int i;
for (i=0;i<10;i=i+1)
printf("i =%d\n",i);
}
Aninhamento de loops
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
printf("valor de j = %d\n", j);
}
printf("valor de i = %d\n", i);
}
}
Comando goto
O comando goto é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.
Exemplo:
#include <stdio.h>
main()
{
int i;
i=0;
PONTO1:
printf("Laço de número %d\n", i);
i++;
if (i<10)
goto PONTO1;
}
- Devido a ser uma instrução "desestruturante", em geral NÃO se recomenda o uso deste comando.
Em alguns casos de tratamento de erro pode ser interessante o uso do goto.
Leia um pouco mais sobre o goto aqui.
Loop Infinito
É possível implementar loops infinitos com qualquer uma das instruções acima.
Exemplo com comando for:
main()
{
for(;;) {
/* Este bloco se executará infinitamente */
}
}
ou com o comando while:
main()
{
while(1) {
/* Este bloco se executará infinitamente */
}
}
- Exemplo
Usando o comando for aninhado, construa um programa que implemente a figura abaixo.
- x
- xx
- xxx
- xxxx
- xxxxx
- xxxxxx
- xxxxxxx
- xxxxxxxx
- xxxxxxxxx
- xxxxxxxxxx
- xxxxxxxxxxx
- xxxxxxxxxxxx
- xxxxxxxxxxxxx
#include <stdio.h>
main()
{
int i,j;
printf("\n"); /* deixa uma linha em branco */
for (i=0;i<13;i++) {
for (j=0;j<=i;j++) {
printf("*");
}
printf("\n"); /* deixa uma linha em branco */
}
}
Uso de BREAK para sair de loops
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada.
É possível sair de um loop na "força bruta" usando a instrução break:
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<10;i++) {
if (i==5)
break;
}
printf("valor de i=%d\n", i);
}
Note que o break sempre sai do loop mais próximo a ele. Muitas vezes rodamos um looping, através de um laço (como FOR ou WHILE), para encontrar alguma informação. O break serve para terminar o laço a qualquer momento sem esperar que o loop termine.
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
if (j==1) {
break;
}
printf("valor de j = %d\n", j);
}
if (i==2)
break;
printf("valor de i = %d\n", i);
}
}
- Desafio 1
Encontre o primeiro número, entre 1 e 1 milhão que é divisível por 11, 13 e 17. Isso significa dizer que temos que encontrar o menor número que, dividido por 11, 13 e 17, dê resto da divisão nulo (igual a zero).
Solução |
---|
#include <stdio.h>
int main()
{
int count,
numero=0;
for(count=1 ; count<=1000000 ; count++)
{
if(numero == 0)
if((count%11==0) && (count%13==0) && (count%17==0))
{
numero=count;
break;
}
}
printf("O numero e: %d\n", numero);
}
|
Uso do CONTINUE para prosseguir no início do loop
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
if (i==1) {
continue;
}
printf("valor de j = %d\n", j);
for (j=0;j<4;j++) {
if (j==1) {
continue;
}
printf("valor de j = %d\n", j);
}
}
}
O comando CONTINUE, quando inserido dentro de algum laço, faz com que a iteração atual seja cancelada, e o laço prossegue na próxima iteração. Ou seja, o BREAK faz todo o laço parar enquanto o CONTINUE, faz somente com que a iteração pule pra próxima.
- Desafio 2
Faça um programa em C que some todos os números, de 1 até 100, exceto os múltiplos de 3. Faça o laço for percorrer de 1 até 100 e teste se cada número deixa resto 0 quando dividido por 3. Caso deixe, é porque é múltiplo de 3 e não devemos somar. Para que isso ocorra, simplesmente pulamos essa iteração. Porém, se não for múltiplo de 3, é porque a iteração não foi pulada, ela continua, e vamos somar esse número na soma total.
Solução |
---|
#include <stdio.h>
int main()
{
int count,
soma;
for(count=1, soma=0 ; count<=100 ; count++)
{
if( count%3 ==0)
continue;
soma = soma + count;
}
printf("Soma %d", soma);
}
|