Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JonaLamper en 20 Noviembre 2015, 18:48 pm



Título: Devolver un número al revés
Publicado por: JonaLamper en 20 Noviembre 2015, 18:48 pm
Buenas,

Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. int main() {
  6. int enteroEntrada, enteroSalida = 0;
  7. const int CENTINELA = 0;
  8.  
  9. ifstream entrada;
  10. ofstream salida;
  11. entrada.open("entrada.txt");
  12. salida.open("salida.txt");
  13.  
  14. if (entrada.is_open()){
  15. entrada >> enteroEntrada;
  16. while (enteroEntrada != CENTINELA){
  17. if (enteroEntrada > 0){
  18. while (enteroEntrada > 0){ // Bucle para dar la vuelta al número enteroEntrada
  19. enteroSalida = enteroSalida * 10 + enteroEntrada % 10;
  20. enteroEntrada = enteroEntrada / 10;
  21. }
  22. salida << enteroSalida << endl; // Escribimos en el fichero salida.txt
  23. }
  24. entrada >> enteroEntrada; // Leer el siguiente
  25. enteroSalida = 0;
  26. }
  27. }
  28. else {
  29. cout << "ERROR: el archivo no pudo abrirse." << endl;
  30. }
  31.  
  32. entrada.close();
  33. salida.close();
  34. return 0;
  35. }

Tengo ese sencillo programa que lee un entero de un fichero de entrada y escribe ese entero (del revés) en otro fichero de salida. El problema es que para la entrada "100" la salida es "1" cuando debería ser "001". Lo que me lleva a pensar que he de usar variables char y/o string en vez de int (corregidme si me equivoco hasta este punto). El problema, de nuevo, es que intento planteármelo usando esas variables... Leo una cadena y voy almacenando los valores de forma invertida, pero claro, no sé cuántos dígitos tendrá el número de entrada, así que no puedo definir el tamaño de mi "contenedor" (un array de char, por ejemplo).

No sé si me explico...


Título: Re: Devolver un número al revés
Publicado por: 0xFer en 20 Noviembre 2015, 18:57 pm
Bueno eso yo lo hago así de sencillo:
Código:
FILE *archivo = fopen("documento.txt", "r"); //Abrimos el archivo
long int tamano; //variable para almacenar el tamaño del archivo

fseek(archivo,0,SEEK_END); //Nos vamos el final del archivo
tamano = ftell(archivo); //Averiaguamos nuestra posición en el archivo con ftell. Y como estamos al final, nos dirá el peso.

saludos


Título: Re: Devolver un número al revés
Publicado por: JonaLamper en 20 Noviembre 2015, 20:22 pm
En primer lugar, gracias.

¿Alguna otra forma de hacerlo? ¿Podría hacerlo con variables int pero arreglando para que la entrada "100" me dé la salida "001"?

No me malinterpretes, tu solución me gusta. El problema es que no hemos visto funciones de ese estilo... Es decir, se supone que debe resolverse de forma más "trivial". Si bien el resultado será correcto, cuando mi profesor mire el código dudo que lo admita como válido.


Título: Re: Devolver un número al revés
Publicado por: 0xFer en 20 Noviembre 2015, 22:03 pm
te lo he modificado tantito:

Código
  1. #include <iostream>
  2.    #include <fstream>
  3.    using namespace std;
  4.  
  5.    int main() {
  6.    int enteroEntrada, enteroSalida = 0;
  7.  
  8.    ifstream entrada;
  9.    ofstream salida;
  10.    entrada.open("entrada.txt");
  11.    salida.open("salida.txt");
  12.  
  13.    if (entrada.is_open()){
  14.    entrada >> enteroEntrada;
  15.  
  16.    if(enteroEntrada)
  17.        for( int digito; enteroEntrada; enteroEntrada = (enteroEntrada - digito)/10 ){
  18.            digito = enteroEntrada%10;
  19.            salida << digito;  
  20.        }
  21.    else
  22.        salida << 0;
  23.  
  24.    }
  25.    else {
  26.    cout << "ERROR: el archivo no pudo abrirse." << endl;
  27.    }
  28.  
  29.    entrada.close();
  30.    salida.close();
  31.    return 0;
  32.    }
  33.  


Título: Re: Devolver un número al revés
Publicado por: JonaLamper en 25 Noviembre 2015, 17:19 pm
Pongo una solución que me parece más clara y mejor:


Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. int main() {
  6.  
  7. int longitudNumero, enteroEntrada, enteroSalida = 0, digito;
  8. string enteroString;
  9.  
  10. ifstream entrada;
  11. ofstream salida;
  12. entrada.open("entrada.txt");
  13. salida.open("salida.txt");
  14.  
  15. if (entrada.is_open()){
  16. entrada >> enteroEntrada;
  17.  
  18. while (enteroEntrada != 0){
  19. if (enteroEntrada > 0) {
  20. digito = enteroEntrada % 10;
  21. while (enteroEntrada != 0) {
  22. salida << digito;
  23. enteroEntrada = enteroEntrada / 10;
  24. digito = enteroEntrada % 10;
  25. }
  26. salida << endl;
  27. }
  28. entrada >> enteroEntrada;
  29. }
  30. }
  31. else {
  32. cout << "ERROR: el archivo no pudo abrirse." << endl;
  33. }
  34.  
  35. entrada.close();
  36. salida.close();
  37.  
  38. return 0;
  39. }

Gracias.

PD: en el for no haría falta hacer "(enteroEntrada - digito) / 10", bastaría con "(enteroEntrada / 10)".


Título: Re: Devolver un número al revés
Publicado por: 0xFer en 26 Noviembre 2015, 00:10 am
En ese caso:

Código
  1.    #include <iostream>
  2.       #include <fstream>
  3.       using namespace std;
  4.  
  5.       int main() {
  6.       int enteroEntrada;
  7.  
  8.       ifstream entrada.open("entrada.txt");
  9.       ofstream  salida.open("salida.txt");
  10.  
  11.       if (entrada.is_open()){
  12.       entrada >> enteroEntrada;
  13.  
  14.           for( ;enteroEntrada > 0; enteroEntrada /=10 )
  15.               salida << enteroEntrada%10;  
  16.       }
  17.       else {
  18.       cout << "ERROR: el archivo no pudo abrirse." << endl;
  19.       }
  20.  
  21.       entrada.close();
  22.       salida.close();
  23.       return 0;
  24.       }
  25.  
  26.  

y hace lo mismo xD