close
From Gossip@caterpillar

語言技術:C++ Gossip
http://caterpillar.onlyfun.net/Gossip/CppGossip/CppGossip.html

C 語 言 入 門 教 室
http://imil.au.edu.tw/~hsichcl/C_OnLine.htm

C++教學講義 Part1
http://itsoho.miroko.tw/Tutorial/CPP/C%2B%2BTutorialPart1.htm

//========================================================
#初學者應該如何學好C++

#給初學者的幾個建議

如果初學者以前完全沒學過任何的程式語言,則筆者建議初學者的學習順序如下:

1. Procedural Programming

2. OO Concepts

3. Object-Based Programming

4. Generic Programming

5. Object-Oriented Programming

第一為Procedural Programming(程序式語言程式設計),所謂的程序式語言即所謂的第三代語言,如Basic,C,Pascal等等,可從其中學到所謂的循序結構、選擇結構(如if-then-else)、重覆結構(如while or do while)等等,並從其中學到變數(或稱物件)及常數觀念及資料型別觀念,還有運算子及運算式的觀念等等,如果你還沒有這些概念的話,建議您選一個您喜歡的第三代語言(建議學C)先行學習,如此會有不錯的學習效果。但要學習C++之前一定要先學C語言嗎?不,應該這麼說,C++是一個C的超集合,也就是說C++囊括了所有C的功能,並加入了許多OOP的特性(如封裝、繼承、多型等),所以可以這麼說,C++是一個功能大大強化後的C語言,所有以前用C寫的程式,完全可以不用改寫就可以在C++ Compiler中編譯並執行,而這也是C++多了一個++的由來,所以在學C++的過程中,如果你完全沒學過Procedural Programming,那麼您自然會先學到Procedural Paradigm的部份,而這一部分剛好就是C語言,不知這麼說明,您是否了解了呢?

第二為OO Concepts(物件導向觀念),如:先了解何謂物件(Objects),何謂類別(Class),何謂訊息等等,在後面的建議書目中會列出一些清單,有了這一些觀念之後再進入C++的OO Based的部分則會感覺比較輕鬆。

第三為OO Based Programming,即C++是如何來實作出Class的機制,也就是學習class的定義與使用,了解何謂建構式(Constructor),解構式(Destructor),拷貝建構式(Copy Constructor),還有如果用到動態記憶體配置的話,則還要學習Operator Overloading(先了解何謂OverLoading),還有new和delete運算子的使用等等。

第四為Generic Programming(泛型式程式設計),主要是學習C++標準中納入的STL(Standard Template Library),了解容器及class template的觀念,有了STL,自此您的程式工作將更加的輕鬆。

第五為OOP(Object Oriented Programming),也是C++的重頭戲,主要的重點是學習繼承以及多型的觀念和用法,了解何謂is-a, is-a-kind-of, has-a的觀念,並且如何將它們落實到C++中。

以下則是給C++初學者的一些建議書目,讀者可參考看看。以下為筆者在程式設計倶樂部回答初學者的一封信:

初學者
1. C++ Primer Plus中文版 蔡明志譯
2. Borland/Turbo C++語言實務 施威銘研究室
3. Essential C++中文版 侯捷 王建興譯

中階讀者
1.C++ Primer中文版 侯捷譯
2.Thinking in C++中文版 蔡明志譯
3.C++標準程式庫 侯捷/孟岩譯

進階讀者
1.泛型程式設計與STL 侯捷/黃俊堯譯
2.C++程式語言經典本 葉秉哲譯
3.Effective C++ 侯捷譯
4.More Effective C++ 侯捷譯
5. Exceptional C++ 侯捷譯



我說說我學C++過程中所看過的書(從第一本到最後一本),我學C++的第一本書是施威銘研究室寫的borland/turbo C++語言實務, 這本書是十多年前的書了,裏面cover的東西還是C語言比較多,不過後面有說到一點OO的東西(很可惜的是講得不夠多),這本的定位來說,我把它不適合"完全"初學者, 但適合學過C想誇到C++的人的"參考",但嚴格來說這一本在Standard C++出來之後好像就沒再改版過,所以我不建議你買,但可以去圖書館借來看看。

我極力推薦的一本是C++ Primer Plus中文版, 這真的是一本讓我受益良多的好書,為什麼?因為作者將讀者定位為完全不懂C++的人來教, 所以前面一開始先講和C語言相關的部分(但學過c的人仍值得一看), 不僅介紹基本的語法,還說明應注意常犯的錯誤和陷阱, 對於第一次引入的觀念介紹的非常詳細,講完觀念之後,後面都會有一二個程式實例應用剛教過的觀念, 當然程式例子也都有說明, 最重要的是後面都有習題,作完習題那章的觀念和技巧也會了90%....

至於和C++ Primer比起來, 我覺得C++ Primer Plus比之更適合初學者, 舉個例子,對於一些專有名詞的解釋, 如Container和Template和Instantiatioin等等,在C++Primer中都草草帶過或不解釋(如為什麼叫做Container也不說明), 但我都在C++ Primer Plus中得到了解答....但C++ Primer仍不失為一本好書, 因為它Cover的東西夠廣, 如果C++ Primer Plus可以吸收90%的話,那不妨以C++ Primer或Essential C++做為第二本教本....再來是C++標準程式庫....

最重要的是實際寫程式練習, 很多東西你認為你懂了,但一旦動手寫之後才發現有很多東西仍是一知半解, 或是有些書本上沒提到的東西(Implementation dependent),還沒有可以磨練Debug的經驗-這可是要慢慢累積的, 無法速成或傳授的(儘管有人告訴你該怎麼Debug,有時仍很難體會,要寫了程式且Debug過才能體會到)...

#Procedural Programming

1. 程式=資料+演算法

2. 資料的種類

3. 了解何謂變數。

4. 變數的四個屬性

5. 何謂常數

6. 常數的表示方法

7. 運算式的使用

#何謂程式(Program)

簡單來說,程式即是以電腦的程式語言之規則所寫出來和電腦溝通並命令電腦做事的一些敍述(Statements),中間這個程式語言又是什麼用途呢?我們知道電腦並無法直接了解人類的語言,理所當然地並無法直接地接受人類的命令直接做事,所以電腦科學家便發明了程式語言當作中間語言以作為間接的溝通方式,而以程式語言的語法規則所寫出來的一些敍述便可稱之為程式。

那麼一般而言,程式大致上有哪些構成要素?某位知名的電腦科學家說過:「程式=資料結構+演算法」,即程式中不可或缺的兩要素為資料和演算法,資料是什麼大家當然都很清楚,比如說統計數字,文字敍述等。而演算法則是用來操作那段資料的運算法則,它詳細描述了整個程式的運作流程,通常能完成一特定功能。

#資料有哪些種類

資料通常是從事實的觀察和記錄而來,比如人口統計數字,總統施政滿意度的民調數字等等,當然也可為一般的文字敍述資料,但在程式中的資料大致上可將之分為兩類,一為數字資料,一為文字資料,而功能比較強的語言又將數字資料細分為整數、浮點數或日期資料等。一般為了和人類使用的習慣相符,程式中的數字資料的表示方法和一般的數學上的用法一致,比如表示一萬是用阿拉伯數字10000直接表示,而文字資料在程式語言中一般將之稱為『字串資料』,字串的表示方法在大部分的語言中是把文字敍述直接在前後加上雙引號或單引號,如"Hello, World!","123.678",當然地,123.678加上引號之後就變成字串資料了。

#何謂變數

我們知道程式由資料加演算法而成,其實根本來說,就是演算法對一堆資料在電腦記憶體中不斷地操弄而已,由上一段知道資料分為數字和字串兩類,可是資料要如何地從外部送到電腦手中做進一步的處理呢?當然是一堆輸入設備,如:『鍵盤、滑鼠等』,可是問題來了,資料送給電腦之後,它是如何地記住那些資料呢?當然地,計概學得好的讀者可能認為我太囉嗦了,如果是的話,就跳過這一段吧!回到正題,電腦是用它的『記憶體』來儲存資料的,大部分正運算中的資料是存在所謂的主記體(Main Memory)中,而通常電腦的主記憶體都是有限的,所以通常同一段記憶體在不同的時間都要不斷反覆地利用,以致同一段記憶體的內容會不斷地變化,嗯!快要進入我們要說的正題了,以下正式地來介紹我們的主角,『變數』。

在程式中要操弄電腦中的資料要如何做呢?當然是對主記憶體下手,可是主記憶體本身低階的細節對程式員來說太過繁複,不適合由程式員直接對此著手,所以要對主記憶體存取便可透過一間接的東西來做,那就是所謂的『變數』,你可將變數視為主記體的一部分,所以變數可以存放資料,包括數字及字串,由前述對主記憶體的說明可知,變數的內容會隨時間而變化的,那也就是我們稱它為變數的主要原因了。由於變數可視為主記體的同義詞,所以我們進一步地來看變數的四個主要特性(屬性)。

#變數的四個屬性

1. 名稱:每個變數都會有一個名稱,主要原因是為了讓程式員方便地在程式中適時地參考到它們,你也可以將名稱看成是幫某段主記憶體取一方便好記的名字。

2. 位址:其實變數是用來代表某一段主記憶體用的,一段一段的記憶體要如何區分位置呢?那就是將記憶體做編號的動作,最小的劃分單位為位元組(Byte),每一個位元組的記憶體都有一個編號,那就是所謂的位址(Address),你可以將位址視為如同每家每戶的門牌號碼一樣,那樣就可以方便地供人找尋了。

3. 值:主記憶體主要的用途當然是用來儲存資料啦,所儲存的數字或字串資料,如123或"Hello, World!"即為變數的值。

4. 型別:即為變數的資料型態,比如說是數字或是字串,是整數或浮點數,之所以要表明變數的型別是為了方便對不同的資料作不同的運算和解釋用的,不同的資料型別可以表示的資料範圍和可以作的運算也不同,如整數和實數型態可以作加、減、乘和除等,但字串型態就不可以,但它可以作串接的運算,長整數和短整數可以表示的大小範圍也不同,當你只要表示一個0到255間的整數時,自然不需要用到長整數這樣的資料型態的變數來儲存,因這樣也只是浪費儲存空間而已,而這也是為何要有資料型態的主要原因。

#C++的識別名稱(Identifier-ID)

所謂的識別名稱,就是在C++中可以用來加以辨識的名稱,比如說:『變數有名稱,函式也要有名稱,常數也可以有名稱』,這樣一來,在程式中要用到它們時,就只要叫名字或綽號(alias)就行了,是不是很方便呢?

#識別名稱的命名規則

必須由英文字母、數字或底線(_)所構成,而且第一個字不可為數字,還有在C/C++中是有分大小寫的,比如說:『tax,Tax,TAX』這三個分別是不同的變數,千萬不要弄錯了。

#C++內建的資料型別(Data Type)

1. 基本資料型別:如字元、布林、整數和浮點數。

2. 特殊資料型別:如陣列、指標、參考(reference)。

#基本資料型別

n 整數

u char:用來存放-128到+127或0到255之間的整數或存字元的ASCII碼。

u bool:布林值,即不是true就是false(真假值),通常可用來判斷。

u int:用來存放-32768到+32767之間或0到65535之間的整數(如果為short int),int前又可用short或long以及unsigned加以修飾,如short int或long int,之間的差別在於short int只佔2位元組記憶體,而long int佔4位元組記憶體(其中long int可簡寫成long),而如果加了unsigned,則表示全部的位元組用來表示正整數(如unsinged short int表示0到65535)。

n 浮點數

u float:用來表示1.18 X 10-38到3.40X1038 ,佔4位元組。

u double:用來表示2.23 X 10-308到1.79X10308 ,佔8位元組。

u long double:用來表示3.40 X 10-4932到1.18X104932 ,佔10位元組。

#特殊資料型別

n 陣列:See Part8

n 指標:See Part8

n 參考:See Part8

#何謂常數

所謂變數就是會隨時間而變化的數,那麼常數呢?以常理來看,就是不會隨時間流逝而改變內容的數,或至少在某段時間內不會改變內容的數,如數學上的圓週率等等。那麼要如何在程式中表示常數呢?其實直接寫在程式中的數字或字串資料,如3.1415或"Hello, Friends!"這類可直接看到的數字或引號括住的文字等等資料皆可視為常數。

#如何表示常數

l 整數常數:直接的數字,如18,23等,其中有不同進位的差別,八進位前多加一個0,如017,022等,16進位前多加0x,如0x12,0x2A等。

l 字元常數:用二個單引號圍起來的單一字元,如‘a’,‘b’等,其中存的是a和b的ascii碼。

l 浮點常數:如3.23,2.58或2.3e8等,其型別為C/C++中的double,其中2.3e8表示2.3 X 108 。

l 字串常數:如”Hello, world!”,即一般的文數字前後用雙引號括起來。

#C++中如何定義使用者自訂常數

l 巨集常數(用#deinfe):如#define PI 3.14159或#define TaxRate 0.05等,需注意的是它不是C/C++的一個敍述,所以後面沒有加分號。

l 唯讀變數(用const):如const int PI = 3.14159;或const double KByte = 1024;

l 使用符號常數有什麼好處?

使用符號常數的好處很多,我們寫程式如果沒有養成使用符號常數的習慣,常常會在修改維護程式時惹來不少麻煩,比如說我們不使用PI符號常數,而是直接寫入3.14的數值常數到程式碼中,而該3.14在程式中出現過一千次,日後如果我們要把3.14改成精確度更高的3.14159時,我們必須把這一千個散落各處的3.14找出來,一一地改成我們要的3.14159,此一工程太浩大也。比較理想的方式是我們在程式最前頭定義一個符號常數PI,如const int PI=3.14159;日後我們就用PI來代表3.14,等到我們要改成更高的精確值時,便只要修改最前頭的const int PI=3.14159;就可以了,它會自動地影響地後續的各個PI值,如此便不會在修改時有掛一漏萬的困擾了。

#何謂運算式

我們都學過數學的加減乘除,如3+5,3/5,2-8等等,最簡單的數學四則運算都可稱之為運算式,在大部分的程式語言中可直接寫入程式中,如上例的3/5等等。

#運算式的種類

l 算術運算式:有一般的加減乘除及取餘數(用%符號),如3+5,3 * 5,3-8,2 / 6等,而8 % 3表示取8除以3的餘數。

l 關係運算式(比較運算):有>(大於)<(小於)>=(大於等於)<=(小於等於)!=(不等於)==(等於),如3>5得到false,3==3得到true,注意等於是用兩個等號。

l 邏輯運算式:有!(not),&&(and),||(or),如x && y或x || y或 ! x等。&&表作「且」運算,只有當x和y都核定為真時才會得出true值,否則為false值。x和y可簡單到純量變數或可為其他的運算式(如比較運算式),如3>5 && 8< 3會先核定出3>5(false)和8<3(false),再拿false && false(結果為false)。||表作「或」運算,當x或y其中一者為真時,即可得出true值,否則皆為false值。x和y可簡單到純量變數或可為其他的運算式(如比較運算式),如3<5 && 8< 3會先核定出3<5(true)和8<3(false),再拿true || false(結果為true)。!運算子表反相運算,可將其後的運算式之值或純量變數之值反相(即真變假,假變真),如果是非零數值(視為true)經反相運算後會得出false,如果是0值(視為false)會得出true。

l 其他運算式:可用的運算子有>>, <<, ~, |, &, ^。>>表位元右旋運算子,如11>>2(會將00001011-即11的二進位表示式,位元向右移二位,即得到00000010-轉成十進位即2,原本的最右邊二個1則會被丟棄掉)。<<表位元左旋運算子,如11<<2(會將00001011-即11的二進位表示式,位元向左移二位,即得到00101100-轉成十進位即44,原本的最左邊二個1則會被丟棄掉)。~表取補數運算子,如~2表取2的補數(即00000010的每個位元0變1,1變0,即11111101-亦即十進位的253。&運算子表作二進位的「且」運算,如 253 & 15(化為二進位為11111101 & 00001111得出00001101-亦即十進位的13) 。|運算子表作二進位的「或」運算,如 253 | 15(化為二進位為11111101 | 00001111得出11111111-亦即十進位的255)。^運算子表互斥或(Exclusive-Or)運算,如253 ^ 15運算式(11111101 & 00001111得出11110010,亦即十進位的242,其要訣為將左右兩二進位數值上下兩兩對齊,當上下二數互異時即可得出true,即1 xor 0或0 xor 1會得到true,其餘狀況為false)。綜上所述,<<、>>和&和|和 ^ 統統是做二進位的位元運算,亦即需先將其化為二進位數值後再行運算,所以統稱其為位元運算子。

l ?:,逗號,sizeof運算子:?:為一簡化的if-else結構的縮寫,如x > y ? “On”:”Off”(如果x>y得出true時,傳回 ”On”,若x>y得出false時,傳回”Off”,其語法格式為 expr1 ? expr2:expr3,表若expr1為true時,則傳回expr2,若expr1為false時,傳回expr3,其中expr1,expr2和expr3為一般運算式或簡單變數。「,」逗號運算子,如expr1, expr2, expr3會依序核定expr1再來是expr2最後是expr3,最後再以expr3的核定值為最後的傳回值。亦即可將一連串的運算式用逗號運算子連接起來(即會由左至右依序作運算,再把最右運算式之值當做最後的運算式之值)。sizeof其後可接基本資料型態,如sizeof int會得出整數型態的記憶空間大小-可能為4或2,如sizeof double會得出倍精準型態的記憶空間大小-為8bytes,sizeof後亦可接一純量變數或物件名,如sizeof TaxRate;會得出TaxRate變數或物件所佔的記憶空間大小。

l 指定運算式:有=,+=,-=,*=,/=,%=等等。「=」等號為指定運算子,如x =3; 會將等號右邊的3指定給變數x,須注意的是等號左邊只能是具有左值(lvalue)的變數,亦即不可寫成3 = x; ,其中是因為3並不具有左值,所以無法用來儲存任何數值,其他的運算子諸如+=,-=和 *= 和 /= 和 %= 統統稱為複合運算子,如x += 3;表示x = x + 3;或如x *= 3;表示x = x * 3;複合運算子還有很多,如<<=和>>=和&=和 |= 和 ~= 等等,如x <<= 3;表示x = x << 3;其餘的運算式皆可仿此類推。

#C++程式最基本的單位-敍述(Statement)

如cout << “Hello, CPP!”;

是一行可以輸出Hello, CPP!文字的敍述,每一行敍述結束時需在後面加上一個分號,C/C++ Compiler看到分號就知道這是一行敍述了,千萬不要忘了加喔。

空敍述(Null statement)

如: ;

單純地只有一個分號則是一個什麼事也不做的敍述,有些地方可以用到空敍述。

如何存資料到變數中(設一值給變數-Assignment)

要設一值給變數很簡單,用等號(=)運算子即可,如:

num1 = 10

num2 = 3

color1 = red

color2 = green

運算之後num1之值等於10,num2之值為3,以此類推。即將等號右邊的內容丟到左邊的變數中。


arrow
arrow
    全站熱搜

    David 發表在 痞客邦 留言(0) 人氣()