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 }
测试截图: