版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一计算器的制作
一.实验规定
1.参照Windows系统提供的计算器功能,制作一个自己的计算器,至少能完
毕数据的加减乘除的基本功能。
2.控件的焦点以及Tab键的设立和使用
3.多个控件(按钮)事件的共享
4.键盘的事件的应用
二.设计思绪
1、一方面要考虑将输入的内容在textbox上显示出来。所以整
个过程采用全局变量input来记录用户输入的内容(计算
器的按键输入或者键盘输入)。然后再将input的内容显示到
textbox上。
2、接下来就是怎么去将用户的输入变成数字和运算符的问题了。
本实验的计算器有“普通运算”和“科学运算”之分。所以
在计算的时候需要判断是哪一种运算,用radi
oButton.Checked来判断。
3、假如是普通的运算,“+的优先级同样,所以
算法比较简朴,只需要将input字符串的内容分割成运算符和
数字,然后再push到两个不同的栈中。其中数字要先转换为
double类型,再存入到栈中。
4、假如是科学运算,则需要按照来“+的优
先级来进行运算。我是运用堆栈来实现的。算法如下:每当用
户点击中的任何一个键时,则进行判
断,假如是“*”、“/”,则将”之前的一个数变成
double类型,然后再存入栈中。然后设立乘号的标记符flag
1为true,或者设立除号的标记符flag2为true。假如用户点
击的是“+则先判断flagl,flag2是否为true,
假如为true,则从栈中pop一个数,然后与当前用户输入
的数进行计算,然后再push到栈中,并把“+”、“一”也存入
到另一个栈中;假如为false,则将“+之前的一个
数变为double,然后存入栈中,把“+也存入到另一
个栈中。
5、当用户点击“=”号的时候,则对两个栈进行运算。由于实验
还规定可以支持键盘输入。所以需要对Input进行判断。由
于假如是键盘输入,input的值为空,所以需要先把textbo
x中的内容读取进来,然后再进行判断,分割成数字和运算符,
然后再分别存入到两个栈中。假如是计算器的按键输入,则直
接对两个栈的内容进行运算。
6、假如你的输入为“1+2-3*4+4+”,然后按“=”号,即输入的式
子后面多了一个“+”号或“一”号或“火”号或“/”号,
程序会自动忽略式子最后多余的那一个运算符,仍然可以对
的计算。并且程序的上一次计算结果可以作为下一次计算的
一个输入,即将上一次的计算结果赋给input,然后可以继续
运算。
7、程序中还设计了小数的计算、退格键以及清零键。可以进行小
数的“+若输错了数字,可以通过退格键
来清除。本实验的“退格键”支持一次性退多个格,
例如,你输入1+2-3*4/5+6之类的,然后退格到1+2-3,
计算结果仍然对的。清零键即将程序中的各个变量的值重
置。
8、本程序的键盘输入跟计算器上的按键输入具有同样的效果,同
样具有“普通运算”和“科学运算”之分。它只是在获得数
据方面跟按键输入不同,其余的计算是同样的。
四则运算核心代码:
privatevoidcal()//判断“+”或“-”号之前的运算符是不是为“*”或者"/”号,假如是
则进行相应的计算。
(
if(radioButton2.Checked==true)
(
if(flagl==true)
(
sum=Doub1e.Parse(substr)*num.Pop();
num.Push(sum);
f1ag1=faIse;
)
elseif(f1ag2==true)
sum=num.Pop()/Double.Parse(substr);
num.Push(sum);
flag2=false;
)
else
(
num.Push(Double?.Parse(substr));
)
}
else
(
num.Push(Double.Parse(substr));
I
}
privatevoidbuttonl3_Click(objectsender,EventArgse)//
加号算法,调用cal()函数。
(
clears();
i=input.LastIndex0fAny(fuhao);
substr=input.Substring(i+1);
if(substr!="")
(
cal();
fh.Push("+〃);
c1ick(sender,e);
}
privatevoidbutton14_C1ick(objectsender,EventArgse)//减号
算法,调用cal()函数。
(
clears();
i=input.LastIndexOfAny(fuhao);
substr=input.Substring(i+1);
if(substr!=
(
cal();
fh.Push(";
c1ick(sender,e);
)
}
privatevoidbuttonl5_C1ick(objectsender,EventArgse)//乘号算
法。会先判断该运算符前面一个是不是“+”或者“-”号,然后进行相应的解决。设立flagl/f1a
g2为true。
(
clears();
i=input.LastIndexOfAny(fuhao);
substr=input.Substring(i+1);
if(substr!="")
if(radioButton2.Checked==true)
if(flagl==true||flag2==true)
cal();flag1=true;
)
else
(
flagl=true;
num.Push(Double.Parse(substr));
)
)
else
nuin.Push(Double.Parse(substr));
fh.Push(〃*〃);
}
click(sender,e);
privatevoidbuttonl6_C1ick(objectsender,EvenIArgse)//除号
clears();
i=input.LastTndexOfAny(fuhao);
substr=input.Substring(i+1);
if(substr!=null)
if(radioButton2.Checked==true)
if(flag1==trueIIflag2==tr
(
cal();
flag2=true;
}
else
(
flag2=true;
num.Push(Doub1e.Parse(substr));
)
)
else
(
num.Push(Double.Parse(substr));
fh.Push(°/〃);
)
c1ick(sender,e);
)
)
privatevoidbuttonl2_Click(objectsender,EventArgse)//退格键
//c1ears();
if(input!=〃")
textBox1.Foeus();
inpu「input.Removednput.Length-l);
textBoxl.Text=input;
substr="str="";
num.Clear();
num22.Clear();
fh.Clear();
fh2.C1ear();
f1ag1=false;flag2=fa1se;flag3=true;//fla
g3用来记录是否触发了“退格键”。
sum=0;numl=0;num2=0;
)
}
privatevoidc1ears()〃此函数用来解决点击“退格键”事件。当点击退格键之后,假如点
击了其他的按键,则程序会先解决这个函数。
(
if(flag3==true)
(
jianpan();
flag3=false;
input=textBoxl.Text;
)
}
privatevoidjianpan()//键盘输入
input=textBox1.Text;
while(input.Contains('+')IIinput.Contains(,->)I|input.C
ontains(,*')||input.Contains^/'))
{
j=input.IndexOfAny(fuhao);
substr=input.Substring(0,j);
if(substr!="〃)
(
switch(input[j])
(
case'+y:cal();fh.Push("+");break;
case'-':cal();fh・Push("一〃);break;
case'*':if(radioButton2.Checked==true)
(
if(flagl==true|Iflag2==true)
(
ca1();flagl=true;
)
else
(
flag1=true;
num.Push(Double.Parse(substr));
)
e1se
num.Push(Doub1e.Parse(substr));
fh.Push—*");
)
break;
case'/':if(radioButton2.Checked==true)
(
if(flagl==true||flag2==true)
(
ca1();
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;
}
privatevoidbuttonl8_Click(objectsender,EventArgse)//“二”号键
clears();
if(input==
(
jianpan();
cal();
input=textBoxl.Text;
)
else
(
i二input.LastIndexOfAny(fuhao);
substr=input.Substring(i+1);//Console.Write(substr);
if(substr!=〃")
(
ca1();
)
)
while(num.Count!=0)
numl=num.Pop();
num22.Push(numl);
)
foreach(doub1enumberinnum22)
(
Conso1e.Write(number+"〃);
}
while(fh.Count!=0)
(
substr=fh.Pop();
fh2.Push(substr);
}
foreach(stringfuhinfh2)
{
Console.Write(fuh+〃”);
}
if(fh2.Count!=0)
{
sum=0;
numl=num22.Pop();
while(num22.Count!=0)
(
num2=num22.Pop();
substr=fh2.Pop();
switch(substr)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论