Anda di halaman 1dari 4

Lgica de Programao

Laboratrio 08: Compressor de Dados


Prof. Dr. Fbio Augusto Menocci Cappabianco
1. Introduo
Este laboratrio ter como objetivos treinar a manipulao de strings e exercitar o planejamento e
a organizao de programas.
Lembrando que a primeira parte do laboratrio contm problemas que no precisam ser
entregues. Eles serviro de ajuda para a implementao da segunda parte que vale nota. importante
relembrar tambm que no sero aceitos em hiptese nenhuma programas enviados por e-mail, atravs
do sistema Moodle, diretamente para o professor ou para o monitor. Tambm no sero aceitos trabalhos
atrasados sem justificativa aceitvel, uma vez que os laboratrios tero prazos de aproximadamente uma
semana para serem feitos e entregues.
Novamente, metade dos testes est aberta para visualizao dos alunos. Isto permitir que erros de
implementao sejam corrigidos. At o final do prazo, vocs podero submeter quantas vezes desejarem,
mas apenas a ltima submisso ser avaliada. No sero consideradas em hiptese alguma submisses
anteriores. No sero feitas revises por pequenos erros. O exerccio deve estar inteiramente correto.
2. Problemas de treinamento (No sero entregues!)
1) Escreva uma funo que copie uma string em outra um caractere por vez.
2) Escreva uma funo que copie parte de uma string em outra. Os parmetros da funo so
a string de entrada a string de sada e os caracteres inicial e final da string a ser copiada.
Faa de uma maneira que a string de sada tenha o seu tamanho adaptado.
3) Faa outra funo que copie parte de uma string para outra, mas desta vez deve ser
indicado tambm o ndice inicial da string de destino.
4) Escreva uma funo que verifique se uma substring existe dentro de uma string maior e
retorne se foi encontrada ou no.
5) Escreva uma funo que verifique e retorne a quantidade de vezes em que uma substring
aparece dentro de uma string menor, podendo haver sobreposio. Exemplo: Na string
arara, a substring ara ocorre duas vezes, apesar de serem sobrepostas.
6) Escreva uma funo que verifique e retorne a quantidade de vezes em que uma substring
aparece dentro de uma string menor, sem sobreposio. Exemplo: Na string arara, a
substring ara ocorre apenas uma vez, sem sobreposio.
7) Escreva uma funo que substitua a primeira ocorrncia de uma substring em uma string
maior pelo caractere '@'.
8) Escreva agora uma funo que substitua todas as ocorrncias da substring em uma string
maior pelo caractere '@'. Note que no pode haver sobreposio entre as ocorrncias que
so substitudas.

3. Problema para apresentao e submisso no Sharif Judge: (Deve ser entregue at 23:59:59 do dia
01 de julho de 2014).
Existem diversos mecanismos para a compresso de dados, sendo alguns simples e outros mais
sofisticados. Estes algoritmos servem tanto para ocupar menos espao de armazenamento, como para
transmisso de dados via redes.
Um mtodo simplrio o de substituio de caracteres repetidos. Trata-se de um programa que
tenta transformar um fluxo de caracteres de entrada em um fluxo de sada de tamanho menor substituindo
as sequncias de caracteres longas que mais se repetem por sequncias mais curtas. Note que este
processo precisa ser reversvel para que, ao transmitir ou ler um dado comprimido ele possa ser
restaurado.
Veja um exemplo em que uma string de entrada comprimida de modo que pode ser restaurada:
Hoje eu comi um abacate muito gostoso. Ele cresceu em um abacateiro perto de minha casa. Comi o
abacate sem d e no sobrou nem o caroo do abacate.
Perceba que a palavra abacate se repete muitas vezes na frase acima. Podemos substituir abacate
por * nesta frase, fazendo com que ela fique mais curta. Veja como seria a sada do texto:
Hoje eu comi um * muito gostoso. Ele cresceu em um *iro perto de minha casa. Comi o * sem d e no
sobrou nem o caroo do *.
No entanto, para que a frase seja reversvel importante gravar a informao de que * abacate.
Perceba que abacateiro tambm pode ser convertido para *iro pela mesma regra.
O laboratrio desta semana consiste em ler um texto de entrada qualquer, procurar pelas
sequncias de caracteres que mais se repetem e converter as sequncias por smbolos. Note que no vale
a pena substituir sequncias que no se repetem, pois neste caso teramos de guardar mais espao para as
regras de converso que contm a sequncia original.
O programa deve procurar pelas sequncias que mais se repetem e substitu-las seguindo as regras
abaixo:
1) O texto de entrada ser uma sequncia de caracteres composta de nmeros, letras sem
acentos ou cedilhas, espaos, um enter no final e os sinais de pontuao '.', '!', '?' e ','.
2) As sequncias que se repetem devem e que geram economia de espao devem ser
substitudas pelos smbolos '@', '#', '$', '%', '&', '*', '~', '+', '=', '^' e '`' nesta ordem,
utilizando um smbolo por substituio.
3) Depois de utilizar o caractere '`' na substituio, o compresso finalizada.
4) Cada substituio ter uma regra de converso no formato: Cstring, onde 'C' um dos
smbolos de substituio da regra 2) e string a sequncia substituda.
5) Quando uma sequncia de caracteres X que possui n caracteres (n > 0) e aparece r vezes (r
> 1) substituda, o ganho de espao de ( n 1 ) * ( r 1 ) 2.
6) Voc deve buscar a sequncia de caracteres que pouparia mais espao se fosse substituda.
Exemplo: Se a sequncia adomiaul se repetir 3 vezes e a sequncia miau se repetir 20
vezes, ento a adomiaul pouparia 12 caracteres e a sequncia miau pouparia 55
caracteres. Assim, a sequncia miau deve ser substituda primeiro.
7) Caso haja mais sequncias que poupem o mximo de espao deve ser escolhida a de
menor nmero de caracteres e a que aparece mais prxima do incio da string.
8) Guarde as regras de converso em uma string no formato: @string1#string2$string3...,
onde string1 a primeira string substituda, string2 a segunda e assim sucessivamente.

No exemplo acima a a regra de converso seria: @miau.


9) Depois de substituda a primeira sequncia, a segunda que mais pouparia deve ser
buscada. Note, porm, que a primeira substituio pode alterar o nmero de repeties de
outras palavras. Exemplo: Se substituirmos miau por '@', toda ocorrncia de adomiaul
se tornaria ado@l. Assim, o seu ganho cairia de 12 para 6 caracteres.
10) A substituio deve continuar at que no haja uma sequncia vale a pena ser substituda,
ou o ltimo caractere '`' da regra 2) seja utilizado.
11) Ao final do programa devem ser impressos o tamanho inicial da string, o tamanho final, o
ganho em porcentagem com duas casas decimais de preciso, a sequncia de caracteres
comprimida e a regra de converso.
Veja um exemplo:
A entrada a sentena:
Acheiumninhodemafagarfos.Noninhodemafagarfoshaviasete
mafagarfinhos.Enquantoamaemafagarfamafagarfava,ossete
mafagarfinhosmafagarfavamtambem.
A primeira substituio : "mafagarf" por '@', com ganho de 46 caracteres.
O resultado parcial desta substituio :
Acheiumninhode@os.Noninhode@oshaviasete@inhos.Enquantoa
mae@a@ava,ossete@inhos@avamtambem.
A segunda substituio : "ninhode@os" por '#', com ganho de 9 caracteres .
O resultado parcial desta substituio :
Acheium#.No#haviasete@inhos.Enquantoamae@a@ava,os
sete@inhos@avamtambem.
A terceira substituio : "sete@inhos" por '$', com ganho de 8 caracteres.
O resultado parcial desta substituio :
Acheium#.No#havia$.Enquantoamae@a@ava,os$@avamtambem.
A quarta substituio : "@ava" por '%', com ganho de 1 caractere.
O resultado parcial desta substituio :
Acheium#.No#havia$.Enquantoamae@a%,os$%mtambem.
No h mais substituies vantajosas. Portanto, o programa deve imprimir como sada:
Inicial:159.
Final:96.
Ganho:39.62%.
Resultado:Acheium#.No#havia$.Enquantoamae@a%,os$%mtambem.
Regra:"@mafagarf#ninhode@os$sete@inhos%@ava".
Note que o resultado final impresso sem aspas duplas, enquanto a regra deve ser impressa entre
aspas duplas, seguida de um ponto final. Observe os detalhes de espaos e pontuao para fazer a sua
sada idntica do exemplo acima.

Exemplos:
Entrada 1:
macacomacacomacaco.
Sada 1:
Inicial:21.
Final:14.
Ganho:33.33%.
Resultado:@@@.
Regra:"@macaco".
Entrada 2:
OcaciqueArariboiaviveunaguanabaraegostavadeararasecanarios.
Sada 2:
Inicial:70.
Final:67.
Ganho:4.29%.
Resultado:Ocaciqu#Ar@iboi$viveun$guanab@$#gostav$d#@@as#can@ios.
Regra:"@ar#e$a".
Entrada 5:
NaoconfundaOrnitorrincocomOtorrinolaringologista,Ornitorrincocom
ornitologista,OrnitologistacomOtorrinolaringologista,Porqueornitorrinco
Eornitorrinco,OrnitologistaeornitologistaEotorrinolaringologistae
Otorrinolaringologista.
Sada 5:
Inicial:244.
Final:118.
Ganho:51.64%.
Resultado:Naoconfunda&$*&$%o#,&#*Porque~$E~$,&#e~#E~@e&@.
Regra:"@torrinolaringologista#rnitologista$rnitorrinco%com&O*%O@,~o".

Anda mungkin juga menyukai