2015年11月25日 星期三

兩本 C 語言好書與 Dev C++ 安裝

最近因為測試 ARDUINO+ESP8266 伺服器程式遇到許多問題, 突然覺得得好好搞懂 C 語言的陣列, 字串, 以及指標這三個常用的技巧. 上週六第二次去市圖總館借書, 就找到一本 C 語言的好書, 現在手邊共有三本 C 語言的書, 但我覺得以下這兩本寫得最好 :

# 碁峰, 李啟龍, 第一次學就上手-從 C 程式範例到專題製作 (第一版)
這本書今年出第二版了, 我看目錄與第一版完全一樣, 應該是賣得不錯吧! 碁峰出的書我覺得品質是數一數二的. 作者曾當選大學優良教師, 寫作風格言簡意賅不囉嗦, 例如第九章介紹字串與字元陣列, 用一張圖就清楚說明兩者的差別是, 字串就是以 \0 (NULL) 結尾的字元陣列, 寫作風格乾脆俐落.

此書附錄 B 介紹許多 C 語言的線上評測系統 (Online Judge), 可以作為參加程式設計競賽磨練程式技巧的工具 :

# ZeroJudge
# USACO
# UVA
# TIOJ
# PKUOJ
# VIJOS
# SPOJ
# URAL
# SGU

第二本好書是日本人氣作家高橋麻奈寫的 :

# 博碩, 高橋麻奈, 最新 C 語言程式設計實例入門 (第四版)


這本最棒的地方是作者會深入探討一些初學者容易搞混的觀念, 例如指標與陣列有何不同?  也詳細解說傳遞函式參數的各種方法, 特別是利用指標當引數, 解決傳值呼叫只能傳回一個值的問題. 此外書中以漫畫圖解程式的運作, 特別是資料在記憶體中的分布情形, 以利初學者能快速理解.

學習標準 ANSI C 語言需要一個編譯器, 我覺得以 Dev C++ 最適合初學者使用 (不知道為什麼, 我對微軟的 Visual XXX 就是有偏見), 目前為 5.11 版 :

http://sourceforge.net/projects/orwelldevcpp/ (約 48MB)

安裝之前務必將之前的舊版 Dev C++ 移除, 再點 Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe 安裝. 安裝語言選擇英文, 等第一次執行時再改為中文 :


按 "I Agree" 才能繼續執行 :


用預設的 Full (完整安裝) 即可 :


使用預設的安裝路徑 (也可以去掉中間的部分, 改安裝在 C:\Dev-Cpp) :



安裝完畢第一次啟動 Dev C++ 有選單可選擇使用之語言 :


使用預設值按下一步即可 :




點選 "檔案/開新檔案" 可以新增原始碼或專案, 如果只是寫個小程式, 選原始碼即可. 編寫的原始碼 (xxx.cpp) 與可執行檔 (xxx.exe) 預設是放在媒體櫃的文件下面, 這可以在 "環境選項/檔案目錄" 中更改 :


編輯器設定部分, 點選 "工具/編輯器選項", 勾選 "文字邊界範圍提示" 裡的 "啟用", 預設是 80 字元, 這樣會在編輯器第 80 行處顯示一條垂直線, 提醒我們一列敘述不要寫太長, 以免列印時反折到下一列. 另外我也把 "Tab 長度" 由預設的 4 改為 2, 因為我習慣每個階層縮兩格, 4 格太佔空間了.


這樣就可以開始編寫 C 程式了. C 程式的基本架構如下 :

#include <stdio.h>   //載入標準輸出入函式庫
#include <stdlib.h>  //載入標準系統函式庫

int main(void) {
  printf("Hello World!");   //輸出訊息至標準輸出 (螢幕)
  system("pause");  //停住執行視窗
  return 0;   //結束程式
  }

先按 Ctrl+F9 編譯程式, 若無編譯錯誤或警告再按 Ctrl+F10 即可執行, 或者直接按 F9 (編譯後執行) 亦可, 如果對程式很有信心的話.

前面 include 是給編譯器讀的前置處理指令, 告訴編譯器在進行編譯時, 要將哪些函式庫含括進來. 注意, C 程式的每一個敘述都要用分號結尾, 唯獨前置指令 include 與 define 不能用分號, 否則會編譯失敗.

最常用的函式庫是 stdio.h, 此函式庫提供如 printf(), scanf() 等常用的標準 IO 指令. 另外一個常用函式庫 stdlib.h 主要是提供系統呼叫 system() 函式用, 例如要讓標準輸出入視窗 (即命令提示字元視窗) 不要一閃而逝, 而是停住出現 "請按任意鍵繼續 ... " 以便觀察輸出結果的話, 就要呼叫 system("pause") 來達成. 不過 Dev C++ 編譯器即使沒有載入此函式庫也會自動停住等待按任意鍵, 呼叫 system("pause") 反而會停住兩次 :


故用 Dev-C++ 開發時若不需要其他系統呼叫, 其實不需要含括 stdlib.h. 系統呼叫 system() 可以讓程式執行作業系統指令, 例如 DOS 指令 dir, 如下範例會將程式所在目錄之檔案列表存入 dir.txt 檔案中 :

#include <stdio.h>   //載入標準輸出入函式庫
#include <stdlib.h>  //載入標準系統函式庫
int main() {
system("dir > dir.txt");
return 0;
}

某些編譯器即使沒有用 include 將 stdio.h 與 stdlib.h 含括進來, 還是可以呼叫 printf() 與 system() 等函式, 那是因為編譯器會自動載入此二函式庫之故. 為了移植的相容性方便, 還是照規定使用 include 為宜. 特別是使用指標時常需要呼叫動態配置記憶體的函式 malloc() 與 free(), 這兩個函式都放在 stdlib.h 裡面, 一定要含括進來才能使用.

含括進來的函式庫因為都擺在最前面, 故又稱標頭檔 (header files). 在 Dev-C++ 編譯器裡, 所有內建函式庫放在 C:\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include 下 :


進行編譯時, 指定的函式庫檔案就會被載入取代 include 指令. 最後是關於主程序 main() 的傳回值 int 與參數 void, 這兩個都沒有加的話, 在 Dev-C++ 都不會編譯錯誤, 不過為了可移植性, 還是加比較好.

為了編輯方便, 也可以將自己常用的程式片段做成樣板, 要用時可以立刻插入程式中, 點選 "工具/編輯器選項/插入程式碼", 按 "新增", 在項目名稱欄中為此樣板取名, 然後將程式片段貼到下方輸入框, 按確定即可 :


要插入樣板, 點選 "編輯/插入文字" 或第二排工具列最左邊的插入鈕, 即可挑選要插入之程式片段 :


雖然我學 C 的主要目的是為了掌握 Arduino 的嵌入式應用, 但因為去年用 Java 幫公司寫的大量數據擷取分析程式執行效能普普, 我打算將 Java 的數據處理函式庫改寫成 C 語言版本, PK 一下到底 C 語言在效能上有多優越. 關於 C 歷四十餘年而不衰, 且越來越紅火, 參考 :

# C 語言秘技 (1) – 使用 sscanf 模仿正規表達式的剖析功能 (作者:陳鍾誠)

此文提到用 sscanf 來模仿正規表示法, 正好用得上. 誠如此文作者所言, 程式語言如過江之鯽, 今日之星轉眼成昨日黃花, 而 C 因為擁有指標功能, 使其兼具高階與低階語言雙重身分, 寫驅動程式少不了它, 故能歷久不衰, 學習 C 的投資報酬率要以一輩子來衡量, 而不是十年二十年, 更何況 C 是掌握 Linux 內核的必殺技, 非學不可.

其他參考資料 :

# 在 C 程式中,使用 Regex (Regular Expression) library
# Using Regular expression in C/C++ 
# C 語言,使用 Regular Expressions
# 正規表示法:規則篇 (這個好)


3 則留言 :

小A 提到...

請問小狐狸大大
我學習C語言不太久
請問 開新檔案時,選擇 原始碼 跟選擇 專案 有什麼不同呢
我選擇專案,然後再選擇console application
跑出來
#include
#include

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
return 0;
}

其實就跟我自己開原始碼寫的一樣呀
還是其實有什麼不一樣的差別呢?


會問這個問題是因為,我看到網路上有人寫說
最好不要使用DEV C 這個IDE入門,會導致以後不會開專案
所以我才想研究一下開專案到底是什麼意思

先謝謝您了^^

小狐狸事務所 提到...

小 A 您好, 初學者都是從單一程式學起, 所以用 New Source File 開啟單一的檔案即可. 簡單的應用只要單一檔案應該就可以解決. 如果是較複雜的應用, 基於模組化設計原則可能要分成多個程式, 除此之外可能還需要文字檔,
圖檔, 資料庫或多媒體等檔案, 這些組合起來就是一個專案. 參考 :
https://www.cs.pu.edu.tw/~tsay/course/objprog/slides/newproj.html
另外對是否使用 IDE 看法見仁見智, 我個人覺得程式基本功非常重要, 但做專案要求的是開發速度, IDE 在這方面可以助我們一臂之力, 況且 DEV C++ 也只是很陽春的 IDE 而已. 我個人因從未用 C 寫過甚麼大專案, 一直以來都用比記事本好用一點的 EditPlus 編輯器做單檔編輯而已. 以前玩 Java 時看到龐然大物的 Eclipse 就讓我毛骨悚然哩!

小A 提到...

謝謝小狐狸大大解答和經驗分享^^