【问题标题】:Is it possible to convert A string that is an equation with a variable into a equation?是否可以将作为带有变量的方程的字符串转换为方程?
【发布时间】:2014-12-11 20:32:35
【问题描述】:

我需要将从prompt 返回的字符串转换为等式,但是parseFloat 仅作为第一个数字和等式中的符号返回,并在变量处停止。该变量将始终为= x。该程序旨在将代数表达式15*x(5^4-56)*17/x=15 转换为表达式,并计算 x 的值。如果有人能告诉我如何做到这一点,那将有很大帮助。我目前正在使用多个提示,让用户在x 之前输入等式,然后在x 之后输入等式,然后在两者之间插入一个变量,并计算它的值。

编辑:

我没有预定义变量,它必须在 x > 1000x != //an integer 的方程中工作。

提前致谢!

【问题讨论】:

  • 您是否考虑过使用正则表达式将字符串解析为可用标记?
  • @PartyLich 不,我实际上没有,我该怎么做?
  • 您给出的示例在分子和分母中都有x,它们抵消了,意味着没有解决方案。这只是一个案例,表明这是一个多么困难的理论问题。你不应该真的尝试自己写这个。人们在整个职业生涯中都在编写这样的求解器,特别是如果您想处理非常一般的情况,包括多项式、三角函数、多元表达式等。
  • @torazaburo 这个程序只是为了帮助我数学课上的人学习代数。他们中的许多人都在苦苦挣扎,他们只是简单地提出问题,然后得到答案和解释。我不想做三角函数或多元表达式之类的东西。

标签: javascript parsing variables algebra


【解决方案1】:

似乎是一个复杂的问题...

这是针对您的问题的简单轻松版本的解决方案。希望您可以使用其中的一些组件。

约束:

  1. x 的答案应该是 0 到 1000 之间的整数
  2. 表达式的左侧应该是正确的 javascript 语法

var input = prompt("enter the equation");  //eg: x*x+x+1=241
var parts = input.split('=');

//solving equation starts
var x = 0;
var temp = eval(parts[0]);
while (temp != parts[1] && x<1000){
   x++;
   temp = eval(parts[0]);
}
var ans = (x<1000)?"answer is "+x:"this program cannot solve this";
//solving equation finishes
  
alert(ans);

您可以将“求解方程”部分替换为计算机科学中用于求解方程的一些数值方法(更多详细信息here)。如果您想允许用户使用您的语法,您将不得不解析等式的左侧并将它们映射到正确的 javascript 表达式(作为与 eval() 一起执行的字符串)。

【讨论】:

  • 有没有什么办法可以给这个更宽的范围,或者一个有理数谱而不是整数?
  • 在此示例中,x 在每次迭代时递增 1。相反,您可以将其增加 0.1 或更少。正确的方法是使用计算机科学中的数值方法 (en.wikibooks.org/wiki/Numerical_Methods/Equation_Solving)..
【解决方案2】:

Javascript 可以使用 eval 函数评估字符串,但变量是事先定义的,并且方程必须以 javascript 可以理解的方式格式化:

var x = 15
var string = "15*x*17/x"
eval(string)

您的示例:"15*x(5^4-56)*17/x=15" 但是不会运行,因为它将 x(5^4-56) 评估为 javascript 表达式,这是无效的。

【讨论】:

  • 你知道这与我想要做的完全相反,对吧?
  • 他想方程,而不是求值。
【解决方案3】:

使用我发现的所有信息和其他方法,我整理了一个社区答案。任何人都被邀请更改和/或添加他们的方法。

为了尽可能减少用户和编码人员的工作量,您将实现以下代码。

var input = prompt("enter the equation");  //eg: x*x+x+1=241
var parts = input.split('=');

//solving equation starts
var x = 0; //Or the lowest possible value of "x"
var temp = eval(parts[0]);
while (temp != parts[1] && x<1000){ // && x < The highest number to evaluate
   x++; //Add the increment (determines the maximum amount of digits) eg x+0.1 for tenths max, x+2 for only even integers etc.
   temp = eval(parts[0]);
}
var ans = (x<1000)?"answer is "+x:"this program cannot solve this"; //make sure x< is the same as line 7.
//solving equation finishes
  
alert(ans);

但是,如果您允许十分之一或大于 2000 的范围,这将运行得非常缓慢。`

一种更快的运行方式是定义允许任何变量(而不仅仅是 x)的数组和不同的评估过程,例如here.(右键单击查看 html 并单击第一个 js 源以查看代码) 但是,这是 2k 行。两者都可用,但第二个效率更高,可以求解多元方程。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多