Realizar un programa que permita realizar conversiones de números entre distintas bases numéricas. El usuario debe ingresar por teclado: la base original, la cantidad de dígitos del numero, el número (se ingresa dígito a dígito y la base final; el programa deberá mostrar el número convertido en la base especificada por el usuario.
Ejemplo:
Entada:
Base: 2 Numero: 1111 Convertir a Base: 16
Salida:
Numero: F
Codigo Fuente en C
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> void llenaArreglo (int num [], int digitos, int base1); int convertirAdecimal (int num [], int digitos, int base1, int base2); void convertirAbase (int decimal, int base2); int checabase (); int checabase2 (); int main() { int digitos = 0; int base1, base2; int decimal; printf ("Este programa convierte numeros de cierta" "base a una distinta.\n\n"); printf ("La base maxima de conversion es Hexadecimal (16).\n\n"); base1 = checabase (); printf ("\nDe cuantos digitos es el numero a convertir?\n=> "); scanf ("%d", &digitos); int num [digitos]; printf ("\nIntroduce el numero entero a convertir, digito a" "digito \n comenzando con la cifra más significativa\n\n"); llenaArreglo (num, digitos, base1); decimal = convertirAdecimal (num, digitos, base1, base2); base2 = checabase2(); printf ("\n"); convertirAbase (decimal, base2); system ("PAUSE"); return 0; } int checabase () { int x; printf ("De que base es el numero a convertir?\n=> "); scanf ("%d", &x); if(x >=17) { printf("\n\n**El numero insertado excede la capacidad de" "por favor ingrese una base menor a 16**\n\n"); printf ("De que base es el numero a convertir?\n"); scanf ("%d", &x); } if(x <=-1) { printf("\n\n**El numero insertado excede la capacidad," "por favor ingrese una base mayor a cero**\n\n"); printf ("De que base es el numero a convertir?\n"); scanf ("%d", &x); } return x; } int checabase2 () { int x; printf ("\n\nA que base desea convertirlo? \n"); scanf ("%d", &x); if(x >=17) { printf("\n\n**El numero insertado excede la capacidad," " por favor ingrese una base menor a 16**\n\n"); printf ("\n\nA que base desea convertirlo? \n"); scanf ("%d", &x); } if(x <=-1) { printf("\n\n**El numero insertado excede la capacidad " " por favor ingrese una base mayor a cero**\n\n"); printf ("\n\nA que base desea convertirlo? \n"); scanf ("%d", &x); } return x; } void llenaArreglo (int num [], int digitos, int base1) { int i,x, a; for (i=0; i<digitos; i++) { printf ("\nIntroduce el digito numero %d\n", i+1); scanf("%x", &num[i]); if (num[i]>=base1 || num[i]<0) { printf ("\n**Numero no valido para esta base**\n"); printf ("\nIntroduce el digito numero %d\n", i+1); scanf("%x", &num[i]); } } printf ("\nEl numero que deseas convertir es: "); for (i=0; i<digitos; i++) printf ("%x", num [i]); } int convertirAdecimal (int num [], int digitos, int base1, int base2) { int i, pot; int x=0; for (i=digitos-1, pot=0; i>=0, pot<digitos; i--, pot++) { x+= (pow(base1, pot)* num[i]); } return x; } void convertirAbase (int decimal, int base2) { int cociente,residuo,cont, i,j; int conv [50]; i=0; do{ cociente = decimal/base2; residuo = decimal%base2; conv[i] = residuo; decimal = cociente; i+=1; }while (cociente>0); printf("La conversion es: "); for (cont=i-1; cont>=0; cont--) { printf("%x", conv [cont]); } printf("\n\n"); }
Gracias, está genial tu código y trabaja perfecto. Saludos :)
ResponderEliminaresta fácil
ResponderEliminary para net beans java como seria
ResponderEliminarGracias me sirbio de mucho
ResponderEliminarMuchas gracias ,me sirvió mucho :)
ResponderEliminarme salvaste
ResponderEliminarcomo el programmo lea las letras del hexadecimal por favor ? lo siento para mi espanol escrito, es terible
ResponderEliminarcomo el programmo lea las letras del hexadecimal por favor ? lo siento para mi espanol escrito, es terible
ResponderEliminar#include "iostream"
ResponderEliminar#include "sstream"
#include "string"
#include "conio.h"
#include "cmath"
using namespace std;
/*
10a
11b
12c
13d
14e
15f
16g
17h
18i
19j
20
*/
int cantDigitos(long num) {
int contador = 1;
while (num / 10 > 0)
{
num = num / 10;
contador++;
}
return contador;
}
bool DigitoMenorABase(long num, int base) {
bool verificar = true;
int digito = 0;
while (digito >= 0 && num > 0)
{
digito = num % 10;
if (digito >= base)
{
verificar = false;
break;
}
num = num / 10;
}
return verificar;
}
string invertir(string num) {
string aux_cadena = "";
for (int i = num.size(); i >= 0; i--)
aux_cadena += num[i];
return aux_cadena;
}
long BaseNa10(long num, int base1) {
int exp = 0, digito;
long decimal = 0;
while (num / 10 != 0)
{
digito = num % 10;
decimal = decimal + (digito * (pow(base1, exp)));
exp++;
num = num / 10;
}
decimal = decimal + (num * (pow(base1, exp)));
return decimal;
}
string Base10aN(long num, int base) {
string conversion = "";
string num_invertido = "";
int residuo = 0;
do {
residuo = num % base;
if (residuo > 9)
{
for (int i = 10, letra = 65; i <= 20 && letra <= 75; i++, letra++)
{
if (residuo == i)
{
num_invertido = char(letra);
break;
}
}
num /= base;
conversion = conversion + (num_invertido);
}
else
{
num_invertido = to_string(residuo);
num /= base;
conversion = conversion + invertir(num_invertido);
}
} while (num != 0);
return invertir(conversion);
}
void BaseNaN(long num, int base1, int base2) {
long num1 = BaseNa10(num, base1);
cout << Base10aN(num1, base2);
}
int main() {
long num;
int base1, base2;
do
{
cout << "Ingrese base: ";
cin >> base1;
} while (base1 < 2 || base1 > 20);
do
{
cout << "Ingrese numero en base " << base1 << ": ";
cin >> num;
} while (num < 1 || !(DigitoMenorABase(num, base1)));
do
{
cout << "Ingrese base a la que quiere convertir: ";
cin >> base2;
} while (base2 < 1 || base2 > 20);
cout << endl << "El numero en base " << base2 << ": ";
BaseNaN(num, base1, base2);
_getch();
return 0;
}
//Esta es mi solucion en c++ espero que sirva de algo
me gustaria el saber como el programa es capaz de reconcer la letras y de saber el numero a que corresponden para hacer las conversiones
ResponderEliminarComo se haría :convertir de base 10 a base n en HTML disculpen ?
ResponderEliminarEres la verga bro, el programa funciona al 100
ResponderEliminar