Aqui você encontra infomações sobre Informática, Eletrônica, Elétrica, Mecânica e Automação

quinta-feira, 14 de abril de 2011

Linguagem C (parte 5)

Matrizes Nesta seção, criaremos um pequeno programa em C que gera 10 números aleatórios e os ordena. Para tal, utilizaremos uma nova disposição de variável denominada matriz.
Uma matriz permite declarar e trabalhar com uma coleção de valores de mesmo tipo. Por exemplo, você pode querer criar uma coleção de 5 inteiros. Uma forma para fazer isso seria declarar 5 inteiros diretamente:
  int a, b, c, d, e; 
Isso está certo, mas e se você precisasse de milhares de números inteiros? Uma forma mais fácil é declarar uma matriz de 5 inteiros.
  int a[5];  
Os cinco inteiros individuais dentro desta matriz são acessados por um índice. Todas as matrizes iniciam em zero e vão até n-1 no C. Assim, int a[5]; contém 5 elementos. Por exemplo:
  int a[5];


  a[0] = 12;
  a[1] = 9;
  a[2] = 14;
  a[3] = 5;
  a[4] = 1;  
Uma das vantagens sobre a indexação de matriz é que você pode usar um loop para manipular o índice. Por exemplo, o código a seguir inicializa todos os valores na matriz em 0:
  int a[5];


  int i;
  for (i=0; i<5; i++)
      a[i] = 0;  
O código seguinte inicializa seqüencialmente os valores na matriz e então os imprime:
  #include <stdio.h> 

  int main()
  {
      int a[5];
      int i;
        for (i=0; i<5; i++)
          a[i] = i;
      for (i=0; i<5; i++)
          printf("a[%d] = %dn", i, a[i]);
  }  
As matrizes são usadas a toda hora em C. Para entender seu uso, inicie um editor e digite o seguinte código:
  #include <stdio.h>

  #define MAX 10

  int a[MAX];
  int rand_seed=10;

  /* from K&R
     - retorna um número aleatório entre 0 e 32767.*/
  int rand()
  {
      rand_seed = rand_seed * 1103515245 +12345;
      return (unsigned int)(rand_seed / 65536) % 32768;
  }
    int main()
  {
      int i,t,x,y;
       
      /* preenche a matriz */
      for (i=0; i < MAX; i++)
      {
          a[i]=rand();
           printf("%dn",a[i]);
      }
      /* mais coisas aparecerão aqui em breve */
      return 0;
  }  
Este código contém vários conceitos novos. A linha #define declara uma constante denominada MAX e a define em 10. Os nomes de constantes em geral são escritos em letras maiúsculas para destacá-los no código. A linha int a[MAX]; mostra como declarar uma matriz de inteiros em C. Observe que por causa da posição da declaração da matriz, ela é global ao programa.
A linha int rand_seed=10 também declara uma variável global, desta vez denominada rand_seed, que é inicializada em 10 sempre que o programa inicia. Este valor é o inicial para o código de números aleatórios que segue. Em um gerador de números aleatórios reais, o seed deve inicializar como um valor aleatório, como a hora do sistema. Aqui, a função rand produzirá os mesmos valores sempre que executar o programa.
A linha int rand() é uma instrução de função. A função rand não aceita parâmetros e retorna um resultado inteiro: aprenderemos mais sobre as funções em breve. As quatro linhas que seguem implementam a função rand. Por hora, nós as ignoraremos.
A função principal é normal. Quatro inteiros locais são declarados e a matriz é preenchida com 10 valores aleatórios usando um loop for. Observe que a matriz a contém 10 inteiros individuais. Você aponta para um inteiro específico na matriz usando colchetes. Assim a[0] refere-se ao primeiro inteiro na matriz, a[1] refere-se ao segundo, e assim por diante. A linha que começa com /* e termina com */ é denominada de comentário. O compilador ignora completamente a linha de comentário. Você pode colocar notas para si próprio ou outros programadores nos comentários.
Agora adicione o seguinte código no lugar do comentário mais coisas...:
  /* ordenação por bolha da matriz */
  for (x=0; x < MAX-1; x++)
      for (y=0; y < MAX-x-1; y++)
          if (a[y] > a[y+1])
          {
              t=a[y];
              a[y]=a[y+1];
              a[y+1]=t;
           }
  /* imprime matriz classificada */
  printf("--------------------n");
  for (i=0; i < MAX; i++)
  printf("%dn",a[i]);  
Esta codificação classifica os valores aleatórios e os imprime ordenadamente. Sempre que o executar, você obterá os mesmos valores. Para alterar os valores classificados, altere o valor de rand_seed sempre que executar o programa.
O único modo fácil para realmente entender o que o código está fazendo é executá-lo "à mão". Isto é, assuma que MAX é 4 para facilitar, pegue uma folha de papel e finja que é o computador. Desenhe a matriz no papel e coloque 4 valores aleatórios e não-classificados na matriz. Execute cada linha da seção de classificação do código e desenhe exatamente o que acontece. Você verá que, sempre que submetidos ao loop interno, os valores maiores na matriz são empurrados para baixo e os valores menores vão para o topo da matriz.
Tente isto
  • No primeiro trecho do código, tente alterar o loop for que preenche a matriz para uma única linha de código. Certifique-se de que o resultado seja igual ao do código original.
  • Pegue o código de ordenação por bolha e coloque-o em sua própria função. O cabeçalho de função será void bubble_sort(). Depois transfira as variáveis utilizadas pela ordenação por bolha para a função e torne-as locais. Por ser uma matriz local, você não precisa passar parâmetros.
  • Inicialize a semente do número aleatório para diferentes valores.
Erros que devem ser evitados na linguagem C
  • A linguagem C não tem nenhuma verificação de dimensão, portanto, se você indexar além do fim da matriz, ele não o informará a respeito. Ele provavelmente travará ou apresentará dados incorretos.
  • A chamada de função deve incluir () mesmo se nenhum parâmetro for informado. Por exemplo, C aceitará x=rand; mas a chamada não funcionará. O endereço de memória da função rand será colocado em x. Você deve dizer x=rand();.

Nenhum comentário: