Autor Tema: Por que se evalúa mal un expresión definida por teclado con cin?  (Leído 2914 veces)

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

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Por que se evalúa mal un expresión definida por teclado con cin?
« en: 14 de Octubre de 2013, 15:53:35 »
EL siguiente código trabaja bien si una función en x la incorporo dentro del código, pero si es requerida por teclado se evalúa a 0,

/!\ previamente se definió un valor de x,  por que no toma ese valor el compilador?

Muchas gracias

ejemplos

x-pow(2,-x)
x-3*x*x


Código: C++
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <cstring>
  8. #include <list>
  9. #include <vector>
  10. #include <queue>
  11. #include <algorithm>
  12. using namespace std;
  13.  
  14. int main(int argc, char *argv[]) {
  15.         int imax;
  16.         double  k,t,x,fx,e,y;
  17.         cout<<"Ingrese el valor de la constante k=";
  18.         cin>>k;
  19.         cout<<"\nk="<<k; // muestre el valor de k
  20.  
  21.         cout<<"\n\nIngrese el valor de la tolerancia t=";
  22.         cin>>t;
  23.         cout<<"\nt="<<t; // muestre el valor de t
  24.  
  25.         cout<<"\n\nIngrese el valor de Xo=";
  26.         cin>>x;
  27.         cout<<"\nx="<<x; // muestre el valor de x
  28.  
  29.  
  30.  
  31.         //fx = (x-3.0*x*x); // f= x-3*x^2
  32.         //fx=x-pow(2,-x);
  33.         cout<<"\n\nIngrese f(x)=";
  34.         cin>>fx;
  35.  
  36.         cout<<"\n\nfx="<< fx <<endl; // muestre la funcion
  37.         system("PAUSE");
  38.         cout<<"\n\nIngrese el numero de interaciones maximas iMax=";
  39.         cin>>imax;     
  40.        
  41.        
  42.        
  43.         cout<<"\nprocesando"<< endl;
  44.        
  45.        
  46.         for( int i = 0; i <= imax; i++){
  47.                 cout<<"\n\nIteracion #" << i <<"\n";
  48.                 system("PAUSE");
  49.                 y = x - ( fx / k );  // y = Xo-(funcion evaluada en Xo/CONSTANTE);
  50.                 cout<<"\ny="<<y;
  51.                 e = (y - x) / y;   // ERROR RELATIVO = (nuevo valor de Xo-valor inicial de Xo)/ nuevo valor de Xo;
  52.                 cout<<"\ne="<<e;
  53.                 if( e < t ){
  54.                         i = imax + 1; // sale del ciclo for por que se excede en 1 imax
  55.                         cout<<"\nEl error es menor que la tolerancia :" << "\n";
  56.                         cout<<"\nEl valor de convergencia es de :" << y <<"\n";
  57.                         cout<<"\nEl valor aproximado es de :"<< x <<"\n"; ;
  58.                         cout<<"\nCon una tolerancia de :"<< t << "\n";;
  59.                 }
  60.                 else{
  61.                         x=y; // SI EL ERROR RELATIVO NO ES IGUAL O MENOR  A LA TOLERANCIA , EL NUEVO x SERA EL NUEVO VALOR de y
  62.                 }
  63.         }
  64.         return 0;
  65. }
  66. // datos de prueba k=1.49, tolerancia 0.2, x inicial 0.5
  67. // fx = (x-3.0*x*x); // f= x-3*x^2
  68. // fx = x-pow(2,-x);
« Última modificación: 20 de Octubre de 2013, 17:58:18 por CompSystems »
Desde Colombia

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Por que al entrar expresiones matemáticas desde teclado se evalúa a 0?
« Respuesta #1 en: 19 de Octubre de 2013, 14:15:49 »
Hola, da más pistas de dónde falla y qué te arroja la consola  ;-)

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: Por que se evalúa mal un expresión definida por teclado con cin?
« Respuesta #2 en: 19 de Octubre de 2013, 16:41:52 »
Si asigno por ejemplo  al identificador fx la siguiente sentencia el programa retorna lo previsto

fx = (x-3.0*x*x); // f= x-3*x^2
   
//fx=x-pow(2,-x); // otro entrada preasignando dentro del codigo


Pero si se pide entrar por consola fx, y si el usuario escribe por ejemplo : x-3.0*x*x, fx toma el valor de cero, pero x se definió con un valor previo y no debe dar cero
   
cout<<"\n\nIngrese f(x)="; cin>>fx;

« Última modificación: 20 de Octubre de 2013, 17:58:35 por CompSystems »
Desde Colombia

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Por que al entrar expresiones matemáticas desde teclado se evalúa a 0?
« Respuesta #3 en: 20 de Octubre de 2013, 11:17:23 »
Si asigno por ejemplo  al identificador fx la siguiente sentencia el programa retorna lo previsto

fx = (x-3.0*x*x); // f= x-3*x^2
   
//fx=x-pow(2,-x); // otro entrada preasignando dentro del codigo


Pero si se pide entrar por consola fx, y si el usuario escribe por ejemplo : x-3.0*x*x, fx toma el valor de cero, pero x se definió con un valor previo y no debe dar cero
   
cout<<"\n\nIngrese f(x)="; cin>>fx;



Hola.
Me parece que te devuelve cero porque no puede interpretar lo que le estas asignando.
Fx la definis como double y luego le queres "meter" toda una funcion en ella. Es como querer meter toda una zapateria dentro de una caja de zapatos. Ademas, ¿quien interpreta la funcion?. Cuando es parte del programa (source) es interpretada por el compilador. Te recomiendo que busques un buen libro de C porque no estas entendiendo los conceptos basicos. No te ofendas, pero me parece que tenes errores o falta de conceptos basicos sobre programacion y no puedo dedicarme a escribir un libro en este post para ayudarte.
Saludos.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: Por que se evalúa mal un expresión definida por teclado con cin?
« Respuesta #4 en: 20 de Octubre de 2013, 13:10:31 »
El problema creo que radica en el manejo de cin,  cin casi nunca lo he utilizado, pues en programacion de micros es ínfimo su uso. Ademas no he programado en C/C++ para sistemas de escritorio y muy poco para consola  :(

« Última modificación: 20 de Octubre de 2013, 18:22:53 por CompSystems »
Desde Colombia

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Por que se evalúa mal un expresión definida por teclado con cout?
« Respuesta #5 en: 20 de Octubre de 2013, 15:23:54 »
Hola CompSystems,

no me ha quedado clara la idea... La idea es que el usuario ingrese mediante el teclado una función (f(x)) y el programa luego la usa internamente para procesar datos?
Si la respuesta es afirmativa, entonces Darkman_A está en lo correcto y estás equivocado en la forma en que funcionan las cosas.Tal vez si estuvieses en un lenguaje scripting, lo que buscas hacer se podría resolver inmediatamente, pero deberías detenerte a pensar en que:

Qué es lo que el usuario ingresa?
   Asumiendo que es la ecuación, el programa aún así lo único que entenderá es que es un String. Los humanos podemos resolverla porque tenemos los conocimientos adquiridos para entender que aún siendo texto, se trata de una ecuación y podemos interpretar las partes, orden de las operaciones, etc  hasta llegar a los resultados posibles. No pasa lo mísmo en el algortimo. No confundamos un ingreso de ecuación desde el código fuente con uno por consola durante la ejecución del programa! El primero sucede en tiempo de compilación, y el segundo durante tiempo de ejecución. Esto significa que si ponemos una ecuación en el código, como los ejemplos que has puesto:

fx = (x-3.0*x*x);

quien se encarga de desglosar e interpretar dicha ecuación es el COMPILADOR, quien convierte ese texto (string) en operaciones que el procesador pueda entender y finalmente obtiene el resultado. Pero cuando le pides al usuario que las ingrese por teclado en tiempo de ejecución, el COMPILADOR no existe, no ocurre un compilado del texto ingresado por el usuario. Lo único que existe y ve el programa es un string ingresado por el usuario. No tiene la menor idea de lo que es, más que un mero string.

En el proyecto que hice: Calculadora científica y graficadora 2D/3D con PIC tuve que implementar todo el código para un PARSEADOR, que es lo que vas a necesitar para poder convertir la ecuación ingresada (notación infija) a otro formato llamado notación posfija, que resulta mucho más sencilla de procesar para un computador, mediante lo que se llama luego EVALUADOR, que es quien ejecuta las operaciones matemáticas y reemplaza incógnitas, constantes, etc, para ir obteniendo el/los resultados de la ecuación.

Acá tenés un link que use yo en su momento para entender cómo lograrlo:

http://www.tec-digital.itcr.ac.cr/revistamatematica/ContribucionesV7_n2_2006/Parseador/node2.html

Obviamente, la ventaja de programar para PC es que los recursos son mucho más abundantes, tanto en hardware como en software, y ya existen librerías que se encargan de lograrlo.
Puedes googlear por "Equation Parser" si deseas investigar más sobre el asunto. Aquí hay una lib: http://muparser.beltoforion.de/

Como verás, ingresar una ecuaciónn por teclado/texto y hacer que el programa la resuelva, no es para nada similar a hacerlo dentro del código fuente.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: Por que se evalúa mal un expresión definida por teclado con cin?
« Respuesta #6 en: 20 de Octubre de 2013, 18:19:10 »
Gracias BrunoF por tu respuesta, primero no era cout sino cin en el titulo, ya comprendí donde esta el problema, estaba pensando con lógica de lenguaje interpretado, donde si se define una variable y posteriormente esa variable hace parte de una expresión, se evalúa en ella, en un lenguaje compilado es diferente


Un ejemplo similar al propuesto en HP-Prime BASIC

« Última modificación: 20 de Octubre de 2013, 19:05:26 por CompSystems »
Desde Colombia