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.