Mudanças entre as edições de "PR1022804 2024 1 AULA06"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=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 es...')
 
(Página substituída por ' ----- link=PR1022804_2024_1_AULA05 link=PR1022804_2024_1#Aulas Imagem:icone_prox.png|link=PR1022804_2024_1...')
Etiqueta: Substituído
Linha 1: Linha 1:
=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''
 
 
 
<blockquote style="background:#E6E6FA; border: 2px solid #8A2BE2; margin-left: 100px; margin-right: 100px; padding: 2em;">
 
;Nota: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.
 
</blockquote>
 
 
==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<br>
 
a declaração é executada e faz-se o teste novamente, e assim por diante.<br>
 
 
O comando ''while'' permite implementar ''loops'' com controle no início:
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
void main()
 
{
 
  int contador;
 
 
 
  contador=0;
 
  while (contador<5) { 
 
    printf("valor do contador =  %d\n", contador);
 
    contador=contador+1;
 
  }
 
}
 
</syntaxhighlight>
 
 
 
Variação do exemplo anterior:
 
 
<syntaxhighlight lang=c>
 
#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);
 
}
 
</syntaxhighlight>
 
 
 
Vamos ver a correspondência do comando ''while'' com um fluxograma:
 
 
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
 
! style="background:#8A2BE2; color:white;" | Fluxograma
 
! style="background:#8A2BE2; color:white;" | C
 
! style="background:#8A2BE2; color:white;" | Comentário
 
|-
 
| |[[imagem:fluxo5.jpg|300px]]
 
||<syntaxhighlight lang=c>while(contador<5) {
 
  printf("Entre com x\n");
 
  scanf("%f",&x);
 
  soma=soma+x;
 
  contador = contador + 1;
 
}</syntaxhighlight>|| O comando ''while()'' aplicado sobre um bloco de instruções.<br>Note que se for uma instrução simples,<br>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 <br>
 
mais instruções, com controle do ''loop'' no final. <br>
 
Isto permite que o bloco seja executado pelo menos uma vez.
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
void main()
 
{
 
  int contador;
 
 
 
  contador=0;
 
  do { 
 
    printf("valor do contador =  %d\n", contador);
 
    contador=contador+1;
 
  } while (contador<5);
 
}
 
</syntaxhighlight>
 
 
 
 
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
 
! style="background:#8A2BE2; color:white;" | Fluxograma
 
! style="background:#8A2BE2; color:white;" | C
 
! style="background:#8A2BE2; color:white;" | Comentário
 
|-
 
| |[[imagem:fluxoDoWhile-Eraldo.jpg|300px]]
 
||<syntaxhighlight lang=c>
 
contador = 0;
 
do {
 
        scanf("%d",&x);
 
        soma=soma+x;
 
        if (soma>150)
 
          y=z+x;
 
        contador++;
 
} while(contador<5);
 
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas <br>como instruções normais
 
que podem ser aninhadas <br>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;
 
}
 
 
 
 
[[arquivo:ComandoFor.gif|thumb|right| Estrutura de Repetição]]
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
 
void main()
 
{
 
  int i;
 
 
 
  for (i=0;i<10;i=i+1)
 
      printf("i =%d\n",i);
 
}
 
</syntaxhighlight>
 
 
 
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
 
! style="background:#8A2BE2; color:white;" | Fluxograma
 
! style="background:#8A2BE2; color:white;" | C
 
! style="background:#8A2BE2; color:white;" | Comentário
 
|-
 
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]
 
||<syntaxhighlight lang=c>
 
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");
 
}
 
</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''. <br>Se FALSA o ''loop'' é encerrado. <br>Ela é executada após a expressão
 
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''.
 
|}
 
 
==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:
 
 
<syntaxhighlight lang=c>
 
#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;
 
}
 
</syntaxhighlight>
 
 
: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 [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].
 
 
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].
 
 
=Aninhamento de loops=
 
 
<syntaxhighlight lang=c>
 
#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);
 
  }
 
}
 
</syntaxhighlight>
 
 
==Loop Infinito==
 
 
É possível implementar loops infinitos com qualquer uma das instruções acima.
 
 
Exemplo com comando ''for'':
 
 
<syntaxhighlight lang=c>
 
void main()
 
{
 
  for(;;) {
 
        /* Este bloco se executará infinitamente */
 
  }
 
}
 
</syntaxhighlight>
 
 
ou com o comando ''while'':
 
 
<syntaxhighlight lang=c>
 
void main()
 
{
 
  while(1) {
 
        /* Este bloco se executará infinitamente */
 
  }
 
}
 
</syntaxhighlight>
 
 
 
;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
 
 
 
<syntaxhighlight lang=c>
 
#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 */
 
  }
 
 
}
 
</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>
 
void 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. 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.
 
 
 
<syntaxhighlight lang=c>
 
#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);
 
  }
 
 
}
 
 
</syntaxhighlight>
 
 
;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).
 
 
 
{{collapse top|bg=#E6E6FA|Solução}}
 
<syntaxhighlight lang=c>
 
#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);
 
}
 
</syntaxhighlight>
 
{{collapse bottom}}
 
 
==Uso do ''CONTINUE'' para prosseguir no início do ''loop''==
 
 
<syntaxhighlight lang=c>
 
#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);
 
    }
 
  }
 
 
}
 
</syntaxhighlight>
 
 
 
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.
 
 
 
{{collapse top|bg=#E6E6FA|Solução}}
 
<syntaxhighlight lang=c>
 
#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);
 
}
 
</syntaxhighlight>
 
{{collapse bottom}}
 
 
<!--
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
 
void imp_linha_cheia(int margem, int num_caracteres, char car1)
 
{
 
  int i;
 
 
  for(i=0;i<margem;i++)
 
printf(" ");
 
  for(i=0;i<num_caracteres;i++)
 
printf("%c", car1);
 
  printf("\n"); 
 
}
 
 
void imp_linha_vazada(int margem, int num_vazados, char car1)
 
{
 
  int i;
 
 
  for(i=0;i<margem;i++)
 
printf(" ");
 
  printf("%c", car1);
 
  for(i=0;i<num_vazados;i++)
 
printf(" ");
 
  printf("%c\n", car1);
 
}
 
 
void plot_ret(int margem, int num_vazados, int num_linhas_vazado, char car1)
 
{
 
  int i;
 
 
  imp_linha_cheia(margem, num_vazados+2, car1);
 
  for(i=0;i<num_linhas_vazado;i++)
 
    imp_linha_vazada(margem, num_vazados, car1);
 
  imp_linha_cheia(margem, num_vazados+2, car1);
 
}
 
</syntaxhighlight>
 
 
 
{{collapse bottom}}
 
 
 
 
{{collapse top|bg=#E6E6FA|AULA 6 DIA 28/02/2014}}
 
 
Exercícios
 
 
1.Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.
 
  aaaaaaaaaa
 
  a        a
 
  aaaaaaaaaa
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
 
void main()
 
{
 
  int i, j,num_linhas, num_colunas, margem;
 
 
 
  printf("Entre com linhas\n");
 
  scanf ("%d",&num_linhas);
 
 
  printf("Entre com colunas\n");
 
  scanf ("%d",&num_colunas);
 
 
  printf("Entre com margem\n");
 
  scanf ("%d",&margem);
 
 
 
  /* subproblema 1 */
 
 
  for (i=0;i<margem;i=i+1)
 
        printf(" ");
 
  for (i=0;i<num_colunas;i=i+1)
 
printf("A");
 
  printf("\n");
 
 
  /*subproblema 3 */
 
  for(j=0;j<num_linhas-2;j++) {
 
 
        /*subproblema 2 */
 
 
  for (i=0;i<margem;i=i+1)
 
printf(" ");
 
 
 
  printf("A");
 
 
 
  for(i=0;i<num_colunas-2;i=i+1)
 
printf(" ");
 
 
  printf("A");
 
        printf("\n");
 
  }
 
 
  /* subproblema 1 */
 
 
  for (i=0;i<margem;i=i+1)
 
        printf(" ");
 
  for (i=0;i<num_colunas;i=i+1)
 
printf("A");
 
  printf("\n");
 
 
 
}
 
</syntaxhighlight>
 
 
2.Construa um programa para desenhar a seguinte figura de forma parametrizável:
 
 
  AAAAAAAAAAAAAAAA
 
  AAAAAAAAAAAAAA
 
  AAAAAAAAAAAA
 
  AAAAAAAAAA
 
  AAAAAAAA
 
  AAAAAA
 
  AAAA
 
  AA
 
  BB
 
  BBBBB
 
  BBBBBBBB
 
  BBBBBBBBBBB
 
  BBBBBBBBBBBBBB
 
  BBBBBBBBBBBBBBBBB
 
  BBBBBBBBBBBBBBBBBBBB
 
  BBBBBBBBBBBBBBBBBBBBBBB
 
 
3.#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:
 
<syntaxhighlight lang=c>
 
/* rand example: guess the number */
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <time.h>
 
 
int main ()
 
{
 
      int iSecret, iGuess;
 
 
      /* initialize random seed: */
 
        srand ( time(NULL) );
 
 
      /* generate secret number: */
 
      iSecret = rand() % 10 + 1;
 
 
      do {
 
          printf ("Guess the number (1 to 10): ");
 
          scanf ("%d",&iGuess);
 
          if (iSecret<iGuess)
 
              printf ("The secret number is lower\n");
 
          else {
 
              if (iSecret>iGuess)
 
                printf ("The secret number is higher\n");
 
          }
 
      } while (iSecret!=iGuess);
 
 
      printf ("Congratulations!\n");
 
      return 0;
 
}
 
</syntaxhighlight> Estude também o significado das instruções:
 
  srand ( time(NULL) );
 
  iSecret = rand() % 10 + 1;
 
 
4.Sobre o exercício 3, implemente uma versão usando o comando while().
 
 
5.Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número.
 
 
 
-->
 
  
  

Edição das 16h51min de 5 de março de 2024





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