一 需求分析
利用c#语言实现一个计算器程序,包括普通计算器模式、科学计算器模式;实现实数(包括正数、负数、0)的加、减、乘、除、平方等基本远算,并实现非负数的开方运算。
二 程序设计与实现
首先设计主窗体,包括两个TextBox用来显示数据,使用数据绑定实现,在Model中实现INotifyPropertyChanged接口,以起到数据更改通知的功能。一个Button和Panel作为菜单来切换计算器模式。最后一个Panel用来显示不同模式的计算器输入面板;
其次是标准计算器输入面板。包括常用的数字和运算符以及Delete,CE和清除按钮。科学计算模式也只是多了几个运算符而已。在后置代码中获取被单击的按钮的名称,调用Model中的Print方法在TextBox中显示数据。
Model中声明两个字符串变量作为两个TextBox中的数据,还包括Print方法,一方面得到按钮的名称,另一方面调用此程序中最重要的逻辑处理方法PrintText方法。传进去两个值,即当前TextBox中显示的数据,输出两个值作为TextBox在一系列处理之后应显示的数据。
PrintAndExpression类主要负责处理TextBox的显示和生成算术表达式。GetValue方法根据名字返回应显示的字符串。IsOpreation方法判断字符串是数字,一元操作符还是二元操作符及其他符号。PrintText处理显示格式。大致为当输入数字的时候在textBox1中,每按下一个操作符即将textBox1中的数字连接上操作符显示在textBox2中,同时处理简单的一元运算符的运算,生成表达式。最终将表达式传递给AnalyExpressions。将解析表达式运算之后的结果返回。
AnalyExpressions解析表达式,利用堆栈来实现,将中缀表达式分解之后保存在字符串数组中,即所谓的“后缀表达式”。大致规则为:
将中缀表达式翻译成后缀表达式
输入中缀表达式: A+B*(C+D)-E/F
中缀表达式翻译成后缀表达式的方法如下:
从左向右依次取得数据ch
如果ch是操作数,直接输出
如果ch是运算符(含左右括号),则:
如果ch = “(“,放入堆栈
如果ch = “)”,依次输出堆栈中的运算符, 直到遇到”(“为止
如果ch不是”)”或者”(“,那么就和堆栈顶点位置的运算符top做优先级比较
如果ch优先级比top高,那么 将ch放入堆栈
如果ch优先级低于或者等于 top,那么输出top,然后将ch放入堆栈
如果表达式已经读取完成,而堆栈中还有运算符时,依次由顶端输出
参考文档和完整的文档和源码下载地址: