一、第一步创建一个winform空项目,自己绘制了一个简单的计算器界面,如下图:
文本框添加label,按钮添加button,设置好按钮属性,双击按钮添加点击事件。
二、代码实现计算器的难点分析
1.对于没有运算逻辑的表达式的处理。例如5++3*+、23/...12等。
2.运算符的优先级判断。这里只涉及到简单的加减乘除,没有设置括号,也不涉及负数,相对比较简单。
三、具体实现
1.表达式处理
对于没有运算逻辑的表达式的处理可以有两种方式:第一种方法是对表达式的输入进行规范,尽可能避免掉表达式无法计算的情况,保证点击等号之后获取的表达式可以直接进行运算。第二种方法是在点击等号之后,在运算之前先对表达式逻辑进行判断,如果无法计算,可以显示报错信息,合规再计算结果。两种思路的最大区别是,第一种方式是人为的判断好之后,直接告诉计算器哪些情况允许,哪些不被允许,第二种方式是通过代码来让计算器自行判断。显然,第一种方式更为简单。以下是此计算器的一些输入规则(一切输入规则的作用都是在保障计算功能的前提下尽可能排除干扰):
(1)首位输入不可以是除了“-”和“.”以外的其余符号,“-”和“.”出现在首位,在前补零即可。
(2)表达式不可以出现连续的符号,会有歧义,例如“+-”,“/-”,可以理解为加负数和除以负数,但是如果是“+/”,“+--”等,再去纠结其意义就没必要了,所以为了方便,统一不允许连续符号的输入即可,如果连续输入符号,直接用后输入的符号替换掉前一个符号。
(3)表达式最后一位是符号时点击等号的情况,这种情况无法避免,在点击等号之后判断出最后最后一位是符号的话将其忽略掉即可。
下面是定义的输入的方法:
public void AppendNummber(string num)
{
if (labelShow.Text == "0")
{
labelShow.Text = "";
}
string vaildstr = "1234567890";
//如果当前输入的是数字
if (vaildstr.IndexOf(num) > -1)
{
labelShow.Text += num;
}
//如果当前输入的是符号
else{
//如果输入框不为空
if(!string.IsNullOrEmpty(labelShow.Text))
{
//定义上一个字符,如果是符号,不可以继续输入符号
string endstr = labelShow.Text.Substring(labelShow.Text.Length-1,1);
//上一个输入的字符是符号,新输入的符号将替换掉上一个符号
//如果上一个字符是符号&#