Programa en C que cambie de base 10 a cualquier base y viceversa

Iniciado por ERIK546, 30 Abril 2012, 02:28 AM

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

ERIK546

Hola programadores en C la cuestion es la siguiente necesito hacer un programa en C que como dice el asunto del mensaje, teniendo un número en base 10 lo pueda cambiar a cualquier base y viceversa.
Les mostraré lo que he llevado hasta ahora para que me puedan decir porque no ha funcionado;



#include <stdio.h>
#include <stdlib.h>
void conversion (int num, int base);
int main(int argc, char *argv[])
{
  int num,base,coci,i,residuo,k; 
  printf("Programa que convierte un numero de base 10 a cualquier base");
  printf("Escribe el numero de base 10");
  scanf("%d",&num);
  printf("Escribe a la base que se desea convertir");
  scanf("%d",&base);
  k=conversion(num, base);
  for(i=k-1;i>0;i--){
                     printf("%d",residuo);
                     }
  system("PAUSE");
  return 0;
}
void conversion (int num, int base);
{
     int i;
     for(i=0;coci>0;i++){
                         coci=num/base;
                         residuo[i]=num%base;
     }

Como se han podido dar cuenta dicho programa solo se encuentra a la mitad en cuanto se refiere cambiar de base 10 a cualquier otra base, también podrán ver que se requiere el uso de funciones aparte de main, ya que así me han pedido el programa; la idea general del programa es que con los valores que pido en la función main, los puede utilizar en la nueva función "conversion", para obtener los residuos de las divisiones sucesivas y guardarlos en un arreglo residuos y al obtener y guardar dichos valores de la función "conversion" entonces hacer que los use main para imprimirlos de forma regresiva como se hace para obtener la  base 10 a cualquier base. Como verán esto ha sido solo la mitad del programa pero en serio agradecería que me mencionarán mis errores, espero haberme dado a entender gracias de antemano.

s00rk

Bueno hace tiempo hice algo asi de conversion de base 10 a 2 - 16, si te sirve de algo aqui esta:

Anuque solo con numeros enteros hehe, ya con decimales se me paso hacerlo ;$ xD

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

int DecimalToBase(long int iDec, int numbase);
char cHexa[] = {'A','B','C','D','E','F'};
char result[100];

int main(int argc, char *argv[])
{
int num, base;
  cout << "Escribe el numero de base 10: "; cin >> num;
  cout << "Escribe a la base que se desea convertir: "; cin >> base;
  cout << endl << "Numero: ";
  for(int x = 0; x < DecimalToBase(14, 2); x++) cout << result[x];
  cout << endl;
  system("PAUSE");
  return 0;
}

int DecimalToBase(long int iDec, int numbase)
{
    char base_digits[16] =
{'0', '1', '2', '3', '4', '5', '6', '7',
  '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

   int converted_number[64];
   int next_digit, index=0, i=0;

   while (iDec != 0)
   {
converted_number[index] = iDec % numbase;
iDec /= numbase;
++index;
   }
   --index;
   for(  ; index>=0; index--)
   {
result[i] = (base_digits[converted_number[index]]);
i++;
   }
   return i;
}

durasno

Hola! te marco los errores del codigo:
1º Esta mal la declaracion de residuo te faltaron los corchetes [] ya que es un arreglo
2º printf("%d",residuo); si residuo es un arreglo lo tenes q tratar como a un arreglo, tambien t faltan los []
3º k=conversion(num, base); k toma el valor q retorna conversion() pero esa funcion es d tipo void osea no estas retornando nada.
4º Si declaras coci en el main, esta variable es local al main no se ve en la funcion conversion(); por lo tanto tenes q declarar a coci en la funcion

El codigo para la conversion me parece q tambien esta mal...

Saludos
Ahorrate una pregunta, lee el man

ERIK546

Cita de: durasno en 30 Abril 2012, 03:22 AM
Hola! te marco los errores del codigo:
1º Esta mal la declaracion de residuo te faltaron los corchetes [] ya que es un arreglo
2º printf("%d",residuo); si residuo es un arreglo lo tenes q tratar como a un arreglo, tambien t faltan los []
3º k=conversion(num, base); k toma el valor q retorna conversion() pero esa funcion es d tipo void osea no estas retornando nada.
4º Si declaras coci en el main, esta variable es local al main no se ve en la funcion conversion(); por lo tanto tenes q declarar a coci en la funcion

El codigo para la conversion me parece q tambien esta mal...

Saludos
Gracias por tu respuesta durasno he tratado de arreglar los errores que me has comentado. Sobre la función "conversion" en el que he tratado de ingresar en un arreglo todos los residuos de la división hasta que el cociente sea cero, he cambiado un poco el código para hacer que funcione, lo dejo a continuación:

#include <stdio.h>
#include <stdlib.h>
int conversion (int num, int base);
int main(int argc, char *argv[])
{
  int num,base,i,k; 
  printf("Programa que convierte un numero de base 10 a cualquier base\n");
  printf("Escribe el numero de base 10\n");
  scanf("%d",&num);
  printf("Escribe a la base que se desea convertir\n");
  scanf("%d",&base);
  conversion (num,base);
  system("PAUSE");
  return 0;
}
int conversion (int num, int base)
{
     int i,coci;
     int residuo[100];
     for(i=0;coci=0;i++){
                         coci=num/base;
                         residuo[i]=num%base;
     return residuo[i];
}
}

Sin embargo no se si dicho ciclo de la función "conversion" haga lo que se pretende debido a que en la función main aunque llamo a la función "conversion" no aparecen dichos valores del arreglo. Te estaría muy agradecido si pudieras decirme como hacer este ciclo (o si está correcto) y como sus resultados guardados en el arreglo residuo puedo hacer que aparezcan en la función main.

durasno

#4
Hola! xD ahora declaras a coci en la funcion pero sacas a residuo[] del main, y otra cosa q sacaste fue el for del main¿como vas a hacer para imprimir?.. Ademas ahora haces que conversion() retorne un int pero no se lo asignas a nada, esta peor el codigo :P

Te dejo el codigo corregido:
#include <stdio.h>
#include <stdlib.h>
int conversion (int num, int base,int []);
int main(int argc, char *argv[])
{
 int num,base,i,k;
 int residuo[10];
 printf("Programa que convierte un numero de base 10 a cualquier base\n");
 printf("Escribe el numero de base 10\n");
 scanf("%d",&num);
 printf("Escribe a la base que se desea convertir\n");
 scanf("%d",&base);
 k=conversion (num,base,residuo);
  for(i=k-1;i>=0;i--){
                    printf("%d ",residuo[i]);
                    }
                    printf("\n\n");
 system("PAUSE");
 return 0;
}
int conversion (int num, int base, int residuo[])
{
    int i;
    for(i=0;num>0;i++){// fijate la condicion del for
                        residuo[i]=num%base; // primero guardas el residuo
                        num/=base; // despues dividis a num
                        }
    return i;
}


Saludos

EDIT: la funcion no sirve para pasar un decimal a hexadecimal
Ahorrate una pregunta, lee el man

ERIK546

Cita de: durasno en 30 Abril 2012, 22:49 PM
Hola! xD ahora declaras a coci en la funcion pero sacas a residuo[] del main, y otra cosa q sacaste fue el for del main¿como vas a hacer para imprimir?.. Ademas ahora haces que conversion() retorne un int pero no se lo asignas a nada, esta peor el codigo :P

Te dejo el codigo corregido:
#include <stdio.h>
#include <stdlib.h>
int conversion (int num, int base,int []);
int main(int argc, char *argv[])
{
 int num,base,i,k;
 int residuo[10];
 printf("Programa que convierte un numero de base 10 a cualquier base\n");
 printf("Escribe el numero de base 10\n");
 scanf("%d",&num);
 printf("Escribe a la base que se desea convertir\n");
 scanf("%d",&base);
 k=conversion (num,base,residuo);
  for(i=k-1;i>=0;i--){
                    printf("%d ",residuo[i]);
                    }
                    printf("\n\n");
 system("PAUSE");
 return 0;
}
int conversion (int num, int base, int residuo[])
{
    int i;
    for(i=0;num>0;i++){// fijate la condicion del for
                        residuo[i]=num%base; // primero guardas el residuo
                        num/=base; // despues dividis a num
                        }
    return i;
}


Saludos

EDIT: la funcion no sirve para pasar un decimal a hexadecimal
Muchísimas gracias durasno por tus respuestas, me han sido de mucha utilidad es exactamente lo que se buscaba, sin embargo hay un parte del código que entiendo lo que hace, más no se como actúa dicho operador: Me refiero a la parte en la función "conversion"

int conversion (int num, int base, int residuo[])
{
     int i;
     for(i=0;num>0;i++){// fijate la condicion del for
                         residuo[i]=num%base; // primero guardas el residuo
                         num/=base; // despues dividis a num
                         }
     return i;
}

Lo que no entendido del todo es la operación "num/=base", entiendo que este operador realiza "num/base" y de alguna manera recicla ese nuevo valor para utilizarlo como "num" y lo hará hastá que dicha operación sea diferente de cero. Sin embargo este tipo de operador "/=" no lo conozco y te agradecería si me explicarás como funciona. Gracias por todo.

durasno

Hola! hacer esto num/=base; es lo mismo que hacer num=num/base, osea a num lo divido por base y al resultado de esa division lo guardo en num

Saludos
Ahorrate una pregunta, lee el man