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

Carlos C

Codificador/Descodificador

27 mensagens neste tópico

ola malta...

tenho um exercicio..que nao estou a conseguir resolver.. peco entao ajudas e dicas ...........

O programa deve ler um número inteiro e escrever o número que resulta

da sua codificação ou descodificação com base nas seguintes regras:

1. (Codificar) – Substituir cada sequência de n dígitos x repetidos,

pelo par de dígitos nx ;

2. (Descodificar) – Substituir cada par de dígitos nx , pela sequência

de n dígitos x repetidos (operação inversa).

A codificação e/ou descodificação deve ser uma opção de escolha. Note

que só podem ser descodificados números que possuam um número par

de dígitos.

O programa deve permitir a codificação/descodificação de mais do que

um número na mesma corrida (“run”) e deve identificar todas as

situações de erro. O programa deve imprimir mensagens em Português.

Por exemplo, se 277733444 for o inteiro lido, o programa pode codificálo

como

1 2 3 7 2 3 3 4

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estás a conseguir ou não estás a tentar?

O que é que já tentaste fazer?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ter a ideia.....

lol

é assim....

tou farto de ler artigos...

ja sei que tem que ser com vectores,

parece me que devo gravar um procedimento  tipo de n em n numeros ele repete o 1ª depois o 2ª...

o meu livro tem n de exercicios..mas com inversos...os pares, os impares...

concatenacao.... o max o minimo..

e eu nao tou a ver o inicio disto...

sera que ele le o numero inteiro [10] por exemplo...

pinrtf[0],[0],[1][2][2],[3][4][4]...etc..

mas assim é muio basico(estupido mesmo)lol..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ninguem me consegue ajudar?

ou me diga qual a logica?

ou a funcao?

se o meu programa ler um numero inteiro tipo:  5214631

como posso converte lo em vectores...para poder manipulalo? tipo 5 2 1 4 6 3 1

onde [0] = 5

onde [1] = 2

onde [2] = 1

onde [3] = 4

etc..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá Carlos,

estou a tentar fazer uma coisa semelhante e nada...

nao me surgem ideias..

estava a pensar em fazer isso mas o numero inteiro é lido em string...

automaticamente ficas com os vectores individuais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tambem ja tinha pensado nisso...

mas o numero tem que ser lido com int..

se se depois houver uma maneira de converte lo em string.

ou se se consegui se passa lo para vector individual..

era optimo.

tou a ler o livro Fundamentos de Programacao em C

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

estava a pensar em fazer isso mas o numero inteiro é lido em string...

Podes converter o int em char* dentro da função e ficas com esse problema resolvido. Só precisas de criar uma função que faça isto porque não existe nenhuma no standard do C para esse efeito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao consigo..

nao tou a ver como converter o n umero exemplo: 523553 em que a string seja '5''2''3''5''5''3'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok...boa dica..mas insuficiente...

pois o inteiro vai de -n a n  e se for um numero excessivamente grande ele nao permite..

int n;
scanf("%d", &n);

char arr[lenght(n)]; 
sprintf(arr, " %d", n); 

printf("%i", arr[2]);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens a função itoa (int to ascii) que converte inteiro para string.

#include <stdlib.h>

char *itoa(int value, char *string, int radix);

value -> é a variavel inteira a ser convertida

string -> é um apontador para um buffer onde vai ser guardada o inteiro convertido

radix -> é a base do sistema de numeração que vais usar. Para sistema decimal usas o 10

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao xonsegui aplicar o itoa..mas

voltando sprintf

eu nao estava a ver bem...

ora vejamos......  o numero pode ser 9999956454545645445878634547

so tem 27 caracateres, arrays...

certo?

porque é que isto nao me esta a funcionar:

int main ()
{system ("chcp 1252");




int n=0;
int aux=0;

printf("Introduza um numero Inteiro");
scanf("%d", &n);
aux = lengthv(n);

char indiv[aux]; 
sprintf(indiv, " %d", n); 

printf("\n%c", indiv[0]);
printf("\n%c", indiv[1]);
printf("\n%c", indiv[2]);
printf("\n%c", indiv[3]);
printf("\n%c", indiv[4]);
printf("\n%c", indiv[5]);
printf("\n%c", indiv[6]);
printf("\n%c", indiv[7]);

printf("\n");

system ("\npause"); return 0;}



0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque 9999956454545645445878634547 não cabe num 'int'!

Experimenta imprimir o 'n' logo a seguir ao scanf.

scanf("%d", &n);
printf("Número lido: %d\n", n);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A função itoa não é standard.

que queres dizer com isso? é preciso fazer alguma coisa para usar a função?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quer dizer que se usares essa função o código pode não ser portável porque pode não ser reconhecida. É preferível usares o sprintf como o pmg disse.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ajudem me por favor..

ja nao vejo solucao para isto..

ja avancei um bocado gracas as vossas ideias..

mas ta complicado.

tenho que entregar ate amanha a noite..

ja dei umas voltas e esta complicado.

#include<stdlib.h>
#include<stdio.h>

int dgtlen(int n)
{
    if(n == 0)
        return 1;
    else
    {
        int c;
        for(c = 0; n; n /= 10)
            c++;
        return c;
    }
}

/*int a(int aux)
{
    if (a < aux)
        printf("o numero codificado:%s", indiv[0][1][2][3][4][5]);
           
} */  

int main ()
{system ("chcp 1252");
    
    int n=0;
    int aux=0; 
    
    printf("Introduza um numero Inteiro");
    
    scanf("%d", &n);
    
    aux = dgtlen(n); 
    
    char indiv[aux]; 
    sprintf(indiv, " %d", n);  
    
    
    for (aux = 0; aux <= n; aux++);
        aux = aux +indiv[aux];
    
    
    printf("\n%s", aux);
   
    printf("\n"); 


system ("\npause"); return 0;} 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Help..please..

como criar um procedimento para de x em x numero repetir um array?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Suponhamos que introduzes 17 para n.

a) aux = 2;

:) indiv[] tem espaço para 2 caracteres (1 dos quais deve ser o '\0')

c) o sprintf() vai meter um espaço e o '\0' no indiv

d) para que é o ciclo?

e) aux é um int. Não o podes imprimir com "%s".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado.

ja alterei..

o ciclo era para ele concatenar os caracteres..mas sendo uma string..nao ncessito..

aux agora tem +1 para /0

queria arranjar uma funcao que agarra sse na string e de x em x caracteres repetisse tipo o numero é 2345678

codificado ficaria 2334556778

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

assim nao da

o numero inteiro é limitado

alguem tem ideia como codificar o Numero sem com o sprintf

ola malta...

tenho um exercicio..que nao estou a conseguir resolver.. peco entao ajudas e dicas ...........

O programa deve ler um número inteiro e escrever o número que resulta

da sua codificação ou descodificação com base nas seguintes regras:

1. (Codificar) – Substituir cada sequência de n dígitos x repetidos,

pelo par de dígitos nx ;

2. (Descodificar) – Substituir cada par de dígitos nx , pela sequência

de n dígitos x repetidos (operação inversa).

A codificação e/ou descodificação deve ser uma opção de escolha. Note

que só podem ser descodificados números que possuam um número par

de dígitos.

O programa deve permitir a codificação/descodificação de mais do que

um número na mesma corrida (“run”) e deve identificar todas as

situações de erro. O programa deve imprimir mensagens em Português.

Por exemplo, se 277733444 for o inteiro lido, o programa pode codificálo

como

1 2 3 7 2 3 3 4

ok..atraves do sprintf dIntroduza um numero Inteiro

9999999999

depois do sprintf= 1410065407

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para os teus propósitos, "123456789012345678901234567890" é um número inteiro?

Se for, fica-te por arrays de caracteres. Ignora os tipos inteiros de C.

Faz todo o tratamento da informação com os elementos do array de caracteres (array com tamanho predefinido ou dinãmico com malloc(), realloc() e free() segundo as necessidades).

Como é que codificas o número inteiro "55555555555" (11 5 seguidos)?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

oi.

entao é assim..

relataivamente ao 55555555 é uma optima questão,,,,nunca tinha pensado nisso.

mas penso que se codificar com mais 5s fica codificado ou seja não é o numero exacto...

em relacao ao tipo de inteiro..

so conheco mesmo o Int...

os outros nao...mas é uma questao de procurar

é possivel fazer uma regra que o tulizador meta um numero inteiro??no  malloc / realloc e free


alguem me consegue perceber o erro??

#include<stdlib.h>
#include<stdio.h>

int dgtlen(int n) /*conta os digitos*/
{
    if(n == 0)
        return 1;
    else
    {
        int c;
        for(c = 0; n!=0; n /= 10)
            c++;
        return c;
    }
}

void codificar(int copy[], int indiv[], int code[])/*unifica as sitrngs*/
{
    int a=0, b=0;
    while (indiv[a] != '\0')
        code[a] = indiv[a];
       /* a++;
        if(indiv[a]==2*copy[b])
        {   
            code[] = code[] + copy[b];
            b++;
        }*/
    
        
} 

int main ()
{system ("chcp 1252");
    
    
    int n=0;
    char copy;
    char code;
    int aux=0; 
    do{
    
    printf("\n\nIntroduza um numero Inteiro\n");
    
    scanf("%d", &n);
    
    aux = dgtlen(n)+1; 
    
    char indiv[aux]; 
    sprintf(indiv, " %d", n);  
    
    copy = indiv[aux];
    printf("\n%s", indiv);
    printf("\n%s", copy);
    printf("\n%s", codificar(code));

   
    printf("\n\n"); 
   
    }while (n!=0);
system ("\n\npause"); return 0;} 


afinal interpretei mal o enunciado...

vamos supor o  numero 22345553

codificado da (2)2(1)3(1)4(3)5(1)3

ou seja conta quantos numeros tem...


eu tenho esta ideia ..

ma nao tou a consegir po la funcionar..

fiz em papel e tentei compilar mas da me alguns erros..

mas nao percebo o 1..

podem ajudar.

obrigado..

#include<stdlib.h>
#include<stdio.h>

int dgtlen(int n)
{
    if(n == 0)
        return 1;
    else
    {
        int c;
        for(c = 0; n!=0; n /= 10)
            c++;
        return c;
    }
}

void identifica(char a)
{    
    
     char code;

     int n = 0, contador = 0;
      while (indiv[n] != '\0'){
            if (indiv[n) == indiv[n+1])
            contador++;
            code = contador + indiv[n];
            n++
            
            else contador++;
            n++
            
     
     }
}

int main ()
{system ("chcp 1252");
    
    
    int n=0;
    int aux=0; 
    char copy, code;
    do{
    
    printf("\n\nIntroduza um numero Inteiro\n");
    
    scanf("%d", &n);
    
    aux = dgtlen(n)+1; 
    
    char indiv[aux]; 
    sprintf(indiv, " %d", n);  
    
    printf("\n%s", indiv);

    printf("\n\n"); 
   
    }while (n!=0);

system ("\n\npause"); 
return 0;} 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora