個人項目-數獨


2017年軟件工程基礎-個人項目作業

數獨

題目修改自https://edu.cnblogs.com/campus/fzu/SoftwareEngineering2015/homework/859

零、任務:

實現一個能夠生成數獨終局並且能求解數獨問題的控制台程序。

一、要求:

  1. 閱讀《構建之法》第一章至第三章的內容,並在下方作業里體現出閱讀后的成果。特別是第2章中的效能分析及個人軟件開發流程(PSP)。
  2. 使用Visual Studio Community 2017進行開發,采用C++或者C#語言實現,可以使用.Net Framework,運行環境為64-bit Windows 10。
    附:下載鏈接:Visual Studio 2015/2017,下載也推薦使用國內一些鏡像站點(不是盜版)MSDN,I tell you
  3. 提交的代碼要求經過Code Quality Analysis工具的分析並消除所有的警告。
  4. 完成項目的首個版本之后,請使用性能分析工具Studio Profiling Tools來找出代碼中的性能瓶頸並進行改進。
  5. 使用單元測試對項目進行測試,並使用插件查看測試分支覆蓋率等指標;並寫出至少10個測試用例確保你的程序能夠正確處理各種情況。
  6. 使用Github來管理源代碼和測試用例,代碼有進展即簽入Github。簽入記錄不合理的項目會被助教抽查詢問項目細節。
  7. 按照要求發布博客,利用在構建之法中學習到的相關內容,結合個人項目的實踐經歷,撰寫解決項目的心路歷程與收獲。博客與Github項目明顯不符的作業將取消作業成績。

二、作業提交:

  • 撰寫一個博客,要求參見博客作業要求。
  • 在個人博客上發布項目源代碼(包含單元測試用例)的Github鏈接,以便助教下載,助教將會在測試環境中檢查程序的正確性。
  • 正確的程序會再進行性能測試,根據性能的好壞進行評分;不正確的程序沒有性能的分數。

三、需求:

實現一個命令行程序(不妨叫sudoku.exe),程序能:

  1. 生成不重復的數獨終局至文件
  2. 讀取文件內的數獨問題,求解並將結果輸出到文件

生成終局

  1. 在命令行中使用-c參數加數字N(1<=N<=1000000)控制生成數獨終局的數量,例如下述命令將生成20個數獨終局至文件中:

sudoku.exe -c 20

  1. 將生成的數獨終局用一個文本文件(假設名字叫 sudoku.txt)的形式保存起來,每次生成的txt文件需要覆蓋上次生成的txt文件,文件內的格式如下,數與數之間由空格分開,終局與終局之間空一行,行末無空格:
2 6 8 4 7 3 9 5 1
3 4 1 9 6 5 2 7 8
7 9 5 8 1 2 3 6 4
5 7 4 6 2 1 8 3 9
1 3 9 5 4 8 6 2 7
8 2 6 3 9 7 4 1 5
9 1 7 2 8 6 5 4 3
6 8 3 1 5 4 7 9 2
4 5 2 7 3 9 1 8 6
 
4 5 1 7 8 2 3 6 9
7 8 6 4 9 3 5 2 1
3 9 2 1 5 6 4 8 7
5 2 7 6 4 9 8 1 3
9 6 8 5 3 1 2 7 4
1 3 4 2 7 8 6 9 5
8 1 5 3 6 7 9 4 2
6 7 3 9 2 4 1 5 8
2 4 9 8 1 5 7 3 6
 
9 5 8 3 6 7 1 2 4
2 3 7 4 5 1 9 6 8
1 4 6 9 2 8 3 5 7
6 1 2 8 7 4 5 9 3
5 7 3 6 1 9 4 8 2
4 8 9 2 3 5 6 7 1
7 2 4 5 9 3 8 1 6
8 9 1 7 4 6 2 3 5
3 6 5 1 8 2 7 4 9
……
  1. 程序在處理命令行參數時,不僅能處理格式正確的參數,還能夠處理各種異常的情況,如:

sudoku.exe -c abc

  1. 在生成數獨矩陣時,左上角的第一個數為:(學號后兩位相加)% 9 + 1。例如學生A學號后2位是80,則該數字為(8+0)% 9 + 1 = 9,那么生成的數獨棋盤應如下(x表示滿足數獨規則的任意數字):
9 x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x

求解數獨

  1. 在命令行中使用-s參數加文件名的形式求解數獨,並將結果輸出至文件,如:

sudoku.exe -s absolute_path_of_puzzlefile

程序將從路徑中讀取數獨題目,並將數獨題目的**一個可行解**輸出至與sudoku.exe同目錄的sudoku.txt中,要求與生成終局相同。
  1. 的格式如下,其中0代表空格,題目與題目之間空一行,行末無空格,最后一個數獨題目后無空行:
9 0 8 0 6 0 1 2 4
2 3 7 4 5 1 9 6 8
1 4 6 0 2 0 3 5 7
0 1 2 0 7 0 5 9 3
0 7 3 0 1 0 4 8 2
4 8 0 0 0 5 6 0 1
7 0 4 5 9 0 8 1 6
8 9 0 7 4 6 2 0 0
3 0 5 0 8 0 7 0 9
 
9 0 0 8 0 0 4 0 0
……
  1. sudoku.txt的格式如下(與生成終局的要求相同):
9 5 8 3 6 7 1 2 4
2 3 7 4 5 1 9 6 8
1 4 6 9 2 8 3 5 7
6 1 2 8 7 4 5 9 3
5 7 3 6 1 9 4 8 2
4 8 9 2 3 5 6 7 1
7 2 4 5 9 3 8 1 6
8 9 1 7 4 6 2 3 5
3 6 5 1 8 2 7 4 9
  1. 中數獨題目個數N(1<=N<=1000000),保證文件中數獨格式正確。

附加題:

現在已經有了一個數獨游戲的生成器,如果想讓大家都能實際使用它,還需要一個簡單的游戲界面。為數獨游戲的生成器做一個GUI界面,並附上一個簡單的使用說明。界面需實現下述功能,會按點給分:

  • 生成任意數量的數獨題目並將初始數獨棋局依次顯示。初始數獨棋盤需要挖空,要求為:99棋盤上挖空不少於30個,不多於60個。每個33的小棋盤中挖空不少於2個。比如下面這就是一個規范的棋局(2.5')
    棋局
  • 用戶可以在界面上通過點擊或輸入完成數獨題目(1.5')
  • 用戶完成數獨題目后可以得到反饋,知道自己的題目是否做對(1')

【注意】選擇完成本附加題目的同學,需要將GUI與數獨游戲生成器作為兩個工程開發,后者可以作為依賴庫為前者提供調用接口,但不可以把兩個工程直接混在一起。 GUI相關的部分也需要提供新的可執行文件,放在根目錄的GUIBIN文件夾下。

四、測試須知

所有提交到Github上的項目均需要建立一個名字為BIN的文件夾,里面必須含有可執行文件與相關的依賴庫,請注意以下兩點:

  • 確保可執行文件的名字統一為 sudoku.exe。
  • 確保生成的棋盤文件 sudoku.txt 與可執行文件在同一目錄下,生成文件時請使用相對路徑

一個示例組織目錄如下所示:

/ SudokuProject(工程名字自行指定即可)
/ main.cpp
/ generator.cpp
/ BIN

    / Lib.dll(exe運行需要的動態鏈接庫文件)

    / sudoku.exe

    / sudoku.txt (運行exe后生成)

助教在測試時,將以命令行運行可執行文件的方式進行批量測試,參數及其約定如下

參數名字 參數意義 用法示例
-c[必選] 需要的棋盤數量 示例:sudoku.exe -c 20 [表示生成20個數獨題目]

五、博客撰寫要求:

發表在你的個人博客上,也可以同時轉發到你的團隊博客上來增加你們團隊博客的人氣。博客共15分,具體要求如下:
1)在文章開頭給出Github項目地址。(1‘)
2)在開始實現程序之前,在下述PSP表格記錄下你估計將在程序的各個模塊的開發上耗費的時間。(0.5‘)
3)解題思路描述。即剛開始拿到題目后,如何思考,如何找資料的過程。(3‘)
4)設計實現過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?單元測試是怎么設計的?(4‘)
5)記錄在改進程序性能上所花費的時間,描述你改進的思路,並展示一張性能分析圖(由VS 2017的性能分析工具自動生成),並展示你程序中消耗最大的函數。(3‘)
6)代碼說明。展示出項目關鍵代碼,並解釋思路與注釋說明。(3‘)
7)在你實現完程序之后,在下述PSP表格記錄下你在程序的各個模塊上實際花費的時間。(0.5‘)

附:PSP 2.1表格

PSP2.1 Personal Software Process Stages 預估耗時(分鍾) 實際耗時(分鍾)
Planning 計划
· Estimate · 估計這個任務需要多少時間
Development 開發
· Analysis · 需求分析 (包括學習新技術)
· Design Spec · 生成設計文檔
· Design Review · 設計復審 (和同事審核設計文檔)
· Coding Standard · 代碼規范 (為目前的開發制定合適的規范)
· Design · 具體設計
· Coding · 具體編碼
· Code Review · 代碼復審
· Test · 測試(自我測試,修改代碼,提交修改)
Reporting 報告
· Test Report · 測試報告
· Size Measurement · 計算工作量
· Postmortem & Process Improvement Plan · 事后總結, 並提出過程改進計划
合計

六、評分規則

本次個人項目分數由三部分組成,分別是
(1)博客 — 15分,分數組成在博文規范中。
(2)程序 — 35分

5分為源代碼管理評分,該評分主要通過源代碼管理中的commit注釋信息,增量修改的內容,是否有運行說明等給分。
20分為正確性評分,正確性測試中輸入范圍限制在 1-1000,要求程序在 60 s 內給出結果,超時則認定運行結果無效。
10分為性能評分,性能測試中輸入范圍限制在 10000-1000000,沒有時間的最小要求限制。
當程序的正確性評分等於20分時才可以參與性能評分環節,所以請各位同學務必保證自己程序的正確性。
性能評分將采取檔級評分制度,助教將根據同學們的程序跑同一數據耗費的時間長度將程序分為若干檔,每一檔的同學得到的分數為 10/檔級數。

(3)附加題 — 5分。
(4)注意事項:

按時間完成並提交——正常評分
晚交一周以內——0分
晚交一周以上或不交——倒扣本次作業分數
抄襲——倒扣2倍本次作業分數【嚴禁代碼與博客等一切形式的抄襲!博客園支持了對博客的查重功能,我們也有專用的代碼查重系統進行代碼查重。請各位同學千萬不要觸碰底線,勿謂言之不預也!】

(5)補考的同學,在截止時間,必須先提交部分博客和部分代碼,允許在最后一門補考結束后的48小時內,補充完整。


免責聲明!

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



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