Pages

lunes, 28 de enero de 2013

Conversión Numeros de Base M a Base N - Codigo Fuente en C

Problema
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");
}

12 comentarios:

  1. Gracias, está genial tu código y trabaja perfecto. Saludos :)

    ResponderEliminar
  2. y para net beans java como seria

    ResponderEliminar
  3. Gracias me sirbio de mucho

    ResponderEliminar
  4. Muchas gracias ,me sirvió mucho :)

    ResponderEliminar
  5. como el programmo lea las letras del hexadecimal por favor ? lo siento para mi espanol escrito, es terible

    ResponderEliminar
  6. como el programmo lea las letras del hexadecimal por favor ? lo siento para mi espanol escrito, es terible

    ResponderEliminar
  7. #include "iostream"
    #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

    ResponderEliminar
  8. 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

    ResponderEliminar
  9. Como se haría :convertir de base 10 a base n en HTML disculpen ?

    ResponderEliminar
  10. Eres la verga bro, el programa funciona al 100

    ResponderEliminar