C#计算器
前段时间写的,计算方法是在网上找的方法,简单修改了一下,没想到期末老师布置的综合题是4道选1道,其中就有计算器,嘿嘿...
(旧博客转移自此的,原文发表时间:2008-12-20 01:46:07)
(旧博客转移自此的,原文发表时间:2008-12-20 01:46:07)
先来一张图片:
计算方法用到非泛型集合stack
部分代码:
按数字按钮:
Code
1 private void btnNum0_Click_1(object sender, EventArgs e)
2 {
3 if (newNum)
4 {
5 txtDisplay.Text = "0.";
6 }
7 else
8 {
9 if (pointKey) //如果小数点按钮已按,textBox原样加0
10 txtDisplay.Text += "0";
11 else if (txtDisplay.Text[0] == '0' || newNum) //如果小数点未按,textBox不变,小数点启用
12 txtDisplay.Text = "0.";
13 else
14 txtDisplay.Text= txtDisplay.Text.Insert(txtDisplay.Text.Length-1,"0");
15 }
16 newNum = false;
17 }
1 private void btnNum0_Click_1(object sender, EventArgs e)
2 {
3 if (newNum)
4 {
5 txtDisplay.Text = "0.";
6 }
7 else
8 {
9 if (pointKey) //如果小数点按钮已按,textBox原样加0
10 txtDisplay.Text += "0";
11 else if (txtDisplay.Text[0] == '0' || newNum) //如果小数点未按,textBox不变,小数点启用
12 txtDisplay.Text = "0.";
13 else
14 txtDisplay.Text= txtDisplay.Text.Insert(txtDisplay.Text.Length-1,"0");
15 }
16 newNum = false;
17 }
按运算符按钮:
Code
1 private void btnPlus_Click(object sender, EventArgs e)
2 {
3 //把displayTextBox.Text内容插入到stack的顶部,做为运算符前边的数字,和while里switch语句中的stk.Push()类似。做完stk第一个元素
4 stk.Push(decimal.Parse(txtDisplay.Text));
5 while (stk.Count >= 3)
6 {
7 //若stk里的元素个数为3个或以上,将最后一个运算符号之前的计算结果增加为stk的第一个元素,以实现连续计算:
8 decimal y = (decimal)stk.Pop();
9 char sign = (char)stk.Pop();
10 decimal x = (decimal)stk.Pop();
11
12 switch (sign)
13 {
14 case '+':
15 stk.Push(x + y);
16 break;
17 case '-':
18 stk.Push(x - y);
19 break;
20 case '*':
21 stk.Push(x * y);
22 break;
23 case '/':
24 stk.Push(x / y);
25 break;
26 }
27 }
28 txtDisplay.Text = stk.Peek().ToString();//返回最后一个加号之前数字的值
29 if (!txtDisplay.Text.Contains("."))
30 txtDisplay.Text += ".";
31 stk.Push('+'); //给stk增加一个运算符“+”,即stk的第二个元素
32 newNum = true;
33 pointKey = false;
34 }
1 private void btnPlus_Click(object sender, EventArgs e)
2 {
3 //把displayTextBox.Text内容插入到stack的顶部,做为运算符前边的数字,和while里switch语句中的stk.Push()类似。做完stk第一个元素
4 stk.Push(decimal.Parse(txtDisplay.Text));
5 while (stk.Count >= 3)
6 {
7 //若stk里的元素个数为3个或以上,将最后一个运算符号之前的计算结果增加为stk的第一个元素,以实现连续计算:
8 decimal y = (decimal)stk.Pop();
9 char sign = (char)stk.Pop();
10 decimal x = (decimal)stk.Pop();
11
12 switch (sign)
13 {
14 case '+':
15 stk.Push(x + y);
16 break;
17 case '-':
18 stk.Push(x - y);
19 break;
20 case '*':
21 stk.Push(x * y);
22 break;
23 case '/':
24 stk.Push(x / y);
25 break;
26 }
27 }
28 txtDisplay.Text = stk.Peek().ToString();//返回最后一个加号之前数字的值
29 if (!txtDisplay.Text.Contains("."))
30 txtDisplay.Text += ".";
31 stk.Push('+'); //给stk增加一个运算符“+”,即stk的第二个元素
32 newNum = true;
33 pointKey = false;
34 }
退格按钮代码:
Code
1 private void btnBackspace_Click(object sender, EventArgs e)
2 {
3 string numString = txtDisplay.Text;
4 //用到Substring()方法截取字符串来获得退格的效果
5 if (numString[numString.Length - 1] == '.') //若文本框最后有小数点
6 {
7 if (numString.Length != 2) //判断文本框是否已经退格到长度为2
8 {
9 //长度若不为2则删除字符串小数点前边最后一个字符,再加上小数点显示出来
10 string before = numString.Substring(0, numString.Length - 2);//截取的字符串为第0个开始,长度为numString.Length - 2
11 txtDisplay.Text = before + ".";
12 }
13 else if (numString.Length == 2) //若文本框退格到长度为2,继续退格则变为0.
14 {
15 txtDisplay.Text = "0.";
16 }
17 }
18 else if (txtDisplay.Text.Contains(".")) //若文本框中间有小数点
19 {
20 txtDisplay.Text = numString.Substring(0, numString.Length - 1);
21 }
22
23 }
1 private void btnBackspace_Click(object sender, EventArgs e)
2 {
3 string numString = txtDisplay.Text;
4 //用到Substring()方法截取字符串来获得退格的效果
5 if (numString[numString.Length - 1] == '.') //若文本框最后有小数点
6 {
7 if (numString.Length != 2) //判断文本框是否已经退格到长度为2
8 {
9 //长度若不为2则删除字符串小数点前边最后一个字符,再加上小数点显示出来
10 string before = numString.Substring(0, numString.Length - 2);//截取的字符串为第0个开始,长度为numString.Length - 2
11 txtDisplay.Text = before + ".";
12 }
13 else if (numString.Length == 2) //若文本框退格到长度为2,继续退格则变为0.
14 {
15 txtDisplay.Text = "0.";
16 }
17 }
18 else if (txtDisplay.Text.Contains(".")) //若文本框中间有小数点
19 {
20 txtDisplay.Text = numString.Substring(0, numString.Length - 1);
21 }
22
23 }