CS50 wk3 + C 學習心得

本週關鍵詞:

  • algorithms
  • searching(linear search, binary search)
  • data structures
  • sorting(selection sort, bubble sort,merge sort)
  • recursion
  • running times

我不會寫課程筆記,只是紀錄下課程的關鍵詞。因為:

1.電腦科學裡的內容很多,也不可能所有的都記住,學過然後通過作業複習所學掌握個三五成也ok,等到再次需要用的時候還可以再google。

2.沒辦法像別的學科一樣寫課程筆記,要學的太多太費時間。

3.寫了筆記幫助也有限,主要要靠實際寫code。

課程心得:

這周最大的心得是稍微理解電腦的思維。電腦只有兩種能力,一是運算,二是存儲,不像我們人腦這麼聰明。這週教授多次非常形象的解釋了這個問題。

比如看一下下面這串數字找出最小。我們人類的大腦一眼就看出來了。

但是電腦不一樣,對於電腦來說,它先打開一個門,發現一個數字4,存儲起來,然後在打開一個門,然後運算(4比6小),所以存儲4,然後再開一個門,再運送(4比8小),再存儲4,如此循環直到最後。

寫程式就是用電腦的思維來指導電腦一步一步的指導電腦幫我們計算。

作業心得

1.tideman

因為CS50群組裡的人都說tideman最難,激起我想要挑戰(自虐)的心。

紀錄下歷程:每天花費約2-3小時。

day1,光看題目就頭暈眼花,發現理解題目的邏輯都很困難。花了3個小時搞懂問題,在紙上演算下每一個步驟。

day2,試(猜)了很多次勉強寫出了vote function,弄懂了record_preferences(int ranks[])的機制,但是對2d array沒有很懂,不知道怎麼轉成code。

做完一個步驟可以run一下check50,看看這個步驟對了沒有。

day3,在紙上演算,徹底弄懂preference的邏輯,但是卻不知道怎麼用recursion寫出preference的code。google了recursion的一些視頻看還是沒有頭緒,決定放棄。然後又感覺用nested loop應該可以寫出來,複習了雙重loop怎麼一步一步執行(Need of Nested Loops in C),最後成功寫出record_preferences。

我發現解決這一步驟的關鍵在於先在紙上找出來解決方案,加上徹底理解nested loop。

day4,add_pairs 比前面兩個簡單,花了30分鐘完成。寫了sorted pairs,沒有成功。提交作業,發現竟然有71%,過關。

day5,試著用insertion sort來解但是不知道怎麼暫存const,放棄。google了下知道可以用pair temp來暫存,準備換bubble sort來試試看。學習了bubble sort的code(Bubble Sort Algorithm| Data Structures),最後真的寫出來了。

day6,locked pairs,試了很多次還是不行,讀了文章才發現自己邏輯的漏洞,學習recursion。loser如果是任何locked winner的話就不能lock,所以必須要用recursion。

day7-10,看了recursion的視頻還是沒辦法解開locked pairs,準備先放下,等學完week4和week5再來解題。接著卡在這裡的話,注意力被最近的戰爭的新聞吸引走,估計就沒辦法完成課程了。

2.Plurality,總共花了3小時

睡前花了2個小時還是沒有頭緒,然後睡覺的時候做夢也是在解這道題。

早上起來google“find the biggest in array in c”,然後找到部分解答,獲得87%分數。

 void print_winner(void)
{
   int i = 0;
    for (i = 0; i < candidate_count; i++)
    {
        if ((candidates[0].votes) < candidates[i].votes)
        {
             candidates[0].votes = candidates[i].votes;
             candidates[0].name = candidates[i].name;
        }
    }
    printf("%s\n",candidates[0].name);
    return;
}

然後搜索了下別人的做法,發現我只做了一步,那就是找出最大值,而少了第二步:每個候選人的票數和最大值比較。

所以這不是code的問題,而是自己邏輯的問題。

void print_winner(void)
{
    // TODO
    int max_votes=candidates[0].votes;
    int i = 0;
    for (i = 0; i < candidate_count; i++)
    {
        if (max_votes< candidates[i].votes)
        {
             max_votes = candidates[i].votes;
        }
    }
    for (i = 0; i < candidate_count; i++)
    {
        if(candidates[i].votes==max_votes)
        {
        printf("%s\n",candidates[i].name);
        }
    }
    return;
}

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *