CS50 week 1 - C 筆記

👀 4 min read 👀

大家好,我是 Cindy,最近跟同事小夥伴相約一起看 CS50 的課程,CS50 (Introduction to Computer Science)是一堂美國哈佛大學知名的通識課程,完全免費,在 edxyoutubeCS50-Study-Group github 都可以非常容易地看到。

這系列的文章會是我的個人筆記,歡迎有興趣的人一定要自己去看看 CS50 的課程歐。

今天這篇是 CS50 week 1 筆記,想先看 week 0 筆記的各位觀眾可以先點 這裡 唷!

這堂課運用了上一堂課學的 scratch 與 C 語言的對應程式碼,來讓學生更容易進入 C 語言的世界呢!

一開始講者提醒學生們,寫程式碼除了要 correct 以外,也應該要是 well design & well style。

compiler

1
2
3
4
5
6
#include <stdio.h>

int main(void)
{
printf ( "hello, world" );
}

我們寫了一段程式碼,其中 printf () 中的 f 代表 format,分號告訴電腦結束,但是依照上一堂課學到的,電腦只懂 binary,也就是一切用 1 和 0 表示的世界,所以我們會需要作轉換,讓電腦讀懂我們寫的程式碼,而這轉換的方式我們稱為 compiler。

過程如下:
source code -> compiler -> machine code

指令:

  • clang 將 source code 轉成 machine code。
  • make + 名稱,這個指令會做 compiler ,並用 make 後面的名稱產生同名可執行的檔案,例如 make hello。

最後會產生一個 hello 檔案,接著可以用 ./hello 執行產生的檔案。

header files

1
2
#include <cs50.h>
#include <stdio.h>

.h 表示 header,#include <stdio.h> 讓我們可以直接使用前人寫好的 printf function。
#include <cs50.h> 讓我們可以直接使用 cs50 提供給我們的 library。

錯誤

當出錯時翻到最上面找錯誤,因為錯誤可能在一開始就發生並且導致後面其他堆疊的錯誤出現,錯誤訊息會告訴我們錯誤發生在第幾行第幾列,另外可以使用 cs50 團隊寫好的 help50 指令獲得更清楚的錯誤訊息,例如執行 help50 make hello

style

可以使用 style50 做風格檢查,例如執行 style50 hello.c,做風格檢查最重要的目的是要寫出可讀性高的程式碼。

註解

註解應該是要講這個程式的目的,而不是講這個程式碼在做什麼,因為這個程式碼在做什麼直接看程式碼就知道了,不需要再寫一次。

Command-Line

一些常用的指令:cd, cp, ls, mkdir, mv, rm, rmdir。

Types

可以參考這裡

  • int: integer,表示只使用 32 位元的整數,超過 40 億的數字將無法計算
  • long long: long integer,64 位元的整數。
  • float: 浮點數是具有小數點的數字,只使用 32 位元。
  • double: 使用 64 位元的 float,讓我們可以做更精確的計算。
  • char: 要用單引號不能用雙引號,表示一個字符(byte)。

如果用 integer 相除的話,會回傳 integer 的結果,可以直接在變數前面用括號重新定義 type。
例如:

1
float z = (float) x / (float) y

語法

將以下這段程式碼放在檔案上面,表示先告訴電腦有這些定義的 function。
第一個 void 表示沒有任何返回值,第二個 void 表示不接收任何輸入。

1
void meow(void);

第一個 void 表示沒有任何返回值,第二個 int n 表示接收 integer n 這個引數。

1
2
3
4
5
6
7
void meow(int n)
{
for (int i = 0; i < n; i++)
{
printf ( "meow\n" );
}
}

float 的限制

當我們的數字是無限大時,或我們想要顯示小數點後面更多的數字時,電腦會因為記憶體有限的關係,在某位數做四捨五入讓數字變的不是那麼精確。越精確就會需要更大的空間。但我們無法精確的計算無限大的數字,因為我們沒有無限大的空間。

integer overflow

因為電腦的硬體容量是有限的,假設我們只有 3 位元的容量時,當我們要從二進位的 111 再繼續進一位的時候,就會變成 000,應該是 1000,但因為總共只有 3 位元,所以進一位之後只剩下後面的 3 位元,而出錯了,Y2K bug 就是因為這樣的問題而產生的 bug。而因為目前我們是用 32 位元來計算時間,也就是說最多只能算到 40 億,而未來 2038/1/19 我們將會面臨到一樣的問題。

總結

這堂課大部分的重點都在教 C 語言的語法,筆記就不詳細寫了,有興趣的人也可以直接看官方的筆記,老實說 C 跟 Ruby 寫起來還真是像,不愧是 CRuby (?),大概只差在 C 要先做型別的宣告然後多了比較醜的大括號XD,少了人性化的寫法(?)。