上一篇文章我们根据VS文档上的教程搭建了计算器的界面,本篇文章就介绍如何实现它的计算逻辑。
逻辑分析
首先,我们要明白,实现计算逻辑,实际上就是在界面上按钮的点击事件中进行一些操作。我们可以将界面上的按钮分为两大类,一类是用于输入的数字按钮,一类是用于计算的运算按钮。这两类按钮要做的事情都是类似的,因此我们可以在编码时做一个公共的方法即可。
其次,计算器的本质是两个操作数A、B进行某种方式的操作。不管是加减乘除,它们都只是两个操作数,那么我们在类中就需要定义两个变量用于保存这两个操作数即可。
其次,计算器有一个连续计算的功能,我们需要实现1+2-3+4这样的连续操作,这也是必须要考虑的。
代码实现
首先,我们需要在类中定义四个字段:
bool iscalced = false;//计算标志符 string calcSign = "+";//计算符 string firstNum = null; //两个变量为两个计算的数 //设置为string类型更方便检测是否已经赋值 string secondNum = null;
第一个字段用于标识是否已经点击了计算按钮。第二个字段是计算符,用于计算方法中识别怎样计算,后面两个是用于保存两个计算操作数的。把它定义为string类型是为了方便检测它的值是否已经被赋值过,可以检测其是否为null实现。
其次,数字按钮的点击事件:
private void twoButton_Click(object sender, EventArgs e) { NumKeyDown("2"); }
我们写了一个公用的方法用于数字按钮的点击事件,参数意思为被点击的数,这里被点击的是数字2,下面是函数的实现:
private void NumKeyDown(string num) { if (iscalced) { //如果已经点击了计算符 iscalced = false; //清除输入框 inputBox.Clear(); //再追加内容 inputBox.AppendText(num); } else { //没有点击计算符就继续追加数字 inputBox.AppendText(num); } }
加了个判断就是区分用户点击这个数字按钮之前,有没有点击过运算符,比如我们点击1,输入框显示1,之后点击+号,再点击1的时候就要把输入框清空,然后显示1,因此这就是iscalced字段的作用。
其次是运算符按钮的点击事件,这里是减号按钮的点击事件:
private void subtractionButton_Click(object sender, EventArgs e) { label1.Text += " " + inputBox.Text + " " + "-"; calcToInputBox("-"); }
忽略掉那个label1,这是我用来记录的,我们只看calcToInputBox()这个函数,四个运算符按钮的点击事件都调用这个方法,参数是运算符的符号,下面是方法的实现:
private void calcToInputBox(string sign) { //判断第一个操作数是否为空 if (firstNum != null) { //不为空的话,说明这次点击要计算两个操作数的运算结果 secondNum = inputBox.Text; inputBox.Text = calclate(Convert.ToDouble(firstNum), Convert.ToDouble(secondNum), calcSign); } //保存计算符 calcSign = sign; //将计算标志符置为true iscalced = true; //在firstNum中保存当前输入框中的数字 firstNum = inputBox.Text; }
意思都已经注释了,如果还不理解的话可以看随后发布的配套视频。
方法中涉及到一个计算方法:calclate()下面是该方法的实现:
private string calclate(double firstNum, double secondNum, string calcSign) { string result = null; switch (calcSign) { case "+": result = (firstNum + secondNum).ToString(); break; case "-": result = (firstNum - secondNum).ToString(); break; case "*": result = (firstNum * secondNum).ToString(); break; case "/": result = (firstNum / secondNum).ToString(); break; } return result; }
该方法很简单,就是根据两个操作数和一个计算符计算出结果。
最后,是一个比较特殊的等于号按钮的点击事件:
private void equalsButton_Click(object sender, EventArgs e) { if(inputBox.Text != "") { if (firstNum != null) { secondNum = inputBox.Text; label1.Text += " " + inputBox.Text + " " + "="; inputBox.Text = calclate(Convert.ToDouble(firstNum), Convert.ToDouble(secondNum), calcSign); //运算结束将两个变量置为null firstNum = null; secondNum = null; } iscalced = true; listView1.Items.Add(label1.Text + " " + inputBox.Text); } }
和之前的方法差不多,就是运算之后将两个操作数置空,那个listview是添加历史记录用的。
还有一个清空按钮的点击事件:
private void clearButton_Click(object sender, EventArgs e) { label1.Text = ""; iscalced = false; firstNum = null; secondNum = null; calcSign = "+"; inputBox.Clear(); }
就是对所有变量的初始化。
好了,本篇文章就到这里,计算器程序也已经完成了。不明白的地方可以看配套视频。
本文系小博客网站原创,转载请注明文章链接地址