Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Crear programa que use el método RLE

Estas en el tema de Crear programa que use el método RLE en el foro de C/C++ en Foros del Web. Hola, buenas! Os escribo a ver si me dais un poco de luz sobre la resolución de este ejercicio que me han propuesto en la ...
  #1 (permalink)  
Antiguo 01/11/2014, 07:43
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 1 mes
Puntos: 0
Crear programa que use el método RLE

Hola, buenas!

Os escribo a ver si me dais un poco de luz sobre la resolución de este ejercicio que me han propuesto en la facultad. Sé que es relativamente sencillo, pero será que hoy estoy más espeso de lo normal, y no consigo hacerlo sin usar temario más avanzado (cosa que no se permite).
Dice así:

Realizar un programa que lea una secuencia de números naturales terminada con un número negativo y la codifique mediante el método RLE.
Por ejemplo:
Entrada: 1 1 1 2 3 3 4 5 5 5 6 -1
Salida: 3 1 1 2 2 3 1 4 3 5 1 6


Código C++:
Ver original
  1. int main(){
  2.    int numero, numero_2, suma;
  3.  
  4.    cout << "Introduzca numeros(-1 para terminar): \n";
  5.    cin >> numero;
  6.  
  7.     while (numero != -1){
  8.         suma = 1;
  9.         cin >> numero_2;
  10.      
  11.         while (numero_2 == numero){
  12.             suma ++;
  13.             cin >> numero_2;
  14.         }
  15.     cout << numero << " " << suma <<endl;
  16.     numero = numero_2;
  17.    }
  18.  
  19. }


El problema de esta aproximación es que no trabaja del todo bien y muestra por pantalla cada vez que se cambia de número cuando debería dar la salida que he indicado antes. Con el uso de arrays y demás sería trivial pero no puedo usar nada de eso.

Si a alguien se le ocurre algo..
Muchas gracias!
  #2 (permalink)  
Antiguo 01/11/2014, 08:50
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 7 años, 6 meses
Puntos: 49
Respuesta: Crear programa que use el método RLE

Cita:
Iniciado por Frnxu Ver Mensaje
Hola, buenas!

Os escribo a ver si me dais un poco de luz sobre la resolución de este ejercicio que me han propuesto en la facultad. Sé que es relativamente sencillo, pero será que hoy estoy más espeso de lo normal, y no consigo hacerlo sin usar temario más avanzado (cosa que no se permite).
Dice así:

Realizar un programa que lea una secuencia de números naturales terminada con un número negativo y la codifique mediante el método RLE.
Por ejemplo:
Entrada: 1 1 1 2 3 3 4 5 5 5 6 -1
Salida: 3 1 1 2 2 3 1 4 3 5 1 6


.................................................. ...

El problema de esta aproximación es que no trabaja del todo bien y muestra por pantalla cada vez que se cambia de número cuando debería dar la salida que he indicado antes. Con el uso de arrays y demás sería trivial pero no puedo usar nada de eso.

Si a alguien se le ocurre algo..
Muchas gracias!
Creo que esto te funcionará:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main ( void ) {
  6.    int i , numero, numero_2, suma ;
  7.    cout << "Introduzca numeros ( -1 para terminar ): \n";
  8.    cin >> numero;
  9.     while ( numero != -1 ){
  10.         suma = 1 ;
  11.         cin >> numero_2 ;
  12.         if ( numero_2 == -1 )
  13.           break ;      
  14.      
  15.         while ( numero_2 == numero ){
  16.             suma ++;
  17.             cin >> numero_2;
  18.             if ( numero_2 == -1 )
  19.               return 2 ;
  20.         }
  21.     if ( suma == 1 )
  22.        cout << " " << numero << endl ;
  23.     else if ( suma > 1 ) {
  24.       cout << " " << suma << " "  ;
  25.       for ( i = 0 ; i < suma - 1 ; i++ )  
  26.         cout << " " << numero << " "  ;
  27.     }
  28.  
  29.     cout << endl ;
  30.     numero = numero_2;
  31.    }
  32.    return 0 ;}

¡¡¡Saluditos!!!


Última edición por leosansan; 01/11/2014 a las 08:57
  #3 (permalink)  
Antiguo 01/11/2014, 09:16
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 1 mes
Puntos: 0
Respuesta: Crear programa que use el método RLE

Cita:
Iniciado por leosansan Ver Mensaje
...
Lamentablemente creo que no...
A ver, lo que necesito es, suponiendo que se mete por teclado esto:
1 1 1 2 3 3 4 5 5 5 6 -1

Al final (cuando se ponga -1) salga por pantalla cuántas veces se ha escrito cada número, es decir:
3(tres veces )1, 1(una vez)2, 2(dos veces)3, 1(una vez)4, 3(tres veces)5, 1(una vez)6.


Y eso ni el código que yo puse, ni el que tú me has dado lo hace. Ni sé si algún código (sólo usando bucles y condiciones) lo podrá hacer xD.
¿Alguna idea más?

Aún así, muchísimas gracias !
  #4 (permalink)  
Antiguo 01/11/2014, 09:41
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 7 años, 6 meses
Puntos: 49
Respuesta: Crear programa que use el método RLE

Cita:
Iniciado por Frnxu Ver Mensaje
Lamentablemente creo que no...
A ver, lo que necesito es, suponiendo que se mete por teclado esto:
1 1 1 2 3 3 4 5 5 5 6 -1

Al final (cuando se ponga -1) salga por pantalla cuántas veces se ha escrito cada número, es decir:
3(tres veces )1, 1(una vez)2, 2(dos veces)3, 1(una vez)4, 3(tres veces)5, 1(una vez)6.


Y eso ni el código que yo puse, ni el que tú me has dado lo hace. Ni sé si algún código (sólo usando bucles y condiciones) lo podrá hacer xD.
¿Alguna idea más?

Aún así, muchísimas gracias !
Lo siento, pero sin usar arrays creí que a medida que los introducías a la vez los imprimías. Pero lo dicho, sin arrays, no sé, no sé......

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 01/11/2014, 11:42
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 1 mes
Puntos: 0
Respuesta: Crear programa que use el método RLE

Cita:
Iniciado por leosansan Ver Mensaje
Lo siento, pero sin usar arrays creí que a medida que los introducías a la vez los imprimías. Pero lo dicho, sin arrays, no sé, no sé......
Ya pensaba yo... Sin usar un arreglo no se me ocurre otra forma. Y en teoría, todavía no los hemos dado en la asignatura. Así que se va a tener que conformar con esta solución xD.
Si a alguno se le ocurre algo más...
  #6 (permalink)  
Antiguo 01/11/2014, 13:07
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crear programa que use el método RLE

Hola; a mí se me ocurre una tontera que cumple con la condición de no usar un array (y supongo que tampoco podrás usar un contenedor de la biblioteca estándar). La genialidad sería usar diez variables, una para cada dígito, y a medida que aparecen, ir incrementando la variable que sea.

int uno, dos, tres .... = 0;

... ... ...
case 1: uno++; break;
case 2: dos++; break;
... y así ...

:lareto :)
  #7 (permalink)  
Antiguo 01/11/2014, 15:02
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 5 años, 4 meses
Puntos: 182
Respuesta: Crear programa que use el método RLE

Yo creo que la solución es la que comenta Lareto: usar varios contadores y en cada iteraccion ir incrementando con un if/switch.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #8 (permalink)  
Antiguo 01/11/2014, 17:01
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 11 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Crear programa que use el método RLE

Hola,

Posiblemente,
Código C++:
Ver original
  1. int numero, k, c;
  2.  
  3.     cout << "Introduzca numeros(-1 para terminar): \n";
  4.     cin >> numero;
  5.  
  6.     while (numero != -1) {
  7.         k = numero;
  8.         c = 1;
  9.         while (numero != -1 && k == numero) {
  10.             cin >> numero;
  11.             if (k == numero) {
  12.                 c++;
  13.             }
  14.         }
  15.         cout << c << " " << k << " ";
  16.     }
Saludos,

Cita:
Iniciado por lareto Ver Mensaje
... a mí se me ocurre una tontera que cumple con la condición de no usar un array (y supongo que tampoco podrás usar un contenedor de la biblioteca estándar)....
No me parece una tontera, pero en un caso real no se podría aplicar, la codificación RLE se usa normalmente para compresión de datos, imágenes y/o video. El problema es que una imagen podría usar 16 millones de colores o mas, para lo cual no sería funciona un switch de 16 millones de casos.

Saludos,

Última edición por HackmanC; 01/11/2014 a las 17:14 Razón: la variable p estaba de mas
  #9 (permalink)  
Antiguo 02/11/2014, 06:57
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 1 mes
Puntos: 0
Respuesta: Crear programa que use el método RLE

Pues muchísimas gracias. He llegado a la conclusión que no se puede realizar de otra forma que no sea con variables contenedoras. Así que optaré por las versiones que me habéis dado, o por la de lareto, aunque sea un poco más engorrosa.
Doy el tema por solucionado.

Saludos!
  #10 (permalink)  
Antiguo 02/11/2014, 10:57
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 11 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Crear programa que use el método RLE

Hola,



Cita:
Iniciado por Frnxu Ver Mensaje
... Realizar un programa que lea una secuencia de números naturales terminada con un número negativo y la codifique mediante el método RLE.
Por ejemplo:
Entrada: 1 1 1 2 3 3 4 5 5 5 6 -1
Salida: 3 1 1 2 2 3 1 4 3 5 1 6


El problema de esta aproximación es que no trabaja del todo bien ...
Esa aproximación inicial tenía pequeños detalles que hacían que no funcionara exactamente igual a los requerimientos, como por ejemplo, imprimía el -1 en la salida, cosa que no aparece en el ejemplo.

Cita:
Iniciado por Frnxu Ver Mensaje
Lamentablemente creo que no...
A ver, lo que necesito es, suponiendo que se mete por teclado esto:
1 1 1 2 3 3 4 5 5 5 6 -1

Al final (cuando se ponga -1) salga por pantalla cuántas veces se ha escrito cada número, es decir:
3(tres veces )1, 1(una vez)2, 2(dos veces)3, 1(una vez)4, 3(tres veces)5, 1(una vez)6.
Ahora comprendo tu problema, no es que tu código no funcione, solamente tenía pequeños errores que fácilmente podías arreglar. Ni muchos menos que no exista una solución, en mi propuesta la salida es exactamente lo que indicas en ese enunciado, contar la cantidad de veces que aparece cada número consecutivamente.

Pero ahora comprendo bien que es lo que sucede, es que no has comprendido bien el problema, seguramente no te tomaste la molestia en leer la documentación del formato RLE (Run-length encoding), que es un formato propietario de Microsoft creado hace muchos, muchos años, para comprimir las imágenes en BMP. Posteriormente fue utilizado en otros programas para comprimir vídeo, etc., hasta que se salieron otros formatos como JPG, MPEG, Intel Indeo y otros que demostraron que este formato de compresión era ineficiente.

https://en.wikipedia.org/wiki/Run-length_encoding

Así que solamente puedo llegar a la conclusión que no tienes ni idea de lo que tenías que hacer, puesto que claramente mencionaste RLE, y contar la cantidad de veces que aparece un elemento consecutivamente, que es la idea detrás de RLE.

Cita:
Iniciado por Frnxu Ver Mensaje
... Así que optaré por las versiones que me habéis dado, ...
Pues que te diré, supongo que en la facultad lo van a tomar como correcto, puesto que es la implementación de RLE, aunque tu todavía no tengas ni idea que significa.

Saludos,

Última edición por HackmanC; 02/11/2014 a las 11:27 Razón: agregar formatos

Etiquetas: int, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 17:05.