目錄
- 1. 題目及要求
- 2. 功能的設計
- 3. GUI(圖形用戶界面)的設計
- 4. 容錯機制的設計
- 4.1 選擇運算符的容錯處理
- 4.2 最大值和題目數輸入的容錯處理
- 4.3 打開文件容錯處理
- 4.4 打印的容錯處理
- 5. 程序的運行效果
- 6. 對領航員的評價
- 7. 總結
本次作業所開發的程序已上傳至Coding.net中
結對伙伴——王宗波
我在本次的作業中擔任“駕駛員”的角色,王宗波同學擔任“領航員”的角色
1. 題目及要求
在這里我們選擇了“小學四則運算”自動生成的題目,其具體要求如下:
- 能夠自動生成四則運算練習題
- 可以定制題目數量
- 用戶可以選擇運算符
- 用戶設置最大數(如十以內、百以內等)
- 用戶選擇是否有括號、是否有小數
- 用戶選擇輸出方式(如輸出到文件、打印機等)
- 最好能提供圖形用戶界面(根據自己能力選做,以完成上述功能為主)
2. 功能的設計
考慮到題目要求、開發難度和實際中的需求,我們決定開發的程序應具有如下功能:
- 自動生成四則(混合)運算題目
- 可以定制題目數量
- 可以定制最大值
- 可以定制四則運算符
- 可以切換小數/整數運算
- 可以添加括號改變運算順序
- 可以輸出到文件,并能讓用戶方便的直接打開生成的文件
- 可以調用系統接口進行打印的設置、頁面的設置,進行打印預覽和打印
- 提供簡單的圖形化界面
- 能對用戶的非法操作進行容錯處理
3. GUI(圖形用戶界面)的設計
我們選用了C#語言,開發Windows窗體應用程序來提供圖形用戶界面。
所設計的GUI如圖所示
其中左側的Rich Text Box(富文本文本框)用來顯示自動生成的題目。
上面的三個按鈕分別實現自動生成題目、(若有則)打開文件和清空富文本框的功能。
左上角的通過Menu Strip控件實現的菜單欄提供了將當前生成的題目進行打印,和進行打印前的設置及打印預覽功能,如下圖所示。
右側的Check Box則提供了選擇運算符、括號和小數,以及是否輸出到文件的選項。
用戶還可通過右側的兩個Text Box(文本框)輸入題目的最大值和題目數。
GUI的設計代碼由Visual Studio 2017完成。
4. 容錯機制的設計
為了提高程序的Robustness,我們對用戶的非法操作進行了容錯處理。
4.1 選擇運算符的容錯處理
用戶在點擊“出題”按鈕前,必須至少從“加”、“減”、“乘”、“除”四個運算符中選擇一個,才能開始。
當用戶沒有選擇運算符,直接進行出題操作是,進行如下的容錯處理
if (Symbols.Count == 0)
{MessageBox.Show("加、減、乘、除運算符至少需要選擇一個!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}
其效果如圖所示
4.2 最大值和題目數輸入的容錯處理
用戶在開始出題前,必須首先輸入最大值和題目數。
當用戶沒有輸入而直接點擊“出題”按鈕時,進行如下的容錯處理
string max = tbxMax.Text;
string num = tbxNum.Text;
if (tbxMax.Text == String.Empty)
{MessageBox.Show("最大值不能為空!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}
if (tbxNum.Text == String.Empty)
{MessageBox.Show("題目數不能為空!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}
其效果如圖所示
4.3 打開文件容錯處理
用戶在點擊“打開文件”按鈕前,必須已經有生成的文件
當用戶未選擇生成文件,又直接點擊了“打開文件”按鈕時,進行如下的容錯處理
if(cbxFile.Checked==false)
{MessageBox.Show("未生成文件,無法打開!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}
其效果如圖所示
4.4 打印的容錯處理
在嘗試打印自動生成的題目時若出錯,則進行如下的容錯處理
try
{printPreviewDialog.ShowDialog();
}
catch(Exception excep)
{MessageBox.Show(excep.Message, "打印出錯", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
5. 程序的運行效果
為了全面的演示程序的運行效果,我們選擇所有的運算符,帶有小數和括號,并且輸出到文件來進行演示。
點擊“出題”按鈕,成功生成題目,并且導出到文件
點擊“打開生成的文件”按鈕,打開文件
打開“打印”菜單,點擊“打印設置”選項,進行打印前的設置
點擊“頁面設置”選項,進行頁面格式的設置
點擊“打印預覽”選項,進行打印預覽
點擊“打印”選項,進行打印
這里我們采用了Adobe公司提供的PDF虛擬打印機,可以看到如下的效果
6. 對領航員的評價
本次我們這個項目的的領航員是王宗波同學。
在進行分析設計思路和用戶需求時,領航員能夠對整體開發思路有較清晰的統籌規劃,結合實際提出了具有遠見且實用的需求分析,并以此為基礎,和我共同制定了清晰的包含了需要開發的功能的開發計劃。
在開始編程前,領航員能夠及時地審閱了我所大體設計地圖形化用戶界面,并提出了有針對性地建議有,與我進行了討論。
在進行程序設計的時,領航員能夠為程序代碼地書寫規范,程序中各功能的開發順序和統籌兼顧實時的提出建議,為代碼及時、準確的完成提供了幫助。
在編程結束后,能設計單元測試,及時發現和提出在開發時考慮不得當的地方和些許小錯誤。
美中不足的是,雖然領航員在結對編程時能及時地發現大部分的問題,但是代碼中仍然有一些小問題是在編程結束后才發現并解決的。這可能是因為在進行開發時,駕駛員和領航員兩個人的思路無法保持同步造成的。
總的來說,這次的結對編程,領航員在大多數術事件,都能正確、及時的完成領航員的職責。
結對編程時領航員和駕駛員的工作照片如圖所示。
7. 總結
本次的作業要求的題目,從總體上來說雖然有一定的難度,但是并不復雜。
這次作業是我們第一次嘗試進行具有圖形用戶界面的程序的設計,由于之前的學習和編程經歷,我們主要進行的都是C和C ++的控制臺應用的開發與設計,所以這次在嘗試開發圖形化用戶界面時,走了不少彎路。為了設計圖形化用戶界面,我們考慮了多種方案,比如使用C ++進行UWP應用的開發,使用Java繼續寧開發,使用C #開發Windows窗體應用程序等……
在考慮到時間限制、學習難度和開發難度等條件下,我們最終決定,學習并使用C #進行Windows窗體應用程序的開發。由于C #和C ++在許多地方一脈相承,學習的過程總體來說還算順利,尤其是語法方面,聯系C ++的語法,認清C #和C ++在諸如數組之類的地方的區別,掌握起來十分容易。但在窗體的設計和開發方面,由于涉及到的控件較多,而他們的方法又不盡相同,學習起來需要一定的時間和精力。
在編程的過程中,為了增加代碼的可讀性和遵循規范化的開發流程,我們有意識地對窗體的控件,控件的事件和變量名等使用了匈牙利命名法。在換行,函數的設計和命名,循環和判斷體的設計中也遵循了一定的規則。
第一次開發圖形化用戶界面,讓我們有機會接觸到比之前所學的課程知識更接近于現代化商業軟件開發流程和的內容。更讓我們體會到了在現代軟件設計開發中,對圖形化界面美觀度,對用戶的需求等方面的考慮的重要性。
在從零開始自學了一門程序設計語言,并編寫出了可以運行的具有圖形用戶界面的程序后,也帶給了我們成就感,能夠鼓勵我們繼續在軟件開發的領域繼續學習探索。
但是這次的程序設計也有不完善的地方。
最開始考慮到的可以讓用戶選擇是否顯示答案的功能,由于在生成題目時,我們將數字和運算符以及括號全部轉換成字符串的格式顯示,所以如果要顯示答案,就要進行字符串的匹配、轉換、找到正確的運算順序并計算等等一系列的功能,受限于本次的開發時間,我們沒有能夠完成這一功能的設計和開發。
另外我們在構思設計的初期,還考慮到了能讓用戶填寫某一特定問題的答案,并進行批改,還可以讓用戶手動切換當前題目的功能。但由于我們采用了邊生成邊顯示的生成題目方式,除了窗體里的富文本框以外,并沒有設計可以存儲已經生成的題目的數據結構,所以如果要實現此功能,還是需要對文本進行遍歷、匹配、識別、判斷運算順序和計算,考慮到時間因素我們也沒有完成這項功能。
雖然代碼仍然存在這兩方面的問題,但是我們在源代碼中預留了實現這兩個功能的函數位置,在本次作業后,我們仍然會找時間嘗試完善這個項目。
總體來說,完成這次作業,讓我們掌握了一門全新的程序設計語言,學習了GUI的設計與開發,認識并親身體會了結對編程的流程,收獲頗豐。