miércoles, 21 de septiembre de 2011

Base N a decimal



Convertir.h

#pragma once

ref class Convertir
{
private:
int buscar(wchar_t);
System::String^ invertirCadena(System::String^);
public:
bool analizarNumero(System::String^,int);
int baseDecimal(System::String^,int);
};


Convertir.cpp


#include "StdAfx.h"
#include "Convertir.h"
#include "Math.h"

wchar_t digitos[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

bool Convertir::analizarNumero(System::String^ number,int base) //bool retorna solo true (verdadero) y false (falso)
{
for(int i=0;i<number->Length;i++)
if(buscar(number[i])>=base || buscar(number[i])<0)//No es valido si un digito es mayor o igual a la base o si un digito esta fuera de rango
return false;
return true;
}

//Busca los digitos (que pueden ser letras) y devuelve su valor en int
int Convertir::buscar(wchar_t digito)
{
for(int i=0;i<16;i++)
if(digito==digitos[i])
return i;
return -1;//Si no esta, retorna -1
}

/*Por qué invertirmos la cadena, esto es, el número?
Porque asi las unidades quedaran primero, luego las decenas, etc etc.*/
System::String^ Convertir::invertirCadena(System::String^ cadena)
{
int index = cadena->Length-1;
System::String^ cadenaI;

for(int i=0;i<cadena->Length;i++)
{
cadenaI+=cadena[index];
index--;
}

return cadenaI;
}

int Convertir::baseDecimal(System::String^ number,int base)
{
int newNumber = 0;

System::String^ numberI = invertirCadena(number);//El numero invertido

for(int i=0;i<number->Length;i++)
newNumber+=buscar(numberI[i])*pow(base,double(i));
/*Tenemos 123 en base 4
Invertimos: 321
En base 10 sería:
3*4^0 + 2*4^1 + 1*4^2 = 3+8+16 =27
Que seria
digito*base^i
Invertimos para las unidades coincidan con el primer caracter
y asi poder usar el indice i*/

return newNumber;
}

Descargar toda la solución de Clases en C++ para abrir con Visual Studio 2010

No hay comentarios:

Publicar un comentario