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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


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

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Convertir decimal a diferentes bases
« en: 6 Marzo 2015, 05:27 am »

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

Código:
#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();
}


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Convertir decimal a diferentes bases
« Respuesta #1 en: 6 Marzo 2015, 07:19 am »

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
  1. 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
  1.   resultado[j] = '\0';
  2.  
  3.   return resultado;
  4. }

Por ultimo en la función main debes imprimir el resultado mediante printf:
Código
  1. printf("El numero %d en base %d es: ", num, base);
  2. printf("\"%s\"\n", conversion(num, base)); /* <== */
  3. 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


En línea

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

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Convertir decimal a diferentes bases
« Respuesta #2 en: 7 Marzo 2015, 23:33 pm »

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:
Código:
resultado[j] = char('0' + n[i]);
Y esto:
Código:
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:
Código:
#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();
}
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Convertir decimal a diferentes bases
« Respuesta #3 en: 9 Marzo 2015, 16:32 pm »

Aú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.

Tampoco estoy seguro de por qué se debe de usar esto:
Código:
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:
Código:
'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':
Código:
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').

Y esto:
Código:
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?).

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é.
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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
convertir de decimal a hexadecimal
Programación C/C++
chaarlyyyy 5 42,165 Último mensaje 29 Mayo 2010, 17:10 pm
por danyof
Convertir de IEEE754 de precisión simple a valor decimal.
Programación Visual Basic
Impersecuto 6 12,547 Último mensaje 18 Noviembre 2010, 20:28 pm
por Karcrack
[C] Convertir caracter a decimal
Programación C/C++
m0rf 2 4,724 Último mensaje 7 Febrero 2012, 18:03 pm
por m0rf
Convertir en binario a Hex y Decimal.
.NET (C#, VB.NET, ASP)
Meta 3 3,789 Último mensaje 24 Agosto 2014, 19:46 pm
por Meta
Django - cruzar dos tablas transaccionales de diferentes bases de datos
Desarrollo Web
JuanjoXD 1 3,102 Último mensaje 2 Noviembre 2019, 06:47 am
por JuanjoXD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines