C語言學習歷程分享 C語言

圖片來源暫無說明

C語言學習歷程分享

1. 先打好基礎再開始吧

 

如果是第一次接觸的程式的話,建議先打給基礎功,了解初步的概念後再著手進行,以下提供些重點讓大家了解。

 

 (1) 組成電腦硬體五大單元 - input, output, 控制, 算術邏輯, 記憶單元。這些單元通常都是剛學道都會接觸的,代表它是比較偏 "軟體應用與概述" 的計概

 

 (2) 數的表示法 - 數的表示法有分成 "有號數與無號數",有號數代表可正可負,無號數一律大於等於零。
     (2.1) 無號數表示法 - 分2進制、8進制、10進制、16進制表示法,在此你必須每個進制都可以相互轉換。
     (2.2) 有號數表示法 - 符號大小表示法、1補數表示法、2補數表示法。
     (2.3) ASCII 表 - 要知道 ASCII 表是什麼東西,至於 UTF, UNICODE, 這也是必備的知識, 初學者請一定先了解 ASCII,UTF, UNICODE 等編碼, 特別是 ASCII 一定要特別熟。


(3) 基本邏輯閘 - and, or, not, xor, 主要這四項特性、真值表要記下來,另外 nand, nor, xnor 也常用,但C語言裡面暫時用不到。在學習這部份的時候,要特別注意 "MASK" 的用法,比如說將前4bits設成1(or),將後4bits設成0(and),取該數的前8bits(and)等等之類,這些都用邏輯閘就辦得到。另這部份也有所謂的 "第摩根" 定理,這個定理要會化簡。掌握以上原則,基本上這章就過去了。這部份內容不多,但很實用。

 

(4) 認識命令提示字元 - 若是習慣使用windows系統,按下 "開始" -> "執行" -> 輸入 "cmd.exe" 後,按下 enter, 這個程式若熟的話以後有很多事情很方便,可以先熟悉以下指令的語法: cd, dir, rd, md, delete, copy, xcopy。

 

(5) 了解絕對路徑與相對路徑之關係 - 下列列出四個路徑名稱,必須要會判別所代表的意義,四個都知道後,這部份也大功告成了。
     (5.1) "D:\Folder\A.txt"
     (5.2) "A.txt"
     (5.3) "..\A.txt"
     (5.4) ".\A.txt"

 

以上五個重點是剛學習程式語言重要的入門,希望打家可以熟記

 

2. 準備一本好的工具書

在學習程式語言的過程當中,需要一本好的工具書是必要的,挑一本好的工具書,可以讓初學者事半功倍。簡單的書會遇到二個問題:(1) 它給你的觀念大多是用比喻的,但卻也可能誤導你成錯誤的觀念 (2) 基礎,但比較深入的部份可能會跳過。而個人也覺得聖經版的書實在是很適合初學者看的書,很多人聽到 "聖經版" 就有點害怕,倘若聖經版寫得東西還不夠清楚、不能讓人理解,實在也不知道有哪本 c/c++ 的書可以讓人了解。而在書的挑選方面,個人覺得 C++ 沒有提到 template, class, 繼承、封裝、多型等特性的,就不叫 C++ 的書,充其量也只能叫 "披著C++的C" ,如果那本書除了上述的東西,後面還有講到 STL 使用的話,那這本書C++ 「對初學者」而言應算是夠了。在此列出幾本 c/c++ 的書供各位參考:

 

 (2.1) C語言
       (2.1.1) C語言教學手冊 - 洪維恩, 旗標, 目前應該是 4e。這本書網路上很多初學者都推,唯章節排版順序與筆者教學順序差很多,敘述上部份有所歧義。


       (2.1.2) The c programming language 2e - Brian W. Kernighan, 這本可說是 C 語言聖經版, 另有中文版:C 語言程式設計 (The C Programming Language, 2/e)- 蔡文能, 培生。這本書為筆者目前看過 C 語言裡最好的一本書,不論是章節排版順序或講解都算清楚,唯指標部份還可以再更好 ( 目前筆者沒看到指標部份用圖解講得很詳細的書 ) 。


       (2.1.3) C programming : A modern approach ,這本書屬較進階在看,若想加深一些知識可考慮這本。

 

 (2.2) C++
       (2.2.1) The C++ Programming Language 3e,  Bjarne Stroustrup, 這本書是C++發明人寫的, 偏向於語言的定義, 是一本 C++ 語言的參考書, 但個人覺得較不適合初學者用,如果你摸了c++一段時間的話,倒是可以看這本書增強對語言的熟悉度


       (2.2.2) C++ Primer 5e/4e, Stanley B. Lippman, 這本書很有名, 初學者也蠻適合的, 國內侯捷侯老師亦有譯書


       (2.2.3) Essential C++ , Stanley B. Lippman

 

筆者開頭是學C,而且書是跟別人借十幾年前的 turbo C, 後來才看 C++ Primer, 此外沒有 C 語言的書, 一開始光是挑書就挑錯了。事實上C++被推的原文書預計至少有30本以上,為避免最後大家不知道要挑什麼,只列出三本出來。在此要強調,如果不幸看到 turbo C 的書或文章、軟體,就不要理它了,那個東西已經被砍掉了。

 

3. 請扎扎實實的熟讀

 

沒有說學會 C 語言後只要看 C++ 的類別、繼承、例外處理部份就好的事!即使你有C語言的基礎,也要從頭到尾看完、實作完一本C++的書。發現很多人學程式語言看書的時候

 

4. 請多加實做練習

 

如果後面的習題是屬於 "挑錯" 的話,這是增強觀念,往往書本上每個章節都有範例可以看,初學者不論是對軟體使用或是語法特性都有著不熟的情形發生,這些都必須靠反覆的實做才能熟練。等基本語法、軟體都熟悉之後,才可以試試是不是真的可以用想的就能做出七、八成的東西;事實上,沒有任何一位程式設計師不經歷反覆上機實作練習這個階段,只有重覆實作才能加深對語法及 IDE 之熟練度。

 

5. 善用 Complier/IDE 軟體

 

如果照著別人的範例打一次,一開始可能會有漏打的可能。請注意程式錯是錯在哪,這些IDE軟體會透露,現在的IDE做得都很人性化,vc, dev-c++, code::Blocks 都有這些功能,進而學習如何看軟體給的錯誤訊息,去抓出程式碼中有問題的地方,這點很重要,沒有一個工程師是只會 coding 而不會 trace, debug 的。

 

6. 善用人類最偉大的發明之一 :  google 搜尋引擎

 

筆者認為這世紀以來,人類在電腦上最偉大的發明就是網際網路搜尋器與exce。若覺得書上觀念不是很清楚,請先 google 找資料,別急著問人,事實上你的問題很有可能別人都已經先遇過,別因為犯懶就直接去問別人,即使問別人也該表明在哪找過哪些資料、試過怎樣的方法等。至於範例程式碼,若 google 用得夠強,也不排斥英文的話,事實上也幾乎都找得到你要的東西。而一些函數不會用,那可以上 " C++ reference" 、" C library referenct"、"MSDN" 查這些函數的說明。

 

7. 學會使用「看二進制軟體」

 

看二進制的軟體比較有名的如 UltraEdit, PSP, 之所以要會使用是因為要學會看檔案的二進制是怎麼處理的。個人覺得,基本輸出入、資料型態學完後,這種軟體就派得上用場。當然程式寫到一定程度時,也可以自己寫一套軟體去看檔案的二進制編碼,而不是用 NOTEPAD.EXE  去看文本模式。

 

8. 怎麼變強?

 

這問題由筆者回答實在是不怎麼合適,因筆者不自覺是強者,還有很長的路要走。提醒,程式語言它只是工具,要用這工具做什麼事情,是在乎背後要解決什麼問題。這裡提出筆者目前的學習方法。

 

(8.1) 正確的學習心態

 

很多人覺得聽完觀念,寫過程式例題,瞭解如何運用。但是沒有實際上的去從頭寫一次,是沒辦法很扎實的正確學習,所以希望同學們要從頭親手寫程式

 

(8.2) 多練習數學題目

 

數學問題不僅僅是程式撰寫上有難易度,還有邏輯上的編排,一開始要求是「可以解出來」,再來才是要求「有沒有辦法使目前寫好的程式碼變快」。可先從簡單的數字的問題 (完全數、求 PI、求 e、階層、求質數、阿姆斯壯數... 等等)先著手,如果找不到練習題目的話,可參閱筆者 另一篇 的文章;再進階一點的數學,是公式、規律上的撰寫,比如一元二次方程式求根、矩陣相乘、高斯消去法、最小平方法、各式線性代數問題、各式統計問題.. 等等問題;另有個議題建議一定要練習:大數問題 ,這問題筆者認為是很值得練習的題目。

 

(8.3) 去學資料結構、演算法

 

這部份很難下定論。有些人是不學資料結構、演算法直接去寫 ACM 練習題,但筆者認為這可能較危險,同時也沒太大意義。事實上 ACM 練習題的確很多演算法部份的東西,但很不建議別人用題目去帶觀念,這樣真的很不好!既然如此還是好好把演算法學好、好好把資料結構學好比較實際。

 

(8.5) 其餘不盡事項

 

這裡真的很難再說明。有些人寫程式會比較「偏應用面」,所以會特別偏向介面設計,於是覺得演算法不重要;有些人寫程式比較偏向大型專案開發,這時又要去買其他的書來補專業!但無論如何,有本書推薦一定要看:程式設計師的自我修養:連結、載入、程式庫,作者為俞甲子、石凡、潘愛民。至於要不要再學習組合語言、要不要再學習編譯器、作業系統等等,筆者認為要吃本行飯的話,作業系統要會,組合語言也要會一點。其餘的 domain know how ,是在於其他專業書籍上得到的知識,程式語言,只是一個工具把它實現出來而已。

百科問與答

  • (600字以內)
留言身份 :