设计思路:
这次要用数据库存储题目,我想到的是用SQL server数据库,用dataGridView控件读取数据。
具体实现:
DBCon.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data;
6 using System.Data.SqlClient;
7 using System.Windows.Forms;
8 namespace Dataopear
9 {
10 class DBCon
11 {
12
13 public string strCon = @"Data Source=.;Initial Catalog=aritemtic;Integrated Security=True"; //连接数据库
14 public SqlConnection sqlCon = new SqlConnection();
15 public SqlDataAdapter sda = new SqlDataAdapter();
16 public DataSet ds = new DataSet();
17 public DataTable dt = new DataTable(); //数据源
18 public SqlDataReader sdr; //数据阅读器
19 public void dbcon()
20 {
21 try
22 {
23 sqlCon = new SqlConnection(strCon);
24 }
25 catch (Exception e)
26 {
27 MessageBox.Show("数据库连接不成功:" + e.ToString());
28 }
29 }
30 public void dbFill(string selstr)
31 {
32 dt.Clear(); //清空
33 sda = new SqlDataAdapter(selstr, strCon);//填充数据集
34 sda.Fill(ds, "opear");
35 dt = ds.Tables["opear"];
36 }
37 public void dbSelect(string showInfo) //查询的方法
38 {
39
40 sqlCon.Open();
41 SqlCommand sqlcmd = new SqlCommand(showInfo, sqlCon);
42 sdr = sqlcmd.ExecuteReader();
43
44 }
45 public void dbInsert(string insertInfo) //插入的方法
46 {
47 sqlCon.Open();
48 SqlCommand sqlcmd = new SqlCommand(insertInfo, sqlCon);
49 try
50 {
51 sqlcmd.ExecuteNonQuery();
52 }
53 catch (Exception e)
54 {
55 MessageBox.Show("数据插入失败" + e.ToString());
56 }
57 sqlCon.Close();
58 }
59
60 public void dbUpdate(string updStr) //修改的方法
61 {
62 sqlCon.Open();
63 SqlCommand sqlcmd = new SqlCommand(updStr, sqlCon);
64 try
65 {
66 sqlcmd.ExecuteNonQuery();
67 MessageBox.Show("数据修改成功!");
68 }
69 catch (Exception e)
70 {
71 MessageBox.Show("数据库修改失败" + e.ToString());
72 }
73 sqlCon.Close();
74 }
75 public void dbDelete(string delStr) //删除的方法
76 {
77 sqlCon.Open();
78 SqlCommand sqlcmd = new SqlCommand(delStr, sqlCon);
79 try
80 {
81 sqlcmd.ExecuteNonQuery();
82 MessageBox.Show("数据删除成功!");
83 }
84 catch (Exception e)
85 {
86 MessageBox.Show("数据删除失败" + e.ToString());
87 }
88 sqlCon.Close();
89 }
90 }
91
92
93 }
94
95
策略模式 arctor.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Dataopear 7 { 8 class arictor 9 { 10 public interface Calculator //声明计算接口 11 { 12 double Cal(double x, double y); 13 } 14 private double x; //定义x变量; 15 16 public double X //封装字段 17 { 18 get { return x; } 19 set { x = value; } 20 21 } 22 private double y; //定义y变量 23 24 25 public double Y //封装字段 26 { 27 get { return y; } 28 set { y = value; } 29 30 } 31 public class Add : Calculator //接口法运算 32 { 33 public double Cal(double x, double y) 34 { 35 double result = 0; 36 result = x + y; 37 return result; 38 } 39 } 40 public class Sub : Calculator 41 { 42 public double Cal(double x, double y) 43 { 44 double result = 0; 45 result = x - y; 46 return result; 47 } 48 } 49 public class Mul : Calculator 50 { 51 public double Cal(double x, double y) 52 { 53 double result = 0; 54 result = x * y; 55 return result; 56 } 57 } 58 public class Div : Calculator 59 { 60 public double Cal(double x, double y) 61 { 62 double result = 0; 63 result = x/ y; 64 return result; 65 } 66 } 67 public class Opear //定义运算符 68 { 69 private Calculator calculate; 70 public Opear(Calculator calculate) 71 { 72 this.calculate = calculate; 73 } 74 public double Cal(double x, double y, String op) //返回运算结果 75 { 76 return this.calculate.Cal(x, y); 77 } 78 } 79 } 80 } 81
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.Data.SqlClient; 10 namespace Dataopear 11 { 12 public partial class Form1 : Form 13 { 14 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 public static int Count = 0; //计算所做的题数 20 public static int Right = 0; //回答正确的题数 21 string seltStr = @"select numberID,number1,symbol,number2 from opear"; 22 DBCon db = new DBCon(); 23 24 private void Form1_Load(object sender, EventArgs e) //窗体加载 25 { 26 db.dbcon(); 27 db.dbFill(seltStr); 28 comboBox1.ValueMember = "numberID"; 29 comboBox1.DataSource = db.dt; 30 31 } 32 33 private void dbSelect_Click(object sender, EventArgs e) //调用查询的方法 34 { 35 36 db.dbcon(); 37 db.dbFill(seltStr); 38 dataGridView1.DataSource = db.dt; 39 40 } 41 42 private void dbAdd_Click(object sender, EventArgs e) //调用插入的方法 43 { 44 db.dbcon(); 45 string insertInfo = "insert into opear(numberID,number1,symbol,number2)values('" + comboBox1.Text + "','" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "')"; 46 db.dbInsert(insertInfo); 47 db.dbFill(seltStr); 48 dataGridView1.DataSource = db.dt; 49 MessageBox.Show("增加试题成功!"); 50 } 51 52 private void dbUpdate_Click(object sender, EventArgs e) //调用修改的方法 53 { 54 db.dbcon(); 55 string strUpd = "update opear set number1='" + textBox1.Text.Trim() + "',symbol='" + textBox2.Text.Trim() + "',number2='" + 56 textBox3.Text.Trim() + "' where numberID='" + comboBox1.Text.Trim() + "'"; 57 db.dbUpdate(strUpd); 58 db.dbFill(seltStr); 59 dataGridView1.DataSource = db.dt; 60 MessageBox.Show("修改成功!"); 61 62 } 63 64 private void dbDelete_Click(object sender, EventArgs e) //调用删除的方法 65 { 66 db.dbcon(); 67 string strsUpd = "delete from opear where numberID='" + comboBox1.Text.Trim() + "'"; 68 db.dbDelete(strsUpd); 69 db.dbFill(seltStr); 70 dataGridView1.DataSource = db.dt; 71 72 } 73 74 private void dbClose_Click(object sender, EventArgs e) //关闭程序 75 { 76 Application.Exit(); 77 } 78 79 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //numberID的事件 80 { 81 string selinfo = "select numberID,number1,symbol,number2 from opear where numberID='" + comboBox1.Text.ToString().Trim() + "'"; 82 db.dbcon(); 83 db.dbSelect(selinfo); 84 if (db.sdr.Read()) 85 { 86 textBox1.Text = db.sdr["number1"].ToString(); 87 textBox2.Text = db.sdr["symbol"].ToString(); 88 textBox3.Text = db.sdr["number2"].ToString(); 89 } 90 } 91 private void textBox4_KeyDown(object sender, KeyEventArgs e) 92 { 93 arictor.Opear opear = null; 94 double x = Convert.ToDouble(textBox1.Text); //为相关的变量赋值 95 double y = Convert.ToDouble(textBox3.Text); 96 string op = textBox2.Text; 97 switch (op) 98 { 99 case "+": 100 opear = new arictor.Opear(new arictor.Add()); //策略模式的引用 101 break; 102 case "-": 103 opear = new arictor.Opear(new arictor.Sub()); 104 105 break; 106 case "*": 107 opear = new arictor.Opear(new arictor.Mul()); 108 109 break; 110 case "÷": 111 opear = new arictor.Opear(new arictor.Div()); 112 113 break; 114 default: 115 break; 116 } 117 118 if (e.KeyCode == Keys.Enter) 119 { 120 string answer = opear.Cal(x, y, op).ToString(); 121 if (textBox4.Text == answer.ToString()) 122 { 123 MessageBox.Show("回答正确"); 124 Count++; 125 Right++; 126 textBox1.Clear(); 127 textBox2.Clear(); 128 textBox3.Clear(); 129 textBox4.Clear(); 130 131 } 132 else 133 { 134 MessageBox.Show("回答错误"); 135 Count++; 136 textBox1.Clear(); 137 textBox2.Clear(); 138 textBox3.Clear(); 139 textBox4.Clear(); 140 } 141 } 142 } 143 144 private void end_Click(object sender, EventArgs e) 145 { 146 Form2 frm2 = new Form2(); 147 frm2.ShowDialog(); 148 } 149 150 151 } 152 } 153
Form2.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 10 namespace Dataopear 11 { 12 public partial class Form2 : Form 13 { 14 public Form2() 15 { 16 InitializeComponent(); 17 } 18 19 private void Form2_Load(object sender, EventArgs e) 20 { 21 textBox1.Text = Form1.Count.ToString(); 22 textBox2.Text = Form1.Right.ToString(); 23 textBox3.Text = ((Form1.Right / (double)(Form1.Count)) * 100).ToString() + "%"; 24 } 25 26 27 } 28 }
原始数据:
导入数据:
修改试题:
增加试题:
删除试题:
答题:
结束运算:
总结:
这次作业比之前的作业复杂一点,工厂模式暂时还没有弄清楚,所以用的策略模式实现的运算。