CS50 week 1 - C 筆記
大家好,我是 Cindy,最近跟同事小夥伴相約一起看 CS50 的課程,CS50 (Introduction to Computer Science)是一堂美國哈佛大學知名的通識課程,完全免費,在 edx 或 youtube 或 CS50-Study-Group github 都可以非常容易地看到。
這系列的文章會是我的個人筆記,歡迎有興趣的人一定要自己去看看 CS50 的課程歐。
今天這篇是 CS50 week 1 筆記,想先看 week 0 筆記的各位觀眾可以先點 這裡 唷!
這堂課運用了上一堂課學的 scratch 與 C 語言的對應程式碼,來讓學生更容易進入 C 語言的世界呢!
一開始講者提醒學生們,寫程式碼除了要 correct 以外,也應該要是 well design & well style。
compiler
1 |
|
我們寫了一段程式碼,其中 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 |
.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 | void meow(int n) |
float 的限制
當我們的數字是無限大時,或我們想要顯示小數點後面更多的數字時,電腦會因為記憶體有限的關係,在某位數做四捨五入讓數字變的不是那麼精確。越精確就會需要更大的空間。但我們無法精確的計算無限大的數字,因為我們沒有無限大的空間。
integer overflow
因為電腦的硬體容量是有限的,假設我們只有 3 位元的容量時,當我們要從二進位的 111 再繼續進一位的時候,就會變成 000,應該是 1000,但因為總共只有 3 位元,所以進一位之後只剩下後面的 3 位元,而出錯了,Y2K bug 就是因為這樣的問題而產生的 bug。而因為目前我們是用 32 位元來計算時間,也就是說最多只能算到 40 億,而未來 2038/1/19 我們將會面臨到一樣的問題。
總結
這堂課大部分的重點都在教 C 語言的語法,筆記就不詳細寫了,有興趣的人也可以直接看官方的筆記,老實說 C 跟 Ruby 寫起來還真是像,不愧是 CRuby (?),大概只差在 C 要先做型別的宣告然後多了比較醜的大括號XD,少了人性化的寫法(?)。