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 1: Linha 1:
==Objetivos==
+
== AULA 6==
  
*Uso do break e do while.
+
===Objetivos===
*Uso da  biblioteca matemática.
 
  
==Uso de break para sair de loops==
+
O aluno deverá ser capaz de colocar estruturas de repetição especificadas
 +
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.
  
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>
+
===Estruturas de Repetição===
É possível sair de um ''loop'' na "força bruta" usando a instrução ''break'':
+
 
 +
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 permite implementar ''loops'' com controle no início:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
main()
+
main()  
 
{
 
{
   int i,j;
+
   int contador;
 +
 
 +
  contador=0;
 +
  while (contador<5) { 
 +
    printf("valor do contador =  %d\n", contador);
 +
    contador=contador+1;
 +
  }
 +
}
 +
</syntaxhighlight>
  
   for (i=0;i<10;i++) {
+
Variação do exemplo anterior:
    if (i==5)
+
<syntaxhighlight lang=c>
      break;
+
#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("valor de i=%d\n", i);
+
   printf("NO FINAL a expressão  contador < 5 é %d\n", contador<5);
 
}
 
}
 +
</syntaxhighlight>
 +
 +
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:
 +
 +
{| border="1" cellpadding="2"
 +
!Fluxograma
 +
!C
 +
!Comentário
 +
|-
 +
| |[[imagem:fluxo5.jpg|200px]]
 +
||<syntaxhighlight lang=c>while(contador<5) {
 +
  printf("Entre com x\n");
 +
  scanf("%f",&x);
 +
  soma=soma+x;
 +
  contador = contador + 1;
 +
}</syntaxhighlight>|| 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.
 +
 +
<syntaxhighlight lang=c>
 +
#include <stdio.h>
 +
main()
 +
{
 +
  int contador;
 +
 
 +
  contador=0;
 +
  do { 
 +
    printf("valor do contador =  %d\n", contador);
 +
    contador=contador+1;
 +
  } while (contador<5);
 +
}
 +
</syntaxhighlight>
 +
 +
A estrutura do comando, informalmente,  é:
 +
 +
do
 +
  ''instrução_simples;''
 +
while (''expressão'');
 +
 +
ou
 +
 +
do {
 +
  ''lista_de_instruções''
 +
} while (''expressão'');
 +
 
 +
{| border="1" cellpadding="2"
 +
!Fluxograma
 +
!C
 +
!Comentário
 +
|-
 +
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]
 +
||<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 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.
 +
 +
 +
 +
[[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>
 
</syntaxhighlight>
  
 +
A estrutura do comando é:
  
Note que o ''break'' sempre sai do ''loop'' mais próximo a ele.
+
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''
 +
}
 +
 +
{| border="1" cellpadding="2"
 +
!Fluxograma
 +
!C
 +
!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, 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====
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 33: Linha 182:
 
{
 
{
 
   int i,j;
 
   int i,j;
 
+
 
   for (i=0;i<3;i++) {
 
   for (i=0;i<3;i++) {
 
     for (j=0;j<4;j++) {
 
     for (j=0;j<4;j++) {
        if (j==1) {
 
            break;
 
        }
 
 
         printf("valor de j = %d\n", j);
 
         printf("valor de j = %d\n", j);
 
     }
 
     }
    if (i==2)
 
        break;
 
 
     printf("valor de i = %d\n", i);
 
     printf("valor de i = %d\n", i);
 
   }
 
   }
 +
}
 +
</syntaxhighlight>
  
}
+
====Comando ''goto'' ====
  
</syntaxhighlight>
+
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.
  
==Uso do continue para prosseguir no início do ''loop''==
+
Exemplo:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 +
 
main()
 
main()
 
{
 
{
  int i,j;
+
  int i;
  
  for (i=0;i<3;i++) {
+
  i=0;
    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);
 
    }
 
  }
 
  
 +
PONTO1:
 +
  printf("Laço de número %d\n", i);
 +
  i++;
 +
  if (i<10)
 +
      goto PONTO1;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Usando funções da biblioteca matemática==
+
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.
  
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:
+
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].
  
Tanto valores passados como argumento, quanto o returno de valores são do tipo ''double''.<br>
+
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].
Veja alguns exemplos de funções disponíveis ao se utilizar ''math.h''.
 
  
{| border="1" cellpadding="5" cellspacing="0"
+
====Loop Infinito====
! style="background: #ffdead;" | Função
+
 
! style="background: #ffdead;" | Como chamar
+
É possível implementar loops infinitos com qualquer uma das instruções acima.
|-
+
 
!style="text-align: center;" | Seno
+
Exemplo com comando ''for'':
|style="text-align: center;" | sin(x)
+
 
|-
+
<syntaxhighlight lang=c>
!style="text-align: center;" | Cosseno
+
main()
|style="text-align: center;" | cos(x)
+
{
|-
+
  for(;;) {
!style="text-align: center;" | Tangente
+
        /* Este bloco se executará infinitamente */
|style="text-align: center;" | tan(x)
+
  }
|-
+
}
!style="text-align: center;" | Exponencial
+
</syntaxhighlight>
|style="text-align: center;" | exp(x)
 
|-
 
!style="text-align: center;" | Logaritmo
 
|style="text-align: center;" | log(x), log10(x)
 
|-
 
!style="text-align: center;" | Potência
 
|style="text-align: center;" | pow(x,y)
 
|-
 
!style="text-align: center;" | Raiz
 
|style="text-align: center;" | sqrt(x)
 
|}
 
  
 +
ou com o comando ''while'':
 +
<syntaxhighlight lang=c>
 +
main()
 +
{
 +
  while(1) {
 +
        /* Este bloco se executará infinitamente */
 +
  }
 +
}
 +
</syntaxhighlight>
  
;Atenção
+
#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.
No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:
+
  aaaaaaaaaa
 +
  a        a
 +
  aaaaaaaaaa
  
<syntaxhighlight lang=c>  
+
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
#include <math.h>
 
  
main()
+
void imp_linha_cheia(int margem, int num_caracteres, char car1)
 
{
 
{
+
  int i;
   float x,y; /* declaração de duas variáveis reais */
+
 
 +
  for(i=0;i<margem;i++)
 +
printf(" ");
 +
   for(i=0;i<num_caracteres;i++)
 +
printf("%c", car1);
 +
  printf("\n"); 
 +
}
  
  printf ("Entre com o valor de x ");
+
void imp_linha_vazada(int margem, int num_vazados, char car1)
   scanf("%f",&x);
+
{
 +
   int i;
  
   y = sqrtf(x);
+
   for(i=0;i<margem;i++)
   printf ("Raiz de x = %lf", y);
+
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>
 
</syntaxhighlight>
  
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').
 
  
*Compilar e ''linkar'' o arquivo da forma:
+
{{collapse bottom}}
  
  gcc ex1.c -o ex1 -lm
 
  
====EXERCÍCIOS====
 
  
 +
{{collapse top|AULA 6 DIA 28/02/2014}}
  
 +
Exercícios
  
#Faça uma versão "politicamente incorreta" do programa de adivinhação da aula passada, Faça um ''loop'' infinito com o ''do while()'' e use uma instrução ''goto'' para sair do ''loop''.<syntaxhighlight lang=c>
+
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.
/* rand example: guess the number */
+
  aaaaaaaaaa
 +
  a        a
 +
  aaaaaaaaaa
 +
 
 +
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
#include <stdlib.h>
+
 
#include <time.h>
+
main()
 
int main ()
 
 
{
 
{
      int iSecret, iGuess;
+
  int i, j,num_linhas, num_colunas, margem;
+
 
      /* initialize random seed: */
+
 
      srand ( time(NULL) );
+
  printf("Entre com linhas\n");
+
  scanf ("%d",&num_linhas);
      /* generate secret number: */
+
 
      iSecret = rand() % 10 + 1;
+
  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 */
  
      do {
+
  for (i=0;i<margem;i=i+1)
          printf ("Guess the number (1 to 10): ");
+
        printf(" ");
          scanf ("%d",&iGuess);
+
  for (i=0;i<num_colunas;i=i+1)
          if (iSecret<iGuess)
+
printf("A");
              printf ("The secret number is lower\n");
+
  printf("\n");
          else {
+
 
              if (iSecret>iGuess)  
 
                printf ("The secret number is higher\n");
 
          }
 
          if (iSecret==iGuess) /* se acertou salta para FIM */
 
              goto FIM;
 
      } while(1);
 
 
FIM:  printf ("Congratulations!\n");
 
      return 0;
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <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;
 
  
      /* coloca um valor em iGuess que nunca será inserido pelo usuário */
+
2.Construa um programa para desenhar a seguinte figura de forma parametrizável:
      iGuess = -1;
+
 
 +
  AAAAAAAAAAAAAAAA
 +
  AAAAAAAAAAAAAA
 +
  AAAAAAAAAAAA
 +
  AAAAAAAAAA
 +
  AAAAAAAA
 +
  AAAAAA
 +
  AAAA
 +
  AA
 +
  BB
 +
  BBBBB
 +
  BBBBBBBB
 +
  BBBBBBBBBBB
 +
  BBBBBBBBBBBBBB
 +
  BBBBBBBBBBBBBBBBB
 +
  BBBBBBBBBBBBBBBBBBBB
 +
  BBBBBBBBBBBBBBBBBBBBBBB
  
      while (iSecret!=iGuess) {
+
3.#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:
          printf ("Guess the number (1 to 10): ");
+
<syntaxhighlight lang=c>
          scanf ("%d",&iGuess);
 
          if (iSecret<iGuess)
 
              printf ("The secret number is lower\n");
 
          else {
 
              if (iSecret>iGuess)
 
                printf ("The secret number is higher\n");
 
          }
 
      }
 
 
      printf ("Congratulations!\n");
 
      return 0;
 
}
 
</syntaxhighlight>
 
#Ainda sobre o exercício 1, implemente uma versão usando ''loop'' infinito e o comando ''break'';<syntaxhighlight lang=c>
 
 
/* rand example: guess the number */
 
/* rand example: guess the number */
 
#include <stdio.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <stdlib.h>
 
#include <time.h>
 
#include <time.h>
+
 
 
int main ()
 
int main ()
 
{
 
{
 
       int iSecret, iGuess;
 
       int iSecret, iGuess;
+
 
 
       /* initialize random seed: */
 
       /* initialize random seed: */
      srand ( time(NULL) );
+
        srand ( time(NULL) );
+
 
 
       /* generate secret number: */
 
       /* generate secret number: */
      iSecret = rand() % 10 + 1;
+
      iSecret = rand() % 10 + 1;
  
 
       do {
 
       do {
Linha 231: Linha 401:
 
                 printf ("The secret number is higher\n");
 
                 printf ("The secret number is higher\n");
 
           }
 
           }
          if (iSecret==iGuess) /* se acertou sai do loop */
+
      } while (iSecret!=iGuess);
              break;
+
 
      } while(1);  
 
 
 
       printf ("Congratulations!\n");
 
       printf ("Congratulations!\n");
 
       return 0;
 
       return 0;
 
}
 
}
</syntaxhighlight>
+
</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 17h00min de 27 de fevereiro de 2015

AULA 6

Objetivos

O aluno deverá ser capaz de colocar estruturas de repetição especificadas em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.

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