| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
jparrot2
Registrado: 03 Oct 2012 Mensajes: 45
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |