isort.c

/* Arquivo: isort.c                  
// Autor:   PF
// Data:    1/5/2003                     
//////////////////////// */
                                         
/* Este programa coloca em ordem crescente qualquer sequência de 
// números inteiros. A sequência é dada em um arquivo, e o 
// resultado é gravado em outro arquivo. O usuário deve indicar 
// os nomes dos arquivos (o segundo pode ser igual ao primeiro) 
// na linha de comando. Eis um exemplo de linha de comando que 
// ativa o programa:
//
//              isort dados.txt resultados.txt
//
// Restrição: A sequência dada pode ter no máximo 1000 elementos.
// Referências: O programa usa o bem-conhecido algoritmo de 
// ordenação-por-inserção (= insertion sort). Minha inspiração é 
// o programa 6.3 (p.264) do livro "Algorithms in C", 3rd. ed., 
// Addison-Wesley, 1998, de R. Sedgewick.
////////////////////////////////////////////////////////////// */


/* //////////////////////////////
// Seção 1: Protótipos de funções  
////////////////////////////// */

#include <stdlib.h>
#include <stdio.h>
void isort( int a[], int l, int r);


/* //////////////////////////////
// Seção 2: Constantes simbólicas  
////////////////////////////// */

#define MAX 1000 


/* ///////////////////////////////////
// Seção 3: Programa propriamente dito
/////////////////////////////////// */

int main( int numargs, char *arg[])
{
   FILE *arq;
   int n, a[MAX+1];
   int i;
   if (numargs != 3) {
      printf( "\nUso: isort <nomearq1> <nomearq2>");
      printf( "\n<nomearq1> é o nome do arquivo de dados");
      printf( "\n<nomearq2> é o nome do arquivo de resultados\n");
      return EXIT_FAILURE;
   }
   arq = fopen( arg[1], "r");
   if (arq == NULL) {
      printf( "\nNão encontrei arquivo %s\n", arg[1]);
      return EXIT_FAILURE;
   }
   n = 0;
   while (fscanf( arq, "%d", &a[n]) == 1) {
      ++n;
      if (n > MAX) {
         printf( "\nNão sei lidar com mais que %d números\n", 
                 MAX);
         return EXIT_FAILURE;
      }
   };
   fclose( arq);

   isort( a, 0, n-1);

   arq = fopen( arg[2], "w");
   if (arq == NULL) {
      printf( "\nSocorro! Não consigo abrir arquivo %s\n", 
              arg[2]);
      return EXIT_FAILURE;
   }
   for (i = 0; i < n; ++i)
      fprintf( arq, "%d\n", a[i]);
   fclose( arq);
   return EXIT_SUCCESS;
}


/* A função isort rearranja os elementos de um vetor a[l..r] de 
// modo que ele fique em ordem crescente, ou seja, de modo que 
// tenhamos a[l] <= a[l+1] <= ... <= a[r]. 
//////////////////////////////////////////////////////////// */

void isort( int a[], int l, int r)
{
   int i;
   for (i = l+1; i <= r; i++) {
      int j = i, v = a[i];
      while (j > l && v < a[j-1]) {
         a[j] = a[j-1];
         j--;
      }
      a[j] = v;
   }
}


/* ////////////////////////////////////////
// Exemplo
// -------
//
// Se o arquivo dados.txt contém
// 
// 444
// 333
// 222
// 111
// 99
// 88
// 77
// 66
// 55
// 111
// 222
//
// então o comando isort dados.txt resultados.txt
// produzirá o arquivo 
//
// 55
// 66
// 77
// 88
// 99
// 111
// 111
// 222
// 222
// 333
// 444
//
//////////////////////////////////////// */


Generated by GNU enscript 1.6.3.