关于公式中除数的容错机制

你的选择H 2017-04-27 09:56:49
公式:M+(F/(A-D/(B+C)))
在执行计算公式计算时,有可能除数为0,但是公式要继续计算 ,故要把其中的除数做判断处理
如:
(F/(A-D/(B+C))) ==> (0 if((A-D/(B+C))==0) else (F/(A-D/(B+C))))
D/(B+C) ==> (0 if((B+C)==0) else D/(B+C))

最后的公式结果替换为:
M+(0 if((F/(A-(0 if((B+C)==0) else D/(B+C))))==0) else (F/(A-(0 if((B+C)==0) else D/(B+C)))))

可能公式更复杂,替换成的脚本遵循python语法

(A if(Ture) else B)


不知道各位有什么好的方法

...全文
318 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
你的选择H 2017-07-09
  • 打赏
  • 举报
回复
我的处理方法: http://blog.csdn.net/nidexuanzhe/article/details/74906010
software_artisan 2017-04-30
  • 打赏
  • 举报
回复
除数为零这个难道不是不应该出现的吗?把你的除数都检查一遍,如有为零的,直接返回一个错误好了。至于把公式搞得这么复杂么?何况,当一个除数为零的时候,你给它赋个什么值才能让你的输出正确?
Anymore 2017-04-28
  • 打赏
  • 举报
回复
貌似有现成的 http://bbs.csdn.net/topics/340135367 http://www.cnblogs.com/wzf-Code/p/5776342.html
xuzuning 2017-04-28
  • 打赏
  • 举报
回复
    class Program
{
static void Main(string[] args)
{
var s = "M+(F/(A-D/(B+C)))";
var expr = new Expression();
expr.Match(s);
Console.WriteLine(expr.InorderTraversal());
}
}
public class EtreeNode
{
public static readonly EtreeNode Empty;
public string Value;
public EtreeNode Left;
public EtreeNode Right;
}
public class Expression
{
public Stack<EtreeNode> ptrStack = new Stack<EtreeNode>();
string[] Symbol = { "+", "-", "*", "/", "(", ")" };

List<string> Pretreatment(string str)
{
var res = new List<string>();
var tmp = "";
foreach(var c in str)
{
if (Symbol.Contains(c.ToString()) || c.ToString() == " ")
{
if (tmp.Length > 0)
{
res.Add(tmp);
tmp = "";
}
res.Add(c.ToString());
}
else if(c != ' ') tmp += c;
}
if (tmp.Length > 0)
{
res.Add(tmp);
tmp = "";
}
return res;
}

public List<string> InfixToSuffix(List<string> a, int x=0, int y=-1)
{
var res = new List<string>();
if (y < 0) y = a.Count;
int p = 0, c1 = -1, c2 = -1;
if (y - x <= 1)
{
res.Add(a[x]);
return res;
}
for (int i = x; i < y; i++)
{
switch (a[i])
{
case "(": p++; break;
case ")": p--; break;
case"+":
case"-":
if (p == 0) c1 = i;
break;
case "*":
case "/":
if (p == 0) c2 = i;
break;
}
}

if (c1 < 0) c1 = c2;
if (c1 < 0) res.AddRange(InfixToSuffix(a, x + 1, y - 1));
else
{
res.AddRange(InfixToSuffix(a, x, c1));
res.AddRange(InfixToSuffix(a, c1 + 1, y));
res.Add(a[c1]);
}
return res;
}
public void Match(string str)
{
var a = Pretreatment(str);
Console.WriteLine(string.Join(" ", a));
if (Symbol.Contains(a[0]) || Symbol.Contains(a[1])) a = InfixToSuffix(a);
Console.WriteLine(string.Join(" ", a));

foreach (var c in a)
{
var ptr = new EtreeNode();
if (Symbol.Contains(c))
{
ptr.Value = c;
ptr.Right = ptrStack.Pop();
ptr.Left = ptrStack.Pop();
ptrStack.Push(ptr);
}
else
{
ptr.Value = c;
ptr.Left = ptr.Right = EtreeNode.Empty;
ptrStack.Push(ptr);
}
}
}
public string InorderTraversal()
{
return InorderTraversal(ptrStack.Peek());
}
public string InorderTraversal(EtreeNode r) //递归进行中序遍历
{
var res = new StringBuilder();
if (r == EtreeNode.Empty) return res.ToString();

if (Symbol.Contains(r.Value)) res.Append("(");
if (r.Value == "/") res.Append("0 if(" + InorderTraversal(r.Right) + "==0) else "); //这里!

res.Append(InorderTraversal(r.Left)); //引用左子树
res.Append(r.Value); //引用根节点

res.Append(InorderTraversal(r.Right)); //引用右子树
if (Symbol.Contains(r.Value)) res.Append(")");
return res.ToString();
}
}
cheng2005 2017-04-28
  • 打赏
  • 举报
回复
自己写一个除法的方法,替代公式里的 除号(/)。 这样处理相对来说最简单。
xuzuning 2017-04-28
  • 打赏
  • 举报
回复
先化为后缀表达式 再转成中缀表达式,在转换过程中加入除0判断(符号栈顶为 /)
xuggzu 2017-04-27
  • 打赏
  • 举报
回复
光为了容错,可以用: try{}catch{}.... 但有缺点: 1、除0错误太多,会严重影响效率; 2、因为是出错了抓错再处理,所以要在2个{}里写算法逻辑,代码写起来可能很乱。
你的选择H 2017-04-27
  • 打赏
  • 举报
回复
引用 1 楼 xuggzu 的回复:
楼主是想用python还是c#? c#,可以用(0==a)?0:a ,这种写法,高版本Vs可能还有更简单写法。
我的目的是公式的容错,保证公式即使是在除数为0,也能继续执行,且结果正确 其实就是把公式做一番替换
xuggzu 2017-04-27
  • 打赏
  • 举报
回复
楼主是想用python还是c#? c#,可以用(0==a)?0:a ,这种写法,高版本Vs可能还有更简单写法。

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧