# Homework 01 > 這份作業主要由國立臺北科技大學 109 資工系黃漢軒所命題,若有任何的問題,非常歡迎使用以下的聯絡方式提問: > > Email: t10950031@ntut.org.tw/MS Teams: 黃漢軒/Telegram: @xuan910625 ⚠️ Due: 11:59 p.m., dd / MM / yyyy ⚠️ ## 作業目標 這份作業主要希望你能夠熟悉以下的事項,以利於跟進未來課程的發展: - [x] 【環境與工具】熟悉如何使用 Git,並將解答上傳至 GitLab,以及熟悉 Jenkins 相關的操作。 - [x] 【環境與工具】學習如何使用 Google Test 來撰寫測試案例。 - [x] 【核心能力】熟悉 C++ 的語法。 - [x] 【核心能力】能夠具有解決問題的邏輯能力。 ## 檔案架構 請確認提交是否符合以下的檔案架構,否則無法進行評分。 ``` <To Be Implement> ``` ## 題目敘述 給你一個長度為 $N$ 的陣列,陣列上有不重複的數字 $0-(N-1)$。 請驗證從第一個元素開始遍歷,每次遍歷時,將索引的位置移至當前元素的索引值,確認執行 $N-1$ 次遍歷後是否能夠遍歷所有的元素。 例如,若我們有一個 $N=3$ 陣列 $[2, 0, 1]$ - 第一次:第一個元素是 2,因此遍歷完第一個元素後,移至索引值為 $2$ 的元素 $1$。 - 第二次:元素值是 $1$,遍歷索引值為 $1$ 的元素 $0$。 因此 $N=3$ 的陣列 $[2, 0, 1]$ 可以透過執行 $N-1$ 次的步驟完整遍歷所有的元素。 請查看任務子章節來瞭解需要完成的事項。 ## 題目任務 ### 第一部分:撰寫程式 在 `traversal.h` 中具有未完成的函式,函式傳入陣列長度 $n$ 與數字陣列 $arr$,請根據傳入的陣列長度與陣列,來判斷該陣列是否能夠透過題目敘述的方法遍歷所有的元素,若能夠滿足題目上的要求,請回傳 `true`,否則請回傳 `false`。 查看 `traversal.h` 來取得更多資訊。 ### 第二部分:撰寫測試案例 在 `/test` 資料夾中,具有測試執行檔(`ut_main.cpp`)與測試標頭檔(`ut_traversal.h`),請在測試標頭檔上,使用 `Google Test` 來測試函式是否正確。 查看 `ut_traversal.h` 來取得更多資訊。 ### 第三部分:確認撰寫的測試案例能夠使題目達到高於 95% 的覆蓋率 使用 `gcovr` 來得到撰寫的測試案例在程式中的單元測試覆蓋率,並確保達到覆蓋率高於 `95%`。 查看環境安裝入門指南來熟悉單元測試的操作。 ## 題目評分 - [55 分]第一部分,依照是否通過隱藏測試給予分數 - 若未通過隱藏測試,則該部分配分為 $0$ 分。 - [45 分]第二部分 + 第三部分 - 若未撰寫測試,則第二部分與第三部分的分數均為 $0$ 分。 - 若未通過自己撰寫的測試,則第二部分與第三部分的分數均為 $0$ 分。 - 若通過自己撰寫的測試,但測試覆蓋率未高於 95%,分數為 $25$ 分。 ## 注意事項 - 若你想要有空指標,請將指標賦值(assign) `nullptr` ,這個特殊的指標可用於指向不存在的東西。 - 對於 Google Test 的測試函數: - 使用 `ASSIGN_EQ` 來測試不會有精度誤差的值(例如:整數、字串等) - 使用 `ASSIGN_NEAR` 來測試具有精度的值 - 使用 `ASSIGN_THROW` 來測試該函數會不會拋出例外 - 使用 `ASSIGN_FALSE` 來測試該值是否為 `false` - 你不應該上傳 `/bin` 資料夾至專案上。 - 你的功課不應該出現 Memory Leak,否則將會扣除作業總分 $10$ 分。 - 你不應該上傳 `/bin` 資料夾至專案庫,編譯結果不應該上傳至專案庫上,若在助教確認功課評分時 `/bin` 資料夾存在在專案庫中,扣除作業總分 $5$ 分。 - 你可以使用 `debugger` 工具來進行除錯,有利於尋找漏洞與理解漏洞為何會發生。 ## 作業迷因 ![img](https://i.imgflip.com/7xstyi.jpg)