2015F Faker's Note HW3 

作業說明 

  • Question #2, #3, #4, #5, #6, #27
  • 除了修改程式,也要編輯 Hackpad 下方「+作業區」,增添開發紀錄和 GitHub 連結 
  • 額外要求觀賞電影《進擊的鼓手》,思考這 4 週以來,課程給你的衝擊 (若你沒衝擊的話,可以退選了),在自己的 Hackpad 紀錄心得,特別是對於追求卓越這件事
  • 應該要有完整的測試程式,並測試各項邊界狀況 
  • 執行時間分析
  • 記憶體需求分析
  • cache miss 分析
  • 時間複雜度分析
  • 善用 assert
  • 提供遞迴與非遞迴的版本
 
  • 使用astyle維持固定coding style
$ astyle --style=kr --indent=spaces=4 --indent-switches --suffix=none *.[ch]
 
argc & argv
1、argc與 argv為C語言的關鍵字,是專門用在命令列的參數名。
2、argc是argument count(參數總和)的縮寫,代表包括指令本身的參數個數。系統會自動計算所輸入的參數個數。
3、argv則是argument value的縮寫。代表參數值。也就是使用者在命令列中輸入的字串,每個字串以空白相隔。同時,系統會自動將程式本身的名稱指定給argv[0],再將程式名稱後面所接續的參數依序指定給argv[1]、argv[2]….。
 
putchar()、getchar()、puts()、gets()
如果您只想取得使用者輸入的字元,則可以使用getchar(),它直接取得使用者輸入的字元並傳回;
如果只想要輸出一個字元,則也可以直接使用putchar()
如果您輸入了兩個以上的字元,則getchar()會取得第一個字元並將第二個字元留在緩衝區中直到您使用getchar()或scanf()再次嘗試取得輸入。
如果想要取得使用者輸入的整個字串,則可以使用gets(),它會取得使用者的輸入字串,不包括按下Enter的換行字元碼,而想要輸出整個字串,也可以直接使用puts(),它在輸出字串後,會直接進行換行
 
 
assert() 原型定義在 assert.h,接受一個表達式作為參數,當表達式為 false 時,會向 stderr 送出錯誤訊息,並調用 abort() 中止程式。
其缺點是頻繁調用會影響程序的性能,debug 完成後應在包含 assert.h 的 #include 敘述之前定義 NDEBUG,如下
#define NDEBUG
#include <assert.h>
或者使用 gcc 編譯時,加入 -DNDEBUG 參數,如此 assert() 便不會被編譯執行。
 
示意:
assert(<expression>);
此表達式應為程式中不會出現的情況(condition)
如果違反則會abort程式,並顯示程式中違反了此條expression(assertion),檔名,行號
 
輸入格式符號輸入資料型態:
  • %d整數
  • %f浮點數
  • %c字元
  • %s字串
  • %e科學符號
  • %u不帶符號10進位整數
  • %o8進位整數
  • %x16進位整數