開發記錄 Homework #3
 
要求: 實作 Question #2, #3, #4, #5, #6, #27
 

心得

            上學期我就有修老師的課,那時候是大四下,我的第一堂課就是 Week #2 的資格考(因為我不知道開學前一周要上課),考試內容大多都是以前學過的東西,更正,正確來說是有學過但完全沒有學會的東西,在大學四年完全都只是考慮會不會被當、學分會不會過,卻沒有好好的將必須具備的知識融會貫通,就連該略懂的知識都不存在腦袋中,只知道「喔!這個我有學過」,我感到非常恐慌,不是因為我會在這堂課考不好(已經推甄上,所以沒有分數壓力),而是我想到我的未來要拿什麼東西跟人家競爭,我不想向老師所說的只窮的剩下一張成功大學的畢業證書。
            我很喜歡《進擊的鼓手》裡頭的一句話:「沒有什麼比『做得好』更害人的」,「分數」其實都是假的,為什麼?大多的考題來自考古題加上一點點變化,那麼有考古題的人背答案都可以考得滿高分的,我在大一時,學長幾乎沒有給我考古題,所以我就靠"實力"上考場,我記得我第一次的考試考了 4 分,我學號上面及下面的都考了 100 分,這就是差別,大二之後,我學會了"怎樣考高分"的技巧,成績也有了起色,分數高就不會想要進步,也不會想要深入學習,作業也常常用"參考"卷哥卷姐的方式度過,到頭來我會的東西 = NULL。
            我在上學期的課學得很吃力,因為我是個會的東西 = NULL 的大四生,連一個超過 100 行的程式碼都沒寫過,更何論要去修改 freeRTOS,雖然很吃力、很痛苦,但我很開心,開心的是我不是在浪費我的青春去賺分數,而是揮灑我的青春去充實我的小腦袋,我不想再逃避學習了,唯有面對自己的不足,不斷挑戰自己的極限,學到扎實的東西才不會重蹈覆轍,才不會窮的只剩下一張畢業證書。
 
 

Q #2

 
Recursive:
char smallest_character(char str[], char c, int index)
{
    if(str[index]!= 127){
        if(str[index]>c) 
            return str[index];
        return smallest_character(str, c, ++index)
    }  
    return str[0]; 
}
 
Non-Recursive:
char smallest_character(char str[], char c)
{
        for(int i = 0; str[i] != 127; i++){
                if( str[i] > c)
                        return str[i];
        }
        return str[0];
}
 
 
效能分析:
這張圖是 smallest_character(char str[], char c)  從 a ~ z 進行比對,讓他執行 1000 次所得到的總時間比較圖,可以看到 revursive執行總時間比較長,主要因為 recursive會暫存在memory中,而多次的 access memory會造成整體時間拉長。
 
 

Q #27

參考 Leetcode 去撰寫的,他所使用的是 java,改成 c 的時候遇到array length的問題,一般求一個陣列的 length 時,會使用 sizeof( arr[ ]) / sizeof(arr[0])  ,但若在 shuffle 裡面用這種方法會得不到真正的 array  length ,據 cppreference.com 的解釋是 sizeof 是當應用在 reference type 時,結果只會 return size of the referenced type,所以只好多一個 array  length 參數給 shuffle。
程式概念:
  • 只要能夠將 int array 內的數做洗牌的動作,就等同於將52張不同花色的牌洗牌,而可以用 mod 方式去分梅花、方塊、愛心、黑桃,在這裡只做洗牌的 function。
static void swap_fun(int arr[], int i, int j)
{
        int temp = arr[i];
        arr[i] = arr[j];