Mudanças entre as edições de "PR1022804 2023 2 AULA06"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
(Sem diferença)

Edição atual tal como às 09h59min de 11 de setembro de 2023

Estruturas de Repetição

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; e
  • Utilizar o comando break associado ao comando for, do, while.


METODOLOGIA
A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos testados programas no microcomputador do laboratório de informática.


INTRODUÇÃO
Dentro da lógica de programação é uma estrutura que permite executar mais de uma vez o mesmo comando ou conjunto de comandos, de acordo com uma condição ou com um contador. Na linguagem C existem 4 estruturas/comandos que permitem implementar loops ou repetições de blocos de código:
  • while()
  • do – while()
  • for()
  • goto – label


Nota
Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.

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>
void 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>
void 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:

Fluxograma C Comentário
Fluxo5.jpg
while(contador<5) {
   printf("Entre com x\n");
   scanf("%f",&x);
   soma=soma+x;
   contador = contador + 1;
}
O comando while() aplicado sobre um bloco de instruções.
Note que se for uma instrução simples,
as chaves podem ser omitidas.

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>
void main() 
{
  int contador;
  
  contador=0;
  do {  
     printf("valor do contador =  %d\n", contador);
     contador=contador+1;
  } while (contador<5);
}


Fluxograma C Comentário
FluxoDoWhile-Eraldo.jpg
contador = 0;
do {
        scanf("%d",&x);
        soma=soma+x;
        if (soma>150) 
           y=z+x;
        contador++;
} while(contador<5);
Note que instruções while e if são tratadas
como instruções normais

que podem ser aninhadas
normalmente em outros comandos.

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;
}


Estrutura de Repetição
#include <stdio.h>

void main()
{
  int i;
  
  for (i=0;i<10;i=i+1)
      printf("i =%d\n",i);
}


Fluxograma C Comentário
FluxogramaComandoFor-Eraldo.jpg
for(i=0; i<10; i++) {
  printf("Laço de número %d\n", i);
  if (i==5)
      printf("Este é o laço 5\n");
}
Observe que a expressão i=0 é executada SEMPRE e
uma única VEZ, no início do comando.

A expressão i<10 é o controle do loop.
Se FALSA o loop é encerrado.
Ela é executada após a expressão de inicialização e,
na sequência, no início de cada loop.
A expressão i++ é executada no final de cada loop.

Comando goto – label

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>

void 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.

Aninhamento de loops

#include <stdio.h>
void 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);
  }
}

Loop Infinito

É possível implementar loops infinitos com qualquer uma das instruções acima.

Exemplo com comando for:

void main()
{
   for(;;) {
        /* Este bloco se executará infinitamente */
   }
}

ou com o comando while:

void 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>
void 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>
void 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>
void 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>
void main()
{
  int i,j;

  for (i=0;i<3;i++) {
     if (i==1) { 
         continue;
     }
     printf("valor de i = %d\n", i);
     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>

void main()
{
    int count,
        soma;

    for(count=1, soma=0 ; count<=100 ; count++)
    {
        if( count%3 ==0)
                continue;

        soma = soma + count;
    }
    printf("Soma %d", soma);
}





Icone voltar.png Icone menu.png Icone prox.png