计算器实验报告实验一 计算器的制作一.实验要求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;}elseif (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));}}clears();i = input.LastIndexOfAny(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 = input.LastIndexOfAny(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 = input.LastIndexOfAny(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));}}elsenum.Push(Double.Parse(substr)); fh.Push("*" );} click(sender,e);}}private void button16_Click(object sender, EventArgs e)// 除号{clears();i = input.LastIndexOfAny(fuhao);substr = input.Substring(i + 1);if (substr != null){if (radioButton2.Checked == true){if (flag1 == true || flag2 == true){cal();flag2 = true;}else{flag2 = true; num.Push(Double.Parse(substr));}}else{num.Push(Double.Parse(substr));fh.Push("/");} click(sender,e);}}{//clears();if (input != "" ){textBox1.Focus();input=input.Remove(input.Length-1); textBox1.Text = input; substr = ""; str = ""; num.Clear(); num22.Clear(); fh.Clear(); fh2.Clear();flagl = false; flag2 = false; flag3 = true;//flag3用来记录是否触发了 退格键”sum = 0; num1 = 0; num2 = 0;} }private void clears。
/此函数用来处理点击 退格键"事件当点击退格键之后,如果点击了其他的按键,则程序会先处理这个函数{if (flag3 == true){ jianpan();flag3 = false;input = textBox1.Text;}}private void jianpan()〃键盘输入{input = textBox1.Text;while (input.Contains('+') || input.Contains('-') || input.Contains('*') || input.Contains('/')){j = input.IndexOfAny(fuhao);substr = input.Substring(0, j);if (substr != ""){switch (input[j]){case'+': cal(); fh.Push("+" ); break;case'-': cal(); fh.Push("-" ); break;case'*' : 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)); fh.Push("*" );}break ;case'/' : if (radioButton2.Checked == true){if (flag1 == true || flag2 == true){cal();flag2 = true;}else{flag2 = true; num.Push(Double.Parse(substr));}}else{ num.Push(Double.Parse(substr)); fh.Push("/" );}break ;}}input = input.Substring(j + 1);}substr = input;}clears();if (input == ""){jianpan();cal();input = textBox1.Text;}else{i = input.LastIndexOfAny(fuhao);substr = input.Substring(i + 1); //Console.Write(substr); if (substr != "" ){cal();}}while (num.Count != 0){num1 = num.Pop();num22.Push(num1);}foreach (double number in num22){Console.Write(number+ " " );}while (fh.Count != 0){substr = fh.Pop();fh2.Push(substr);}foreach (string fuh in fh2){Console.Write(fuh+ " " );}if (fh2.Count != 0){sum = 0;num1 = num22.Pop();。