Os objetivos deste exercício-programa são:
Você escreverá um programa que lê um arquivo de texto, ordena as linhas desse
arquivo de texto e escreve na saída padrão o arquivo ordenado. Seu programa,
chamado ordena
, deve ler a entrada padrão, caso ele
tenha sido ativado sem nenhum argumento na linha comando, ou o arquivo cujo
nome foi passado como argumento na linha de comando. Assim, no Linux, a linha
de comando
./ordena
faz o programa tomar como arquivo de entrada a entrada padrão, que neste caso é o teclado. Já a linha de comando
./ordena arq_entrada
faz o programa tomar como entrada o arquivo arq_entrada
.
Finalmente, a linha de comando
./ordena < arq_entrada
faz o programa tomar como arquivo de entrada a entrada padrão redirecionada,
que neste caso é o arquivo arq_entrada
.
O programa ordena
deve reconhecer as seguintes opções:
-a<alg>
: Usa o algoritmo de ordenação especificado
pelo caractere <alg>
, que pode ser um dos
seguintes caracteres:
H
para Heapsort;I
para ordenação por inserção;M
para Mergesort;Q
para Quicksort;S
para ordenação por seleção.-a<alg>
, a ordenação é feita com o
Quicksort.-f
: Não faz distinção entre letras minúsculas e maiúsculas,
ordenando as linhas como se todas as letras minúsculas fossem maiúsculas
("fold lower case to upper case characters").-n
: Considera que cada linha começa com um campo numérico e
faz a ordenação pelo valor desse campo (que deve ser um número
inteiro)-r
: Gera um arquivo com as linhas em ordem decrescente
(ordenação reversa). Se não houver -r
, o arquivo de saída
é gerado com as linhas em ordem crescente.-t
: Mede o tempo (em segundos) gasto na função de ordenação
e apresenta essa informação na saída de erro padrão.Exemplo: a linha de comando
./ordena -r -f -aM arq_entrada
faz ordenação reversa (decrescente) do arquivo arq_entrada
,
considerando as letras minúsculas como maiúsculas e usando o algoritmo
Mergesort.
char
s com espaço suficiente para o arquivo inteiro.
Nesse vetorzão, cada linha do arquivo será terminada pelo caractere
nulo ('\0'
). Em outras palavras, os terminadores de
linha '\n'
devem ser trocados por '\0'
quando
o arquivo de entrada for lido. Se não houver um '\n'
ao
final da última linha do arquivo, mesmo assim essa linha deverá aparecer
no vetorzão terminada por um '\0'
. É importante o
'\0'
ao final de cada linha para que todas as linhas sejam
strings e, portanto, possam ser passadas como parâmetro para
funções que esperam strings. Em particular, isso permite que
função strcmp
seja usada para comparar linhas.char
s deve ser alocado dinamicamente (via
malloc
). Quando o nome do arquivo de entrada for
especificado na linha de comando (ou seja, quando a entrada para o
programa ordena
não for a entrada padrão),
esse vetor deve ser alocado com tamanho igual ao tamanho do arquivo de
entrada mais um. (O "mais um" prevê a possibilidade de não haver um
'\n'
ao final da última linha do arquivo de entrada.) Quando
a entrada para o programa ordena
for a entrada padrão, o
vetorzão deve ser alocado com espaço para 40000000 caracteres.int (*cmp)(char [], char []) /* ponteiro para função que recebe dois vetores de chars e devolve int */conforme vimos em classe.
Efetue uma série de experimentos com seu programa, com o objetivo de comparar os tempos de execução dos diferentes algoritmos de ordenação para arquivos de vários tamanhos e características (arquivos já em ordem crescente ou decrescente, arquivos parcialmente ordenados, arquivos não ordenados). Verifique se as complexidades teóricas dos algoritmos são confirmadas pelos seus experimentos. Entregue, juntamente com seu programa, um relatório com os resultados dos experimentos.
Este trabalho deve ser entregue até 04/12, através do sistema Paca/Moodle.
ep3-<seu-número-USP.tar.gz>
ou
ep3-<seu-número-USP.zip>
.
Por exemplo: ep3-12345678.zip
..tar.gz
ou .zip
. (Exemplo:
ep3-12345678
.) Todos os arquivos desempacotados devem
estar dentro desse diretório..h
ou .c
necessários para gerar o programa
ordena
a partir do zero. Deve conter também um
arquivo em formato PDF com o seu relatório. O nome desse arquivo
deve ser relatorio.pdf
..h
ou .c
devem ter
um cabeçalho como o seguinte:
/**********************************************************/ /* Aluno: Fulano de Tal */ /* Número USP: 12345678 */ /* Exercício-Programa 3 -- Ordenação de Arquivos de Texto */ /* MAC122 -- BMAC -- 2008 -- Professor: Reverbel */ /* Compilador: ... (DevC++ ou gcc) versão ... */ /**********************************************************/
gcc
,
com as opções "-Wall -ansi -pedantic -O2
".gcc
,
passe ao compilador (na linha de comando) as opções
"-Wall -ansi -pedantic -O2
".
Caso você use o DevC++, clique em "Ferramentas" (ou
"Tools") e "Opções do Compilador" (ou "Compiler
Options") e, na tela de opções do compilador, marque como
selecionada a opção "Adicione os seguintes comandos quando chamar o
compilador" (ou "Add the following commands when calling
compiler"). Na caixa de texto que aparece logo depois dessa opção,
digite "-Wall -ansi -O2
". (Não use "-pedantic
"
com o DevC++.)