计算器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一计算器的制作
一.实验要求
1.参照Windows系统提供的计算器功能,制作一个自己的计算器,至少能完成数据的加减乘除的基本功能。
2.控件的焦点以及Tab键的设置和使用
3.多个控件(按钮)事件的共享
4.键盘的事件的应用
二.设计思路
1、首先要考虑将输入的内容在textbox上显示出来。所以整个过
程采用全局变量input来记录用户输入的内容(计算器的按
键输入或者键盘输入)。然后再将input的内容显示到textbox
上。
2、接下来就是怎么去将用户的输入变成数字和运算符的问题了。
本实验的计算器有“普通运算”和“科学运算”之分。所以
在计算的时候需要判断是哪一种运算,用
radioButton.Checked来判断。
3、如果是普通的运算,“+”、“-”、“*”、“/”的优先级一样,所
以算法比较简单,只需要将input字符串的内容分割成运算
符和数字,然后再push到两个不同的栈中。其中数字要先
转换为double类型,再存入到栈中。
4、如果是科学运算,则需要按照来“+”、“-”、“*”、“/”的优先
级来进行运算。我是运用堆栈来实现的。算法如下:每当用
户点击“+”、“-”、“*”、“/”中的任何一个键时,则进行判
断,如果是“*”、“/”,则将“*”、“/”之前的一个数变成
double类型,然后再存入栈中。然后设置乘号的标识符flag1
为true,或者设置除号的标识符flag2为true。如果用户点击
的是“+”、“-”,则先判断flag1,flag2是否为true,如果为true,则从栈中pop一个数,然后与当前用户输入的数进行计算,然后再push到栈中,并把“+”、“-”也存入到另一个栈中;
如果为false,则将“+”、“-”之前的一个数变为double,然
后存入栈中,把“+”、“-”也存入到另一个栈中。
5、当用户点击“=”号的时候,则对两个栈进行运算。由于实验
还要求可以支持键盘输入。所以需要对Input进行判断。因
为如果是键盘输入,input的值为空,所以需要先把textbox
中的内容读取进来,然后再进行判断,分割成数字和运算符,然后再分别存入到两个栈中。如果是计算器的按键输入,则
直接对两个栈的内容进行运算。
6、假如你的输入为“1+2-3*4+4+”,然后按“=”号,即输入的式
子后面多了一个“+”号或“-”号或“*”号或“/”号,程
序会自动忽略式子最后多出的那一个运算符,依然能够正确
计算。而且程序的上一次计算结果能够作为下一次计算的一
个输入,即将上一次的计算结果赋给input,然后可以继续
运算。
7、程序中还设计了小数的计算、退格键以及清零键。可以进行小
数的“+”、“-”、“*”、“/”;若输错了数字,可以通过退格键
“ ”来清除。本实验的“退格键”支持一次性退多个格,
例如,你输入1+2-3*4/5+6之类的,然后退格到1+2-3,计算
结果依然正确。清零键即将程序中的各个变量的值重置。
8、本程序的键盘输入跟计算器上的按键输入具有同样的效果,同
样具有“普通运算”和“科学运算”之分。它只是在获得数
据方面跟按键输入不同,其余的计算是一样的。
四则运算核心代码:
private void cal()//判断“+”或“-”号之前的运算符是不是为“*”或者“/"号,如果是则进行相应的计算。
{
if (radioButton2.Checked == true)
{
if (flag1 == true)
{
sum = Double.Parse(substr) * num.Pop();
num.Push(sum);
flag1 = false;
}
else if (flag2 == true)
{
sum = num.Pop() / Double.Parse(substr);
num.Push(sum);
flag2 = false;
}
else
{
num.Push(Double.Parse(substr));
}
}
else
{
num.Push(Double.Parse(substr));
}
}
private void button13_Click(object sender, EventArgs e)//加号算法,调用cal()函数。 {
clears();
i = stIndexOfAny(fuhao);
substr = input.Substring(i + 1);
if (substr != "")
{
cal();
fh.Push("+");
click(sender,e);
}
}
private void button14_Click(object sender, EventArgs e)//减号算法,调用cal()函数。 {
clears();
i = stIndexOfAny(fuhao);
substr = input.Substring(i + 1);
if (substr != "")
{
cal();
fh.Push("-");
click(sender,e);
}
}
private void button15_Click(object sender, EventArgs e)//乘号算法。会先判断该运算符前面一个是不是“+”或者“-”号,然后进行相应的处理。设置flag1/flag2为true。
{
clears();
i = stIndexOfAny(fuhao);
substr = input.Substring(i + 1);
if (substr != "")
{
if (radioButton2.Checked == true)
{
if (flag1 == true || flag2 == true)
{
cal(); flag1 = true;
}
else
{
flag1 = true;
num.Push(Double.Parse(substr));
}
}
else
{
num.Push(Double.Parse(substr));