用戶需求:
程序能接收用戶輸入的整數答案,並判斷對錯
程序結束時,統計出答對、答錯的題目數量。
補充說明: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個增量,各做了兩個增量,我做的是:
4)用戶可以選擇哪種計算類型,比如加減乘除,或可選擇軟件隨機生成四則運算中的一種。
在這之前呢。也就是十一假期的時候我們陳老師給我們推薦了《大話重構》這本書。
我整理了一些我覺得和這次寫程序有用的幾句話:
【每做一次重構,修改一點兒代碼,然后提交,對系統進行一次測試。如果系統依然保持與以往一樣的功能,重構成功,繼續進行下一次重構。如果不是,你不得不還原回來重新重構。】
【通過安全而平穩的重構方法先重構我們的系統,使之可以應付那個需求,然后再添加代碼,實現新需求。
這個過程被稱為“兩頂帽子”:一頂是只重構而不新增功能,一頂是增加新的功能實現新需求。正因為如此,我們在設計時思考當下就可以了。】
【我們要修改軟件,萬變不離其宗,無非就是四種動機:
1. 增加新功能;
2. 原有功能有BUG;
3. 改善原有程序的結構;
4. 優化原有系統的性能 。
第一種和第二種動機,都是源於客戶的功能需求,而第四種是源於客戶的非功能需求。】
我覺得講的真是太好了。我們這次做增量,不就是增加新的功能么。
首先很感謝我的搭檔李燕燕,我們一起完成了這次結對編程。
在結對編程的時候,我和李燕燕我們倆個先在一起列出了設計思路。然后根據設計思路,開始是我負責寫程序,她負責在一旁看我寫,並且在程序出錯的時候能和我一起分析。她比較細心、嚴謹。所以每當她有新的思路的時候我就讓給她寫,然后我就在一旁看着這條路到底合不合適。感覺這樣挺好的,比一個人寫程序有意思,出錯的時候還有人幫我分析。雖然這次寫程序也用了那么長時間,效率不算太高,畢竟我能力也有限只能做到這了。她還告訴我一句話,沒有最好,只有更好!對,所以要不斷完善啊!