July 22, 2017

[CS50] Week 1 C - 作業筆記

*此作業筆記是依據 CS50x 2017 版本(也就是哈佛大學 2016 秋季班的 CS50)所寫。

作業筆記我只會寫出我做作業時遇到的問題,或是需要特別注意的地方,但不會把完整的程式碼寫出來。也因為這個緣故,所以只能用文字與少量的程式碼描述,可能會有難以理解的地方,還請見諒。

即使課程影片我都看得懂,但是做作業時還是卡關了一下,但做完後發現其實真正難的不是如何寫出程式,而是要寫出符合作業規定的 UX 設計。

第一週的作業分四小題,第三跟第四題還有分比較簡單的(他們叫做 less comfortable) 和比較困難的(他們叫做 more comfortable)這兩種版本,每個作業說明裡面都會有助教的講解短片 Walkthrough,基本上看完 Walkthrough 後就可以抓到如何寫作業的方向,強烈建議一定要看過才動手寫。

寫完作業之後可以輸入 check50 的指令,檢查自己的作業有沒有完全符合作業要求。以 water.c 作業為例:

hello.c 這個作業就不需要特別寫筆記了,在作業解說裡面都直接有答案了 XD 只是用來熟悉 CS50 IDE 跟 terminal 的作業。

2. water.c
一開始想得太多,所以花了半個小時才寫出來,但花了一個小時 debug(XDDD)。看過 Walkthrough 之後就會知道要用 do-while loop 先判斷使用者輸入的是否為正整數,然後再計算用水量。

要注意的是作業要求的 UX 設計,仔細看作業給的範例:

有加底線的數字是使用者輸入的數字(我有用紅色線框起來),所以執行 ./water 之後,要先跑出 Minutes:,這樣使用者才知道要做什麼(UX設計),然後經過計算後算出用水量。

一開始就是沒注意到這一點,所以輸入 check50 後一直跑出錯誤:

我算出的答案是正確的,但是引導輸入 (input) 的提示是錯的。 在胡立老師的幫助下才總算知道到底問題出在哪裡,不然我一直以為是我程式寫錯了,debug 超久的 QAQ

3. mario.c
我是做 less comfortable 的版本。其實這個題目是我最後才做的作業,因為一剛開始卡住了,沒甚麼頭緒,所以先寫第四題才回頭寫這題。後來做出來之後才發現也沒有當初想的那麼難,一開始也是把題目想得太複雜了。

這題一樣要用 do-while loop 先判斷使用者輸入值,這題的正整數必須是在 0 到 22(不大於 23)的範圍。我在 int main(void) 函式內先寫一個 for loop,然後在裡面自訂兩個函式,一個處理空白,一個處理 #,兩個函式也是用 for loop 寫。所以就是一個 for loop 包兩個 for loop。

切出函式的方法在課程影片的 prototype 部分有講解,我的課程筆記 [CS50] Week 1 C - 課程筆記 裡也有寫。

要注意包在 int main(void) 裡的 for loop 裡的自訂函式的參數,要仔細觀察空白跟 # 的規律,然後放入正確的參數。

最後一樣要注意 UX 設計,仔細看一下作業要求內的範例:

執行 ./mario 之後,先跑出 Height:,一旦使用者輸入的值是不在範圍內,就要引導使用者再次輸入,一樣要有 Height: 跑出來(使用者要是輸入的是文字,則會由 C 語言自動跑出 Retry:)。

4. greedy.c
這題一樣要用 do-while loop 先判斷使用者輸入值。除了拿使用者輸入值的變數之外,還多了兩個變數,一個是把圓 (dollars) 變成分 (cents) 的變數(基本上是乘以 100),另一個是計算幾個硬幣的變數,記得要設初始值。

我參考 Walkthrough 的方法,所以用四個 while loop 去計算總共要找前幾個硬幣。這樣大致上就完成了。

但是因為這次使用者輸入的是浮點數,所以就會產生精準度的問題,用 check50 檢查,全部都通過了就只有 4.2 不能通過:

也是跟胡立老師求救才知道怎麼解。輸入 4.2 後乘以 100 事實上會是 419.99(浮點數的關係),雖然 420 跟 419 只差 1,但是找的硬幣數就從 18 變成 22。胡立老師教我的方法是把使用者的輸入加 0.005 之後再乘以 100,這樣就可以把讓最後的數字變成 420,同時不會影響其他的輸入值。

最後這題比較狡猾的地方是,第一次的問題跟之後的問題不一樣,仔細觀察範例:

第一次的問題必須要有 O hai!,如果輸入錯誤的值之後就不用,所以可以先思考如何讓問題每次都是 O hai! How much change is owed?,知道答案後再思考如何只讓第一次的問題才有 O hai!。


以上就是我自己做作業遇到的一些問題以及需要注意的地方,再次感謝胡立老師幫忙~ 筆記如果有錯還請指正。


No comments:

Post a Comment