|
|
|
Mensaje: #1
Pequeñas cuentas con C++
Hola chicos
Soy algo nuevo con C++, la pregunta es simple, imaginad que yo introduzco "3*4+5+7", como logro conseguir el resultado final?
No puedo ir pidiendo numero a numero pues se pretende que estas sencillas operaciones se puedan hacer sobre n numeros y mi problema es que no sé como diferenciar el numero del operador ( se nota que estoy algo verde eh? )
Digamos que tenemos algo así
char operacion;
const char operadores[] = "+-*/";
......
.....
cout << " Introduzca la operacion" ;
cin >> operacion;
// Realicemos el calculo de la operación
--> Ahora tocaría leer lo que se ha introducido por teclado y lograr separar los dígitos, el primero del segundo y realizar la operación, posteriormente el resultado de esta operación con el del tercero y así sucesivamente hasta llegar al final.
A ver si se les ocurre algo
Un saludo y gracias de antemano.
(Este mensaje fue modificado por última vez en: 22-11-2011 07:31 AM por NuX.)
|
|
| 22-11-2011 07:29 AM |
|
|
|
Mensaje: #2
RE: Pequeñas cuentas con C++
Lo que se me ocurrió a mi con lo poco que llevo con c++ es hacer en un while un recorrido por lo que te introduce con cin.get() y luego comparar lo que recoge en un switch con los operandos y si no es ninguno, que lo añada a una variable auxiliar que será sobre la que operará.
Explico con el conjunto que diste.
Imaginemos que introduces: 3*5+5+7
con cin.get() cogemos el primer carácter: 3
como no es un operando lo metemos en una variable total. primero=3.
Cogemos el segundo caracter: *
como es un operando pues lo guardamos en otra variable: operación='*'
cogemos el tercero: 5
como no es operando y la operación tiene contenido, no es igual a ''; pues hacemos con un switch lo que tenga que hacer: primero = 3*5 = 15
cogemos el tercer carácter, +, operación = '+'
cogemos el cuarto: 5
Hacemos la operación: primero = 15+5=20.
Así sucesivamente. Es lo que se me ocurrió y no lo he probado, pero con un switch y un bucle while se podría realizar bastante bien creo yo.
PD: Aún no sé trabajar con arrays, por eso no los digo en mi idea.
![[Imagen: moderadorglobal.png]](http://img832.imageshack.us/img832/3400/moderadorglobal.png)
|
|
| 22-11-2011 08:58 AM |
|
|
|
Mensaje: #3
RE: Pequeñas cuentas con C++
a ver... primero que todo.. char operacion; deberia ser una cadena es decir usemos
char operacion[nmax];
donde nmax sera la cantidad de caracteres permitidos.. ej
16/2*5-47 <-- 9 caracteres...
tambien debemos tener en cuenta la prioridad de operadores..
creamos un bucle y recorremos en busqueda de caracteres
while(operacion[i]!='\0'){
if(operacion[i] = '*') //o cualquier caracter que se quiera buscar
{
........................esto lo dejo a tu imaginacion
}
i++;
}
espero te sea util... un saludo ^^ :D
Cualquier código de tu autoría que no hayas revisado en meses, bien podría haberlo escrito cualquier otra persona, porque al volverlo a revisar no te enterarás de nada.
|
|
| 28-11-2011 07:04 AM |
|
|
|
Mensaje: #4
RE: Pequeñas cuentas con C++
Perdon por la ausencia, ya logré lo que deseaba, tengo la versión 1.0, a partir de ahora trataré de ir añadiendo mas funciones.
Lenguaje C++
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// Declaramos las variables.
char c;
double operando1, operando2, operando3, resultado;
bool error = false, exit = false ;
// Inicio del programa
cout << endl;
cout << "Calculadora v1.0 "<< endl;
cout << "Hecho por NuX"<< endl;
cout << "Informacion: Esta calculadora solo cuenta con los operadores '+' '-' '*' y '/'." << endl;
cout << ">";
// Calculo de la operacion
while (exit==0)
{
cin >> operando1; // Tomamos el primer operando
if (operando1!=0)
{
cin.get©; // Cogemos el resto de la cadena.
while (c!='\n') // Iniciamos while cuando "c" sea distinto de un retorno de carro.
{
cin >> operando2; // Tomamos el segundo operando
switch ©
{ // Aplicamos los operadores requeridos para la version 1.0
case '+': resultado = operando1+operando2; break;
case '-': resultado = operando1-operando2; break;
case '*': resultado = operando1*operando2; break;
case '/': resultado = operando1/operando2; break;
default:error=true;break;
}
if (error==false) // En caso de no encontrar ninguna de las funciones el propio operando sera el resultado
{
operando1 = resultado;
cin.get©;
}
}
switch (error)
{
case 0: cout << resultado << endl << endl; break;
case 1:
{ cout<<"Error."<<endl<<endl;
error = false;} ; break;
}
}
else // En caso de que operando1 sea = a 0, el programa terminará. (observamos que en caso de ser una letra el resultado es el mismo)
exit = !exit;
}
return 0;
}
Sería genial que me ayudasen a optimizar el código, lo he comentado para aquellos que se pierdan un poco.
Iré comentando las mejoras que logre, un saludo.
Al revisar el source he visto que aparece "cin.get©;" esto es un error de la página al colorear el source, la verdadera sintaxis es cin.get( c );
Un saludo.
(Este mensaje fue modificado por última vez en: 29-11-2011 08:03 AM por NuX.)
|
|
| 29-11-2011 07:34 AM |
|
|
|
Mensaje: #5
RE: Pequeñas cuentas con C++
Tengo una nueva versión con operadores para realizar la raiz cuadrada, la potencia y el factorial de un numero.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// Declaramos las variables.
char c;
double operando1, operando2, resultado, aux=1;
bool error = false, exit = false ;
int i;
// Inicio del programa
cout << endl;
cout << "Calculadora v2.0 "<< endl;
cout << "Hecho por NuX"<< endl;
cout << "Informacion: Esta calculadora cuenta con los operadores '+', '-', '*', '/', 'r' para raices cuadradas, '^' para potencias y '!' para calcular el factorial." << endl << endl;
// Calculo de la operacion
while (exit==0)
{
cout << ">";
cin >> operando1; // Tomamos el primer operando
if (operando1!=0)
{
cin.get©; // Cogemos el resto de la cadena.
while (c!='\n' && !error) // Iniciamos while cuando "c" sea distinto de un retorno de carro.
{
// Tomamos el segundo operando
switch ©
{ // Aplicamos los operadores requeridos para la version 1.0
case '+': cin >> operando2; resultado = operando1+operando2; break;
case '-': cin >> operando2; resultado = operando1-operando2; break;
case '*': cin >> operando2; resultado = operando1*operando2; break;
case '/': cin >> operando2; resultado = operando1/operando2; break;
// Aplicamos los operadores requeridos para la version 2.0
case 'r':
if (operando1>= 0)
{resultado = sqrt(operando1);}
else
{
resultado = 0;
cout << "No se puede realizar la raiz cuadrada de un numero negativo" << endl;}
break;
case '^':
cin >> operando2;
if (operando2 == floor(operando2))
{
if (operando2 > 0) // exponente positivo
{
for(i= 1; i<= operando2; i++)
{
aux = aux*operando1;
resultado = aux;
}
}
else if (operando2 == 0) // Para exponente = 0
{
resultado = 1;
}
else
{
for(i= 0; i> operando2; i--) // exponente negativo.
{
aux = aux*operando1;
resultado = 1/aux;
}
}
aux = 1;
}
else
{
cout << "error..no es entero.";
}
break;
case '!': // Factorial
if(operando1 >= 0 && operando1 == floor(operando1)) // Requerimos un entero no negativo
{
for( i=operando1; i>=1; i--) // Fuuncion recursiva del factorial
{
aux = aux*(i);
resultado = aux;
}
aux= 1;
}
else // En caso de que el numero no sea entero positivo.
{
cout << "Debe introducir un entero no negativo para que se realice el factorial de dicho numero" << endl;
resultado = 0;
}
break;
default:error=true;break;
}
if (error==false) // En caso de no encontrar ninguna de las funciones el propio operando sera el resultado
{
operando1 = resultado;
cin.get©;
}
}
switch (error)
{
case 0:
cout << "= " << resultado << endl << endl; break;
case 1:
cout<<"Error."<<endl<<endl;
error = false;
break;
}
}
else // En caso de que operando1 sea = a 0, el programa terminará. (observamos que en caso de ser una letra el resultado es el mismo)
exit = !exit;
}
return 0;
}
Un saludo.
ATENCION: Cuando veáis el símbolo --> © interpretarlo como ( c ) (SIN ESPACIOS) no sé porqué se produce este error
(Este mensaje fue modificado por última vez en: 30-11-2011 06:00 AM por NuX.)
|
|
| 30-11-2011 05:59 AM |
|
Usuario(s) navegando en este tema: 1 invitado(s)
|