| git地址 | https://github.com/Jason98w |
| git用戶名 | Jason98w |
| 學號后5位 | 72323 |
| 博客地址 | https://www.cnblogs.com/jason5689/ |
| 作業鏈接 | https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793 |
聲明:
本次博客部分細節內容參考了ChildishChange的博客
博客地址:https://www.cnblogs.com/ChildishChange/p/10398212.html
項目背景:
阿超家里的孩子上小學一年級了,這個暑假老師給家長們布置了一個作業:家長每天要給孩子出一些合理的,但要有些難度的四則運算題目,並且家長要對孩子的作業打分記錄。
作為程序員的阿超心想,既然每天都需要出題,那何不做一個可以自動生成小學四則運算題目與解決題目的命令行 “軟件”呢。他把老師的話翻譯一下,就形成了這個軟件的需求:
程序接收一個命令行參數 n,然后隨機產生 n 道加減乘除(分別使用符號+-*/來表示)練習題,每個數字在 0 和 100 之間,運算符在 2 個 到 3 個之間。由於阿超的孩子才上一年級,並不知道分數。所以軟件所出的練習題在運算過程中不得出現非整數,比如不能出現 3÷5+2=2.6 這樣的算式。
練習題生成好后,將生成的 n 道練習題及其對應的正確答案輸出到一個文件 subject.txt 中。
項目的完成過程
1.配置環境
安裝能進行編碼,單元測試,效能分析等功能的工具VS2017,並用已學到的C#語言進行項目的開發。

在此處勾選則可進行進一步開發。
Tips:最后不要將安裝路徑設置為C盤
配置環境的問題:
配置環境的操作步驟很簡單,就需要注意安裝路徑要有足夠的空間去放置VS2017。
2.克隆項目
1.在Github中拷貝本次項目中班級指定的倉庫,將指定倉庫的內容拷貝到自己的倉庫中。

2.安裝將倉庫內容拷貝到本地的工具Git
Git-windows版本下載地址:點擊此處

Tips:按自身電腦操作系統的位數進行選擇

下載安裝完成后,新建一個文件夾來保存倉庫中的文件,打開文件夾,在文件夾空白區域點擊右鍵,選擇Git Bash Here,輸入git clone + 倉庫的地址,可以直接復制下來,但是Git中不能允許直接Ctrl+v進行粘貼,只能通過右鍵然后paste進行粘貼,輸入完成后按回車就可以了
細節步驟如下:



打開文件夾,新建一個文件夾,命名為自己的github用戶名

如果是第一次使用 Git,請需要在git命令行中使用如下兩條命令配置自己的個人郵箱與 Commit 時的用戶名,這里的郵箱和用戶名最好與 Github 賬號保持一致。
git config --global user.name "你的用戶名"
git config --global user.email 你的郵箱號
接下來接連使用
git add .(注意這一個小點)
git commit -m "換成你想命名的分支名稱"(如:git commit -m "Hello")

即可利用 Git 記錄下所有的改動。
克隆項目的問題:
1.注冊和使用Github剛開始有點不熟練
2.利用git進行clone時不知道<clone url>是什么
3.git命令語句的使用經常出現錯誤,通過百度相關問題得到解決
3.代碼設計:
針對項目的要求進行分析,設計,然后在進行編碼,滿足項目的需求。
過程:
將編碼的路徑設置為上一步創建好的文件夾中

代碼設計思路:
Step1:利用formula()函數生成一個隨機序列的等式,其中運算符的個數也同樣是隨機的(2-3個)
Step2:將formula()返回的等式傳入Solve()函數中進行求解,返回等式+計算結果(如:3*4+5=17),若計算結果為小數或等式包含÷0操作則重新生成
Step3:調用calculator()函數生成指定數量的等式,並通過Fwrite()函數寫入到本地文件中
部分代碼見下圖:
1 //生成等式 2 public static string formula() 3 { 4 int opNumber = 0; 5 int firstNum = 0; 6 int nextNum = 0; 7 int opNum = 0; 8 9 string result = null; 10 Random rd = new Random(); 11 12 firstNum = (int)rd.Next(0, 101); 13 opNumber = (int)rd.Next(2, 4); 14 result += firstNum; 15 16 for (int i = 0; i < opNumber; i++) 17 { 18 nextNum = (int)rd.Next(0, 101); 19 opNum = (int)rd.Next(0, 4); 20 result = result + Operator[opNum] + nextNum; 21 } 22 23 return result; 24 }
生成等式的函數
1 //求解生成的等式,調用Computer函數 2 public static string Solve(string msg) 3 { 4 5 DataTable dt = new DataTable(); 6 object ob = null; 7 ob = dt.Compute(msg, ""); 8 //不能出現小數和除0操作,若出現則重新生成 9 while (ob.ToString().Contains(".") || msg.Contains("/0")) 10 { 11 12 msg = formula(); 13 ob = dt.Compute(msg, ""); 14 } 15 return msg + "=" + ob.ToString(); 16 }
求解的函數
1 //寫入文件到記事本 2 public static bool Fwrite(String msg) 3 { 4 try 5 { 6 StreamWriter sw = new StreamWriter("F:\\result.txt"); 7 sw.Write(msg); 8 sw.Close(); 9 return true; 10 } 11 catch 12 { 13 Console.WriteLine("保存文本文件出錯!"); 14 return false; 15 } 16 }
寫入文件的函數
這次項目的難點就是生成隨機序列的等式,並且計算結果不能為小數,等式中不能包含÷0運算,就需針對可能的結果進行判斷處理,直到滿足項目的需求。
代碼運行結果:

代碼能夠滿足項目的各種需求,達到正常運行的標准,但還需要進行單元測試,進行跟細的分析。
代碼設計的問題:
1.在生成隨機運算符個數上處理不當,反復修改了很多次
2.在等式求解的過程中,用到很多方法都不合適,對以前學到的知識有所遺忘,需復習數據結構與C#的相關內容
3.兩個函數相互調用導致運行出錯,stackoverflow,需注意編程的細節問題
4.單元測試
用單元測試來保證代碼中的各個類與函數的正確性,從而保證整個項目的穩定性,此次測試運用VS2017搭載的測試環境來進行
1.首先要將所有私有的類和函數都改為共有的(private->public),然后對需要測試的函數或類創建單元測試,類似於C#中組件的調用。

創建成功則會自動添加對類的引用

如果沒有完成修改則會彈出如下提示信息

創建好單元測試后,就能對指定函數或類進行測試了,下面對該項目中的Solve()函數進行測試,具體測試代碼如下:

接下來,判斷函數是否滿足測試的代碼

觀察測試結果,注意提示信息

出現錯誤,找出原因,對代碼進行修改后,繼續測試,直到代碼准確無誤



顯示正確信息,則函數通過單元測試,后對其他函數或類進行測試,操作步驟相似,修改測試條件即可.

該項目的所有函數都通過測試
單元測試問題:
1.沒有將類和函數改成public就創建單元測試,導致一直出現錯誤信息
2.對函數的測試,沒有滿足所有出現的情況,只是簡單的測試
3.代碼的規范性對單元測試的影響很大
5.基本操作(斷點和監視器的使用)
斷點和監視器的使用對於程序的調試有着很重要的作用,可以很快很准確的找出程序的錯誤原因和出現錯誤的位置,從而根據調試的結果去重新修改程序,滿足程序的正確性。
斷點使用方法
鼠標點擊窗體左邊緣,形成一個紅色的一點即可

然后點擊調試圖標或按F5就能開始對程序的調試了
調試過程中會用到這樣的一個調試框
,通過逐語句圖標使程序一句一句運行,達到調試的效果。觀察變量的值是否滿足程序設計的要求,找到出現問題的原因。

監視器的使用方法
對需要一直觀察的變量,可以通過添加監視的方式,更好的到達調試的效果

隨着程序的執行,監視的變量則會一直處於監視的狀態,來觀察其值的變化

條件斷點的使用
能夠更加快捷的達到程序員需要看到的結果,從而更快的判斷程序是否合理,或者找到錯誤的原因


基本操作的問題:
1.斷點位置的標記的合理性存在問題,需要不斷實踐,熟練掌握方法
2. 准備觀察,調試過程中變量值的變化則是調試的關鍵
6.回歸測試
回歸測試是指修改了舊代碼后,重新進行測試以確認修改沒有引入新的錯誤或導致其他代碼產生錯誤。自動回歸測試將大幅降低系統測試、維護升級等階段的成本。
該項目中,在之前的單元測試過程,就運用到了回歸測試,修改源代碼之后,對其重新進行單元測試,並且修改后的代碼仍然要滿足單元測試的正確性,達到回歸測試的目的


回歸測試問題:
1.養成修改代碼之后,就對其重新進行單元測試的習慣,將程序效能優化的修改才是所需要的
7.效能分析
此次的效能分析運用了VS2017自帶的性能探查器

選擇CPU使用率作為此項目的分析目標

之后就可以對代碼進行效能分析了,具體執行圖如下

還可查看更為詳細的效能分析報告


效能分析會幫助程序員從機器的運行角度方面去思考程序的運行效率,對程序的優化有着重要作用
8.提交代碼
在完成項目的源代碼與單元測試工作以后,即可將代碼上傳到Github上,在最初的文件夾目錄中打開Git
在使用該命令前,請確保所有本地的改動都已經add並commit了。可以用
git status來檢查:

若出現這樣的效果圖就可以執行 git push命令了,將程序提交到Github中

輸入自己的Github的賬號密碼就可以成功的完成提交了
在完成 push 后,我們就可以開始向源倉庫(即阿超的倉庫)發起 Pull Request(指發起請求給倉庫貢獻代碼)。打開你 Fork 后的項目主頁,如圖所示,點擊按鈕New pull request

此時點擊 Create pull request 即可發起請求。等待倉庫主人阿超通過審核后,你的代碼就可以成功合並進阿超的倉庫,至此就完成了整個教程。

請求結果如下圖:

感悟總結:
呼呼,這次的作業是真的麻煩呀,代碼已經好久沒敲過了,有點生疏了,數據結構的知識也有點忘記了,然后就是各種翻書找資料,終於把這次的作業做完了,~~ 但是還是有很多收獲的,第一次進行這么全面的去完成一個小項目,學會了Github的使用,對代碼進行單元測試,回歸測試,效能分析,對程序的仔細調試等等,更深入的了解了軟件工程這一專業並不只是簡單的敲代碼,而是一個工程項目,需要計划明確,合理分工才能做出滿意的產品。
發現Github還有很多其他大佬分享的源代碼,值得去借鑒學習,~~ 下次作業繼續加油咯~
