Convertir decimal a diferentes bases

Iniciado por AxelP, 6 Marzo 2015, 05:27 AM

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

AxelP

Hola, tengo que hacer un programa que convierta un numero decimal dado a una base dada. Tengo hecho un código que considero está bien, pero no entiendo por qué no me da ningún resultado, y me urge que funcione, les agradecería si alguien me ayuda  :P

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

char* conversion(int num, int base)
{
char* resultado = new char[20];
int i = 0; //contador de posicion.
int n[20];
while(num > 0)
{
n[i] = num % base;
num = num / base;
i++;
}
int j = 0; //contador para resultado.
while(i >=0)
{
if(n[i] >= 0 && n[i] <= 9)
{
resultado[j] = char(n[i]);
}
else
{
switch(n[i])
{
case 10: resultado[j] = 'A';
break;
case 11: resultado[j] = 'B';
break;
case 12: resultado[j] = 'C';
break;
case 13: resultado[j] = 'D';
break;
case 14: resultado[j] = 'E';
break;
case 15: resultado[j] = 'F';
break;
}
}
i--;
j++;
}
return resultado;
}

int main()
{
int num, base;
int continuar = 0;
while (continuar == 0)
{
printf("Aqui puedes convertir un numero decimal a cualquier base entre 2 y 16.\n\nIngresa el numero a convertir: ");
scanf("%d", &num);
printf("\nA que base quieres convertirlo? ");
scanf("%d", &base);
printf("El numero %d en base %d es: ", num, base);
conversion(num, base);
printf("\n\nQuieres convertir otro numero? Si=0/No=1 ");
scanf("%d", &continuar);
system("cls");
}
printf("Presiona enter para salir...");
getch();
}

rir3760

El primer problema con el programa es que el lenguaje es C++ (la próxima vez por favor indícalo) pero no tiene casi nada de este (solo la reserva de memoria mediante new).

En la función de conversión los cambios a realizar son:
1) Debes reducir en una unidad el contador "i" antes de procesar cada dígito.
2) Cuando el dígito este en el rango 0 .. 9 para generar el carácter correspondiente debes utilizar:
Código (cpp) [Seleccionar]
resultado[j] = char('0' + n[i]);
3) Después del bucle y antes de la sentencia de retorno debes agregar el carácter de fin de cadena con:
Código (cpp) [Seleccionar]
   resultado[j] = '\0';

   return resultado;
}


Por ultimo en la función main debes imprimir el resultado mediante printf:
Código (cpp) [Seleccionar]
printf("El numero %d en base %d es: ", num, base);
printf("\"%s\"\n", conversion(num, base)); /* <== */
printf("\n\nQuieres convertir otro numero? Si=0/No=1 ");


Ya por ultimo deberías utilizar las facilidades del lenguaje, la función se puede reducir bastante, falta liberar la memoria utilizada y hay que evitar el uso de la biblioteca conio de Borland. Por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

AxelP

Muchas gracias!  :D
Aún no tengo claro con qué podría sustituir el new char, ya que mi propósito es usar C; he leído algo sobre malloc, pero no se como usarlo.
Tampoco estoy seguro de por qué se debe de usar esto:
resultado[j] = char('0' + n[i]);
Y esto:
resultado[j] = '\0';
Ademas quisiera saber por qué en algunos char se debe poner char*, me dijeron que para que funcionara debía ponerlo, pero no se por qué.
En cuanto a conio, ya aprendí a no usarlo, te agradezco mucho la ayuda  :D
El código quedó asi:
#include <stdio.h>
#include <stdlib.h>

char* conversion(int num, int base)
{
char* resultado = new char[20];
int i = 0; //contador de posicion.
int n[20];
while(num > 0)
{
n[i] = num % base;
num = num / base;
i++;
}
i--;
int j = 0; //contador para resultado.
while(i >=0)
{
if(n[i] >= 0 && n[i] <= 9)
{
resultado[j] = char('0' + n[i]);
}
else
{
switch(n[i])
{
case 10: resultado[j] = 'A';
break;
case 11: resultado[j] = 'B';
break;
case 12: resultado[j] = 'C';
break;
case 13: resultado[j] = 'D';
break;
case 14: resultado[j] = 'E';
break;
case 15: resultado[j] = 'F';
break;
}
}
i--;
j++;
}
resultado[j] = '\0';
return resultado;
}

int main()
{
int num, base;
int continuar = 0;
while (continuar == 0)
{
printf("Aqui puedes convertir un numero decimal a cualquier base entre 2 y 16.\n\nIngresa el numero a convertir: ");
scanf("%d", &num);
printf("\nA que base quieres convertirlo? ");
scanf("%d", &base);
printf("El numero %d en base %d es: %s", num, base, conversion(num, base));
printf("\n\nQuieres convertir otro numero? Si=0/No=1 ");
scanf("%d", &continuar);
system("cls");
}
printf("Presiona enter para salir...");
getchar();
}

rir3760

Cita de: AxelP en  7 Marzo 2015, 23:33 PMAún no tengo claro con qué podría sustituir el new char, ya que mi propósito es usar C
Puedes utilizar new porque utilizas un compilador de C++, revisa con cuidado su documentación para saber como compilar el código fuente como C.

Cita de: AxelP en  7 Marzo 2015, 23:33 PMTampoco estoy seguro de por qué se debe de usar esto:
resultado[j] = char('0' + n[i]);
Porque los enteros 0, 1, 2, ... y los caracteres '0', '1', '2' ... se parecen (son enteros) pero no son los mismo (sus valores son diferentes).

Para obtener los dígitos 0, 1, 2, ... en base a los caracteres '0', '1', '2', ... debes restar '0'. Para explicarlo mejor:
'0' - '0' == 0
'1' - '0' == 1
...
'9' - '0' == 9

Y lo opuesto también aplica, para obtener los caracteres '0', '1', '2', ... en base a los dígitos 0, 1, 2, ... debes sumar '0':
0 + '0' == '0'
1 + '0' == '1'
...
9 + '0' == '9'

Ello porque los caracteres '0', '1', '2', ... tienen posiciones (valores) consecutivos y están ordenados de forma ascendente ('0', '1', '2', ...., '9').

Cita de: AxelP en  7 Marzo 2015, 23:33 PM
Y esto:
resultado[j] = '\0';
Porque en C una cadena es una secuencia de cero o mas caracteres seguidos del carácter '\0', este ultimo se utiliza para indicar el final de la cadena (si no lo colocas, ¿Como sabes donde termina?).

Cita de: AxelP en  7 Marzo 2015, 23:33 PMAdemas quisiera saber por qué en algunos char se debe poner char*, me dijeron que para que funcionara debía ponerlo, pero no se por qué.
Se utiliza "char *" para declarar una variable de tipo "puntero a carácter", ese tema lo veras mas adelante junto con los arrays.

Por ultimo si no tienes un curso o libro de calidad consigue uno, recomendaciones sobre ellos las puedes encontrar mediante el motor de búsqueda de los foros.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language