Fazendo o EP com as funções básicas exigidas

Fazendo o EP com as funções básicas exigidas

por Rafael Obara -
Número de respostas: 9
Estou com alguns problemas para passar meu EP para a forma de funções. É que eu tenho que colocar no meu EP pelo menos as 4 funções q são exigidas mas eu ñ entendi a diferença entre a função p comprimir um arquivo e a que determina o par (distr, compr). P mim, se eu determinar o par é só imprimi-lo e pronto: Aquele caractere já estará comprimido. Então eu ñ vejo nenhum lugar em que seja necessário colocar a função "comprimir_um_arquivo", sendo suficiente apenas a função que determina o par (dist, compr). Alguém poderia me ajudar?
Em resposta à Rafael Obara

Re: Fazendo o EP com as funções básicas exigidas

por Francisco Reverbel -
A função que comprime um arquivo faz a tarefa completa. Ela recebe os arquivos de entrada (o arquivo original) e de saída (o arquivo comprimido, que ela deve criar). A função começa preenchendo o look-ahead com com bytes lidos do arquivo de entrada, para depois entrar num laço que implementa o algoritmo LZ77. Esse laço vai escrevendo no arquivo de saída os pares gerados pelo LZ77 e, à medida que os bytes do look-ahead vão passando para o dicionário, vai lendo do arquivo de entrada mais bytes do arquivo de entrada. O laço acaba (e a função encerra sua execução) depois que o último byte do arquivo de entrada for lido e sair do look-ahead.

Note que a função comprime_arquivo (ela não precisa ter necessiamente esse nome, fique à vontade para escolher algum outro, desde que seja um nome sugestivo) precisará, a cada volta no laço que implementa o LZ77, determinar o próximo par (dist, comp) que ela escreverá no arquivo de saída. Ou seja, ela precisará chamar a função que determina o próximo par. A função comprime_arquivo também precisará fazer com que o segmento representado por esse par passe do look-ahead para o dicionário. Para isso, ela chamará a função que desloca os bytes da janela.

Acima eu disse que a função comprime_arquivo recebe os arquivos de entrada e de saída. Aqui você tem duas alternativas: (1) fazer essa função receber os nomes desses arquivos, ou (2) fazer essa funcão receber um FILE *entrada e  um FILE *saida. Na alternativa (1), a função comprime_arquivo fica com a responsabilidade de abrir os arquivos, pois ela recebe os nomes dos arquivos e tem de chamar fopen para obter um FILE *entrada e  um FILE *saida. Na alternativa (2), a função principal do programa cuida de abrir os arquivos antes de chamar a função comprime_arquivo, pois neste caso os parâmetros recebidos por comprime_arquivo correspondem a arquivos já abertos.

Esse tipo de escolha é muito comum quando se projeta software. É importante a gente se acostumar a planejar o que vai fazer e pensar na estrutura geral do programa (que funções ele vai ter, qual função chama qual, etc.) antes de sair escrevendo o software. Ou seja, primeiro pense nas alternativas que você tem e faça as escolhas que lhe parecerem melhores, depois escreva o programa!

Em resposta à Francisco Reverbel

Re: Fazendo o EP com as funções básicas exigidas

por Rafael Obara -

Ah.... Axo q estou entendendo. É que o raciocínio que eu estava usando estava bem diferente....

+ então, pela explicação daí de cima, quer dizer que eu posso deixar a função comprimir_um_arquivo como sendo a "principal" e então eu coloco as outras funções dentro dela? Tipow, eu abro apenas uma vez a função comprimir_um_arquivo e só fecho ela uma vez quando terminar a execução do programa (como se o meu main fosse a função comprimir_um_arquivo)?

Em resposta à Rafael Obara

Re: Fazendo o EP com as funções básicas exigidas

por Rodrigo Luiz Marques Flores -
Isso mesmo.

Com o decorrer do tempo e do curso do BCC de vocês, vocês verão que o main ficará menor e praticamente tudo será feito nas funções.

O ideal nesse EP seria o main só ter uma "bifurcação" com a escolha da compressão ou descompressão e fossem feitas chamadas para a compressão e a descompressão no main. Todo o resto seria feito nas funções. Mas certifiquem-se de terminar o programa no main, nada de ficar usando exit(0).
Em resposta à Rodrigo Luiz Marques Flores

Re: Fazendo o EP com as funções básicas exigidas

por José David Fernández Curado -
Desculpe, mas eu usei o exit() em alguns lugares. Eu tenho que mudar ou vc só pede que se o programa rodar até o fim ele termine na função main (podendo então usar o exit se der algum erro em outras funções)?
Em resposta à José David Fernández Curado

Re: Fazendo o EP com as funções básicas exigidas

por Rodrigo Luiz Marques Flores -
Você pode usar o exit(), mas somente em casos onde o programa falha (ex: o fopen devolveu NULL quando pediu para abrir um arquivo).

Usar o exit() num funcionamento normal do programa não é bom.
Em resposta à Rodrigo Luiz Marques Flores

Re: Fazendo o EP com as funções básicas exigidas

por Rafael Obara -
Ainda ñ sei muito bem como usar o end of file. Pesquisei na internet e tentei usá-lo de várias formas:

while (!eof){

while (not EOF){

while (feof(entrada) == 0){

while (!feof(entrada)){

while (janela[254] != feof){

Mas nada dá certo. Eu estou usando o eof de maneira errada?
Em resposta à Rafael Obara

Re: Fazendo o EP com as funções básicas exigidas

por Rodrigo Luiz Marques Flores -

A sintaxe while (!feof(entrada)){
deveria funcionar. Você tem certeza que está lendo alguma coisa dentro desse while (e assim incrementando a entrada?)?