Mudanças entre as edições de "MCO18703 2017 2 AULA04"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
 
(5 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
 +
=Objetivos=
 +
 +
*O aluno será capaz de implementar estruturas de repetição em linguagem C.
 +
*Implementar ''loops'' infinitos.
 +
*Uso do break associado ao comando ''for''.
 +
 +
=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''
 +
 +
<blockquote style="background: #FFEEFF; border: 1px solid red; margin-left: 0px; margin-right: 0px; padding: 1em;">
 +
Nota 1: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.
 +
</blockquote>
 +
 +
 +
 +
==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>
 +
 +
main()
 +
{
 +
  int i;
 +
 
 +
  for (i=0;i<10;i=i+1)
 +
      printf("i =%d\n",i);
 +
}
 +
</syntaxhighlight>
 +
 +
 +
{| border="1" cellpadding="5" cellspacing="0"
 +
! style="background: #FFD700;" | Fluxograma
 +
! style="background: #FFD700;" | C
 +
! style="background: #FFD700;" | Comentário
 +
|-
 +
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]
 +
||<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 uma única VEZ, <br>no início do comando.
 +
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. <br>Ela é executada após a expressão
 +
de inicialização e, na sequência,  <br>no início de cada ''loop''. <br>A expressão i++ é executada no final de cada ''loop''.
 +
|}
 +
 +
==Aninhamento de loops==
 +
 +
<syntaxhighlight lang=c>
 +
#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);
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
=Loop Infinito=
 +
 +
É possível implementar loops infinitos com qualquer uma das instruções acima.
 +
 +
Exemplo com comando ''for'':
 +
 +
<syntaxhighlight lang=c>
 +
main()
 +
{
 +
  for(;;) {
 +
        /* Este bloco se executará infinitamente */
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
;Exemplo
 +
 +
Usando o comando '''for''' aninhado, construa um programa que implemente a figura abaixo. <br>
 +
 +
:x
 +
:xx
 +
:xxx
 +
:xxxx
 +
:xxxxx
 +
:xxxxxx
 +
:xxxxxxx
 +
:xxxxxxxx
 +
:xxxxxxxxx
 +
:xxxxxxxxxx
 +
:xxxxxxxxxxx
 +
:xxxxxxxxxxxx
 +
:xxxxxxxxxxxxx
 +
 +
 +
<syntaxhighlight lang=c>
 +
#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 */
 +
  }
 +
 +
}
 +
</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. 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>
 +
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|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>
 +
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>
 +
 +
 +
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|Solução}}
 +
<syntaxhighlight lang=c>
 +
#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);
 +
 +
}
 +
</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|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>
 +
 +
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 atual tal como às 15h07min de 24 de outubro de 2017

Objetivos

  • O aluno será capaz de implementar estruturas de repetição em linguagem C.
  • Implementar loops infinitos.
  • Uso do break associado ao comando for.

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.


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

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

}




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