Anuncios

Bienvenidos sean a mi post, hoy vamos a ver una actualizacion de mi primer programa, estuve pensando en otras alternativas de donde poder aplicar especialmente todo lo aprendido en los ultimos posts.

Anuncios

En este caso aplique herencia, datos abstractos y apuntadores. Estuve tratando de ver varias alternativas para mi segundo programa, desde un programa de calculo de area de distintas figuras (en realidad lo hice pero no me gusto el funcionamiento en si por algunos calculos complejos que agregue de forma innecesaria) hasta pense en algun pequeño “juego” de texto tipo rol con batallas y otras cosas pero no me parecio una buena idea (por ahora), por lo tanto opte por actualizar mi programa conversor de cm a in y viceversa, me di cuenta al hacerlo en mi cabeza el hecho de poder incluir los metodos de herencia y sea util para un futuro uso, pasemos a ver el codigo fuente y luego su explicacion:

conversor2.cpp

# include <iostream>

using namespace std;

class Unidades
{
public:
 	Unidades(){}
 	virtual ~Unidades(){}
 	virtual float ObtenerResultado() const = 0;
 	virtual float Convertir(float,float,string){ return 0; }
};

class Longitud : public Unidades
{
public:
 	Longitud(){}
 	virtual ~Longitud(){}
 	virtual float ObtenerResultado() const {
 			return suResultado; }
 	virtual float Convertir(float valor, float cambio, string unidad)
	{
 	if (unidad == "cm" || unidad == "km" || unidad == "l" || unidad == "kg")
 		suResultado = valor / cambio;
 	else
 		suResultado = valor * cambio;
	return suResultado;
	}
protected:
 	float suResultado;
};

class Volumen : public Longitud
{
public:
 	Volumen(){}
 	virtual ~Volumen(){}
 	virtual float ObtenerResultado() const {
 			return suResultado; }
};

class Masa : public Longitud
{
public:
 	Masa(){}
 	virtual ~Masa(){}
 	virtual float ObtenerResultado() const {
 			return suResultado; }
};

int main()
{
 	string unidad,etiqueta,salir;
 	float cambio,valor;
 	Unidades *apConv = NULL;
 	while(salir != "n")
 	{
 		cout << "Ingresa el valor a convertir: ";
 		cin >> valor;
 		cout << "Ingresa la unidad (cm/km/l/kg/in/ml/gl/pt/lb): ";
 		cin >> unidad;
 		if (unidad == "cm")
 		{
 			apConv = new Longitud;
 			cambio = 2.54;
 			etiqueta = " pulgadas(in).";
 		}
 		if (unidad == "km")
 		{
 			apConv = new Longitud;
 			cambio = 1.61;
 			etiqueta = " millas(ml).";
 		}
 		if (unidad == "l")
 		{
 			apConv = new Volumen();
 			cambio = 4.55;
 			etiqueta = " galones(gl).";
 		}
 		if (unidad == "kg")
 		{
 			apConv = new Masa();
 			cambio = 0.45;
 			etiqueta = " libras(lb).";
 		}
 		if (unidad == "in")
 		{
 			apConv = new Longitud;
 			cambio = 2.54;
 			etiqueta = " centimetros(cm).";
 		}
 		if (unidad == "ml")
 		{
 			apConv = new Longitud;
 			cambio = 1.61;
 			etiqueta = " kilometros(km).";
 		}
 		if (unidad == "gl")
 		{
 			apConv = new Volumen();
 			cambio = 4.55;
 			etiqueta = " litros(l)";
 		}
 		if (unidad == "pt")
 		{
 			apConv = new Volumen();
 			cambio = 0.57;
 			etiqueta = " litros(l)";
 		}
 		if (unidad == "lb")
 		{
 			apConv = new Masa();
 			cambio = 0.45;
 			etiqueta = " kilogramos(kg).";
 		}
		apConv->Convertir(valor, cambio, unidad);
 		
		cout << "El resultado es " << apConv->ObtenerResultado() << etiqueta << endl;
 		cout << "Deseas realizar otra conversion (s/n): ";
 		cin >> salir;
 	}
 	cout << "Hasta la proxima!" << endl;
 	return 0;
}
Anuncios

En esta ocasion, le agregue al programa la posibilidad de no solo convertir centimetros (cm) a pulgadas (in) y viceversa, sino tambien de millas (ml) a kilometros (km), tambien al reves, de litros (l) a galones (gl) en medida de liquido/seco ingles (no norteramericano), tambien al reves, de pinta (pt) a litros (l), la agregue como curiosidad porque no sabia la existencia como medida de volumen y no es reversible, y por ultimo de kilogramos (kg) a libra (lb), tambien al reves.

Anuncios

Para el programa cree primero una clase ADT llamada Unidades, la cual va a declarar los metodos a utilizar en el resto de las clases herederas, las funciones a derivar van a ser ObtenerResultado, como virtual pura, y Convertir la cual va a ser encargada de la magia, en esta vamos a tener tres variables dos de tipo float y una string. Luego vamos a declarar una clase llamada Longitud, esta va a ser heredera de Unidades, en la cual vamos a redefinir los metodos heredados de la clase ADT, tambien vamos a crear una variable protected, para ser utilizada entre todas las clases, la cual va a ser la receptora de la conversion llamada suResultado, al redefinir ObtenerResultado vamos a hacer el retorno del contenido en la misma. Por otro lado, vamos a transformar el valor recibido en el metodo Convertir, en ella vamos a tener tres variables, la primera es el valor a convertir, la segunda va a ser el indice modificador y por ultimo el tipo de unidad del valor para convertir.

Anuncios

En este metodo, tendremos un if donde verificara primero si las unidades son del tipo metricas estandar (kilometros, centimetros, litros y kilogramos) efectuara la siguiente formula: suResultado = valor * cambio; y en cambio si la unidad no estuviera dentro de los informados anteriormente ejecutara la siguiente formula, suResultado = valor / cambio; para poder hacer la conversion. Esta clase originalmente iba a solo calcular las unidades de longitud (cm, km, in y ml) pero despues pense que debia redefinir cada metodo en las distintas clases lo cual me parecio una tarea demasiada redundancia para la misma formula en todas las clases, entonces opte para el resto de las clases (Volumen y Masa) sean herederas de Longitud y utilicen el mismo metodo de Convertir pero si le agregue el de ObtenerResultado por ser un metodo virtual puro, se debe redefinir en cada una de las clases herederas.

Anuncios

Ahora pasemos al cuerpo del main, aqui tenemos las variables a utilizar, tambien un apuntador del objeto Unidades, despues vamos a crear un While, el cual siempre va a estar en bucle mientras salir sea distinto de n, despues le pedimos al usuario que ingrese el valor a convertir, luego ingresara el tipo de unidad (cm/km/l/kg/in/ml/gl/pt/lb), una vez ingresado pasaremos a unos ciclos de if donde en base a la unidad ingresada podemos crear en el apuntador un objeto nuevo de Longitud, Volumen y Masa. Despues definiremos en etiqueta un texto para finalizar la salida y tambien definiremos cambio el cual va a ser el indice para convertir la informacion cargada en valor, esto lo enviamos a Convertir, y como explicamos anteriormente en base a unidad utilizara una formula u otra, una vez convertido el valor y almacenado en suResultado, en la siguiente escribiremos el resultado a traves del metodo ObtenerResultado para luego hacer la pregunta si deseamos hacer otra conversion o no, en caso de ser afirmativo volvera al principio del ciclo, de caso contrario procedera a salir, les dejo un video de la salida del programa

Anuncios

Este programa fue un poco para probar lo aprendido hasta ahora, ver si podia utilizarlo en alguna herramienta practica y util, por eso como dije al principio no tenia bien en claro el programa a crear pero despues de realizado me dejo contento porque todo esto no fue en vano y de a poco podremos hacer alguna aplicacion mas interesante y esto les muestra la posibilidad a ustedes para empezar a crear sus propios programas, simplemente fijense en lo necesario para ustedes, espero les haya sido de gran utilidad y puedan empezar a usar su imaginacion, yo por mi parte seguire subiendo lecciones de C++ y otros lenguajes y a medida que genere programas en base a lo estudiado seguire subiendo a este blog, sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00