Devolver un número al revés

Iniciado por JonaLamper, 20 Noviembre 2015, 18:48 PM

0 Miembros y 1 Visitante están viendo este tema.

JonaLamper

Buenas,

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
using namespace std;

int main() {
int enteroEntrada, enteroSalida = 0;
const int CENTINELA = 0;

ifstream entrada;
ofstream salida;
entrada.open("entrada.txt");
salida.open("salida.txt");

if (entrada.is_open()){
entrada >> enteroEntrada;
while (enteroEntrada != CENTINELA){
if (enteroEntrada > 0){
while (enteroEntrada > 0){ // Bucle para dar la vuelta al número enteroEntrada
enteroSalida = enteroSalida * 10 + enteroEntrada % 10;
enteroEntrada = enteroEntrada / 10;
}
salida << enteroSalida << endl; // Escribimos en el fichero salida.txt
}
entrada >> enteroEntrada; // Leer el siguiente
enteroSalida = 0;
}
}
else {
cout << "ERROR: el archivo no pudo abrirse." << endl;
}

entrada.close();
salida.close();
return 0;
}


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...
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

0xFer

Cita de: SirLanceCC en 28 Marzo 2007, 00:35 AM
Bueno eso yo lo hago así de sencillo:

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
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

JonaLamper

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.
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

0xFer

#3
te lo he modificado tantito:

Código (cpp) [Seleccionar]

#include <iostream>
   #include <fstream>
   using namespace std;
   
   int main() {
   int enteroEntrada, enteroSalida = 0;
   
   ifstream entrada;
   ofstream salida;
   entrada.open("entrada.txt");
   salida.open("salida.txt");
   
   if (entrada.is_open()){
   entrada >> enteroEntrada;
   
   if(enteroEntrada)
       for( int digito; enteroEntrada; enteroEntrada = (enteroEntrada - digito)/10 ){
           digito = enteroEntrada%10;
           salida << digito;  
       }
   else
       salida << 0;
       
   }
   else {
   cout << "ERROR: el archivo no pudo abrirse." << endl;
   }
   
   entrada.close();
   salida.close();
   return 0;
   }
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

JonaLamper

Pongo una solución que me parece más clara y mejor:


Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
using namespace std;

int main() {

int longitudNumero, enteroEntrada, enteroSalida = 0, digito;
string enteroString;

ifstream entrada;
ofstream salida;
entrada.open("entrada.txt");
salida.open("salida.txt");

if (entrada.is_open()){
entrada >> enteroEntrada;

while (enteroEntrada != 0){
if (enteroEntrada > 0) {
digito = enteroEntrada % 10;
while (enteroEntrada != 0) {
salida << digito;
enteroEntrada = enteroEntrada / 10;
digito = enteroEntrada % 10;
}
salida << endl;
}
entrada >> enteroEntrada;
}
}
else {
cout << "ERROR: el archivo no pudo abrirse." << endl;
}

entrada.close();
salida.close();

return 0;
}


Gracias.

PD: en el for no haría falta hacer "(enteroEntrada - digito) / 10", bastaría con "(enteroEntrada / 10)".
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

0xFer

#5
En ese caso:

Código (cpp) [Seleccionar]

   #include <iostream>
      #include <fstream>
      using namespace std;
   
      int main() {
      int enteroEntrada;
   
      ifstream entrada.open("entrada.txt");
      ofstream  salida.open("salida.txt");
   
      if (entrada.is_open()){
      entrada >> enteroEntrada;
   
          for( ;enteroEntrada > 0; enteroEntrada /=10 )
              salida << enteroEntrada%10;  
      }
      else {
      cout << "ERROR: el archivo no pudo abrirse." << endl;
      }
   
      entrada.close();
      salida.close();
      return 0;
      }
   


y hace lo mismo xD
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}