一 整体概述

这个计算器软件的功能和以前的功能基本上一样,只不过是数据的保存形式发生了变化,,以前用的是txt文件保存,现在更正用SQL数据库,现在更改了以前的文件保存形式,是三层架构中数据层的更换,但是仍然采用了设计模式中的策略模式,对于在wpf中实现的要求,会在今后中进一步实现的!

二 数据库代码的封装 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data.SqlClient;
  6. using System.Windows.Forms;
  7. using System.Data;
  8.  
  9. namespace shuxuefudao
  10. {
  11. class shujuku
  12. {
  13.  
  14. string str = "Data Source=.;Initial Catalog=jisuan;Integrated Security=True"; //连接数据库的字符串
  15. SqlConnection sqlcon = new SqlConnection(); //声明相关语句的设置
  16. SqlDataAdapter sda = new SqlDataAdapter();
  17. DataSet ds = new DataSet();
  18. DataTable dt = new DataTable();
  19. public int i = ; //相关变量的声明
  20. public string number1, number2, fuhao1,shu1,fuhao2,shu2,ti;
  21. public void lianjie() //数据库连接的方法
  22. {
  23. try
  24. {
  25. sqlcon = new SqlConnection(str);
  26.  
  27. }
  28. catch (Exception ex)
  29. {
  30. MessageBox.Show("数据连接不成功" + ex.Message);
  31. }
  32. }
  33. public void bianji() //数据库中编辑试题的方法
  34. {
  35. lianjie();
  36. sqlcon.Open();
  37. try
  38. {
  39. string sqlstr = "insert into shuju(第一个数字,符号,第二个数字) values('" + number1 + "','" + fuhao1 + "','" + number2 + "')";
  40. SqlCommand comm = new SqlCommand(sqlstr, sqlcon);
  41. comm.ExecuteNonQuery();
  42. }
  43. catch (Exception ex)
  44. {
  45. MessageBox.Show("出题失败" + ex.ToString());
  46. }
  47. sqlcon.Close();
  48. }
  49. public void qingkong() //清空后台数据库的数据
  50. {
  51. lianjie();
  52. sqlcon.Open();
  53. try
  54. {
  55. string sqltr = "delete from shuju";
  56. SqlCommand comm = new SqlCommand(sqltr, sqlcon);
  57. comm.ExecuteNonQuery();
  58. SqlDataReader reder = comm.ExecuteReader();
  59. MessageBox.Show("删除成功");
  60. }
  61. catch (Exception ex)
  62. {
  63. MessageBox.Show("删除失败" + ex.ToString());
  64. }
  65. sqlcon.Close();
  66.  
  67. }
  68. public void JiSuan() //在第一次计算后的计算方法
  69. {
  70. i++;
  71. lianjie();
  72. sqlcon.Open();
  73. string sqltr = "select * from shuju ";
  74. SqlCommand comm = new SqlCommand(sqltr, sqlcon);
  75. SqlDataAdapter da = new SqlDataAdapter(comm);
  76. DataSet ds = new DataSet();
  77. da.Fill(ds);
  78. DataTable dt = ds.Tables[];
  79. shu1 = dt.Rows[i][].ToString();
  80. fuhao2 = dt.Rows[i][].ToString();
  81. shu2 = dt.Rows[i][].ToString();
  82. sqlcon.Close();
  83.  
  84. }
  85. public void JiSuan1() //初次单击计时开始时调用的方法,即第一个运算式子的调用
  86. {
  87. lianjie();
  88. sqlcon.Open();
  89. string sqltr = "select * from shuju ";
  90. SqlCommand comm = new SqlCommand(sqltr, sqlcon);
  91. SqlDataAdapter da = new SqlDataAdapter(comm);
  92. DataSet ds = new DataSet();
  93. da.Fill(ds);
  94. DataTable dt = ds.Tables[];
  95. shu1 = dt.Rows[][].ToString();
  96. fuhao2 = dt.Rows[][].ToString();
  97. shu2 = dt.Rows[][].ToString();
  98. sqlcon.Close();
  99. }
  100. public void DaoRu() //把数据库里面的式子全部导入到文本框中的方法
  101. {
  102. lianjie();
  103. sqlcon.Open();
  104. string sqltr = "select * from shuju ";
  105. SqlCommand comm = new SqlCommand(sqltr, sqlcon);
  106. SqlDataAdapter da = new SqlDataAdapter(comm);
  107. DataSet ds = new DataSet();
  108. da.Fill(ds);
  109. DataTable dt = ds.Tables[];
  110. for (int i = ; i < dt.Rows.Count; i++)
  111. {
  112. dt.Rows[i][].ToString();
  113. dt.Rows[i][].ToString();
  114. dt.Rows[i][].ToString();
  115. ti += dt.Rows[i][].ToString().Trim() + dt.Rows[i][].ToString().Trim() + dt.Rows[i][].ToString().Trim() + "="+"\n";
  116. }
  117. sqlcon.Close();
  118. }
  119. }
  120. }

三 策略模式的代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6.  
  7. namespace shuxuefudao
  8. {
  9. class qita
  10. {
  11.  
  12. }
  13. public interface Calculator //声明一个计算的接口
  14. {
  15. double Cal(double a,double b);
  16. }
  17. public class Add : Calculator //接口实现加法运算
  18. {
  19. public double Cal(double a, double b)
  20. {
  21. double result = ;
  22. result = a + b;
  23. return result;
  24. }
  25. }
  26. public class Sub : Calculator //接口实现减法运算
  27. {
  28. public double Cal(double a, double b)
  29. {
  30. double result = ;
  31. result = a - b;
  32. return result;
  33. }
  34. }
  35. public class Mul : Calculator //接口实现乘法运算
  36. {
  37. public double Cal(double a, double b)
  38. {
  39. double result = ;
  40. result = a * b;
  41. return result;
  42. }
  43. }
  44. public class Div : Calculator //接口实现除法运算
  45. {
  46. public double Cal(double a, double b)
  47. {
  48. double result = ;
  49. result = a / b;
  50. return result;
  51. }
  52. }
  53. public class Environment //定义那个需要动态改变算法的对象
  54. {
  55. private Calculator calculate;
  56. public Environment(Calculator calculate)
  57. {
  58. this.calculate = calculate;
  59. }
  60. public double Cal(double a, double b, String m) //返回运算结果
  61. {
  62. return this.calculate.Cal(a, b);
  63. }
  64. }
  65. }

四 运算主体的代码

  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 shuxuefudao
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. }
  19. shujuku bbb = new shujuku();
  20. string path = "E:\rtf";
  21. public static int Count = ; // 题目出的数量
  22. public static int zuode = ; //做的题目数量
  23. public static int zhengque = ;
  24. public static int lefttime;
  25. public static int time;
  26. public static int sum;
  27. private void Form1_Load(object sender, EventArgs e)
  28. {
  29.  
  30. }
  31. private void open_Click(object sender, EventArgs e) //打开文件的方法
  32. {
  33. OpenFileDialog TxTOpenDialog = new OpenFileDialog();
  34. TxTOpenDialog.Filter = "RTF文件(*.RTF)|*.RTF";
  35. if (TxTOpenDialog.ShowDialog() == DialogResult.OK)
  36. {
  37. path = TxTOpenDialog.FileName;
  38. this.richTextBox1.LoadFile(TxTOpenDialog.FileName, RichTextBoxStreamType.RichText);
  39. save.Enabled = false;
  40. open.Enabled = false;
  41. MessageBox.Show("读取成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  42. }
  43. }
  44.  
  45. private void save_Click(object sender, EventArgs e) //保存文件的方法
  46. {
  47. SaveFileDialog TxtSaveDialog = new SaveFileDialog();
  48. TxtSaveDialog.Filter = "RTF文件(*.RTF)|*.RTF";
  49. if (File.Exists(path))
  50. {
  51.  
  52. this.richTextBox1.LoadFile(path, RichTextBoxStreamType.RichText);
  53. MessageBox.Show("保存成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  54. this.richTextBox1.Clear();
  55. save.Enabled = false;
  56. }
  57. else
  58. {
  59. if (TxtSaveDialog.ShowDialog() == DialogResult.OK)
  60. {
  61.  
  62. this.richTextBox1.SaveFile(TxtSaveDialog.FileName, RichTextBoxStreamType.RichText);
  63. MessageBox.Show("保存成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  64. this.richTextBox1.Clear();
  65. save.Enabled = false;
  66. }
  67. }
  68. }
  69.  
  70. private void richTextBox1_TextChanged(object sender, EventArgs e)
  71. {
  72. save.Enabled = true;
  73. if (this.richTextBox1.Text == "" || this.richTextBox1.Text == null)
  74. {
  75. open.Enabled = true;
  76. }
  77. }
  78. private void open2_Click(object sender, EventArgs e) //打开试题的方法
  79. {
  80. OpenFileDialog TxTOpenDialog = new OpenFileDialog();
  81. TxTOpenDialog.Filter = "RTF文件(*.RTF)|*.RTF";
  82. if (TxTOpenDialog.ShowDialog() == DialogResult.OK)
  83. {
  84. path = TxTOpenDialog.FileName;
  85. this.richTextBox2.LoadFile(TxTOpenDialog.FileName, RichTextBoxStreamType.RichText);
  86. save.Enabled = false;
  87. open.Enabled = false;
  88. MessageBox.Show("打开成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  89. }
  90. }
  91.  
  92. private void daoru_Click(object sender, EventArgs e) //导入试题的方法
  93. {
  94. bbb.DaoRu();
  95. richTextBox2.Text = bbb.ti;
  96.  
  97. }
  98.  
  99. private void daan1_Click(object sender, EventArgs e)
  100. {
  101. if (daan1.Text == "显示答案")
  102. {
  103. daan.PasswordChar = Convert.ToChar();
  104. daan1.Text = "隐藏答案";
  105. }
  106. else if (daan1.Text == "隐藏答案")
  107. {
  108. daan.PasswordChar = '.';
  109. daan1.Text = "显示答案";
  110.  
  111. }
  112. }
  113.  
  114. private void kaishi_Click(object sender, EventArgs e)
  115. {
  116.  
  117. bbb.JiSuan1();
  118. textBox1.Text = bbb.shu1;
  119. textBox2.Text = bbb.fuhao2;
  120. textBox3.Text = bbb.shu2;
  121. int minute;
  122. try
  123. {
  124. minute = int.Parse(this.shijian.Text);
  125. }
  126. catch (System.Exception ex)
  127. {
  128. this.shijian1.Text = "输入错误";
  129. return;
  130. }
  131. lefttime = minute;
  132. this.timer1.Interval = ;
  133. this.timer1.Enabled = true;
  134. this.timer1.Start();
  135.  
  136. }
  137.  
  138. private void timer1_Tick(object sender, EventArgs e)
  139. {
  140. time = Convert.ToInt32(shijian.Text);
  141. if (lefttime <= )
  142. {
  143. timer1.Enabled = false;
  144. MessageBox.Show("答题时间到!");
  145. textBox4.Enabled = false;
  146. Form2 frm2 = new Form2();
  147. frm2.ShowDialog();
  148. }
  149. this.shijian1.Text = "剩余时间" + lefttime.ToString() + "秒";
  150. lefttime--;
  151. }
  152.  
  153. private void jieshu_Click(object sender, EventArgs e)
  154. {
  155. Form2 frm2 = new Form2();
  156. frm2.ShowDialog();
  157. }
  158.  
  159. private void button1_Click(object sender, EventArgs e) //请编辑下道题的事件
  160. {
  161. Count++;
  162. ti.Text = Count.ToString();
  163. bbb.number1=left.Text;
  164. bbb.fuhao1=fuhao.Text;
  165. bbb.number2=right.Text;
  166. bbb.bianji();
  167. richTextBox1.Text += left.Text + fuhao.Text + right.Text+"="+"\n";
  168. left.Clear();
  169. fuhao.Clear();
  170. right.Clear();
  171. }
  172. private void textBox4_KeyDown(object sender, KeyEventArgs e)
  173. {
  174. try //异常处理机制,预防数组发生越界
  175. {
  176. Environment environment = null;
  177. double a = Convert.ToDouble(textBox1.Text.Trim()); //为相关的变量赋值
  178. double b = Convert.ToDouble(textBox3.Text.Trim());
  179. string m = textBox2.Text.Trim();
  180. int result;
  181. switch (m)
  182. {
  183. case "+":
  184. environment = new Environment(new Add()); //策略模式的引用
  185. break;
  186. case "-":
  187. environment = new Environment(new Sub());
  188.  
  189. break;
  190. case "*":
  191. environment = new Environment(new Mul());
  192.  
  193. break;
  194. case "/":
  195. environment = new Environment(new Div());
  196.  
  197. break;
  198. default:
  199. break;
  200. }
  201.  
  202. if (e.KeyCode == Keys.Enter)
  203. {
  204.  
  205. if (int.TryParse(textBox4.Text, out result) == false)
  206. {
  207. MessageBox.Show("请输入数字");
  208. }
  209. string answer = environment.Cal(a, b, m).ToString();
  210. daan.Text += answer + "\r\n";
  211. if (textBox4.Text == answer.ToString())
  212. {
  213. MessageBox.Show("回答正确");
  214. zuode++;
  215. zhengque++;
  216. }
  217. else
  218. {
  219. MessageBox.Show("回答错误");
  220. zuode++;
  221. }
  222. bbb.JiSuan();
  223. textBox1.Text = bbb.shu1;
  224. textBox2.Text = bbb.fuhao2;
  225. textBox3.Text = bbb.shu2;
  226. textBox4.Text = "";
  227. }
  228.  
  229. }
  230.  
  231. catch (Exception ex)
  232. {
  233. Form2 frm = new Form2();
  234. frm.ShowDialog();
  235. }
  236.  
  237. }
  238.  
  239. private void button2_Click(object sender, EventArgs e) //清空上次编辑试题的方法
  240. {
  241. bbb.qingkong();
  242. }
  243. private void button3_Click(object sender, EventArgs e) //退出程序的方法
  244. {
  245. Application.Exit();
  246. }
  247. }
  248. }

五  运行界面的展示

1 试题的编辑

2 进行计算,并且判断正误

3 统计做题情况

计算器软件实现系列(六)windowform窗体+SQL+策略模式的更多相关文章

  1. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  2. 计算器软件实现系列(七)WPF+SQL+策略模式

    一  整体概述 本次设计主要是在WPF的页面中实现的,属于表现层的更换,数据库部分用的还是数据库的封装,其中引用了策略模式 二  设计思路 1 在出题页面,进行试题的编辑,在编辑后会自动保存到数据库中 ...

  3. 计算器软件实现系列(五)策略模式+asp.net

    一 策略模式代码的编写 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ...

  4. SpringCloud系列六:Eureka的自我保护模式、IP选择、健康检查

    1. 回顾 前面讲了很多Eureka的用法,比如Eureka Server.Eureka Server的高可用.Eureka Server的用户认证(虽然未完全实现).元数据等, 这章将讲解剩下的自我 ...

  5. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

  6. mybatis(六):设计模式 - 策略模式

  7. Java设计模式系列之策略模式

    策略模式的定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化. 策略模式使这些算法在客户端调用它们的时候能够互不影响地变化 ...

  8. SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

    原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...

  9. GIS基础软件及操作(六)

    原文 GIS基础软件及操作(六) 练习六.空间分析的应用 1.加深对缓冲区分析基本原理.方法的认识:2.熟练掌握距离制图创建缓冲区技术方法.3.掌握利用缓冲区分析方法解决地学空间分析问题的能力. 1. ...

随机推荐

  1. 浅谈HTML5中canvas中的beginPath()和closePath()的重要性

    beginPath的作用很简单,就是开始一段新的路径,但在使用canvas绘图的过程中却非常重要 先来看一小段代码: var ctx=document.getElementById("can ...

  2. ecshop 后台添加新菜单 以及 权限控制

    首先 在languages\zh_cn\admin\common.php 中添加 一级菜单 二级菜单 其次 在admin\includes\inc_menu.php 中添加 然后 在admin\inc ...

  3. 用 wait-notify 解决生产者-消费者问题

    //生产者 package com.mzj.test; import java.util.Vector; import java.util.logging.Level; import java.uti ...

  4. 企业网站被黑 dedecms漏洞修复办法

    前段时间网站被黑了,从百度打开网站直接被劫持跳转到了彩票,du博网站上去,网站的首页index.html文件也被篡改成一些什么北京sai车,pk10,一些cai票的关键词内容,搞得网站根本无法正常浏览 ...

  5. 天津Uber优步司机奖励政策(1月11日~1月17日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. ruby 技巧 根据函数的返回

    一般语言中,函数必须有返回值,即要带个return关键字.但在ruby中,return不是必须的,如果不写会默认返回最终计算的结果.举例 def add(a,b) # 省去了return a + b ...

  7. 关于iOS开发的各种证书

    关于iOS开发的各种证书 最近在接推送服务的时候,被各种证书弄得不亦晕乎,这里记录一下一些基本的证书作用: 1. App IDs appID分明确的和通配的两种,如果要使用推送功能,只能用明确的. 2 ...

  8. JavaSE基础笔记

    JVM 不是跨平台的,他是用 C++编写的. Path 环境变量的地址是 ...jdk/bin java_home 地址是 ...jdk

  9. 【JUC源码解析】Exchanger

    简介 Exchanger,并发工具类,用于线程间的数据交换. 使用 两个线程,两个缓冲区,一个线程往一个缓冲区里面填数据,另一个线程从另一个缓冲区里面取数据.当填数据的线程将缓冲区填满时,或者取数据的 ...

  10. C# 组装XML传给webserver+XML 返回获取多个xml,根据多个XML 返回dataset类型

    大致流程介绍: 传值给 webserver+XML ,得到webserver+XML多个返回值,组装成dataset形式返回 首先创建所需要的类型 DataSet ds = new DataSet() ...