Hola
En relación a mi post
anterior os traigo la versión "final" de la calculadora, tal vez algún dia la retome y la mejore pero por el momento se queda así :)
Código:
/*
Calculadora realizada por NuX
*/
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
// Declaramos las variables
double op1 = 0, op2, resultado=0, aux=1;
bool error = false, exit = false, repetir = false, cerror = true;;
char operador;
int i,menu;
char suma='+',resta='-',multiplicacion='*',division='/',raiz='r',exponencial='^',factorial='!',cancelar = 'x', limpiar = 'c', conf;
// INICIAMOS EL PROGRAMA
do
{
cout << "Calculadora v3.0."<< endl<< endl;
cout << "Menu:"<< endl;
cout << "1.Calculadora"<< endl;
cout << "2.Configurar"<< endl;
cout << "3.Salir"<< endl<< endl;
cout << ">>";
cin >> menu;
if (menu <=0)
{
cout << "Introduzca una de las opciones del menu" << endl<< endl;
repetir = true;
}
else if (menu >3)
{
cout << "Introduzca una de las opciones del menu" << endl<< endl;
repetir = true;
}
else if (menu >= 1 && menu <=3)
{
switch(menu)
{
case 1: // Calculadora
exit = false;
cout << endl << "Calculadora: " << endl;
while (!exit)
{
cout << ">";
operador = cin.peek();
if (isdigit(operador))
{
cin >> op1;
}
cin.get(operador); // Obtenemos el operador
while (operador!='\n' && !error) //Mientras sea distinto de un retorno de carro....
{
if (operador == suma)
{
cin >> op2;
resultado = op1+op2;
}
else if (operador == resta)
{
cin >> op2;
resultado = op1-op2;
}
else if (operador == multiplicacion)
{ cin >> op2;
resultado = op1*op2;
}
else if (operador == division)
{ cin >> op2;
resultado = op1/op2;
}
else if (operador == raiz)
{
if (op1>= 0)
{
resultado = sqrt(op1);
}
else
{
cout << "!Error: Debe introducir un numero positivo." << endl;
resultado = 0; // Devolvemos 0 a resultado.
}
}
else if (operador == exponencial)
{
cin >> op2;
if (op2 == floor(op2))
{
if (op2 > 0) // Exponente positivo
{
for(i= 1; i<= op2; i++)
{
// Aux = 1 para que aux*operando1 sea igual que operando1¹
// i incrementa hasta operaando2 consiguiendo que aux vaya siendo un multiplo mayor en cada ronda.
aux = aux*op1;
resultado = aux;
}
}
else if (op2 == 0) // Exponente = 0
{
resultado = 1;
}
else
{
for(i= 0; i> op2; i--) // Exponente negativo
{
aux = aux*op1;
resultado = 1/aux;
}
}
aux = 1; // Devolvemos el valor de la auxiliar a 1, para ser usada en otras operaciones...
}
else
{
cout << "!Error: El exponente introducido no es numero entero.";
}
}
else if (operador == factorial)
{
if(op1 >= 0 && op1 == floor(op1)) // Requerimos un entero no negativo
{
for( i=op1; i>=1; i--) //
{
aux = aux*(i);
resultado = aux;
}
aux= 1;
}
else // En caso de que el numero no sea entero positivo.
{
cout << "Introduzca un entero positivo para calcular el factorial." << endl;
resultado = 0;
}
}
else if (operador == cancelar)
{
repetir = true;
resultado = 0;
exit = true;
}
else if (operador == limpiar)
{
resultado = 0;
}
else
{ // No nos dan un valor que esperamos para el operador...
cout << "La operacion requerida no se encuentra registrada." << endl;
error=true; // Vamos al case true para salir del ciclo
resultado = 0;
}
if (error==false)
{
op1 = resultado; // Si no hay error el valor se le asigna a operando1
cin.get(operador); // Obtenemos el valor del operador
}
}
switch (error)
{
case true:
cout<<"Error." << endl;
error = false;
break;
default:
cout << "= " <<op1 << endl << endl;
break;
}
}
break;// FIN CALCULADORA
case 2:
// INICIO CONFIGURACION
cout << endl << endl;
cout << "Ha escogido la opcion de configuracion, introduzca el caracter deseado para cada operacion"<< endl<< endl;
cout << "Caracter actual de suma: " << suma << endl;
cout << "Caracter actual de resta: " << resta << endl;
cout << "Caracter actual de multiplicacion: " << multiplicacion << endl;
cout << "Caracter actual de division: " << division << endl;
cout << "Caracter actual de raiz: " << raiz << endl;
cout << "Caracter actual de potencia: " << exponencial << endl;
cout << "Caracter actual de factorial: " << factorial << endl;
cout << "Caracter para cerrar el programa: " << cancelar << endl;
cout << "Caracter actual para cancelar: " << limpiar << endl << endl;
cout << "Caracter deseado para la suma: ";
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != resta && conf != multiplicacion && conf != division && conf != factorial && conf != exponencial && conf != raiz && conf != limpiar && conf != cancelar)
{
suma = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para la suma: ";
cin >> conf;
}
}
cout << "Caracter deseado para la resta: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != multiplicacion && conf != division && conf != factorial && conf != exponencial && conf != raiz && conf != limpiar && conf != cancelar)
{
resta = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para la resta: ";
cin >> conf;
}
}
cout << "Caracter deseado para la multiplicacion: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != division && conf != factorial && conf != exponencial && conf != raiz && conf != limpiar && conf != cancelar)
{
multiplicacion = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para la multiplicacion: ";
cin >> conf;
}
}
cout << "Caracter deseado para la division: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != multiplicacion && conf != factorial && conf != exponencial && conf != raiz && conf != limpiar && conf != cancelar)
{
division = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para la division: ";
cin >> conf;
}
}
cout << "Caracter deseado para la raiz: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != division && conf != factorial && conf != exponencial && conf != multiplicacion && conf != limpiar && conf != cancelar)
{
raiz = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para la raiz: ";
cin >> conf;
}
}
cout << "Caracter deseado para la potencia: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != division && conf != factorial && conf != raiz && conf != multiplicacion && conf != limpiar && conf != cancelar)
{
exponencial = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para la potencia: ";
cin >> conf;
}
}
cout << "Caracter deseado para el factorial: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != division && conf != exponencial && conf != raiz && conf != multiplicacion && conf != limpiar && conf != cancelar)
{
factorial = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para el factorial: ";
cin >> conf;
}
}
cout << "Caracter deseado para cerrar el programa: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != division && conf != exponencial && conf != raiz && conf != multiplicacion && conf != limpiar && conf != factorial)
{
cancelar = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para cerrar el programa: ";
cin >> conf;
}
}
cout << "Caracter deseado para limpiar: ";
cerror = true;
cin >> conf;
if (conf != '\n')
{
while (cerror)
if (conf != suma && conf != resta && conf != division && conf != exponencial && conf != raiz && conf != multiplicacion && conf != cancelar && conf != factorial)
{
limpiar = conf;
cerror= false;
}
else
{
cout << "El caracter especificado se usa para otra operacion. Introduzca un caracter valido." << endl<< endl;
cout << "Caracter deseado para limpiar: ";
cin >> conf;
}
}
cout << endl;
cout << endl << "Ha terminado la configuracion" << endl;
repetir = true;
break; // FIN CONFIGURACION
case 3: // salir.
cout << "Ha seleccionado la opcion 3, salir del programa" << endl<< endl;
repetir = false; // Para salir del do while
break; // FIN SALIR DEL PROGRAMA
} // FINALIZAN LAS OPCIONES DEL MENU
} // Fin else de la opcion del menu
}
while (repetir==true);
return 0;
}
Características:
- Opera con todos los números menos con los imaginarios.
- Realiza las operaciones leyendo operando,operador y operando sistemáticamente sin tener en cuenta las preferencias de los operadores.
- No tiene paréntesis.
- Menú de configuración para modificar los caracteres con los que hacer las operaciones.
- Realiza suma, resta, multiplicación, división, factorial, raiz y potencias.
- Devuelve mensajes de error en caso de haber introducido caracteres no válidos.
Nota: Para salir de la calculadora (opcion 1) escribid "x" y para poner el resultado a 0 escribid "c". Estas dos letras son configurables..
Un saludo.