Bibliotecas

Bibliotecas são muito importantes na linguagem C, pois a linguagem suporta apenas os recursos mais básicos de que necessita. A linguagem C não contém sequer funções de I/O para ler a partir do teclado e digitar na tela. Qualquer coisa que vá além da linguagem básica deve ser escrita por um programador. Geralmente, os trechos de código resultantes são colocados em bibliotecas para torná-los facilmente reutilizáveis. Vimos a biblioteca padrão de I/O padrão ou stdio: as bibliotecas padrão existem para I/O padrão, funções matemáticas, manipulação da string de caracteres, manipulação de tempo e assim por diante. Você pode utilizar as bibliotecas em seus próprios programas para dividi-los em módulos. Isso os torna fáceis de entender, testar e depurar, como também possibilita a reutilização do código por outros programas que você criar.

Você pode criar suas próprias bibliotecas facilmente. Como exemplo, pegaremos um código do artigo anterior desta série e criaremos uma biblioteca a partir de duas de suas funções. Eis o código com o qual iniciaremos:

  #include <stdio.h>
  #define MAX 10     

  int a[MAX];
  int rand_seed=10;

  int rand()  
  /* de K&R
     - produz um número aleatório entre 0 e 32767.*/
  {
      rand_seed = rand_seed * 1103515245 +12345;
      return (unsigned int)(rand_seed / 65536) % 32768;
  }    
  void main()
  {      
  int i,t,x,y;  

  /* preenche a matriz*/
      for (i=0; i < MAX; i++)
      {
          a[i]=rand();
          printf("%d\n",a[i]);
      }
     /* 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("%d\n",a[i]);
  }  

Este código preenche uma matriz com números aleatórios, ordena-os em bubble sort e depois os exibe na lista ordenada.

Pegue o código bubble sort e use o que aprendeu no artigo anterior para criar uma função a partir dele. Visto que a matriz a e a constante MAX são globalmente conhecidas, a função que você cria não precisa de parâmetros, tampouco apresentar um resultado. Porém, você deve usar variáveis locais para x, y e t.

Uma vez testada a função para verificar se ela está funcionado, passe o número de elementos como um parâmetro em vez de utilizar MAX:

  #include <stdio.h>
  #define MAX 10

  int a[MAX];
  int rand_seed=10;
     /* de 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;
  }
  void bubble_sort(int m)
  {
      int x,y,t;
        for (x=0; x < m-1; x++)
          for (y=0; y < m-x-1; y++)
              if (a[y] > a[y+1])
              {
                  t=a[y];
                   a[y]=a[y+1];
                   a[y+1]=t;
               }
  }
    void main()
  {
      int i,t,x,y;
       /* preenche a matriz */
       for (i=0; i < MAX; i++)
      {    a[i]=rand();
           printf("%d\n",a[i]);
      }
      bubble_sort(MAX);
      /* imprime matriz classificada */
      printf("--------------------n");
      for (i=0; i < MAX; i++)
          printf("%d\n",a[i]);
  }  

Você também pode generalizar ainda mais a função bubble_sort passando a como um parâmetro:

  bubble_sort(int m, int a[]) 

Esta linha diz: "Aceitar a matriz do inteiro a de qualquer tamanho como parâmetro". Nada precisa ser alterado no corpo da função bubble_sort. Para chamar bubble_sort, altere a chamada para:

  bubble_sort(MAX, a);  

Observe que &a não foi usado na chamada de função, embora a classificação vá mudar a. O motivo para tal ficará mais evidente depois que você entender os ponteiros.