计算器实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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));

相关文档
最新文档