C#四则运算之策略模式

Calculator.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace stratage
 7 {
 8     public abstract class Calculator    //抽象类 Calculator
 9     {
10         public abstract double Cal(double a, double b); //抽象方法Cal
11     }
12     public class Add : Calculator      //派生类Add继承抽象类Calculator
13     {
14         public override double Cal(double a, double b)//并重写了抽象方法Cal
15         {
16             double result = 0;
17             result = a + b;
18             return result;
19         }
20     }
21     public class Sub : Calculator
22     {
23         public override double Cal(double a, double b)
24         {
25             double result = 0;
26             result = a - b;
27             return result;
28         }
29     }
30     public class Mul : Calculator
31     {
32         public override double Cal(double a, double b)
33         {
34             double result = 0;
35             result = a * b;
36             return result;
37         }
38     }
39     public class Div : Calculator
40     {
41         public override double Cal(double a, double b)
42         {
43             double result = 0;
44             result = a / b;
45             return result;
46         }
47     }
48     public class Context           //上下文
49     {
50         private Calculator calculate = null;//实例化一个基类的引用对象
51         public Context(Calculator _cal)//_cal为派生类的一个对象
52         {
53             this.calculate = _cal;    //把派生类的对象赋给基类的引用对象
54         }
55         public double Cal(double a, double b, String symbol)
56         {
57             return this.calculate.Cal(a, b);//返回计算结果
58         }
59     }
60 }

Form1.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.IO;
10 
11 namespace stratage
12 {
13     public partial class Form1 : Form
14     {
15         public Form1()
16         {
17             InitializeComponent();
18         }
19         int Count=0;
20         int Right=0;
21         public static String AddSymbol = "+";  //加法
22         public static String SubSymbol = "-";  //减法
23         public static String MulSymbol = "*";  //乘法
24         public static String DivSymbol = "/";  //除法
25         private void textBox4_KeyDown(object sender, KeyEventArgs e)
26         {
27             double a = double.Parse(textBox1.Text); //用来存第一个数
28             string symbol = textBox2.Text;          //用来存运算符
29             double b = double.Parse(textBox3.Text); //用来存第二个数
30             Context contex = null;                  //上下文
31             if (symbol.Equals(AddSymbol))           //若为加号
32             {
33                 contex = new Context(new Add());    //加法策略
34             }
35             else if (symbol.Equals(SubSymbol))      //如果减号
36             {
37                 contex = new Context(new Sub());    //减法策略
38             }
39             else if (symbol.Equals(MulSymbol))      //若为乘号
40             {
41                 contex = new Context(new Mul());    //乘法策略
42             }
43             else if (symbol.Equals(DivSymbol))      //若为除号
44             {
45                 contex = new Context(new Div());    //除法策略
46             }
47             string answer = contex.Cal(a, b, symbol).ToString();  //用answer来存计算出来的答案,此时已经计算出a,b两个数的运算结果。
48             if (e.KeyCode == Keys.Enter)              //回车操作
49             {
50                 string result = textBox1.Text + textBox2.Text + textBox3.Text;//把运算式子存在result里面
51                 Count++;                                                      //出题总数加一
52                 if (textBox4.Text == answer)                                  //如果输入答案与计算出的answer相等
53                 {
54                     MessageBox.Show("回答正确!");                            //弹出回答正确
55                     listBox1.Items.Add(result + "=" + textBox4.Text.Trim() + "");//并把运算式子存在listbox里
56                     Right++;                                                  //答对题数加一
57                 }
58 
59                 else                                                          //如果答错
60                 {
61                     MessageBox.Show("答题错误!");                            //弹出答题错误
62                     listBox1.Items.Add(result + "=" + textBox4.Text.Trim() +"×");//同样把运算式子放在listbox
63                 }
64                 label3.Text = "正确率:" + Convert.ToString(Right * 1.0 / Count * 100).PadRight(5, ' ').Substring(0, 5) + "%";//统计正确率
65                 textBox1.Clear();//把文本框清空,进行下一次出题
66                 textBox3.Clear();
67                 textBox4.Clear();
68             }
69         }
70         private void button1_Click(object sender, EventArgs e)//保存按钮,把已答题目放在txt文件里
71         {
72             sfd.Filter = "(*.txt)|*.txt";
73             if (sfd.ShowDialog() == DialogResult.OK)
74             {
75                 string sPath = sfd.FileName;
76                 FileStream fs = new FileStream(sPath, FileMode.Create);
77                 StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
78                 int iCount = listBox1.Items.Count - 1;
79                 for (int i = 0; i <= iCount; i++)
80                 {
81                     sw.WriteLine(listBox1.Items[i].ToString());
82                 }
83                 sw.Flush();
84                 sw.Close();
85                 fs.Close();
86             }
87         }
88     }
89 }

 

 测试截图:

 

 

转载于:https://www.cnblogs.com/yumaster/p/4977306.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值