Mudanças entre as edições de "PR1022804 2020 1 AULA06"
Linha 173: | Linha 173: | ||
{| border="1" cellpadding="5" cellspacing="0" | {| border="1" cellpadding="5" cellspacing="0" | ||
− | ! style="background:# | + | ! style="background:#D2691E; color:white;" | Fluxograma |
− | ! style="background:# | + | ! style="background:#D2691E; color:white;" | C |
− | ! style="background:# | + | ! style="background:#D2691E; color:white;" | Comentário |
|- | |- | ||
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]] | | |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]] |
Edição atual tal como às 14h05min de 19 de fevereiro de 2020
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);
}
|