Mudanças entre as edições de "PRG122804 2017 2 AULA06"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 293: Linha 293:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
 +
==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.<br>
 +
É possível sair de um ''loop'' na "força bruta" usando a instrução ''break'':
 +
 +
<syntaxhighlight lang=c>
 +
#include <stdio.h>
 +
main()
 +
{
 +
  int i,j;
 +
 +
  for (i=0;i<10;i++) {
 +
    if (i==5)
 +
      break;
 +
  }
 +
  printf("valor de i=%d\n", i);
 +
}
 +
 +
</syntaxhighlight>
 +
 +
 +
Note que o ''break'' sempre sai do ''loop'' mais próximo a ele.
 +
 +
 +
<syntaxhighlight lang=c>
 +
#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);
 +
  }
 +
 +
}
 +
 +
</syntaxhighlight>
 +
 +
==Uso do continue para prosseguir no início do ''loop''==
 +
 +
<syntaxhighlight lang=c>
 +
#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);
 +
    }
 +
  }
 +
 +
}
 +
</syntaxhighlight>
 +
 +
  
 
<!--
 
<!--

Edição das 14h14min de 29 de agosto de 2017

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:

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

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.

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.


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

}

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

}





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