我的第一个winform程序:简单的计算器(4)
接上篇
在编写运算符按钮事件时,我很头痛什么时候把前面计算的数转到temp里,后来就列了个表,把各种情况对应的temp,left,right是否为empty罗列出来就很清楚了。
下面是等号按钮事件
等号其实和加减号差不多,就是要把所有的结果都计算出来。
1
2 public static void EqualClick() //等号按钮事件
3 {
4 if(left==string.Empty)
5 {
6 left=sign+right;
7 right=string.Empty;
8 n=0;
9 }
10 else
11 {
12 left=Calculate(tempNum,Calculate(left,sign+right,operators),tempOperator);
13 tempNum=string.Empty;
14 tempOperator=string.Empty;
15 right=string.Empty;
16 n=0;
17 }
18 if(left.Length>MaxLength)
19 throw new CalculationExcption("计算结果越界",true);
20 }
2 public static void EqualClick() //等号按钮事件
3 {
4 if(left==string.Empty)
5 {
6 left=sign+right;
7 right=string.Empty;
8 n=0;
9 }
10 else
11 {
12 left=Calculate(tempNum,Calculate(left,sign+right,operators),tempOperator);
13 tempNum=string.Empty;
14 tempOperator=string.Empty;
15 right=string.Empty;
16 n=0;
17 }
18 if(left.Length>MaxLength)
19 throw new CalculationExcption("计算结果越界",true);
20 }
至此,计算器主要的组件就完成了,下面处理异常。
我自定义了一个异常类MyExcption然后从中派生出2个异常类,一个用来处理由计算器本身设置产生的异常,比如计算结果的位数超过了所允许的范围,这个异常类是CalculationExcption;另一个是由数学运算所导致的异常,比如被除数是0,这个异常类是MathExcption,这样,在捕获异常时,只要使用MyExcption就可以利用动态捆绑来灵活处理各种情况。
1 public abstract class MyExcption:ApplicationException //自定义异常基类,因为两派生异常类及其相似
2 { //故添加一抽象基类以使用动态捆绑,且层次更分明
3 bool temp;
4
5 public bool Temp
6 {
7 get
8 {return temp;}
9 }
10 public MyExcption():base("抱歉,程序出现未知问题")
11 {
12 temp=true;
13 }
14 public MyExcption(string message,bool temp):base(message)
15 {
16 this.temp=temp;
17 }
18 public abstract void Information();
19 }
20
21
22 public class CalculationExcption:MyExcption //由计算器设置所导致的异常
23 {
24 public CalculationExcption():base()
25 {}
26 public CalculationExcption(string message,bool temp):base(message,temp)
27 {}
28 public override void Information()
29 {
30 if(this.Temp)
31 MessageBox.Show(this.Message+"\n已输入的内容将全部清空","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
32 else
33 MessageBox.Show(this.Message,"警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
34 }
35 }
36
37
38 public class MathExcption:MyExcption //由运算符的性质所导致的异常,注意,没有定义默认构造函数
39 {
40 public MathExcption(string message):base(message,true)
41 {}
42 public MathExcption(string message,bool temp):base(message,temp)
43 {}
44 public override void Information()
45 {
46 if(this.Temp)
47 MessageBox.Show(this.Message+",已输入的内容将全部清空!","非法的函数参数",MessageBoxButtons.OK,MessageBoxIcon.Error);
48 else
49 MessageBox.Show(this.Message,"非法的函数参数",MessageBoxButtons.OK,MessageBoxIcon.Error);
50 }
51 }
2 { //故添加一抽象基类以使用动态捆绑,且层次更分明
3 bool temp;
4
5 public bool Temp
6 {
7 get
8 {return temp;}
9 }
10 public MyExcption():base("抱歉,程序出现未知问题")
11 {
12 temp=true;
13 }
14 public MyExcption(string message,bool temp):base(message)
15 {
16 this.temp=temp;
17 }
18 public abstract void Information();
19 }
20
21
22 public class CalculationExcption:MyExcption //由计算器设置所导致的异常
23 {
24 public CalculationExcption():base()
25 {}
26 public CalculationExcption(string message,bool temp):base(message,temp)
27 {}
28 public override void Information()
29 {
30 if(this.Temp)
31 MessageBox.Show(this.Message+"\n已输入的内容将全部清空","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
32 else
33 MessageBox.Show(this.Message,"警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
34 }
35 }
36
37
38 public class MathExcption:MyExcption //由运算符的性质所导致的异常,注意,没有定义默认构造函数
39 {
40 public MathExcption(string message):base(message,true)
41 {}
42 public MathExcption(string message,bool temp):base(message,temp)
43 {}
44 public override void Information()
45 {
46 if(this.Temp)
47 MessageBox.Show(this.Message+",已输入的内容将全部清空!","非法的函数参数",MessageBoxButtons.OK,MessageBoxIcon.Error);
48 else
49 MessageBox.Show(this.Message,"非法的函数参数",MessageBoxButtons.OK,MessageBoxIcon.Error);
50 }
51 }
这样,计算器就差不多完成了。这只能实现最基本的功能,随着以后的学习,我将逐渐把它完善。
完。