Mudanças entre as edições de "AULA 7 - Programação 1 - Graduação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 29: Linha 29:
 
:::declaração1;
 
:::declaração1;
 
:::declaração2;
 
:::declaração2;
:::...
 
 
::}
 
::}
  

Edição das 17h27min de 27 de fevereiro de 2015

Objetivos

  • O aluno deverá 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.

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


A estrutura do comando, informalmente, é:

while (expressão)
  instrução_simples;

ou

while (expressão) {
  lista_de_instruções
} 


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

A estrutura do comando, informalmente, é:

do 
  instrução_simples;
while (expressão);

ou

do {
  lista_de_instruções
} while (expressão); 
 
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.


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

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

A estrutura do comando é:

for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco)
    instrução_simples;

ou

for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {
    lista_de_instruções
}
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 */
   }
}
  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
#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);
}


|}


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

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 (referência) abaixo:

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