Hola gente, estoy trabajando en un proyecto al cual lo he llamado BaseABase, tiene que pasar bases a cualquier base o sistema, les dejo un adelanto, y me gustaría si alguien pudiera decirme que cambiaria con el tema de el .h y el otro .cpp osea, de la separacion de la interfaz de la implementacion, o si acaso voy bien por el momento.
Les dejo el código, Espero respuestas Saludos! :D
PD: por ahora solo maneja de binario a decimal, de binario a BCO y de decimal a binario
main.cpp
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <cmath>
using std::pow;
#include "BaseABase.h"
int main()
{
//CREACION DEL OBJETO APLICACION
BaseABase aplicacion;
//MENU
int opcion=0;
int numero;
int base;
cout <<"Menu: Que tipo de numero desea convertir?\a" <<endl <<endl
<<"1 - Binario" <<endl
<<"2 - Decimal" <<endl
<<endl <<endl <<"salir: -1" <<endl <<"opcion: ";
cin >> opcion;
while (opcion != -1)
{
switch (opcion)
{
////BINARIO
case 1:
system("cls");
cout <<"\aSeleccione la base: \n\n"
<<"1 - Decimal" <<endl
<<"2 - BCO" <<endl
<<endl <<endl <<"Menu Principal: -1 " <<endl <<"opcion: ";
cin >> base;
while ( base != -1)
{
system("cls");
switch (base)
{
case 1:
cout <<"Numero: ";
cin >> numero;
aplicacion.convertirBinarioADecimal(numero);
cout <<"convert: " <<aplicacion.obtenerDecimal() <<endl;
base= -1;
cin.get();
cin.get();
system("cls");
break;
case 2:
system("cls");
cout <<"Numero: ";
cin >> numero;
aplicacion.convertirBinarioABCO(numero);
cout <<"convert: " <<aplicacion.obtenerBCO() <<endl;
base= -1;
cin.get();
cin.get();
system("cls");
break;
}
}
break;
// DECIMAL
case 2:
system("cls");
cout <<"\aSeleccione la base: \n\n"
<<"1 - Binario" <<endl
<<endl <<endl <<"Menu Principal: -1 " <<endl <<"opcion: ";
cin >> base;
while ( base != -1)
{
system("cls");
switch (base)
{
case 1:
cout <<"Numeroa: ";
cin >> numero;
aplicacion.convertirDecimalABinario(numero);
cout <<"convert: " <<aplicacion.obtenerBinario() <<endl;
base= -1;
cin.get();
cin.get();
system("cls");
break;
}
}
break;
}
// RESTAURACION DE VALORES!
aplicacion.restaurarValores();
system("cls");
cout <<"Menu: Que tipo de numero desea convertir?\a" <<endl <<endl
<<"1 - Binario" <<endl
<<"2 - Decimal" <<endl
<<endl <<endl <<"salir: -1" <<endl <<"opcion: ";
cin >> opcion;
}
cin.get();
cin.get();
return 0;
}
BaseABase.h
/*
ATENCION: luego de usar las funciones obtener se debe ejecutar la funcion restaurarValores!
*/
#include <string>
using std::string;
class BaseABase
{
public:
//Constructor
BaseABase();
//funciones convertir
void convertirBinarioADecimal(int);
void convertirDecimalABinario(int);
void convertirBinarioABCO(int);
//funciones obtener
long int obtenerBinario();
long int obtenerDecimal();
string obtenerBCO();
//funciones restaurar
void restaurarValores();
private:
long int binario;
long int decimal;
string BCO;
};
BaseABase.cpp
#include <iostream>
using std::cin;
using std::endl;
using std::cout;
#include <cmath>
using std::pow;
#include "BaseABase.h"
BaseABase::BaseABase()
{
restaurarValores();
}
//Funciones convertir
void BaseABase::convertirBinarioADecimal(int numero)
{
long int auxBinario;
int resto;
binario= numero;
auxBinario= numero;
for (int contador=0; pow(10.,contador) <= binario; contador++)
{
resto= auxBinario % 10;
auxBinario/= 10;
switch (resto)
{
case 0:
decimal+= (resto * pow(2.0,contador));
break;
case 1:
decimal+= (resto * pow(2.0,contador));
break;
}
}
} //FIN FUNCION CONVERTIR BINARIO A DECIMAL
void BaseABase::convertirDecimalABinario(int numero)
{
int restoDivision=0;
int unidadDivision=0;
int iteracionBinaria=0;
unidadDivision= numero;
while (unidadDivision > 0)
{
restoDivision= unidadDivision % 2;
unidadDivision= unidadDivision / 2;
binario+= restoDivision * pow (10.,iteracionBinaria);
++iteracionBinaria;
if (numero == 2)
{
binario+= unidadDivision * pow (10.,iteracionBinaria);
}
}
}
void BaseABase::convertirBinarioABCO(int numero)
{
convertirBinarioADecimal(numero);
int digitos= 1;
int digito;
int auxNumero= decimal;
while ((auxNumero / 10) != 0)
{
auxNumero/= 10;
digitos++;
}
int divisor= pow(10.,digitos-1);
for (int i=1; i <= digitos;i++)
{
digito= decimal / divisor;
decimal%= divisor;
switch (digito)
{
case 0: BCO+= " 000";
break;
case 1: BCO+= " 001";
break;
case 2: BCO+= " 010";
break;
case 3: BCO+= " 011";
break;
case 4: BCO+= " 100";
break;
case 5: BCO+= " 101";
break;
case 6: BCO+= " 110";
break;
case 7: BCO+= " 111";
break;
}
divisor/= 10;
}
}
//funciones obtener
long int BaseABase::obtenerBinario()
{
return binario;
}
long int BaseABase::obtenerDecimal()
{
return decimal;
}
string BaseABase::obtenerBCO()
{
return BCO;
}
//funciones restaurar
void BaseABase::restaurarValores()
{
binario= 0;
decimal= 0;
BCO= " ";
}
En vez de una clase, sería más comodo hacer solo una función:
bool toBase(string in, uint8_t initialBase, string &out, uint8_t finalBase);
Luego basta tirar false si alguna base se sale del rango [2,36]
Cita de: ivancea96 en 22 Mayo 2015, 17:40 PM
En vez de una clase, sería más comodo hacer solo una función:
bool toBase(string in, uint8_t initialBase, string &out, uint8_t finalBase);
Luego basta tirar false si alguna base se sale del rango [2,36]
Hola ivancea96, si bien podria usar una función, no es mejor como lo estoy haciendo? el dia de mañana cuando necesite pasar un binario a por ejemplo octal solamente me fijo el nombre de la funcion miembro inserto el .h y la llamo? aparte de ser mas descriptiva, solo hago uso de las funciones que quiero y no todas juntas, pues asi lo tengo entendido yo, quizas lo haya entendido mal :S
Encontré un pequeño error en la funcion: convertirBinarioABCO(int), que al tratarse de un numero por ejemplo 20, que se transformaba en 02, osea 2, el cero ni aparecia, con lo cual arregle eso y al arreglarlo se eliminó la función long int darVueltaNumero() :D
Tras hacer la función, puedes hacer funciones con el nombre que quieras que hagan de 'puente'. En esas funciones, llamarías a cualquier combinación de bases que quisieras.
Así, tienes lo mismo, y un extra de funcionalidad gracias a la función base.
Cita de: Mario Olivera en 22 Mayo 2015, 21:01 PMel dia de mañana cuando necesite pasar un binario a por ejemplo octal solamente me fijo el nombre de la funcion y la llamo
El día de mañana, cuando quieras pasar de una base a otra, piensas "de base 2, a base 8". Y lo escribes xD
Es más, el día de mañana, cuando quieras pasar de cualquier base a cualquier base (pidiendo la base al usuario, por ejemplo), tan solo endrás que pasarle la entrada del usuario a la función, en vez de tener que hacer un arreglo de arreglos de funciones (por ejemplo).