/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Descodificar codigo

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
jparrot2



Registrado: 03 Oct 2012
Mensajes: 45

MensajePublicado: 30/03/2013 1:44 pm
Título: Descodificar codigo

Buenas,
hace poco escrebi sobre un programa que tenia que codificar un texto, el caso es ya me a salido. Pero ahora tengo que descodificar el texto codifica, es decir que el texto codificado vuelva a su estado original.
Alguna ideo de como lo puedo hacer. Les mando el codigo que codifica el texto.
Código:

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

#define MAX_texto 25
#define MAX_PAR (MAX_texto/2)+1
#define MAX_codigos (MAX_texto/2)+1
#define MAX_CARAC_CODI (int) round(log2(MAX_texto))+2


typedef enum {fals,cert} boolea;
char codigos[MAX_codigos][9] = {"0","1","00","01","10","11","000","001","010"};

void inicializaciones (char[],char[],char[],char[],int[]);
void introducirtexto (char[]);
void compactacion(char [],char [],int [],char []);
void obtenerCaracteresYrepeticiones(char [],char[],int[], int *);
void ordenarRepeticiones(int [],char [],int);
void codificar(char [],char [],char []);

int main()
{
    char texto[MAX_texto+1];
    char textoDescompactat[MAX_texto+1];
    char textoCodificado[(MAX_texto * MAX_CARAC_CODI)+1];
    char caracteres[MAX_PAR];
    int repeticiones[MAX_PAR];

    inicializaciones(texto,textoDescompactat,textoCodificado,caracteres,repeticiones);

    introducirtexto(texto);

    compactacion(texto,caracteres,repeticiones,textoCodificado);


    return 0;
}

void inicializaciones(char texto[],char textoDescompactat[],char textoCodificado[],char caracteres[],int repeticiones[]){
    texto[0]='\0'; textoDescompactat[0]='\0'; textoCodificado[0]='\0'; caracteres[0]='\0'; repeticiones[0]=0;
}

void introducirtexto(char texto[]){
    printf("Introduce un texto:\n\t");
    scanf("%100[^\n]",texto);while(getchar()!='\n');
}


void compactacion(char texto[],char caracteres[],int repeticiones[],char textoCodificado[]){
    int iCar;
    obtenerCaracteresYrepeticiones(texto,caracteres,repeticiones,&iCar);
    ordenarRepeticiones(repeticiones,caracteres,iCar);
    codificar(texto,caracteres,textoCodificado);
    }

void obtenerCaracteresYrepeticiones(char texto[],char caracteres[],int repeticiones[],int *iCar){
    boolea esta=0;
    int itexto=0,unics=0;

    while(texto[itexto] != '\0'){
        esta=0;
        for(*iCar=0; *iCar<unics; (*iCar)++)
            if(caracteres[*iCar] == texto[itexto])
            {
                esta=1; repeticiones[*iCar]++;
            }
        if(!esta)
        {
            caracteres[*iCar] = texto[itexto];
            repeticiones[*iCar] = 1; unics++;
        }
        ++ itexto;
    }
}

void ordenarRepeticiones(int repeticiones[],char caracteres[],int iCar){

    int i,j,aux;
    char auxC;

    for (i=2; i<=iCar; i++) {
        for (j=0; j<=iCar-i; j++) {
            if(repeticiones[j]<repeticiones[j+1]){
                aux=repeticiones[j];
                auxC=caracteres[j];
                repeticiones[j]=repeticiones[j+1];
                caracteres[j]=caracteres[j+1];
                repeticiones[j+1]=aux;
                caracteres[j+1]=auxC;
            }
        }
    }
}

void codificar(char texto[],char caracteres[],char textoCodificado[]){
    boolea trobat=fals;
    char caracterTmp;
    int itexto=0,indextextoCodificado=0, indexC2=0, iCar=0;

    while (texto[itexto]!='\0'){
        caracterTmp=texto[itexto];
        trobat=fals;
            while(!trobat){
                if(caracterTmp==caracteres[iCar]){
                    trobat=cert;
                }
                iCar++;
            }
            iCar--;

            while(codigos[iCar][indexC2]!='\0'){

                textoCodificado[indextextoCodificado]=codigos[iCar][indexC2];

                indexC2++;
                indextextoCodificado++;

            }

        textoCodificado[indextextoCodificado]='$';
        indextextoCodificado++;
        itexto++;
        indexC2=0;
        iCar=0;
    }
    textoCodificado[indextextoCodificado-1]='\0';


    printf("Texto codificado:\n\t%s",textoCodificado);
}


Espero que me puedan aydar.
UN saludo
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7530
Ubicación: Mexico

MensajePublicado: 01/04/2013 8:16 am
Título:

Para decodificar debes crear una función que reciba el texto codificado así como el array con los caracteres originales ordenados de mayor a menor frecuencia, este es el array "caracteres" declarado en la función main.

En la función para decodificar debes procesar la cadena separandola en tokens que terminen con '$', para ello puedes utilizar la función strtok (hay ejemplos de su uso en el foro cortesía del motor de búsqueda) o sscanf.

Por cada token lo buscas en el array "codigos", el indice que obtengas sera el mismo que debas utilizar con el array "caracteres".

Inténtalo, no es difícil.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
jparrot2



Registrado: 03 Oct 2012
Mensajes: 45

MensajePublicado: 03/04/2013 1:40 pm
Título: No me sale la descodificacion

Buenas, he esta intendo hacer la descodificacion del texto pero no me sale.El que no mes sale es: "el indice que obtengas sera el mismo que debas utilizar con el array "caracteres"." y nunaca me sale de la iteracion pricipal. Espero que me puedan aydar.
Código:

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

#define MAX_texto 25
#define MAX_PAR (MAX_texto/2)+1
#define MAX_codigos (MAX_texto/2)+1
#define MAX_CARAC_CODI (int) round(log2(MAX_texto))+2


typedef enum {fals,cert} boolea;
char codigos[MAX_codigos][9] = {"0","1","00","01","10","11","000","001","010"};

void inicializaciones (char[],char[],char[],char[],int[]);
void introducirtexto (char[]);
void compactacion(char [],char [],int [],char []);
void obtenerCaracteresYrepeticiones(char [],char[],int[], int *);
void ordenarRepeticiones(int [],char [],int);
void codificar(char [],char [],char []);
void descompactar(char [],char [],int [],char []);


int main()
{
    char texto[MAX_texto+1];
    char textoDescompactat[MAX_texto+1];
    char textoCodificado[(MAX_texto * MAX_CARAC_CODI)+1];
    char caracteres[MAX_PAR];
    int repeticiones[MAX_PAR];

    inicializaciones(texto,textoDescompactat,textoCodificado,caracteres,repeticiones);

    introducirtexto(texto);

    compactacion(texto,caracteres,repeticiones,textoCodificado);

    descompactar(texto,caracteres,repeticiones,textoCodificado);



    return 0;
}

void inicializaciones(char texto[],char textoDescompactat[],char textoCodificado[],char caracteres[],int repeticiones[]){
    texto[0]='\0'; textoDescompactat[0]='\0'; textoCodificado[0]='\0'; caracteres[0]='\0'; repeticiones[0]=0;
}

void introducirtexto(char texto[]){
    printf("Introduce un texto:\n\t");
    scanf("%100[^\n]",texto);while(getchar()!='\n');
}


void compactacion(char texto[],char caracteres[],int repeticiones[],char textoCodificado[]){
    int iCar;
    obtenerCaracteresYrepeticiones(texto,caracteres,repeticiones,&iCar);
    ordenarRepeticiones(repeticiones,caracteres,iCar);
    codificar(texto,caracteres,textoCodificado);
    }

void obtenerCaracteresYrepeticiones(char texto[],char caracteres[],int repeticiones[],int *iCar){
    boolea esta=0;
    int itexto=0,unics=0;

    while(texto[itexto] != '\0'){
        esta=0;
        for(*iCar=0; *iCar<unics; (*iCar)++)
            if(caracteres[*iCar] == texto[itexto])
            {
                esta=1; repeticiones[*iCar]++;
            }
        if(!esta)
        {
            caracteres[*iCar] = texto[itexto];
            repeticiones[*iCar] = 1; unics++;
        }
        ++ itexto;
    }
}

void ordenarRepeticiones(int repeticiones[],char caracteres[],int iCar){

    int i,j,aux;
    char auxC;

    for (i=2; i<=iCar; i++) {
        for (j=0; j<=iCar-i; j++) {
            if(repeticiones[j]<repeticiones[j+1]){
                aux=repeticiones[j];
                auxC=caracteres[j];
                repeticiones[j]=repeticiones[j+1];
                caracteres[j]=caracteres[j+1];
                repeticiones[j+1]=aux;
                caracteres[j+1]=auxC;
            }
        }
    }
}

void codificar(char texto[],char caracteres[],char textoCodificado[]){
    boolea trobat=fals;
    char caracterTmp;
    int itexto=0,indextextoCodificado=0, indexC2=0, iCar=0;

    while (texto[itexto]!='\0'){
        caracterTmp=texto[itexto];
        trobat=fals;
            while(!trobat){
                if(caracterTmp==caracteres[iCar]){
                    trobat=cert;
                }
                iCar++;
            }
            iCar--;

            while(codigos[iCar][indexC2]!='\0'){

                textoCodificado[indextextoCodificado]=codigos[iCar][indexC2];

                indexC2++;
                indextextoCodificado++;

            }

        textoCodificado[indextextoCodificado]='$';
        indextextoCodificado++;
        itexto++;
        indexC2=0;
        iCar=0;
    }
    textoCodificado[indextextoCodificado-1]='\0';


    printf("Texto codificado:\n\t%s",textoCodificado);
}

void descompactar(char texto[],char caracteres[],int repeticiones[],char textoCodificado[]){
    boolea encontrado=fals;
    char carCodiTmp[100];
    int indextextoCodificado=0,iCarCodiTmp=0;
    int iCar=0,indexC2=0;

    printf("\nIntrodueix el text a descompacta:\n\t");
    scanf("%100[^\n]",textoCodificado);while(getchar()!='\n');

    while(textoCodificado[indextextoCodificado]!='\0'){
        while(textoCodificado[indextextoCodificado]!='$' && textoCodificado[indextextoCodificado]!='\0'){
            carCodiTmp[iCarCodiTmp]=textoCodificado[indextextoCodificado];
            iCarCodiTmp++;
            indextextoCodificado++;
        }
        carCodiTmp[iCarCodiTmp]='\0';

        while(!encontrado){
            if(carCodiTmp[iCarCodiTmp]==codigos[iCar][indexC2]){
                encontrado=cert;
            }
        indexC2++;
        }

        iCarCodiTmp=0;
    }


}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7530
Ubicación: Mexico

MensajePublicado: 03/04/2013 6:57 pm
Título:

Por favor no utilices nombres de contadores como este:
Código:
while (textoCodificado[indextextoCodificado] != '\0'){

En C los nombres para los indices deben ser los usuales i, j y k. Utilizar nombres mas largos no aumenta la claridad del código fuente, al contrario.

En cuanto a la función "descompactar":

* Un error es pedir el texto a "descompacta" cuando este es su cuarto parámetro.

* El segundo bucle interno donde buscas la secuencia esta mal, hay que rescribirlo desde cero.

* El enunciado indica que todo token debe terminar con '$', debes modificar la función "codificar". Después del bucle principal agregas el cero de esta forma:
Código:
textoCodificado[indextextoCodificado] = '\0';


La función con las correcciones:
Código:
#include <string.h>

void descompactar(char texto[], char car[], int reps[], char codificado[])
{
   char temp[100];
   int i;
   int j;
   int k;
   
   k = 0;
   for (i = 0; codificado[i] != '\0'; i++){
      for (j = 0; codificado[i] != '$'; j++){
         temp[j] = codificado[i];
         i++;
      }
      temp[j] = '\0';
     
      for (j = 0; strcmp(temp, codigos[j]) != 0; j++)
         ;
      texto[k] = car[j];
      k++;
   }
   texto[k] = '\0';
   
   printf("Texto decodificado:\n%s\n", texto);
}


Si no te permiten utilizar strcmp para compara dos cadenas puedes crear una propia (hay en los foros, puedes revisarlas mediante el motor de búsqueda) o bien utilizar un bucle para comparar manualmente carácter por carácter.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com