最近由于某些原因要求我做个题目,是一个文本框中不管输入如何复杂的加减乘除都能自动算出结果,本人慧根不莱塞,想了N久还是未能做出来(居然要求我用笔写出来。。NND),但最后还是解决了(还是全靠VS),用处理文本方式来制作的。。不知道是否有更方便的不需要处理文本的方法(不知道是否可以让编译器来处理)
首先定义两个泛型集合,第一个用于保存表达式所有文本。
若TEXTBOX中的文本内容是是(2.1+3)*4.5,经过如上处理后把文本保存进List,List的内容变成{"(","2.1","+","3",")","*","4.5"}也就是将数字和运算符和括号按文本的顺序分离开,然后我觉得应该从简单到复杂,也就是说先计算个简单的,比如1+2+3+4+5+6这样从左往有右依次运算的表达式.
上面运算运用递归(本人讨厌递归,思考的时候太复杂了),如果一个集合是{ "1","+","2","+","3","+","4","+","5","+","6"},我觉得应该这样处理先判断L[1]的文本是加则将L[0]和L[2]相加而后将结果保存进L[0],在删除L[2],L[1](从大往小删除,不然可能会导致序号变化而出错),这样去掉了两个数(减法一样),然后再进行递归就可以把只要是加减法的表达式结果保存进LIST[0]。
在来个能处理加减乘除的表达式比如2+3*4,应该先从集合中搜所"*"或者"/"找到后依然是把计算结果保留的第一位然后删除其他两位,在进行递归在结尾把乘除先执行完.
在代码执行时候应该是:
Two(list);
Three(list);
MessageBox.Show(list[0] + "||" + list.Count.ToString());
先执行乘除在执行加减.
这个是最令我头痛的括弧(一般很少用中括弧和大括弧,都是小括弧代替的,若需要加上和小括弧同样处理),比如算术式((2+3)*4+(5+6)*7)这样的算术式应该怎么做的,先找最内的括弧
for (int i = 0; i < l.Count; i++)
{
if (l[i] == "(")
{
a = i;
}
}
这样就能得到最内的"("的序号,如果A=-1说明没括弧就直接跳过,有的话再查寻")"的序号,并将其中内容复制进另个集合
for (int i = a+1; i < b; i++)
{
lint.Add(l[i]);
}
for (int i = b ; i > a; i--)
{
l.RemoveAt(i);
}
然后按惯例保留第一位,其他的删除在用前面的方式先乘除后加减,在把结果放进第一位,当然还是需要递归的.
Two(lint);
Three(lint);
l[a] = lint[0];
//MessageBox.Show(l[a]);
one(l);
然后在其他的按钮或者失去焦点的事件中加入
就能得到结果:)