Mi proyecto: BaseABase

Iniciado por Mario Olivera, 22 Mayo 2015, 07:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Mario Olivera

 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
Código (cpp) [Seleccionar]
#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
Código (cpp) [Seleccionar]
/*

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
Código (cpp) [Seleccionar]
#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= " ";
}


ivancea96

En vez de una clase, sería más comodo hacer solo una función:
Código (cpp) [Seleccionar]
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]

Mario Olivera

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:
Código (cpp) [Seleccionar]
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

ivancea96

#3
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).