用户需求:
程序能接收用户输入的整数答案,并判断对错
程序结束时,统计出答对、答错的题目数量。
补充说明:0——10的整数是随机生成的
用户可以选择四则运算中的一种
用户可以结束程序的运行,并显示统计结果。
在此基础上,做增量开发。
增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况;
2)用户可以设定倒计时;
3)用户可以设定随机整数的范围和题目数量;
4)用户可以选择哪种计算类型,比如加减乘除,或可选择软件随机生成四则运算中的一种。
设计思路:
除了之前可以实现的功能以外,增加新的功能。 因为之前十一假期的时候我们陈老师给我们推荐了《大话重构》这本书,所以脑海里第一时间想到了重构。
(1)保证是小学水平,不出现负数,比如不出现"5-8=-3"这种情况。那么我就会想,在进行减法时,对它进行计算的时候判断一下:看第二个数是否大于第一个数。如果大于第一个数,就让它弹出一个对话框,并让它重新产生一对随机数。
(2)用户可以设定倒计时,在窗体添加一个timer控件,并设置初值为60;这样,只要单击开始就会倒计时。
(3)用户可以设定随机整数的范围,那么我首先想到的是在给出随机数的时候设定一个范围,其实很简单。拖出两个文本框,比如textBox4,textBox5,然后让这两个文本框的值转换成int类型,并让Random()方法从给出的这个范围出题。
(4)对于设定答题的题目数量,我的搭档李燕燕告诉我说:可以添加一个文本框让它存放我要答题的数量,并且判断一下,当答题数量等于预先设定的答题数量时,让它弹出Form2。
(5)用户可以选择哪种计算类型,比如加减乘除,或可选择软件随机生成四则运算中的一种。 感觉还是这个更有难度一些,不过我先用数组把四种运算存了起来,然后从这个数组里随机选出一种运算显示在label3里面,这样就可以switch(label3.Text)了。 如下:
代码实现:
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
10 namespace _Random
11 {
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17 }
18 public static int Count = 0;
19 private int t = 60;
20 public static int right = 0;
21
22 private void button1_Click(object sender, EventArgs e)
23 {
24 label2.Text = t.ToString();
25 timer1.Enabled = true;
26 timer1.Interval = 1000;
27 timer1.Start();
28 }
29
30 private void RDN()
31 {
32 Random rd = new Random();
33 int r1, r2;
34 if (textBox4.Text == "" && textBox5.Text == "")
35 {
36 MessageBox.Show("请输入取值范围!");
37 return;
38 }
39 r1 = rd.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
40 r2 = rd.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
41 textBox1.Text=r1.ToString();
42 textBox2.Text=r2.ToString();
43 string[] fuhao = new string[]{"+","-","×","÷"};
44 label3.Text = fuhao[rd.Next(0,5)];
45 int result = 0;
46 switch (label3.Text)
47 {
48 case "+":
49 result = int.Parse(textBox1.Text) + int.Parse(textBox2.Text);
50 return;
51 case "-":
52 if (int.Parse(textBox1.Text) >= int.Parse(textBox2.Text))
53 {
54 result = int.Parse(textBox1.Text) - int.Parse(textBox2.Text);
55 }
56 else
57 {
58 MessageBox.Show("请回车进行下一题!此题不计入答题总数!");
59 }
60 return;
61 case "×":
62 result = int.Parse(textBox1.Text) * int.Parse(textBox2.Text);
63 return;
64 case "÷":
65 if (textBox2.Text == "0")
66 {
67 MessageBox.Show("分母为0,不计入答题总数,请回车继续答题!");
68 }
69 else
70 {
71 result = int.Parse(textBox1.Text) / int.Parse(textBox2.Text);
72 }
73 return;
74 }
75 }
76
77 private void RandomNum()
78 {
79 Random ran=new Random();
80 int n1,n2;
81 if (textBox4.Text==""&&textBox5.Text=="")
82 {
83 MessageBox.Show("请输入取值范围!");
84 return;
85 }
86 n1=ran.Next(int.Parse(textBox4.Text),int.Parse(textBox5.Text));
87 n2 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
88 textBox1.Text=n1.ToString();
89 textBox2.Text=n2.ToString();
90 textBox3.Text="";
91 }
92
93 private void timer1_Tick(object sender, EventArgs e)
94 {
95 if (t <= 0)
96 {
97 timer1.Enabled = false;
98 textBox3.Enabled = false;
99 MessageBox.Show("时间到!");
100 textBox3.Enabled = false;
101 Form2 frm2 = new Form2();
102 frm2.ShowDialog();
103 }
104 t = t - 1;
105 label2.Text = t.ToString();
106 }
107
108 private void button2_Click(object sender, EventArgs e)
109 {
110 timer1.Stop();
111 Form2 frm2 = new Form2();
112 frm2.ShowDialog();
113 }
114
115 private void textBox3_KeyDown(object sender, KeyEventArgs e)
116 {
117 int result = 0;
118 string s = label3.Text;
119 if (Count == int.Parse(textBox6.Text))
120 {
121 Form2 frm2 = new Form2();
122 frm2.ShowDialog();
123 }
124 switch (s)
125 {
126 case "+":
127 result = int.Parse(textBox1.Text) + int.Parse(textBox2.Text);
128 break;
129 case "-":
130 if (int.Parse(textBox1.Text) >= int.Parse(textBox2.Text))
131 {
132 result = int.Parse(textBox1.Text) - int.Parse(textBox2.Text);
133 }
134 else
135 {
136 MessageBox.Show("请回车进行下一题!此题不计入答题总数!");
137 }
138 break;
139 case "×":
140 result = int.Parse(textBox1.Text) * int.Parse(textBox2.Text);
141 break;
142 case "÷":
143 if (textBox2.Text=="0")
144 {
145 MessageBox.Show("分母为0,不计入答题总数,请回车继续答题!");
146 }
147 else
148 {
149 result = int.Parse(textBox1.Text) / int.Parse(textBox2.Text);
150 }
151 break;
152 }
153 if (e.KeyCode == Keys.Enter)
154 {
155 if (textBox3.Text == result.ToString())
156 {
157 right++;
158 Count++;
159 MessageBox.Show("回答正确!");
160 }
161 else
162 {
163 if (textBox2.Text=="0"||int.Parse(textBox1.Text)-int.Parse(textBox2.Text)<0)
164 {
165 RandomNum();
166 }
167 else
168 {
169 MessageBox.Show("答题错误!");
170 RandomNum();
171 Count++;
172 }
173 }
174 RandomNum();
175 }
176 }
177
178 private void button3_Click(object sender, EventArgs e)
179 {
180 label3.Text = button3.Text;
181 RandomNum();
182 }
183
184 private void button4_Click(object sender, EventArgs e)
185 {
186 label3.Text = button4.Text;
187 RandomNum();
188 }
189
190 private void button5_Click(object sender, EventArgs e)
191 {
192 label3.Text = button5.Text;
193 RandomNum();
194 }
195
196 private void button6_Click(object sender, EventArgs e)
197 {
198 label3.Text = button6.Text;
199 RandomNum();
200 }
201
202 private void button7_Click(object sender, EventArgs e)
203 {
204 if (textBox4.Text == "" && textBox5.Text == "")
205 {
206 MessageBox.Show("请输入取值范围!");
207 return;
208 }
209 else
210 {
211 for (int i = 0; i < int.Parse(textBox6.Text);i++)
212 {
213 RDN();
214 }
215 }
216 }
217 }
218 }
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 _Random
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.Count - Form1.right).ToString();
24 }
25
26 }
27 }
**运行过程:
答题的时候给出取值范围,和预想答题数目,如果随机计算的话,不用点击想使用的算法,只需要点击随机就行了。
这样程序会自动产生算法。并且时间到的时候,会自动弹出时间到和测试结果。
**
当减法时出现第二个数大于第一个数或者除法时分母为0的时候:
****计算开始前没有输入取值范围的时候:**
**
回答正确或者错误时候给出的提示:
PSP耗时分析:
结对编程总结:
说明:我们一起做了4个增量,各做了两个增量,我做的是:\
3)用户可以设定随机整数的范围和题目数量;
4)用户可以选择哪种计算类型,比如加减乘除,或可选择软件随机生成四则运算中的一种。
在这之前呢。也就是十一假期的时候我们陈老师给我们推荐了《大话重构》这本书。
我整理了一些我觉得和这次写程序有用的几句话:
【每做一次重构,修改一点儿代码,然后提交,对系统进行一次测试。如果系统依然保持与以往一样的功能,重构成功,继续进行下一次重构。如果不是,你不得不还原回来重新重构。】
【通过安全而平稳的重构方法先重构我们的系统,使之可以应付那个需求,然后再添加代码,实现新需求。
这个过程被称为“两顶帽子”:一顶是只重构而不新增功能,一顶是增加新的功能实现新需求。正因为如此,我们在设计时思考当下就可以了。】\
【我们要修改软件,万变不离其宗,无非就是四种动机:
1. 增加新功能;
2. 原有功能有BUG;
3. 改善原有程序的结构;
4. 优化原有系统的性能 。
第一种和第二种动机,都是源于客户的功能需求,而第四种是源于客户的非功能需求。】
我觉得讲的真是太好了。我们这次做增量,不就是增加新的功能么。
首先很感谢我的搭档李燕燕,我们一起完成了这次结对编程。
在结对编程的时候,我和李燕燕我们俩个先在一起列出了设计思路。然后根据设计思路,开始是我负责写程序,她负责在一旁看我写,并且在程序出错的时候能和我一起分析。她比较细心、严谨。所以每当她有新的思路的时候我就让给她写,然后我就在一旁看着这条路到底合不合适。感觉这样挺好的,比一个人写程序有意思,出错的时候还有人帮我分析。虽然这次写程序也用了那么长时间,效率不算太高,毕竟我能力也有限只能做到这了。她还告诉我一句话,没有最好,只有更好!对,所以要不断完善啊!