我得到了一些导致显示一些数字的复杂代码。 该代码仍在开发中,并非最终版本。现在,最终用户想要了解这些数字是如何计算的。
举个简单的例子:
var x = y + z; // x = 10 + 20
Display(x); // x will be 30
但是我想要一个像
这样的帮助字符串"x = y(10) + z(20) = 30"
这是一个非常简单的例子,典型的我得到了一个很深的公式,就像一个树结构。
有没有人做过类似的事情并且有一些提示和技巧?
我试图创建我自己的双类来覆盖 +-*/
并创建一个字符串。但是代码变得非常丑陋。
最佳答案
我最近做了类似的事情,并以基本相同的方式使用树结构。我没有使用二叉树——我允许每个级别有多个 child ——我构建了“帮助”,正如我所说,手动与算术分开,但它完成了工作。这更灵活一些,但自动化程度较低,而且工作量更大。
从设计的角度来看,我可能想将值派生的想法封装在一个类中,称之为变量。变量将派生自涉及其他变量的表达式。变量将具有实际数值,运算符不仅会计算新值,还会计算新的推导。例如:
class Variable
int id
double value
string expression
Variable[] dependencies
Variable()
id = GetId()
static int shared_id = 0
static int GetId()
return shared_id++
static Variable Add(Variable lhs, Variable rhs)
Variable result
result.value = lhs.value + rhs.value
result.expression = "v[" + lhs.id + "]+v[" + rhs.name + "]"
result.dependencies[0] = lhs
result.dependencies[1] = rhs
return result
Variable x(1.0, "x", [])
// x.id = 0
// x.value = 1.0
// x.expression = "x"
// x.dependecies = []
Variable y(2.0, "y", [])
// y.id = 1
// y.value = 2.0
// y.expression = "y"
// y.dependecies = []
Variable z(3.0, "z", [])
// z.id = 2
// z.value = 3.0
// z.expression = "z"
// z.dependecies = []
Variable w = x + (y + z)
// (y + z).id = 3
// (y + z).value = 5.0
// (y + z).expression = "v[1]+v[2]"
// (y + z).dependencies = [y, z]
// w.id = 4
// w.value = 6.0
// w.expression = "v[0]+v[3]"
// w.dependencies = [x, (y + z)]
你得到一个如下所示的推导:
v[4]=v[0]+v[3]=1.0+5.0=6.0
v[0]=x=1.0
v[3]=v[1]+v[2]=2.0+3.0=5.0
v[1]=y=2.0
v[2]=z=3.0
如果您想内联地写出它,您可以递归地将根的每个依赖项的内联表达式替换为根的表达式,用圆括号括起每个术语以确保正确排序。
关于c# - 如何显示变量的公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497178/