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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  pasar de decimal a cualquier base menor de 10
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: pasar de decimal a cualquier base menor de 10  (Leído 4,939 veces)
juanma31

Desconectado Desconectado

Mensajes: 5


Ver Perfil
pasar de decimal a cualquier base menor de 10
« en: 21 Mayo 2014, 20:25 pm »

Holaa tengo que hacer este ejercicio y no consigo que me salga, estoy empezando con los arrays y aun no lo controlo bien:
Escriba una función que acepte de entrada una cadena y devuelva un número entero. La función efectuará la conversión de un número entero en base 10 a cualquier base menor a 10. La cadena de entrada es un string en formato "número/base". El programa principal leerá la cadena, llamará a la función, y mostrará el resultado Ejemplo: - Introduzca dato: 723/4 - Indica que el número 723 hay que convertirlo a base 4.
NOTA: Como la salida es un entero, está limitado el número de dígitos a usar. En particular, para base 2 funcionará bien para el número 1023, pero el número 1024 en base 2 requiere 11 dígitos, lo cual no cabe en la variable entera de salida, generando un resultado erróneo. Se puede evitar ese problema haciendo que la variable de salida sea de tipo cadena.

Esto es lo q yo he hecho, me salen muchos errores:

#include <iostream>
#include<array>
using namespace std;

int Conversor(string numero,string base,string& cociente)
{
        int contador=1,i;
        cociente=numero;

        while(cociente>=base)
        {
            cociente=cociente/base;
            contador++;
        }
        for(i=contador; i>0; i--)
        {
            cociente=numero;
            contador=i;
            while(contador>1)
            {
                cociente=cociente/base;
                contador--;
            }

        }
}

int main()
{
    string numero,base;
    cout<<"Escribe el numero que quieres convertir (num/base): ";
    getline(cin,numero,'/');
    getline(cin,base,'\n');
    if(base<=10)
        Conversor(numero,base);
    else
        cout<<"Error no es una base menor de 10";
    return 0;
}




En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #1 en: 21 Mayo 2014, 22:21 pm »


* La librería <array> está de más.

* La función Conversor no devuelve nada por lo que debería ser de tipo void.

* Los argumentos de dicha función son los dos string, numero y base, el tercer argumento sobra.

* Tanto en la función mencionada como en main comparas y operas los string numero y base como si fueran enteros cuando previamente los has de pasar de string a int. Para ello uso la función atoi de la librería <cstdlib>, se podría hacer de otra forma pero tal vez es lo más cómodo.

Con las observaciones anteriores y respetando en lo posible tu código, a excepción de la forma que usas para cambiar de base, una posible solución sería:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. void Conversor(string numero,string base){
  7.  int factor=1,i,resto=0,num,bas;
  8.  num=atoi(numero.c_str()),bas=atoi(base.c_str());
  9.  for (i=0;num>=1 ;i++ ,factor*=10){
  10.    resto+=(num%bas)*factor;
  11.    num=num/bas;
  12.  }
  13.  cout<<resto;
  14. }
  15.  
  16. int main(){
  17.  string  numero,base;
  18.  cout<<"Escribe el numero que quieres convertir (num/base): ";
  19.  getline(cin,numero,'/');
  20.  getline(cin,base,'\n');
  21.  if(atoi(base.c_str())<=10)
  22.    Conversor(numero,base);
  23.  else
  24.    cout<<"Error no es una base menor de 10";
  25.  return 0;
  26. }

¡¡¡¡ Saluditos! ..... de leosansan!!!!




En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #2 en: 21 Mayo 2014, 23:02 pm »

Solo una observación con respecto al codigo, en el for la variable i es innecesaria puedes dejarlo simplemente asi

Código
  1. for(; num >= 1 ; factor *= 10, num = num/bas)
  2.   resto += (num%bas)*factor;

Saludos
En línea

juanma31

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #3 en: 21 Mayo 2014, 23:05 pm »

gracias. Aunq la libreria cstdlib no la he dado y eso de atoi nunca lo he usado.
Ademas el ejercicio dice q acepte de entrada una cadena y devuelva un número entero. Y la cadena de entrada es un string en formato "número/base".
Es un ejemplo del tema de array, ¿sabrias alguna forma de hacerlo usando la libreria array?
En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #4 en: 21 Mayo 2014, 23:46 pm »

Ademas el ejercicio dice q acepte de entrada una cadena y devuelva un número entero. Y la cadena de entrada es un string en formato "número/base".

Lo que sigue ya solo son detallitos ya se te dio un codigo funcional el cual puedes adaptarlo a tus necesidades, aqui no te van hacer la tarea completita

Saludos
En línea

juanma31

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #5 en: 21 Mayo 2014, 23:58 pm »

tu eres la completita. Estoy aprendiendo a programar en c++ y pregunto si alguien me podria ayudar. si no quieres colaborar mantente al margen
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #6 en: 22 Mayo 2014, 03:10 am »

Juanma, trataré de explicarte con paciencia, ya que estás comprendo que estás empezando. Necesitas la función atoi() de la biblioteca <cstdlib> para poder convertir un argumento de tipo cadena en un número entero equivalente. Pues, las operaciones aritméticas sólo tienen sentido entre argumentos que sean numéricos. Por ejemplo en el código original tenías:
Código
  1. cociente=cociente/base;
donde 'cociente' y 'base' son tipos string. Pero no puedes dividir dos string (!), en todo caso dividir los números representados por dichos strings, que es lo que hace atoi(): recibe una cadena y devuelve un número equivalente, e.g., el valor devuelto por la sentencia

atoi( "123" )

es el número 123, de tipo int.

A continuación voy a proponer, a modo de complemento con leosansan, una versión que da el resultado en forma de cadena y no como número decimal (lo hacemos de esta manera justo por las razones que tú expones al principio, evitar limitaciones en cuánto al número de dígitos en la salida).

Código
  1. #include <iostream>
  2. #include <array>
  3. #include <cstdlib>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7.  
  8. void Conversor( int numero, int base )
  9. {
  10.   int digito, i, N = 0;
  11.   string resultado = "";
  12.   char c;
  13.  
  14.   /* calcular la mayor potencia de la base que no supera al numero */
  15.   while ( numero >= 1 ) {
  16.      digito = numero % base;
  17.      numero = numero / base;
  18.      /* añadimos el digito, convertido a un char, al resultado */
  19.      c = digito + '0';
  20.      resultado = resultado + c;
  21.      N++;
  22.   }
  23.   /* ahora imprimimos la cadena en reversa */
  24.   for ( i = N - 1; i >= 0; i-- )
  25.      cout << resultado[i];
  26.   cout << endl;
  27. }
  28.  
  29. int main()
  30. {
  31.   string str_numero, str_base;
  32.   int numero, base;
  33.  
  34.   cout<<"Escribe el numero que quieres convertir (num/base): ";
  35.   getline(cin, str_numero,'/');
  36.   numero = atoi( str_numero.c_str() ); /* <-- ver aquí, convertimos el string en un entero */
  37.   getline(cin, str_base,'\n');
  38.   base = atoi( str_base.c_str() ); /* <-- ver aquí, convertimos el string en un entero */
  39.  
  40.   if( base <= 10 )
  41.      Conversor( numero, base );
  42.   else
  43.      cout<<"Error no es una base menor de 10";
  44.  
  45.   return 0;
  46. }

Ten en cuenta que el algoritmo de conversión que hemos usado (tanto leosansan como tú y yo) convierten el número calculando desde el dígito menos significativo hasta el más significativo, por eso la cadena debe imprimirse "al revés".

Espero te ayude.

---------------------------------------------------------------------------------------
P.D. En mi ignorancia, no conozco una función de biblioteca de C++ que imprima directamente cadenas en reversa, si alguien la sabe que me lo diga xD
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #7 en: 22 Mayo 2014, 05:03 am »

tu eres la completita. Estoy aprendiendo a programar en c++ y pregunto si alguien me podria ayudar. si no quieres colaborar mantente al margen

juanma31 calma por que te pones en ese plan, mi unica intención era de que pusieras un poquito de esfuerzo de tu parte para solventar el resto del ejercicio

P.D. En mi ignorancia, no conozco una función de biblioteca de C++ que imprima directamente cadenas en reversa, si alguien la sabe que me lo diga xD

yoel_alejandro puedes usar la función std::reverse de la libreria algorithm de C++

Código
  1. std::reverse(resultado.begin(), resultado.end());
  2. std::cout << resultado << endl;

Saludos
« Última modificación: 22 Mayo 2014, 05:07 am por Blaster » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #8 en: 22 Mayo 2014, 08:52 am »

tu eres la completita. Estoy aprendiendo a programar en c++ y pregunto si alguien me podria ayudar. si no quieres colaborar mantente al margen

Tu sigue contestando así en este foro que te vas a tener que responder tu solo a las dudas.

Ante todo educación, que somos ya mayorcitos.

¿Que estás aprendiendo? perfecto, bienvenido al mundo de la programación. Nadie dijo que fuese a ser fácil. Si te damos las cosas echas no vas a aprender absolutamente nada. Esta profesión, como cualquier otra, se aprende a base de meter la pata y de dedicarle tiempo. Además, ten en cuenta que el mundo de la programación suele ser de todo menos sencillo y fácil, vete acostumbrando a los retos porque te vas a hartar.

Así que, por favor, menos humos y más humildad. Ten en cuenta que aquí no te estamos cobrando por nuestro tiempo y nuestro conocimiento, cosa que deberías agradecer.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: pasar de decimal a cualquier base menor de 10
« Respuesta #9 en: 24 Mayo 2014, 15:14 pm »

gracias. Aunq la librería cstdlib no la he dado y eso de atoi nunca lo he usado.
Ademas el ejercicio dice q acepte de entrada una cadena y devuelva un número entero. Y la cadena de entrada es un string en formato "número/base".
Es un ejemplo del tema de array, ¿sabrías alguna forma de hacerlo usando la librería array?

Creo que confundes el usar arrays con usar la librería array.

Una posible solución sin usar atoi ni stdlib y sí arrays donde después de la entrada en el formato 123/2 tipo string paso los valores a enteros para luego poder operar con ellos:

Código
  1. /**
  2. Entrada ejemplo en el formato string:123/2
  3. **/
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. void Conversor(int num,int bas){
  9.  int resto=0;
  10.  for (int factor=1;num>=1;factor*=10,num=num/bas)
  11.    resto+=(num%bas)*factor;
  12.  cout<<resto;
  13. }
  14.  
  15. int main(){
  16.  int i,lon,num=0,bas=0,factor;
  17.  string  numero,base;
  18.  cout<<"Escribe el numero que quieres convertir (num/base): ";
  19.  getline(cin,numero,'/');
  20.  getline(cin,base,'\n');
  21.  for (lon=0;numero[lon];lon++);
  22.  for (i=lon-1,factor=1;i>=0;i--,factor*=10)
  23.    num+=(numero[i]-'0')*factor;
  24.  for (lon=0;base[lon];lon++);
  25.  for (i=lon-1,factor=1;i>=0;i--,factor*=10)
  26.    bas+=(base[i]-'0')*factor;
  27.  if(bas<=10)
  28.    Conversor(num,bas);
  29.  else
  30.    cout<<"Error no es una base menor de 10";
  31.  return 0;
  32. }

¡¡¡¡ Saluditos! ..... !!!!


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error programa que cambia un número de base 10 a cualquier base
Programación C/C++
ERIK546 7 6,619 Último mensaje 16 Mayo 2012, 03:59 am
por ERIK546
[C] Decimal a base n, con n<10
Programación C/C++
edr89 8 4,403 Último mensaje 24 Octubre 2013, 03:12 am
por rir3760
pasar de decimal a cualquier base menor de 10 « 1 2 »
Programación C/C++
juanma31 14 7,505 Último mensaje 3 Abril 2014, 18:48 pm
por Eternal Idol
programa que cambie de base binaria a base decimal en C
Programación C/C++
estudiante_1 1 3,085 Último mensaje 23 Noviembre 2015, 02:37 am
por Deivbid
Duda ejercicio C nº decimal pasar a otra base
Programación C/C++
juanpalomo098 0 2,354 Último mensaje 7 Diciembre 2016, 16:04 pm
por juanpalomo098
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines