Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
i307

Compressão de dados

Recommended Posts

i307

Agora tenho de comprimir dados num vector.

E não consigo acabar.

int main()
{
int v[50];
int aux=0;
int n=0;
int c=0;

printf("Quantas vezes quer introduzir o valor?");
scanf("%i",&n);

    do {
        scanf("%i",&v[aux]);
        aux++;
    }
    while(aux < n);


for (aux=0;aux <n ;aux++){

     if (v[aux]==v[aux+1])
     c++;
}

if (c>4)
/* introduzir no vector o seguinte: "c(numero repetido)(o c)f" */
}

Eu consigo através disto descobrir se existe alguma repetição , mas não sei como introduzir no vector aquela última parte  :)

Share this post


Link to post
Share on other sites
i307

Se houver mais que 4 repetições de um número substitui-se o numero.

Exemplo:  4556777777777789 fica 4556c710f89

Ou seja "c numero repetido numero de repetições f".

Share this post


Link to post
Share on other sites
Localhost

Para cada elemento do array percorres todo o array e verificas.


here since 2009

Share this post


Link to post
Share on other sites
i307

Se é do tipo int não dá.

Então o que tenho de fazer para conseguir por letras e números?

Que tipo é?

Share this post


Link to post
Share on other sites
pedrosorio

Então o que tenho de fazer para conseguir por letras e números?

Que tipo é?

Como parece que estás a usar um array de inteiros em que cada posição tem um algarismo, faria de facto mais sentido usar um array de caracteres. Para colocar o 'c' e o 'f' basta-te fazer uma atribuição normal, os caracteres são convertidos em inteiros usando o seu código ASCII automaticamente (quer 'c' quer 'f' têm códigos superiores a 9 pelo que não há ambiguidade).


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
Localhost

Como parece que estás a usar um array de inteiros em que cada posição tem um algarismo, faria de facto mais sentido usar um array de caracteres. Para colocar o 'c' e o 'f' basta-te fazer uma atribuição normal, os caracteres são convertidos em inteiros usando o seu código ASCII automaticamente (quer 'c' quer 'f' têm códigos superiores a 9 pelo que não há ambiguidade).

Fiquei na dúvida se ele depois de atribuir não ficaria sem vê-los visto que eles eram transformados em ascii code.


here since 2009

Share this post


Link to post
Share on other sites
pedrosorio

Fiquei na dúvida se ele depois de atribuir não ficaria sem vê-los visto que eles eram transformados em ascii code.

De facto, se fizer um printf, por exemplo, aparece-lhe o ascii code. Mas se o objectivo for apenas comprimir/descomprimir um vector, pode comparar esses valores com os caracteres e tudo funciona bem.


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
Localhost

Pois, e isso pode ser um problema se ele pretender imprimir mais tarde.

A função itoa seria boa para este caso. Depois podia comprimir. No entanto, não é definida pelo ansi.


here since 2009

Share this post


Link to post
Share on other sites
pedrosorio

Nunca usei. Transforma em string?

Funciona exactamente como um printf, mas faz output para uma string em vez de ser para o standard output.

Exemplo:

sprintf(string,"%d",var);

Isto é equivalente a:

itoa(var,string,10);


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
Localhost

Pronto, então acho que essa era a solução para o caso dele.


here since 2009

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.