本書主要針對高中與大學開始接觸程式設計的初學者,及想學好程式設計的讀者所設計。書中文字敘述力求淺顯簡潔,並以大量範例、片語、學習要點、風格要點等方式,逐步引導初學者進入程式設計的領域。
二版新增C99語法,如bool類別、顯示位元數整數類別、放寬變數宣告位置、stddef的offsetof及stdlib的二分搜尋bsearch等重點介紹。以更多完整範例、相關圖示說明複雜的觀念與方法,同時強化各範例間的關聯性,讓讀者能從中反覆練習、更瞭解所學之實際應用。
本書特色
1. 以片語為主,依據慣用寫法來引導初學者進入C語言程式設計。
2. 透過「學習要點」、「風格要點」、「特殊字元」等設計,隨時提醒讀者各項學習重點,以提升學習效率。
3. 本書搭配專屬網站(https://sites.google.com/view/c-programming-with-idioms-2ed/home),提供各章練習題、作業、教學投影片,並隨時更新相關補充資料、程式碼等資訊。
作者簡介:
劉邦鋒
現任
國立臺灣大學電機資訊學院美光講座教授、資訊工程系暨資訊網路與多媒體研究所教授
學歷
美國耶魯大學計算機科學博士
研究專長
平行分散式系統、演算法設計與分析
講授課程
計算機程式設計、高等程式設計、物件導向程式設計、平行程式設計等。
作者序
二版前言
第二版除修正第一版錯誤外,還作了以下大改變。
•取消所有的作業:
隨著我教書的時間增加,作業題目數量也一直增加,這些新增加的題目就沒有辦法加入紙本書中。我的想法就是放在網路上,這樣就能動態增加。詳情請參酌本書網站。https://sites.google.com/view/c-programming-2ed/home
•採用C99語法:
現在大部份的編譯器(例如gcc)都已經直接支援C99語法,所以本書也將C99語法作重點式的介紹。
– 增加bool類別的介紹。
– 增加明白顯示位元數整數(如int64 t)類別的介紹。
– for迴圈自帶註標變數。
– 放寬的變數宣告位置。
– stddef的offsetof。
– stdlib的二分搜尋bsearch。
•增加較完整的例題:
增加了許多較完整例題,讓同學了解所學技術的應用。其中包括了一個簡易BASIC 直譯器。相信同學在了解直譯器原理後,更能體會高階語言的運作。
•加強例子的關聯性:
增加了許多互相有關聯的例子。例如一個舊例子可以用剛學習過的新方法重寫一次,讓同學了解所學方法的實際應用。
•調整觀念順序:
第一版重視觀念應該在哪一章節出現。例如define就應該在前置處理章節。第二版重視觀念應用的需要。如果define適合在前面的例子出現,就提前介紹,不用拘泥章節。
•增加圖示:
增加了許多圖示。幫助了解複雜的觀念。
另外,第二版還有一個重大的改變,就是把「批改娘」(Judge Girl)放上封面。「批改娘」是我在2003年為臺大資訊系所開發的程式批改系統(https://judgegirl.csie.org/)。為甚麼要有這套線上批改系統?由於當時並沒有任何簡單好用的線上批改系統。學生交了作業,也不知道對錯。考試都是在考卷上寫程式,老師也不知道程式對不對。有鑒於此,我在2003年寫了第一版的批改娘系統。學生可以將程式提交給批改娘系統,然後系統會批改程式,並立即計算作業或是考試的得分。學生的反應很正面,因為他們可以當場就知道作業或是考試答案是否正確。這對學習程式非常有幫助。臺大資訊系也成為國內第一個在程式課程中,捨棄紙筆考卷,使用上機實測考試的系所。關於批改娘詳細的使用說明請見本書第1章。
為了說明方便,我開始使用「批改娘」稱呼這個批改系統。「批改娘」也成為臺大資訊系的學生,在學習程式設計過程中不可磨滅的回憶。所以從第一代批改娘開始,其設定就是「答錯就斬除」的鐮刀女巫。對資訊系的學生而言,批改娘就是青春的回憶和象徵,具有重大意義。
十六年來,批改娘默默的編譯、執行、評分,陪伴著臺大資訊系大一學生學習程式。現在的批改娘系統早已不是當初我建立的陽春版本。經過歷代助教的整理改良,她已經成為一個在github上的開源軟體項目。「批改娘」圖像也在2010年經由學生競圖選出,進化成為目前大家所看到的,臺大電信所施光祖博士創作的第二代。無論如何演進,批改娘就是臺大資訊系學生大一生活的一部分。不管程式寫的對或不對,不變的是臺大資訊系同學們對程式設計的熱情與投入。今天我決定在教科書封面上放批改娘,就是要紀念這段歷史,也是對臺大資訊系同學們努力付出時間、學習程式的最高致敬。
同時,我想藉這個機會感謝所有批改娘系統的參與人員。首先,感謝歷代助教上官林傑、陳映睿、王尹、蕭俊宏、鍾以千、曹佐碩、黃易、李宗翰、許祐程、王盛平、曹又霖、楊翔雲的整理改良。感謝第一代原畫江昌鴻、第二代原畫施光祖。最後要感謝臺大出版社的編輯團隊,很有耐心的傾聽批改娘的背景故事。讓批改娘能站上臺大教科書封面,見證這段批改系統在臺大由無到有的歷史。身為這本書的作者,能得到這麼多朋友的幫助,我感到十分榮幸。
最後,雖然已經經過無數次的校對,但目前的版本可能還是有一些錯誤。如果您發現任何錯誤,歡迎寄信到pangfeng.liu@gmail.com。感謝。
二版前言
第二版除修正第一版錯誤外,還作了以下大改變。
•取消所有的作業:
隨著我教書的時間增加,作業題目數量也一直增加,這些新增加的題目就沒有辦法加入紙本書中。我的想法就是放在網路上,這樣就能動態增加。詳情請參酌本書網站。https://sites.google.com/view/c-programming-2ed/home
•採用C99語法:
現在大部份的編譯器(例如gcc)都已經直接支援C99語法,所以本書也將C99語法作重點式的介紹。
– 增加bool類別的介紹。
– 增加明白顯示位元數整數(如int64 t)類別的介紹。
– for迴圈自帶註標變數。
– 放寬的變數...
目錄
前言
二版前言
關於「批改娘」
1 程式設計
1.1 程式
1.2 設計
1.3 程式批改系統
2 基本程式架構
2.1 程式骨架
2.2 變數
2.3 輸出
2.4 輸入
3 運算
3.1 指定
3.2 算術運算
3.3 整數的範圍
3.4 比較運算
3.5 邏輯運算
4 判斷
4.1 if判斷
4.2 判斷式值
4.3 switch判斷
5 迴圈
5.1 while迴圈
5.2 for迴圈
5.3 do while迴圈
5.4 使用break結束迴圈
5.5 使用continue繼續迴圈
5.6 多重迴圈
5.7 迴圈範例
6 陣列
6.1 屬性
6.2 一維陣列
6.3 多維陣列
7 浮點數
7.1 宣告
7.2 輸出與輸入
7.3 類別轉換
7.4 計算
8 函式
8.1 呼叫函式
8.2 定義有回傳值的函式
8.3 定義無回傳值的函式
8.4 多個參數的函式
8.5 不定個數參數
8.6 參數傳遞
8.7 函式的優點
9 指標
9.1 用法
9.2 指標參數傳遞
9.3 指標與陣列
9.4 回傳值
9.5 用途與限制
10 字元
10.1 宣告
10.2 輸出
10.3 字元常數
10.4 輸入
10.5 常用函式
11 字串
11.1 宣告
11.2 輸出
11.3 字串常數
11.4 輸入
11.5 字元指標
11.6 字串函式
11.7 簡易BASIC直譯器
12 宣告修飾
12.1 short、long及long long
12.2 signed及unsigned
12.3 C99
12.4 const
12.5 static
13 位元運算
13.1 位元且
13.2 位元或
13.3 位元互補
13.4 位元互斥或
13.5 移位
14 結構
14.1 定義
14.2 初始化
14.3 欄位
14.4 結構指標
14.5 參數傳遞
14.6 typedef
14.7 結構標頭檔
14.8 簡易BASIC直譯器
15 遞迴
15.1 定義
15.2 應用
15.3 效能考量
16 檔案處理
16.1 開啟與關閉檔案
16.2 文字檔案處理
16.3 二進制檔案處理
16.4 EOF測試
17 資料結構
17.1 動態記憶體配置
17.2 assert
17.3 鏈結序列
17.4 二元樹
18 物件
18.1 堆疊
18.2 堆疊的陣列實作
18.3 括號平衡
18.4 對稱字串
18.5 堆疊的鏈結序列實作
18.6 物件的優點
19 前置處理
19.1 #include
19.2 #define
19.3 #if, #ifdef, #ifndef
19.4 #
19.5 _ LINE_ _ FILE_
19.6 ##
20 C標準程式庫
20.1 qsort
20.2 二分搜尋
20.3 轉換函式
20.4 隨機數
20.5 exit
21 高等技術
21.1 命令列參數
21.2 導向
21.3 全域變數
22 不想教的東西
22.1 goto
22.2 全域變數
22.3 格式字串
22.4 指標技巧
22.5 修改記憶體
22.6 征服銀河系
徵引書目
前言
二版前言
關於「批改娘」
1 程式設計
1.1 程式
1.2 設計
1.3 程式批改系統
2 基本程式架構
2.1 程式骨架
2.2 變數
2.3 輸出
2.4 輸入
3 運算
3.1 指定
3.2 算術運算
3.3 整數的範圍
3.4 比較運算
3.5 邏輯運算
4 判斷
4.1 if判斷
4.2 判斷式值
4.3 switch判斷
5 迴圈
5.1 while迴圈
5.2 for迴圈
5.3 do while迴圈
5.4 使用break結束迴圈
5.5 使用continue繼續迴圈
5.6 多重迴圈
5.7 迴圈範例
6 陣列
6.1 屬性
6.2 一維陣列
6.3 多維陣列
7 浮點數
7.1 宣告
7.2 輸出與輸入
7.3 類...