C#窗體->>隨機四則運算


用戶需求:

程序能接收用戶輸入的整數答案,並判斷對錯
程序結束時,統計出答對、答錯的題目數量。
補充說明: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. 優化原有系統的性能 。
第一種和第二種動機,都是源於客戶的功能需求,而第四種是源於客戶的非功能需求。】

我覺得講的真是太好了。我們這次做增量,不就是增加新的功能么。

首先很感謝我的搭檔李燕燕,我們一起完成了這次結對編程。
在結對編程的時候,我和李燕燕我們倆個先在一起列出了設計思路。然后根據設計思路,開始是我負責寫程序,她負責在一旁看我寫,並且在程序出錯的時候能和我一起分析。她比較細心、嚴謹。所以每當她有新的思路的時候我就讓給她寫,然后我就在一旁看着這條路到底合不合適。感覺這樣挺好的,比一個人寫程序有意思,出錯的時候還有人幫我分析。雖然這次寫程序也用了那么長時間,效率不算太高,畢竟我能力也有限只能做到這了。她還告訴我一句話,沒有最好,只有更好!對,所以要不斷完善啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM