如EXCEL单元格一样的TEXTBOX

   最近由于某些原因要求我做个题目,是一个文本框中不管输入如何复杂的加减乘除都能自动算出结果,本人慧根不莱塞,想了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);

然后在其他的按钮或者失去焦点的事件中加入

  

就能得到结果:)

EXCEL单元格的计算结果

程序的执行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值