close

"怎麼學c語言、怎麼挑書、要挑什麼書",這個問題聽過蠻多遍了,提供自己學習 C/C++ 的歷程讓各位參考。以下的說明都是以個人主觀的立場,當然我不是什麼大師,這些都參考就好。由於當初筆者接觸時,就是 C ,若想學其它像是 VB, JAVA, C# 等程式語言,這篇文章仍可給予一些幫助與參考。

1. 請先進修基礎知識

若非本科出身,請先進修以下所敘述的部份再來;如果是本科系出身,請確定以下部份都知道在幹嘛;寫程式並不在乎學歷和背景。學歷和背景不否認的確是提供不錯的學習環境,別被學歷迷思給嚇到了!雖一開始在進入這塊領域,可能會有些挫折感,個人的學習與家教經驗是先學習以下的 topic ,在學習程式語言過程中,對於書中的描述你將更有體會。

 (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) 程式運作基本流程 - 這部份用不到很複雜的作業系統理論,你只須要知道,你開啟了一個檔案(比如說 word 檔),電腦裡面大致上的運作情形就可以了,當然簡單可以很簡單,複雜可以很複雜,你只須要用自己的方式說明就好。(不過千萬不要說:開啟我的電腦->按D槽->快點二下 這種沒營養的話)。當然您可先參考這篇:http://edisonshih.pixnet.net/blog/post/28020065 ,這篇文章寫得非常非常淺,只是先提個最基本的概念..

 (5) 認識命令提示字元 - 若為 windows 系統慣用使用者,按下 "開始" -> "執行" -> 輸入 "cmd.exe" 後,按下 enter, 這個程式若熟的話以後有很多事情很方便,可以先熟悉以下指令的語法: cd, dir, rd, md, delete, copy, xcopy, 其它的視個人興趣學習,這部份大致上花一天時間就會有成果。

至於批次檔要不要學?筆者認為視個人興趣,但筆者學會 C 語言之後,額外再找資料學習一些批次檔之撰寫,且所撰之批次檔並不會過於複雜,但對於程式設計確實有一定幫助。

 (6) 了解絕對路徑與相對路徑之關係 - 下列列出四個路徑名稱,必須要會判別所代表的意義,四個都知道後,這部份也大功告成了。
     (6.1) "D:\Folder\A.txt"
     (6.2) "A.txt"
     (6.3) "..\A.txt"
     (6.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 都有這些功能 (筆者沒提到的IDE不代表沒有,只是我沒用過),進而學習如何看軟體給的錯誤(警告)訊息,去抓出程式碼中有問題的地方,這點很重要,沒有一個工程師是只會 coding 而不會 trace, debug 的。

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

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

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

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

8. 怎麼變強?

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

(8.1) 正確的學習心態

同一個問題不是覺得「自己會寫、寫得出來」就是個簡單的問題、不是個好問題。重點是有沒有辦法進行加速?有沒有辦法讓程式碼簡化 (簡化並不是亂寫,簡化也要讓別人看得懂在寫什麼,千萬不要影響了良好的程式碼風格)?為什麼別人這麼做?別人這麼做到底會不會比較快?可以多去看別人的程式碼去觀摩學習,重點是「重其義而不重其招」,要了解那問題的情況為何可以這麼做?為何那麼做會比較好?總之會有十萬顆問號一直在腦中盤旋,除了「多看書」、「多觀摩」、「多思考」、「多練習」、「多 google」外,沒再更好的方法。

(8.2) 多練習數學題目

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

事實上,筆者認為直接學「數值分析」是個最簡單、快速的方法。如果是要真正學習數值分析的書,勢必要買二本以上的書籍,一本是專門講理論、綁定程式語言較小的書籍,另一本是用 C/C++ 去實做數值分析之方法;如果只是要練 coding 能力的話,直接去買一本中文的數值分析,念起來也不會那麼辛苦。以下介紹二本

「數值分析:使用C語言」:作者為程曉旭、耿魯靜、張海、王勇。但說實在話,這本書程式碼的變數命名並不漂亮,背後的原理說明很不詳細,所以想了解背景原理與推導的話勢必要再買其他理論用書做輔助,但這本書探討的範圍甚廣。最後筆者是直接把大多方法都學起來,自己再重新 coding 一份。這也是比較好的方法,除非真的試不出來,再去研究別人的程式碼是怎麼寫的。

「數值分析 - 用C語言」:作者為簡聰海,這本書和上一本書剛好相法!它說的沒上一本書那麼多,但有手算範例,也有圖解說明,說得東西沒上一本來得多,但其實也不少了。

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

這部份少數人不認同,但如上所述,程式語言只是工具,有些問題解得出來但不代表解得漂亮,有些問題是想半天都寫不出來的 (舉例,如果要寫排列組合問題會寫嗎?為什麼同一個問題別人跑程式碼只要一分鐘而自己卻要跑一小時?為什麼別人的程式使用記憶體只有 1MB,自己的程式要用到 100MB?),這時候才知道資料結構和演算法的重要。資料結構筆者手上沒正式的參考用書 (其實是跟別人借 20 年前的用書,故覺得現在已不適合用這本),演算法倒是有本書必看:Introduction to Algorithms,這本書不確定有沒有繁體中文版,但確定是有簡體中文版,但其實這本書單字真的不會很艱澀。另如果想挑戰有字天書的話,高德納的 The Art of Computer Programming (TAOCP) 為必讀之作!這系列書籍的偉大便不再重述了,到 wiki 查便可得到讓人驚訝的資訊。

(8.4)  寫 ACM 練習題?

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

(8.5) 其餘不盡事項

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

以上,是筆者初學 C/C++ 語言的心得,如果目標是放在「短期學會」的話,建議不要自學,很累,成效不彰。也不建議找坊間補習班,筆者認為坊間補習班對於學習較進階的議題成效會較大,建議直接找「有經驗」的家教協助規劃課程為佳,這是最快學會、學精的方式,這是筆者兼職家教的心得與經驗。(這段沒在為自己打廣告,但若真有需求又沒合適人選的話,可考慮以悄悄話與筆者聯繫,目前筆者教過的5位學生皆讚譽有佳。)

另本文對於物件導向、設計模式部份,未著以筆墨,實際上這些部份也都有代表必讀之書籍。提醒,若排斥英文的話,還是試著去接受它,如使用 google 濾除掉英文的話,事實上會比別人得到更少的資訊,而這些資訊可能重要的都在裡面。至於一些比較進階的書籍與議題,諸如作業系統、多行緒、driver 、WMI、影像處理、圖形學、socket programming、 GUI programming ... etc,就不在這裡討論了。

若對於本文有補充、有意見、想噓我,歡迎發表意見。最後祝各位學習愉快。

           - by EdisonX (Edison.Shih.)

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 edisonx 的頭像
    edisonx

    Edison.X. Blog

    edisonx 發表在 痞客邦 留言(40) 人氣()