PR1022804 2023 1 AULA06

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

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


Lista de Exercícios para AT1

INTRODUÇÃO
A lista de exercícios para Avaliação Teórica 1 (AT1) está dividida em quatro partes: Algoritmos, Operadores Relacionais e Lógicos, Estruturas de decisão e repetição e Introdução a linguagem C. Lembrando que em cada aula existe vários exercícios propostos. Esses exercícios servirão de base para nossa avaliação online. Não há necessidade de entregar os exercícios e todos os são feitos com base no material de aula da wiki.

Parte I - Algoritmos

[1] O que é um algoritmo e para que serve?

[2] Qual a diferença entre pseudocódigo e fluxograma?

[3] Cite as seis etapas para a construção de um algoritmo.

[4] Quais os pontos fortes e fracos na construção de fluxogramas?

[5] Para que serve um "teste de mesa"?

[6] Qual a diferença entre constantes e variáveis?

[7] O que são as expressões e para que servem?

[8] Explique os operadores: %, ++ e --.

[9] Faça um algoritmo na forma de pseudocódigo que encontre o ponto médio de uma reta dados os pontos A e B dessa reta.

[10] Faça um algoritmo na forma de fluxograma que encontre o ponto médio da metade final de uma reta dados os pontos A e B dessa reta, ou seja, entre M e B, onde M é o ponto médio.

Parte II - Operadores Lógicos e Relacionais

[11] Analise as expressões abaixo e coloque como resultado: 0 para falso e 1 para verdadeiro:

Considerando
A=3, B=-1 e C=2
Expressão Resultado
A>B
C>=A
B<(C-A)
C<=A
A==(C+B)
A!=3
B=1

[12] Analise as expressões abaixo e coloque como resultado: 0 para falso e 1 para verdadeiro:

Considerando
A=-1, B=1, C=0 e D=2
Expressão Resultado
(A>B) && (C>D)
(A<B) && !(C>D)
(A<=B) || (C<1)
A>=B || ((C>=D) && (D<=A))
!A==B) && !(C!=D)
((A==B) || (B<30)) && (C>=D)
(A>B>C>D) |& (B<C<A<D)

Parte III - Estruturas de decisão e repetição

[13] Faça um algoritmo na forma de fluxograma utilizando estrutura de repetição que imprima os 100 primeiros números pares.

[14] Faça um algoritmo na forma de pseudocódigo utilizando estrutura de repetição que imprima todos os anos bissextos a partir de 1900 até 2030.

Parte IV - Introdução a linguagem C

[15] Descreva o processo de compilação de um programa em linguagem C.

[16] O que é código fonte, código objeto e arquivo executável?

[17] Qual a diferença entre variáveis inteiras e reais?

[18] Pra que servem as funções printf() e scanf()?

[20] Pra que servem e onde são utilizados os símbolos abaixo:

Código Significado
%d
%f
%c
%%

[21] Qual o resultado de para as expressões abaixo?

Considerando
S, A=1,B=3,C=7: Inteiros;


Expressão Resultado de S
S=A+B-(C-10)
S=C/B*(C-A)
S=A--
S=B++
S=C/B/A
S=(C%B)-11%3




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