[源码和文档分享]基于C#语言的计算器的设计与实现

一 需求分析

利用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放入堆栈

      • 如果表达式已经读取完成,而堆栈中还有运算符时,依次由顶端输出

 

参考文档和完整的文档和源码下载地址:

https://www.write-bug.com/article/105.html

posted @ 2018-12-03 21:16  ggdd5151  阅读(535)  评论(0编辑  收藏  举报