elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Compresión RLE Independiente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Compresión RLE Independiente  (Leído 2,475 veces)
Tiruliki

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Compresión RLE Independiente
« en: 1 Enero 2017, 11:32 am »

Buenos días.

Venía a ver si alguno me podría ayudar con un programa en C++ que tengo confuso. Me explico. El ejercicio consiste en hacer un programa de compresión RLE pero totalmente independiente, es decir, introduzcas caracteres o números, debe funcionar el método.

Es decir;

A A B B --> 2 A 2 B.
1 1 2 2 --> 2 1 2 2.

Tengo una clase RLE, que la dejo por aquí:
Código
  1. class RLE
  2. {
  3.  
  4. // La clase RLE no tiene campos.
  5. // Los objetos de la clase sieven para ejecutar los métodos "Codifica"
  6. // y "Descodifica" (esta implementación se diferencia muy poco de escribir
  7. // los dos métodos como funciones globales).
  8.  
  9. private:
  10.  
  11. public:
  12.  
  13. /***********************************************************************/
  14. // Codifica una secuencia de enteros según el código RLE y devuelve
  15. // otra secuencia de enteros codificada.
  16. //
  17. // Recibe: secuencia_descodificada, la secuencia que se va a codificar.
  18. // Devuelve: una nueva secuencia, resultado de codificar según RLE
  19. // la secuencia recibida "secuencia_descodificada".
  20.  
  21. SecuenciaEnteros Codifica (SecuenciaEnteros secuencia_descodificada)
  22. {
  23. // Secuencia resultado de la codificación
  24. SecuenciaEnteros secuencia_codificada;
  25.  
  26. int tope, actual, anterior, iguales_hasta_ahora;
  27.  
  28. // Registrar la longitud de la secuencia
  29. tope = secuencia_descodificada.TotalUtilizados();
  30.  
  31. // Guardar el primer valor de la secuencia
  32. actual = secuencia_descodificada.Elemento(0);
  33.  
  34. iguales_hasta_ahora = 1;
  35.  
  36. for (int pos=1; pos<tope; pos++) {
  37.  
  38. anterior = actual;
  39. actual = secuencia_descodificada.Elemento(pos);
  40.  
  41. if (anterior == actual)
  42.  
  43. iguales_hasta_ahora++; // Continua la serie
  44.  
  45. else {
  46.  
  47. // Añade la pareja (valor, num.repeticiones)
  48. secuencia_codificada.Aniade(iguales_hasta_ahora);
  49. secuencia_codificada.Aniade(anterior);
  50.  
  51. iguales_hasta_ahora = 1; // empezar una nueva serie
  52. }
  53. } // for (int pos=1; pos<tope; pos++)
  54.  
  55. // Añade la última pareja (valor, num.repeticiones)
  56. secuencia_codificada.Aniade(iguales_hasta_ahora);
  57. secuencia_codificada.Aniade(actual);
  58.  
  59. return (secuencia_codificada);
  60. }  
  61.  
  62. /***********************************************************************/
  63. // Descodifica una secuencia de enteros según el código RLE y devuelve
  64. // otra secuencia de enteros descodificada.
  65. //
  66. // Recibe: secuencia_codificada, la secuencia que se va a descodificar.
  67. // Devuelve: una nueva secuencia, resultado de descodificar según RLE
  68. // la secuencia recibida "secuencia_codificada".
  69.  
  70. SecuenciaEnteros Descodifica (SecuenciaEnteros secuencia_codificada)
  71. {
  72. // Secuencia resultado de la descodificación
  73.  
  74. SecuenciaEnteros secuencia_descodificada;
  75.  
  76. // Registrar el número de elementos de la secuencia codificada.
  77.  
  78. int tope = secuencia_codificada.TotalUtilizados();
  79.  
  80. // Ciclo que recorre la secuencia codificada.
  81. // La longitud de la secuencia es par (está formada por parejas) así
  82. // que el número de parejas es justo la mitad del número de elementos.
  83. // Observad que el salto se realiza de 2 en 2 porque en cada iteración
  84. // se procesa una pareja.
  85.  
  86. for (int pos=0; pos<tope; pos+=2) {
  87.  
  88. int num_repeticiones = secuencia_codificada.Elemento(pos);
  89. int valor = secuencia_codificada.Elemento(pos+1);
  90.  
  91. // Cada pareja es (num_repeticiones, valor). Se trata de escribir
  92. // "valor" en la secuencia descodificada "num_repeticiones" veces.  
  93.  
  94. for (int i=0; i<num_repeticiones; i++)
  95. secuencia_descodificada.Aniade(valor);
  96. }
  97.  
  98. return (secuencia_descodificada);
  99. }
  100.  
  101. /***********************************************************************/
  102.  
  103. };
  104.  


Esa implementación funciona perfectamente con números enteros, pero a la hora de tener que tener en cuenta que también pueden introducirse caracteres, me confunde. Se me ocurre hacer una clase SecuenciaParejas y la clase SecuenciaEnteros (ya implementada)

Código
  1. class SecuenciaEnteros
  2. {
  3.  
  4. private:
  5.  
  6. static const int TAMANIO = 200; // Número de casillas disponibles
  7.  
  8. int vector_privado[TAMANIO];
  9.  
  10. //PRE: 0 <= total_utilizados <= TAMANIO
  11. int total_utilizados; // Número de casillas ocupadas
  12.  
  13. public:
  14.  
  15. /***********************************************************************/
  16. // Constructor sin argumentos
  17.  
  18. SecuenciaEnteros() : total_utilizados(0) {}
  19.  
  20. /***********************************************************************/
  21. // Métodos de lectura (Get) de los datos individuales
  22.  
  23. // Devuelve el número de casillas ocupadas
  24. int TotalUtilizados (void)
  25. {
  26. return (total_utilizados);
  27. }
  28.  
  29. // Devuelve el número de casillas disponibles
  30. int Capacidad (void)
  31. {
  32. return (TAMANIO);
  33. }
  34.  
  35. /***********************************************************************/
  36. // Añade un elemento al vector.
  37. // Recibe: nuevo, el elemento que se va a añadir.
  38. //
  39. // PRE: total_utilizados < TAMANIO
  40. // La adición se realiza si hay espacio para el nuevo elemento.
  41. // El nuevo elemento se coloca al final del vector.
  42. // Si no hay espacio, no se hace nada.
  43.  
  44. void Aniade (int nuevo)
  45. {
  46. if (total_utilizados < TAMANIO) {
  47. vector_privado[total_utilizados] = nuevo;
  48. total_utilizados++;
  49. }
  50. }
  51.  
  52. /***********************************************************************/
  53. // Devuelve el elemento de la casilla "indice"
  54. //
  55. // PRE: 0 <= indice < total_utilizados
  56.  
  57. int Elemento (int indice)
  58. {
  59. return vector_privado[indice];
  60. }
  61.  
  62. /***********************************************************************/
  63. // Calcula si dos objetos son iguales: serán iguales si contienen el
  64. // mismo número de elementos, son iguales uno a uno y están en el mismo
  65. // orden.
  66. //
  67. // Recibe: otro, la secuencia con la que se compara el objeto implícito.
  68. // Devuelve: true, si las dos secuencias son iguales; false, en otro caso.
  69.  
  70. bool EsIgualA (SecuenciaEnteros otro)
  71. {
  72. bool son_iguales;
  73.  
  74. if (total_utilizados == otro.total_utilizados) {
  75.  
  76. son_iguales = true;
  77.  
  78. int pos = 0;
  79. bool sigo_comparando = true;
  80.  
  81. // Mientras queden por comparar y sigan siendo iguales
  82.  
  83. while ((pos<total_utilizados) && (sigo_comparando)) {
  84.  
  85. if (vector_privado[pos] == otro.vector_privado[pos]) {
  86. pos++;
  87. }
  88. else {
  89. sigo_comparando = false;
  90. son_iguales = false;
  91. }
  92.  
  93. } // while (sigo_comparando)
  94.  
  95. }
  96. else son_iguales = false; // tienen distinto tamaño
  97.  
  98. return (son_iguales);
  99. }
  100.  
  101. /***********************************************************************/
  102. };
  103.  
  104. /////////////////////////////////////////////////////////////////////////////
  105.  


Una vez teniendo SecuenciaEnteros y SecuenciaParejas, a la hora de que el usuario vaya a introducir los valores, hacer un if para comprobar si está metiendo letras o números.


¿Alguna ayuda?

¡Gracias!


En línea

fran800m

Desconectado Desconectado

Mensajes: 204



Ver Perfil
Re: Compresión RLE Independiente
« Respuesta #1 en: 1 Enero 2017, 22:06 pm »

Hace mucho que no toco C, pero si solo se trata de almacenar o leer una secuencia de pares caracter -> número de repeticiones, ¿por qué no creas una estructura y rellenas un array dinámico con instancias de esa estructura? Los números son caracteres, no deberías tener problema.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[MOD] Compresion de video y audio, cual es la mejor compresion?
Multimedia
robinsv 4 5,004 Último mensaje 29 Diciembre 2005, 21:01 pm
por Songoku
Como hago un programa independiente de su CD?
Software
ullysses 2 2,011 Último mensaje 29 Mayo 2010, 01:01 am
por Dracomega
Router independiente
Redes
winsor 3 3,451 Último mensaje 15 Junio 2010, 06:58 am
por Mr.Blue
Escribir en un edit de una ventana independiente.
ASM
Иōҳ 1 3,495 Último mensaje 19 Junio 2011, 00:14 am
por _Enko
Un lenguaje de programación independiente.
Programación General
on11ce 5 3,364 Último mensaje 14 Abril 2013, 23:41 pm
por Mitgus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines