c語言開發手冊
㈠ 學習c語言 必看的書籍
給C++初學者的50個忠告
1.把C++當成一門新的語言學習(和C沒啥關系!真的。);
2.看《Thinking In C++》,不要看《C++變成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因為他們很難而我們自己是初學者所以就不看;
4.不要被VC、BCB、BC、MC、TC等詞彙所迷惑——他們都是集成開發環境,而我們要學的是一門語言;
5.不要放過任何一個看上去很簡單的小編程問題——他們往往並不那麼簡單,或者可以引伸出很多知識點;
6.會用Visual C++,並不說明你會C++;
7.學class並不難,template、STL、generic programming也不過如此——難的是長期堅持實踐和不遺餘力的博覽群書;
8.如果不是天才的話,想學編程就不要想玩游戲——你以為你做到了,其實你的C++水平並沒有和你通關的能力一起變高——其實可以時刻記住:學C++是為了編游戲的;
9.看Visual C++的書,是學不了C++語言的;
10.浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
11.浮躁的人容易問:我到底該學什麼;——別問,學就對了;
12.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;
13.浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
14.浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;
15.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;
16.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡;
17.C++不僅僅是支持面向對象的程序設計語言;
18.學習編程最好的方法之一就是閱讀源代碼;
19.在任何時刻都不要認為自己手中的書已經足夠了;
20.請閱讀《The Standard C++ Bible》(中文版:標准C++寶典),掌握C++標准;
21.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;
22.別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;
23.請看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序;
25.和別人一起討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪個好;
26.請看《程序設計實踐》,並嚴格的按照其要求去做;
27.不要因為C和C++中有一些語法和關鍵字看上去相同,就認為它們的意義和作用完全一樣;
28.C++絕不是所謂的C的「擴充」——如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯系得那麼緊密;
29.請不要認為學過XX語言再改學C++會有什麼問題——你只不過又在學一門全新的語言而已;
30.讀完了《Inside The C++ Object Model》以後再來認定自己是不是已經學會了C++;
31.學習編程的秘訣是:編程,編程,再編程;
32.請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》《面向對象軟體構造(Object-Oriented Software Construction)》《設計模式(Design Patterns)》《The Art of Computer Programming》;
33.記住:面向對象技術不只是C++專有的;
34.請把書上的程序例子親手輸入到電腦上實踐,即使配套光碟中有源代碼;
35.把在書中看到的有意義的例子擴充;
36.請重視C++中的異常處理技術,並將其切實的運用到自己的程序中;
37.經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去;
38.不要漏掉書中任何一個練習題——請全部做完並記錄下解題思路;
39.C++語言和C++的集成開發環境要同時學習和掌握;
40.既然決定了學C++,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;
41.就讓C++語言的各種平台和開發環境去激烈的競爭吧,我們要以學習C++語言本身為主;
42.當你寫C++程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43);
43.別心急,設計C++的class確實不容易;自己程序中的class和自己的class設計水平是在不斷的編程實踐中完善和發展的;
44.決不要因為程序「很小」就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;
45.每學到一個C++難點的時候,嘗試著對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;
46.記錄下在和別人交流時發現的自己忽視或不理解的知識點;
47.請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;
48.保存好你寫過的所有的程序——那是你最好的積累之一;
49.請不要做浮躁的人;
50.請熱愛C++!
建議你買本書,書比網上的電子版教程好的多,如計算機屆超級權威教授 譚浩強 老先生寫的《C語言程序設計(第三版)》,全國發行了700萬冊,可以說是學C語言的人必看的書,我們大學就用這本書,很適合自學,通俗易懂
建議你學習其它計算機知識時也看他的書,他出的書很多,涵蓋面廣,每一本都很經典
這里有他的教程word版下載
另外,機械工業出版社的 計算機叢書系列也相當經典,全是翻譯國外經典教材,國外計算機發展早,水平比國內高很多,看這些教材事半功倍,推薦(美)Al Kelley Ira Pohl的《C語言教程第4版》
學習程序語言要持之以恆,不浮躁,祝你成功!
㈡ C語言演算法速查手冊的目錄
第1章緒論1
1.1程序設計語言概述1
1.1.1機器語言1
1.1.2匯編語言2
1.1.3高級語言2
1.1.4C語言3
1.2C語言的優點和缺點4
1.2.1C語言的優點4
1.2.2C語言的缺點6
1.3演算法概述7
1.3.1演算法的基本特徵7
1.3.2演算法的復雜度8
1.3.3演算法的准確性10
1.3.4演算法的穩定性14
第2章復數運算18
2.1復數的四則運算18
2.1.1[演算法1]復數乘法18
2.1.2[演算法2]復數除法20
2.1.3【實例5】 復數的四則運算22
2.2復數的常用函數運算23
2.2.1[演算法3]復數的乘冪23
2.2.2[演算法4]復數的n次方根25
2.2.3[演算法5]復數指數27
2.2.4[演算法6]復數對數29
2.2.5[演算法7]復數正弦30
2.2.6[演算法8]復數餘弦32
2.2.7【實例6】 復數的函數運算34
第3章多項式計算37
3.1多項式的表示方法37
3.1.1系數表示法37
3.1.2點表示法38
3.1.3[演算法9]系數表示轉化為點表示38
3.1.4[演算法10]點表示轉化為系數表示42
3.1.5【實例7】系數表示法與點表示法的轉化46
3.2多項式運算47
3.2.1[演算法11]復系數多項式相乘47
3.2.2[演算法12]實系數多項式相乘50
3.2.3[演算法13]復系數多項式相除52
3.2.4[演算法14]實系數多項式相除54
3.2.5【實例8】復系數多項式的乘除法56
3.2.6【實例9】實系數多項式的乘除法57
3.3多項式的求值59
3.3.1[演算法15]一元多項式求值59
3.3.2[演算法16]一元多項式多組求值60
3.3.3[演算法17]二元多項式求值63
3.3.4【實例10】一元多項式求值65
3.3.5【實例11】二元多項式求值66
第4章矩陣計算68
4.1矩陣相乘68
4.1.1[演算法18]實矩陣相乘68
4.1.2[演算法19]復矩陣相乘70
4.1.3【實例12】 實矩陣與復矩陣的乘法72
4.2矩陣的秩與行列式值73
4.2.1[演算法20]求矩陣的秩73
4.2.2[演算法21]求一般矩陣的行列式值76
4.2.3[演算法22]求對稱正定矩陣的行列式值80
4.2.4【實例13】 求矩陣的秩和行列式值82
4.3矩陣求逆84
4.3.1[演算法23]求一般復矩陣的逆84
4.3.2[演算法24]求對稱正定矩陣的逆90
4.3.3[演算法25]求托貝里斯矩陣逆的Trench方法92
4.3.4【實例14】 驗證矩陣求逆演算法97
4.3.5【實例15】 驗證T矩陣求逆演算法99
4.4矩陣分解與相似變換102
4.4.1[演算法26]實對稱矩陣的LDL分解102
4.4.2[演算法27]對稱正定實矩陣的Cholesky分解104
4.4.3[演算法28]一般實矩陣的全選主元LU分解107
4.4.4[演算法29]一般實矩陣的QR分解112
4.4.5[演算法30]對稱實矩陣相似變換為對稱三對角陣116
4.4.6[演算法31]一般實矩陣相似變換為上Hessen-Burg矩陣121
4.4.7【實例16】 對一般實矩陣進行QR分解126
4.4.8【實例17】 對稱矩陣的相似變換127
4.4.9【實例18】 一般實矩陣相似變換129
4.5矩陣特徵值的計算130
4.5.1[演算法32]求上Hessen-Burg矩陣全部特徵值的QR方法130
4.5.2[演算法33]求對稱三對角陣的全部特徵值137
4.5.3[演算法34]求對稱矩陣特徵值的雅可比法143
4.5.4[演算法35]求對稱矩陣特徵值的雅可比過關法147
4.5.5【實例19】 求上Hessen-Burg矩陣特徵值151
4.5.6【實例20】 分別用兩種雅克比法求對稱矩陣特徵值152
第5章線性代數方程組的求解154
5.1高斯消去法154
5.1.1[演算法36]求解復系數方程組的全選主元高斯消去法155
5.1.2[演算法37]求解實系數方程組的全選主元高斯消去法160
5.1.3[演算法38]求解復系數方程組的全選主元高斯-約當消去法163
5.1.4[演算法39]求解實系數方程組的全選主元高斯-約當消去法168
5.1.5[演算法40]求解大型稀疏系數矩陣方程組的高斯-約當消去法171
5.1.6[演算法41]求解三對角線方程組的追趕法174
5.1.7[演算法42]求解帶型方程組的方法176
5.1.8【實例21】 解線性實系數方程組179
5.1.9【實例22】 解線性復系數方程組180
5.1.10【實例23】 解三對角線方程組182
5.2矩陣分解法184
5.2.1[演算法43]求解對稱方程組的LDL分解法184
5.2.2[演算法44]求解對稱正定方程組的Cholesky分解法186
5.2.3[演算法45]求解線性最小二乘問題的QR分解法188
5.2.4【實例24】 求解對稱正定方程組191
5.2.5【實例25】 求解線性最小二乘問題192
5.3迭代方法193
5.3.1[演算法46]病態方程組的求解193
5.3.2[演算法47]雅克比迭代法197
5.3.3[演算法48]高斯-塞德爾迭代法200
5.3.4[演算法49]超鬆弛方法203
5.3.5[演算法50]求解對稱正定方程組的共軛梯度方法205
5.3.6[演算法51]求解托貝里斯方程組的列文遜方法209
5.3.7【實例26】 解病態方程組214
5.3.8【實例27】 用迭代法解方程組215
5.3.9【實例28】 求解托貝里斯方程組217
第6章非線性方程與方程組的求解219
6.1非線性方程求根的基本過程219
6.1.1確定非線性方程實根的初始近似值或根的所在區間219
6.1.2求非線性方程根的精確解221
6.2求非線性方程一個實根的方法221
6.2.1[演算法52]對分法221
6.2.2[演算法53]牛頓法223
6.2.3[演算法54]插值法226
6.2.4[演算法55]埃特金迭代法229
6.2.5【實例29】 用對分法求非線性方程組的實根232
6.2.6【實例30】 用牛頓法求非線性方程組的實根233
6.2.7【實例31】 用插值法求非線性方程組的實根235
6.2.8【實例32】 用埃特金迭代法求非線性方程組的實根237
6.3求實系數多項式方程全部根的方法238
6.3.1[演算法56]QR方法238
6.3.2【實例33】用QR方法求解多項式的全部根240
6.4求非線性方程組一組實根的方法241
6.4.1[演算法57]梯度法241
6.4.2[演算法58]擬牛頓法244
6.4.3【實例34】 用梯度法計算非線性方程組的一組實根250
6.4.4【實例35】 用擬牛頓法計算非線性方程組的一組實根252
第7章代數插值法254
7.1拉格朗日插值法254
7.1.1[演算法59]線性插值255
7.1.2[演算法60]二次拋物線插值256
7.1.3[演算法61]全區間插值259
7.1.4【實例36】 拉格朗日插值262
7.2埃爾米特插值263
7.2.1[演算法62]埃爾米特不等距插值263
7.2.2[演算法63]埃爾米特等距插值267
7.2.3【實例37】 埃爾米特插值法270
7.3埃特金逐步插值271
7.3.1[演算法64]埃特金不等距插值272
7.3.2[演算法65]埃特金等距插值275
7.3.3【實例38】 埃特金插值278
7.4光滑插值279
7.4.1[演算法66]光滑不等距插值279
7.4.2[演算法67]光滑等距插值283
7.4.3【實例39】 光滑插值286
7.5三次樣條插值287
7.5.1[演算法68]第一類邊界條件的三次樣條函數插值287
7.5.2[演算法69]第二類邊界條件的三次樣條函數插值292
7.5.3[演算法70]第三類邊界條件的三次樣條函數插值296
7.5.4【實例40】 樣條插值法301
7.6連分式插值303
7.6.1[演算法71]連分式插值304
7.6.2【實例41】 驗證連分式插值的函數308
第8章數值積分法309
8.1變步長求積法310
8.1.1[演算法72]變步長梯形求積法310
8.1.2[演算法73]自適應梯形求積法313
8.1.3[演算法74]變步長辛卜生求積法316
8.1.4[演算法75]變步長辛卜生二重積分方法318
8.1.5[演算法76]龍貝格積分322
8.1.6【實例42】 變步長積分法進行一重積分325
8.1.7【實例43】 變步長辛卜生積分法進行二重積分326
8.2高斯求積法328
8.2.1[演算法77]勒讓德-高斯求積法328
8.2.2[演算法78]切比雪夫求積法331
8.2.3[演算法79]拉蓋爾-高斯求積法334
8.2.4[演算法80]埃爾米特-高斯求積法336
8.2.5[演算法81]自適應高斯求積方法337
8.2.6【實例44】 有限區間高斯求積法342
8.2.7【實例45】 半無限區間內高斯求積法343
8.2.8【實例46】 無限區間內高斯求積法345
8.3連分式法346
8.3.1[演算法82]計算一重積分的連分式方法346
8.3.2[演算法83]計算二重積分的連分式方法350
8.3.3【實例47】 連分式法進行一重積分354
8.3.4【實例48】 連分式法進行二重積分355
8.4蒙特卡洛法356
8.4.1[演算法84]蒙特卡洛法進行一重積分356
8.4.2[演算法85]蒙特卡洛法進行二重積分358
8.4.3【實例49】 一重積分的蒙特卡洛法360
8.4.4【實例50】 二重積分的蒙特卡洛法361
第9章常微分方程(組)初值問題的求解363
9.1歐拉方法364
9.1.1[演算法86]定步長歐拉方法364
9.1.2[演算法87]變步長歐拉方法366
9.1.3[演算法88]改進的歐拉方法370
9.1.4【實例51】 歐拉方法求常微分方程數值解372
9.2龍格-庫塔方法376
9.2.1[演算法89]定步長龍格-庫塔方法376
9.2.2[演算法90]變步長龍格-庫塔方法379
9.2.3[演算法91]變步長基爾方法383
9.2.4【實例52】 龍格-庫塔方法求常微分方程的初值問題386
9.3線性多步法390
9.3.1[演算法92]阿當姆斯預報校正法390
9.3.2[演算法93]哈明方法394
9.3.3[演算法94]全區間積分的雙邊法399
9.3.4【實例53】 線性多步法求常微分方程組初值問題401
第10章擬合與逼近405
10.1一元多項式擬合405
10.1.1[演算法95]最小二乘擬合405
10.1.2[演算法96]最佳一致逼近的里米茲方法412
10.1.3【實例54】 一元多項式擬合417
10.2矩形區域曲面擬合419
10.2.1[演算法97]矩形區域最小二乘曲面擬合419
10.2.2【實例55】 二元多項式擬合428
第11章特殊函數430
11.1連分式級數和指數積分430
11.1.1[演算法98]連分式級數求值430
11.1.2[演算法99]指數積分433
11.1.3【實例56】 連分式級數求值436
11.1.4【實例57】 指數積分求值438
11.2伽馬函數439
11.2.1[演算法100]伽馬函數439
11.2.2[演算法101]貝塔函數441
11.2.3[演算法102]階乘442
11.2.4【實例58】伽馬函數和貝塔函數求值443
11.2.5【實例59】階乘求值444
11.3不完全伽馬函數445
11.3.1[演算法103]不完全伽馬函數445
11.3.2[演算法104]誤差函數448
11.3.3[演算法105]卡方分布函數450
11.3.4【實例60】不完全伽馬函數求值451
11.3.5【實例61】誤差函數求值452
11.3.6【實例62】卡方分布函數求值453
11.4不完全貝塔函數454
11.4.1[演算法106]不完全貝塔函數454
11.4.2[演算法107]學生分布函數457
11.4.3[演算法108]累積二項式分布函數458
11.4.4【實例63】不完全貝塔函數求值459
11.5貝塞爾函數461
11.5.1[演算法109]第一類整數階貝塞爾函數461
11.5.2[演算法110]第二類整數階貝塞爾函數466
11.5.3[演算法111]變型第一類整數階貝塞爾函數469
11.5.4[演算法112]變型第二類整數階貝塞爾函數473
11.5.5【實例64】貝塞爾函數求值476
11.5.6【實例65】變型貝塞爾函數求值477
11.6Carlson橢圓積分479
11.6.1[演算法113]第一類橢圓積分479
11.6.2[演算法114]第一類橢圓積分的退化形式481
11.6.3[演算法115]第二類橢圓積分483
11.6.4[演算法116]第三類橢圓積分486
11.6.5【實例66】第一類勒讓德橢圓函數積分求值490
11.6.6【實例67】第二類勒讓德橢圓函數積分求值492
第12章極值問題494
12.1一維極值求解方法494
12.1.1[演算法117]確定極小值點所在的區間494
12.1.2[演算法118]一維黃金分割搜索499
12.1.3[演算法119]一維Brent方法502
12.1.4[演算法120]使用一階導數的Brent方法506
12.1.5【實例68】使用黃金分割搜索法求極值511
12.1.6【實例69】使用Brent法求極值513
12.1.7【實例70】使用帶導數的Brent法求極值515
12.2多元函數求極值517
12.2.1[演算法121]不需要導數的一維搜索517
12.2.2[演算法122]需要導數的一維搜索519
12.2.3[演算法123]Powell方法522
12.2.4[演算法124]共軛梯度法525
12.2.5[演算法125]准牛頓法531
12.2.6【實例71】驗證不使用導數的一維搜索536
12.2.7【實例72】用Powell演算法求極值537
12.2.8【實例73】用共軛梯度法求極值539
12.2.9【實例74】用准牛頓法求極值540
12.3單純形法542
12.3.1[演算法126]求無約束條件下n維極值的單純形法542
12.3.2[演算法127]求有約束條件下n維極值的單純形法548
12.3.3[演算法128]解線性規劃問題的單純形法556
12.3.4【實例75】用單純形法求無約束條件下N維的極值568
12.3.5【實例76】用單純形法求有約束條件下N維的極值569
12.3.6【實例77】求解線性規劃問題571
第13章隨機數產生與統計描述574
13.1均勻分布隨機序列574
13.1.1[演算法129]產生0到1之間均勻分布的一個隨機數574
13.1.2[演算法130]產生0到1之間均勻分布的隨機數序列576
13.1.3[演算法131]產生任意區間內均勻分布的一個隨機整數577
13.1.4[演算法132]產生任意區間內均勻分布的隨機整數序列578
13.1.5【實例78】產生0到1之間均勻分布的隨機數序列580
13.1.6【實例79】產生任意區間內均勻分布的隨機整數序列581
13.2正態分布隨機序列582
13.2.1[演算法133]產生任意均值與方差的正態分布的一個隨機數582
13.2.2[演算法134]產生任意均值與方差的正態分布的隨機數序列585
13.2.3【實例80】產生任意均值與方差的正態分布的一個隨機數587
13.2.4【實例81】產生任意均值與方差的正態分布的隨機數序列588
13.3統計描述589
13.3.1[演算法135]分布的矩589
13.3.2[演算法136]方差相同時的t分布檢驗591
13.3.3[演算法137]方差不同時的t分布檢驗594
13.3.4[演算法138]方差的F檢驗596
13.3.5[演算法139]卡方檢驗599
13.3.6【實例82】計算隨機樣本的矩601
13.3.7【實例83】t分布檢驗602
13.3.8【實例84】F分布檢驗605
13.3.9【實例85】檢驗卡方檢驗的演算法607
第14章查找609
14.1基本查找609
14.1.1[演算法140]有序數組的二分查找609
14.1.2[演算法141]無序數組同時查找最大和最小的元素611
14.1.3[演算法142]無序數組查找第M小的元素613
14.1.4【實例86】基本查找615
14.2結構體和磁碟文件的查找617
14.2.1[演算法143]無序結構體數組的順序查找617
14.2.2[演算法144]磁碟文件中記錄的順序查找618
14.2.3【實例87】結構體數組和文件中的查找619
14.3哈希查找622
14.3.1[演算法145]字元串哈希函數622
14.3.2[演算法146]哈希函數626
14.3.3[演算法147]向哈希表中插入元素628
14.3.4[演算法148]在哈希表中查找元素629
14.3.5[演算法149]在哈希表中刪除元素631
14.3.6【實例88】構造哈希表並進行查找632
第15章排序636
15.1插入排序636
15.1.1[演算法150]直接插入排序636
15.1.2[演算法151]希爾排序637
15.1.3【實例89】插入排序639
15.2交換排序641
15.2.1[演算法152]氣泡排序641
15.2.2[演算法153]快速排序642
15.2.3【實例90】交換排序644
15.3選擇排序646
15.3.1[演算法154]直接選擇排序646
15.3.2[演算法155]堆排序647
15.3.3【實例91】選擇排序650
15.4線性時間排序651
15.4.1[演算法156]計數排序651
15.4.2[演算法157]基數排序653
15.4.3【實例92】線性時間排序656
15.5歸並排序657
15.5.1[演算法158]二路歸並排序658
15.5.2【實例93】二路歸並排序660
第16章數學變換與濾波662
16.1快速傅里葉變換662
16.1.1[演算法159]復數據快速傅里葉變換662
16.1.2[演算法160]復數據快速傅里葉逆變換666
16.1.3[演算法161]實數據快速傅里葉變換669
16.1.4【實例94】驗證傅里葉變換的函數671
16.2其他常用變換674
16.2.1[演算法162]快速沃爾什變換674
16.2.2[演算法163]快速哈達瑪變換678
16.2.3[演算法164]快速餘弦變換682
16.2.4【實例95】驗證沃爾什變換和哈達瑪的函數684
16.2.5【實例96】驗證離散餘弦變換的函數687
16.3平滑和濾波688
16.3.1[演算法165]五點三次平滑689
16.3.2[演算法166]α-β-γ濾波690
16.3.3【實例97】驗證五點三次平滑692
16.3.4【實例98】驗證α-β-γ濾波演算法693
㈢ 推薦幾部學習C#的書籍
1、《C# 5.0 in a Nutshell》:權威的參考書
學習C#的最佳書籍之一。如果你想要獲取最新的信息以增長有關C#語言編程的知識,這是最好的選擇之一。該書深入淺出地探討了有關C#語言的知識。不過要想能夠充分吸收消化,你需要掌握一些關於C語言的基本知識。總之,這本書絕對能讓你獲益良多。
全書首先簡單地介紹了一下C#語言開發的相關背景,之後馬上跳轉到數據類型的基本原理。然後用一種系統化的方法講述編程方面的信息內容。你還可以練習上面寫的代碼示例,這些示例可以從互聯網上免費下載至LINQPAD中。
(3)c語言開發手冊擴展閱讀:
C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言。並定於在微軟職業開發者論壇(PDC)上登台亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、介面、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司 .NET windows網路框架的主角。
C#是一種安全的、穩定的、簡單的、優雅的,由C和C++衍生出來的面向對象的編程語言。它在繼承C和C++強大功能的同時去掉了一些它們的復雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優雅的語法風格、創新的語言特性和便捷的面向組件編程的支持成為.NET開發的首選語言。
C#是面向對象的編程語言。它使得程序員可以快速地編寫各種基於MICROSOFT .NET平台的應用程序,MICROSOFT .NET提供了一系列的工具和服務來最大程度地開發利用計算與通訊領域。
C#使得C++程序員可以高效的開發程序,且因可調用由 C/C++ 編寫的本機原生函數,因此絕不損失C/C++原有的強大的功能。因為這種繼承關系,C#與C/C++具有極大的相似性,熟悉類似語言的開發者可以很快的轉向C#。
參考資料:網路-C#
㈣ C語言學習手冊的目 錄
第1篇 基礎篇
第1章 初識C語言 16
1.1 C語言介紹 17
1.1.1 簡述編程語言 17
1.1.2 C語言的產生 18
1.1.3 C語言的特點 19
1.2 選擇C語言的理由 21
1.2.1 C語言的發展趨勢 21
1.2.2 C語言的成功案例 23
1.2.3 C語言的應用領域 25
1.3 如何學好C語言 25
1.3.1 確立學習態度 26
1.3.2 打好基礎 26
1.3.3 多請教、多交流 26
1.3.4 養成良好的編程習慣 27
1.3.5 多動手、勤思考 27
1.3.6 掌握學習方法 27
1.4 本章小結 28
第2章 C語言編程准備 29
2.1 編寫程序的格式 30
2.1.1 一個簡單的C程序 31
2.1.2 標識符與關鍵字 34
2.2 開發環境 37
2.2.1 Turbo C 2.0 38
2.2.2 Visual C++ 6.0 42
2.3 一個完整的C程序 48
2.4 實戰練習 52
2.4.1 編寫一個簡單的C程序 52
2.4.2 熟悉開發工具 53
2.5 本章小結 53
第3章 C語言的靈魂——演算法 54
3.1 演算法的基本概念 55
3.1.1 演算法的特徵 55
3.1.2 演算法的優劣 57
3.2 描述演算法 57
3.2.1 自然語言 58
3.2.2 描繪流程圖 58
3.2.3 繪制N-S流程圖 64
3.2.4 偽代碼 68
3.3 本章小結 69
第4章 常量和變數 70
4.1 了解數據類型 71
4.2 解讀常量 72
4.2.1 整型常量 72
4.2.2 實型常量 75
4.2.3 字元型常量 76
4.2.4 轉義字元 80
4.2.5 符號常量 81
4.2.6 情景應用一:用putchar函數輸出「I LOVE C」 82
4.2.7 情景應用二:printf函數結合轉義字元 83
4.3 變數 83
4.3.1 整型變數 84
4.3.2 情景應用:求出買水果一共花的錢數 86
4.3.3 實型變數 87
4.3.4 字元型變數 89
4.4 掌握混合運算 91
4.5 實戰練習 93
4.5.1 使用printf語句輸出變數 93
4.5.2 使用字元型變數輸出字元串 94
4.6 本章小結 94
第5章 表達式與運算符 95
5.1 解讀表達式 96
5.2 賦值運算符與賦值表達式 98
5.2.1 變數賦初值 98
5.2.2 自動類型轉換 100
5.2.3 強制類型轉換 100
5.3 掌握算術運算符與表達式 102
5.3.1 算術運算符 102
5.3.2 算術表達式 102
5.3.3 優先順序與結合性 104
5.3.4 自增自減運算符 105
5.3.5 情景應用:求運算後的4個變數的值 107
5.4 了解關系運算符與表達式 108
5.4.1 關系運算符 108
5.4.2 關系表達式 109
5.4.3 優先順序與結合性 110
5.5 解讀邏輯運算符與表達式 111
5.5.1 邏輯運算符 111
5.5.2 邏輯表達式 112
5.5.3 優先順序與結合性 112
5.6 運用位邏輯運算符與表達式 113
5.6.1 位邏輯運算符 114
5.6.2 位邏輯表達式 114
5.7 介紹逗號運算符與表達式 114
5.8 使用復合賦值運算符 116
5.9 判斷條件運算符 117
5.10 了解運算符的優先順序和結合性 118
5.11 實戰練習 119
5.11.1 使用復合賦值運算符求出計算結果 119
5.11.2 用自增、自減運算符求出計算結果 120
5.11.3 編寫簡單的計算加班工資程序 121
5.12 本章小結 122
第6章 輸入、輸出函數 123
6.1 解讀語句 124
6.1.1 表達式語句 124
6.1.2 空語句 124
6.1.3 復合語句 124
6.2 輸入、輸出字元數據 125
6.2.1 輸出字元數據 125
6.2.2 輸入字元數據 126
6.2.3 情景應用:使用getchar函數取消獲取Entet鍵 127
6.3 輸入、輸出字元串 128
6.3.1 使用字元串輸出函數 128
6.3.2 掌握字元串輸入函數 130
6.4 介紹格式輸出函數 131
6.5 講解格式輸入函數 134
6.6 應用順序程序設計 138
6.7 實戰練習 141
6.7.1 將輸入的小寫字元轉換為大寫字元 141
6.7.2 模擬工資計算器 142
6.7.3 輸入、輸出古人名言 142
6.8 本章小結 143
第7章 選擇結構程序設計 144
7.1 if選擇語句 145
7.2 if語句的不同形式 145
7.2.1 單條件單分支的if語句 146
7.2.2 單條件雙分支的if語句 149
7.2.3 多條件多分支的if語句 153
7.2.4 情景應用:輸入數值檢查字元類型 156
7.3 掌握if語句的嵌套形式 157
7.4 注意if語句的常見錯誤 160
7.4.1 使用分號的注意事項 161
7.4.2 條件放置注意事項 161
7.4.3 if和else的配對注意事項 162
7.4.4 大括弧的重要性 162
7.5 判斷分支選擇switch語句 163
7.5.1 switch語句的基本形式 163
7.5.2 多路開關模式的switch語句 167
7.6 區分if…else語句和switch語句 169
7.7 應用選擇結構程序 171
7.8 實戰練習 173
7.8.1 計算函數,求出Y值 173
7.8.2 輸出三個變數中最大的數 174
7.8.3 計算增加後的工資 175
7.9 本章小結 175
第8章 循環語句 176
8.1 編寫循環語句 177
8.2 實現while型循環 177
8.2.1 while循環語句的一般形式 178
8.2.2 情景應用:求出數值內的所有正整數的和 180
8.2.3 避免while循環語句的死循環 182
8.2.4 了解while循環語句的空循環體 183
8.2.5 注意while循環語句常見錯誤 183
8.3 解讀for型循環語句 185
8.3.1 for循環語句的一般形式 185
8.3.2 靈活多變的for循環語句 189
8.3.3 應用for語句中的逗號 192
8.4 介紹do-while語句 193
8.5 比較三種循環 195
8.6 運用循環嵌套 195
8.6.1 各種結構的循環嵌套 195
8.6.2 循環嵌套實例 197
8.7 轉移語句 199
8.7.1 goto語句 200
8.7.2 break語句 202
8.7.3 continue語句 203
8.8 區別三種跳轉語句 205
8.9 實踐練習 205
8.9.1 列印出大寫字母的ASCII碼對照表 205
8.9.2 列印出小寫字母的ASCII碼對照表 206
8.9.3 輸出0~100之間不能被3整除的數 207
8.10 本章小結 209
第2篇 核心篇
第9章 數組 212
9.1 介紹數組的概念 213
9.1.1 數組的分類 213
9.1.2 數組的維數 213
9.2 應用一維數組 214
9.2.1 一維數組的定義 214
9.2.2 一維數組的引用 215
9.2.3 一維數組的初始化 217
9.2.4 一維數組的應用 220
9.3 掌握二維數組 222
9.3.1 二維數組的定義 222
9.3.2 二維數組的引用 223
9.3.3 二維數組的初始化 223
9.3.4 二維數組的應用 227
9.4 解讀多維數組 228
9.5 使用字元數組 229
9.5.1 字元數組的定義 229
9.5.2 字元數組的引用 229
9.5.3 字元數組的初始化 229
9.5.4 字元數組的結束標志 231
9.5.5 字元數組的輸出 232
9.5.6 字元數組的輸入 233
9.5.7 輸出完整的帶有空格的字元串 234
9.5.8 字元數組的應用 235
9.6 字元串處理函數 236
9.6.1 字元串的復制 237
9.6.2 字元串的連接 238
9.6.3 字元串的比較 240
9.6.4 字元串大小寫轉換 241
9.6.5 獲得字元串長度 243
9.7 熟練應用數組 245
9.7.1 反轉輸出字元串 245
9.7.2 使用數組統計學生成績 246
9.7.3 情景應用:字元串的加密和解密 248
9.8 實踐練習 250
9.8.1 實現strcpy函數的功能 250
9.8.2 統計字元中各元素的個數 251
9.8.3 重新排列字元串 251
9.9 本章小結 252
第10章 函數 253
10.1 函數概述 254
10.2 定義函數 256
10.2.1 函數定義的形式 256
10.2.2 定義與聲明 259
10.3 了解返回語句 262
10.3.1 從函數返回 262
10.3.2 返回值 266
10.4 傳遞函數參數 269
10.4.1 形式參數與實際參數 269
10.4.2 數組作為函數參數 271
10.4.3 了解main的參數 276
10.5 調用函數 276
10.5.1 函數調用方式 277
10.5.2 嵌套調用 280
10.5.3 遞歸調用 282
10.6 靈活應用函數 285
10.6.1 函數的應用 285
10.6.2 情景應用:使用字元函數判斷輸入字元 290
10.7 實踐與練習 292
10.7.1 輸出較大的整數 292
10.7.2 求出10個學生的平均成績 292
10.7.3 驗證6174 293
10.8 本章小結 294
第11章 指針 296
11.1 了解指針相關概念 297
11.1.1 介紹地址與指針 297
11.1.2 解讀變數與指針 298
11.1.3 使用指針變數 299
11.1.4 指針自加自減運算 303
11.1.5 情景應用:輸出整型變數地址 304
11.2 掌握數組與指針 305
11.2.1 一維數組與指針 306
11.2.2 情景應用一:輸出數組元素 309
11.2.3 二維數組與指針 310
11.2.4 情景應用二:將一個3行5列的二維數組的
第二行元素輸出 313
11.2.5 字元串與指針 314
11.2.6 字元串數組 316
11.3 指向指針的指針 318
11.3.1 應用介紹指向指針的指針 318
11.3.2 情景應用:輸出偶數 320
11.4 作為函數參數的指針變數 321
11.5 返回指針值的函數 331
11.5.1 介紹返回指針值的函數 331
11.5.2 情景應用:求長方形的周長 332
11.6 指針數組作為main函數的參數 333
11.7 實戰練習 335
11.7.1 將數組中的元素值按照相反順序存放 335
11.7.2 將兩個字元串連接後輸出 336
11.7.3 使用指針實現字元串的復制 336
11.8 本章小結 337
第12章 結構體和共用體 338
12.1 應用結構體 339
12.1.1 結構體類型的概念 339
12.1.2 結構體變數的定義 340
12.1.3 結構體變數的引用 342
12.1.4 結構體類型的初始化 344
12.1.5 情景應用:輸出學生的信息 345
12.2 掌握結構體數組 348
12.2.1 定義結構體數組 348
12.2.2 初始化結構體數組 349
12.2.3 情景應用:輸出學生信息 351
12.3 解讀結構體指針 353
12.3.1 指向結構體變數的指針 353
12.3.2 指向結構體數組的指針 356
12.3.3 結構體作為函數參數 358
12.4 介紹包含結構的結構 360
12.5 應用共用體 362
12.5.1 共用體的概念 362
12.5.2 共用體變數的引用 363
12.5.3 共用體變數的初始化 364
12.5.4 共用體類型的數據特點 365
12.6 解讀枚舉類型 365
12.7 實戰練習 366
12.7.1 統計候選人的得票 366
12.7.2 師生信息存儲系統 367
12.7.3 計算學生的綜合成績 368
12.8 本章小結 368
第13章 鏈表與演算法 369
13.1 介紹鏈表 370
13.1.1 鏈表概述 370
13.1.2 創建動態鏈表 371
13.1.3 輸出鏈表 374
13.2 進行鏈表的相關操作 376
13.2.1 鏈表的插入操作 377
13.2.2 鏈表的刪除操作 380
13.3 運用數組排序演算法 384
13.3.1 選擇法排序 385
13.3.2 冒泡法排序 387
13.3.3 交換法排序 389
13.3.4 插入法排序 391
13.3.5 折半法排序 394
13.3.6 比較數組排序演算法 396
13.4 實戰練習 397
13.4.1 鏈表的刪除操作 397
13.4.2 使用選擇法排序 398
13.4.3 使用冒泡、交換、插入、折半等演算法進行排序 399
13.5 本章小節 399
第3篇 高級篇
第14章 位運算 402
14.1 解讀位與位元組 403
14.2 掌握位運算操作符 403
14.2.1 「與」運算符 404
14.2.2 「或」運算符 405
14.2.3 「取反」運算符 407
14.2.4 「異或」運算符 409
14.2.5 「左移」運算符 412
14.2.6 「右移」運算符 413
14.2.7 位運算復合賦值運算符 415
14.2.8 長度不同的數據進行位運算 415
14.3 循環移位 416
14.4 什麼是位域 418
14.4.1 位域的概念與定義 419
14.4.2 位域相關說明 420
14.5 實戰練習 421
14.5.1 求兩個數進行「與」和「或」運算後的結果 421
14.5.2 求出一個數「左移」和「右移」後的結果 422
14.5.3 求一個數「循環左移」和「循環右移」後的結果 422
14.6 本章小結 423
第15章 存儲管理 424
15.1 內存組織方式 425
15.1.1 了解內存組織方式 425
15.1.2 解讀堆與棧 425
15.2 動態管理 428
15.2.1 動態分配一段內存空間——malloc函數 428
15.2.2 動態分配連續內存空間數組——calloc函數 429
15.2.3 改變ptr指針指向空間大小——realloc函數 431
15.2.4 情景應用:使用realloc函數重新分配內存 432
15.2.5 釋放分配整型變數內存空間——free函數 432
15.3 內存丟失 433
15.4 變數的存儲類別 434
15.4.1 動態存儲與靜態存儲 435
15.4.2 修飾一個局部變數為自動的auto變數 435
15.4.3 聲明位置不同、意義不同的static變數 436
15.4.4 寄存器存儲類的register變數 437
15.4.5 外部存儲的extern變數 437
15.5 實戰練習 438
15.5.1 為數組動態分配內存 438
15.5.2 為數組動態分配並釋放內存 439
15.5.3 用靜態局部整型變數計算3的平方和立方 440
15.6 本章小結 440
第16章 函數類型和預處理 441
16.1 內部函數和外部函數 442
16.1.1 介紹內部函數 442
16.1.2 解讀外部函數 443
16.2 靈活使用宏定義 444
16.2.1 不帶參數的宏定義 445
16.2.2 帶參數的宏定義 446
16.3 編寫#include指令 448
16.4 掌握條件編譯 450
16.4.1 #if命令 450
16.4.2 #ifdef及#ifndef命令 453
16.4.3 #undef命令 455
16.4.4 #line命令 455
16.4.5 #pragma命令 456
16.5 實踐練習 457
16.5.1 求兩個數相乘的積 457
16.5.2 從3個數中找出最小數 457
16.5.3 從3個數中找出最大數 458
16.6 本章小結 459
第17章 讀寫文件 460
17.1 文件概述 461
17.2 掌握文件基本操作 462
17.3 運用文件指針 463
17.4 打開和關閉文件 464
17.4.1 文件的打開 464
17.4.2 文件的關閉 465
17.5 讀 寫 文 件 466
17.5.1 寫字元函數——fputc函數 466
17.5.2 讀字元函數——fgetc函數 468
17.5.3 寫字元串函數——fputs函數 469
17.5.4 讀字元串函數——fgets函數 470
17.5.5 格式化寫入函數——fprintf函數 472
17.5.6 格式化讀取函數——fscanf函數 474
17.5.7 數據塊讀寫函數——fread函數和fwrite函數 475
17.6 定位文件 478
17.6.1 隨機讀寫操作——fseek函數 479
17.6.2 返回位置指針——rewind函數 481
17.6.3 ftell函數 483
17.7 實踐練習 485
17.7.1 復制文件內容 485
17.7.2 保存學生信息 486
17.8 本章小結 487
第4篇 實戰篇
第18章 學生管理系統 490
18.1 分析需求 491
18.2 設計系統 491
18.3 功能模塊設計 492
18.3.1 功能選擇界面 492
18.3.2 錄入學生成績信息 494
18.3.3 查詢學生成績信息 496
18.3.4 刪除學生成績信息 497
18.3.5 修改學生成績信息 499
18.3.6 插入學生成績信息 501
18.3.7 統計學生人數 504
18.4 本章小結 505
附錄A 專業術語表 506
㈤ C語言函數參考手冊的前言
C語言作為當前程序開發中最流行的編程語言之一,以其簡單、高效、快捷、方便的特性吸引了大批用戶。根據筆者使用C語言的經驗,相信對C語言程序開發人員來說,C語言函數參考手冊是必需的。因此,筆者編寫了本書,希望能真正幫助C語言程序開發人員在編程時實現易查、易學、易用,並使其成為程序開發必備的工具書。
本書內容
本書按照C語言庫函數的頭文件進行分類,每個頭文件為一章內容,分別介紹了對應頭文件中常用的C語言函數。對每個頭文件中的函數按照字母進行排序,其中每個函數都按照功能、語法來介紹,在每個方法後都有相關的示例。
本書特點
* 即查、即學、即用
本書將查、學、用結合為一體,讀者能夠使用本書進行快速查詢和快速應用,既是實用的工具書,也是學習的參考書。
* 字母排序,快捷搜索
本書在講解C語言函數時按照頭文件進行分類,用戶在使用時可以根據頭文件快速地縮小查找范圍,並且每個頭文件以字母順序進行排序,以便讀者更快、更准確地查找相關內容。
* 內容全面,示例豐富
本書內容涵蓋了學習C語言應用的各方面技術。為了便於讀者快速掌握每個知識點,每個知識點都給出對應的一個或多個示例,並提供了詳盡的注釋。
* 精彩欄目,貼心提醒
本書根據需要在各章使用了「注意」、「說明」和「技巧」等小欄目,讓讀者可以在學習過程中更輕松地理解相關知識點及概念,並輕松地掌握個別技術的應用技巧。
本書配套資源
本書提供了內容豐富的配套資源,包括源程序、素材,以及模塊庫、案例庫、題庫、素材庫等多項輔助內容,讀者朋友可以通過如下方式獲取。
第1種方式:
(1)登錄清華大學出版社的網站,在網頁右上角的搜索文本框中輸入本書書名(注意區分大小寫和留出空格),或者輸入本書關鍵字,或者輸入本書ISBN號(注意去掉ISBN號間隔線「-」),單擊「搜索」按鈕。
(2)找到本書後單擊超鏈接,在該書的網頁下側單擊「網路資源」超鏈接,即可下載。
第2種方式:
訪問本書的新浪微博:C語言圖書,找到配套資源的鏈接地址進行下載。
讀者對象
本書適合以下人群閱讀。
? 初學編程的自學者 ? 編程愛好者
? 大中專院校的老師和學生 ? 相關培訓機構的老師和學員
? 初、中級程序開發人員 ? 程序測試及維護人員
? 參加實習的程序員
㈥ C語言四書五經是哪4本書
C程序設計之四書五經
自從Dennis M.Ritchie於1973年設計並實現C語言以來,計算機程序設計領域已經發生了巨大的變化。以C語言為根基的C++、Java和C#等面向對象語言相繼誕生,並在各自領域大獲成功。今天,C及其後裔幾乎統治了計算機程序設計世界。可以這么說,C語言的誕生是現代程序語言革命的起點,它改變了程序設計語言發展的軌跡,是程序設計語言發展史中的一個里程碑。
然而,C並不僅僅是其他語言的起點和基礎,否則它早已成為程序設計語言發展過程中又一個被遺棄者。和當初發明時一樣,C語言今天依然至關重要。它的表達力、效率、簡練、緊湊、對機器的最終控制以及跨平台的高度移植性,使其在系統編程、嵌入式編程等領域一直占據著統治地位,而C99標準的制訂則再一次使C語言煥發出新的活力。下文介紹C程序設計領域中的幾本好書,其中一些堪稱經典。
1. Brian W.Kernighan, Dennis M.Ritchie,《C程序設計語言》,機械工業出版社
這是迄今為止在所有程序設計語言書籍中最廣受尊敬的一部經典,是任何一名C程序員的必讀之作。因為出自C語言的設計者Dennis M.Ritchie和著名的計算機科學家Brian W.Kernighan之手,它被昵稱為「K&R C」。是它首先引入了「Hello World!」程序,這個程序幾乎成了後來任何一本入門性程序設計語言書籍中的第一個例子。
如同C語言本身簡潔緊湊而極具威力一樣,這本書輕薄短小而極富張力。通過簡潔的描述和典型的示例,它全面、系統、准確地講述了C語言的各個特性以及C程序設計的基本方法,內容涵蓋基本概念、類型和表達式、控制流、函數與程序結構、指針與數組、結構、輸入與輸出、UNIX系統介面以及標准庫等內容。
簡潔清晰是這本書最大的特色。這本小書可以教給你許多比它厚幾倍的「大部頭」的知識。我認為那些動輒洋洋灑灑拼湊出好幾百頁乃至上千頁的技術作者應該好好向K&R學一學。對於中、高級程序員而言,如果希望迅速獲得C語言的嚴肅知識而又不願意多花費哪怕一丁點時間,這本書就是首選。
順便說一句,這本書的索引製作非常出色,極具實用價值,這可能首先要歸功於正文部分的簡明扼要。此外,盡管它看上去很像一本教程,但其實更是一本寫給專業程序員的指南。如果你不具備任何其他語言程序設計背景或基本的C語言知識,這本書也許並不適合用作你的C語言啟蒙讀物。
2. Perter Van Der LinDen,《C專家編程》,人民郵電出版社
C語言是嚴肅的程序員語言,但這並不意味著C語言書籍必須板著面孔說教。在這本被C程序員昵稱為「魚書」(封面上有一條「醜陋的」腔棘魚)的著作中,作為SUN公司編譯器和操作系統核心開發組成員之一,Peter淋漓盡致地展示了其深厚的技術沉澱、豐富的項目經驗、高超的寫作技巧以及招牌式的幽默。在這部作品中,作者以流暢的文字、詼諧的筆法將逸聞典故、智慧和幽默自然地融入技術描述中,讀來宛若一本小說,極富趣味。
本書講述了C語言的歷史、語言特性、聲明、數組、指針、連接、運行時以及內存使用等知識,揭示了C語言中許多隱晦之處,尤其深入解析了聲明、數組和指針、內存使用等方面的細節。要想成為一名專家級C程序員,這些內容都是必須掌握的。和其他滿是抽象例子的C語言書籍不同,這本書充滿了大量的來自真實世界的C程序設計實例,它們對C程序員具有很高的參照價值。另外,每一章都以極富趣味的「輕松一下」收尾,而附錄A「程序員工作面試的秘密」則是任何語言的程序員在應聘工作前增強自信的好材料。
我懷疑真正的C專家可能用不著看這本書 — 從內容到組織方式到行文風格都決定了這是一本輕松愉快的「從菜鳥到高手」的進階讀本,所以,它理應擁有更廣泛的讀者群。初級程序員往往更需要熱情的鼓勵,在閱讀這本書的過程中,你定會深深地被作者對編程的激情所感染。
世間並無完美。我認為這本書的缺陷在於,和大多數平庸的C語言書籍一樣,它畫蛇添足地加入了一章關於C++的描述。在今天看來,這個描述既不全面也有失公允。不過,鑒於作者是在1994年從一名C程序員的角度去觀察C++,這一點也就不足為奇了。
3. Samuel P. Harbison, Guy L. Steele,《C語言參考手冊(第五版)》(影印版),人民郵電出版社
在C語言參考手冊類書籍里,Samuel P. Harbison 和Guy L. Steele合著的《C: A Reference Manual》是非常出色的一本。這本手冊的第五版新增了對C99標準的介紹,以便滿足新時期C語言學習的需要。全書共分為兩大部分,第一部分專注於C語言特性,第二部分則全面討論了C標准庫。本書涵蓋C99、C89、傳統的C、所有版本的C運行庫以及編寫與C++兼容的C代碼等一切知識。
這本手冊只是中等厚度,但它比「比它更厚」的其他參考手冊更清晰地描述了C語言的現在和過去的方方面面。整本手冊技術細節描述精確,組織條理清楚,內容完備詳盡而又簡明扼要。可以這么說,它在廣度、深度和精度方面都是出類拔萃的。對於中、高級C程序員而言,這本手冊值得常備案頭,它幾乎肯定要比K&R的著作使用頻率更高。
2004年2月1日補充:我手頭有這本書的中文版:《C語言參考手冊》(機械工業出版社出版)。它在很大程度上減輕了我的查閱負擔,不過偶爾也增加了理解上的困難。
4. David Hanson,《C語言介面與實現:創建可重用軟體的技術》,機械工業出版社
C語言能夠歷經三十多年而不衰,一個重要的原因在於它的適應能力。在這「復用」、「面向對象」、「組件」、「異常處理」等先進機制漫天飛舞的年代,C語言仍然能夠憑借它小而優雅的語言特性,在相當程度上滿足現代軟體體系架構提出的要求。只不過,想要達到這個程度,必須要在C的應用功力上達到最高層次。在嵌入式、系統軟體以及對性能要求極高的系統開發中,開發人員必須達到這樣的層次,熟練掌握C語言的高級特性,才能夠同時滿足效率和靈活性、復用性的要求。可惜,雖然C語言技術圖書汗牛充棟,但是關注這個峰頂之域的作品卻是屈指可數。David Hanson的《C Interfaces and Implementations》就是個中翹楚。
David Hanson是業內大名鼎鼎的自由編譯器lcc的合作者。在這個項目中,他負責提供高度可復用的基礎架構。在不斷的實踐中,他完全使用ANSI C形成了一整套可復用組件庫。這套組件庫架構清晰,性能優異,而且提供了很多高級的特性,比如類Win32 SEH的異常處理機制,可移植的線程庫,高性能的內存池,豐富的可復用數據結構組件。David Hanson把他在創作這些組件的過程中所積累的心得以及對其源碼的精緻剖析原原本本地寫在了這本書里。這樣的著作,當然堪稱C語言領域里的銘心絕品。難怪已故著名技術作家Richard Stevens對此書贊不絕口,他說:「這本書中的技術,對於大部分C程序員來說,已經遺忘得太久了。」對於希望能在C語言應用上達到最高層次的核心程序員而言,這本書是難得的必讀之作。
其他
除了以上四本書以外,我還樂意推薦Andrew Koenig的著作《C陷阱和缺陷》(人民郵電出版社)和Deitel父子合著的《C How to Program》兩本書。
Andrew Koenig是世界上屈指可數的C++專家,他的這本書可能是最薄的一本C語言經典。它簡明扼要地講述了C程序設計中的陷阱和缺陷,包括詞法陷阱、語法陷阱、語義陷阱、連接、庫函數、預處理器以及可移植性缺陷等,最後一章還給出了關於如何減少程序錯誤的建議以及前面各章問題的參考答案。盡管這個小冊子成書於C89標准制定之前,然而,即使到了C99早已頒布的今天,書中提到的大多數陷阱和缺陷一如十五年前那樣使我們警醒。
Deitel父子合著的《C How to Program》一直是非常好的C語言入門教程,我手頭的中譯本名為《C程序設計教程》(機械工業出版社出版,原書第二版)。除了對技術的正規描述(輔以許多簡明扼要的例子)外,每一章後面都帶有小結、術語、常見的程序設計錯誤、良好的程序設計習慣、性能忠告、可移植性忠告、軟體工程評述、自我測驗練習及答案等。整書內容清晰,組織良好,易於閱讀和理解。值得一提的是,有許多入門書讀完一遍即可扔掉,而這一本是個例外。
結語
以上這幾本書很大程度上局限於描述C語言及標准庫本身,如果希望學習更專業的、領域相關的C程序設計技術,你可以在選擇閱讀這幾本書的基礎上繼續查閱專門書籍。此外,在C語言書籍領域,水平不相上下的作品有很多,這幾本只是根據我自身的閱讀體驗而做出的推薦。
我並不是一名C程序員,我的大多數時間都花在C的後裔語言尤其是C++身上了。然而,正如你知道的那樣,C++並不全是類和模板,不全是面向對象和泛型編程,在較低的層面,C++的各個實現一如既往在很大程度上兼容C。C++和C的親密關系決定了每一本C語言經典都應該是C++程序員的讀物。
這世界變化得真是太快。各色新事物層出不窮,讓人眼花繚亂、目不暇接。人們也很容易被那些五光十色的花哨玩意兒所吸引,常常會忘記構築過去、現在和未來的堅實基礎。C語言就是這樣的基礎之一。今天,世界上有許多我們看不見的重要軟體是用C語言(以及C++等)編寫而成的,正是它們在默默地支撐著這個信息世界的運轉。
㈦ 初學者學習C語言,用什麼書好,想用點比較經典的書。
學習C語言不是一朝一夕的事情,但也不需要花費十年時間才能精通。如何讓編程初學者以最小的代價學習並精通C語言是本文的主題。請注意,即使是最小的代價」也絕不是什麼捷徑,而是以最短的時間取得最多的收獲,同時也意味著各位編程初學者需要經歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學者面臨的第一個問題便是如何選擇教材。好的開始是成功的一半,選擇一本優秀的教材是事半功倍的關鍵因素。
1. 《C程序設計語言》
Kernighan和 RitchiTheCProgramLanguag的《C程序設計語言》堪稱經典中的經典,不過舊版的很多內容都已過時,和現在標准C語言相去甚遠,大家一定要看最新的版本,否則不如不看。
2. 《C語言參考手冊》
即使是最經典最權威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》十分必要的C語言參考手冊》就是CReferManualC語言標準的詳細描述,包括絕大多數C標准庫函數的細節,算得上是最好的標准C語言的工具書。順便提一句,最新的C程序設計語言》根據C89標准修訂的而《C語言參考手冊》描述的C99標准,二者可能會有些出入,建議按照C99標准學習。
3. 《C和指針》
這本《C和指針》寫得也是相當地不錯,英文名是PointeronC特別地強調指針的重要性,算是本書的一個特點吧。不過這本書並不十分適合初學者,如果你曾經學過C語言,有那麼一些C語言的基礎但又不是很扎實,那麼你可以嘗試一下這本書。相信,只要你理解了指針,C語言便不再神秘。
4.如果你已經看完一本C語言教材,並想要繼續深入學習,那麼我有兩本書推薦給你
《C陷井與缺陷》
首先這本CTrapandPitfal的《C陷井與缺陷》,很薄的一本書,內容非常非常地有趣。不過注意的是,這本書是二十多年前寫的,裡面提到很多C語言的缺陷現在都已被改進,不過能夠了解一些歷史也不是什麼壞事。
《C專家編程》
還有就是可以嘗試挑戰一下ExpertCProgram的《C專家編程》,書如其名,這本書頗具難度,不過一旦你仔細讀完並能透徹理解,便可以放心大膽地在簡歷上寫「精通C語言」
切記一個原則,不要讀自己目前還看不懂的書,那是浪費生命。如果你看不懂,那你一定是缺失了某些必需基礎知識。此時,要仔細分析自己需要補充哪些內容,然後再去書店尋找講述的這些內容的書籍。把基礎知識補充完畢再回頭來學習,才會真正的事半功倍。
二、Unix/Linux還是Window這是個很大的問題
不同的編程環境會造就出不同思維的程序員。Window程序員大多依賴集成開發環境,比如VisualStudio而Unix程序員更加鍾愛Makefil與控制台。顯而易見,集成開發環境更容易上手,Window上學習C語言,只需要會按幾個基本的VisutC++工具欄按鈕就可以開始寫Hello,World!而在Unix下,需要一些控制台操作的基本知識。有人也許認為Unix環境更簡潔,但習慣的力量是很大的大家都很熟悉 Window基本操作,而為了學習C語言去專門裝一個Unix系統,似乎有點不劃算。
對於一個只懂得Window基本操作、連 DOS什麼都不知道的新手而言,盡快做一些有趣而有意義的事情才是最重要的用C語言寫一個小程序遠比學習lscat等命令有趣,況且我要專注於C語言本身,就不得不暫時忽略一些東西,比如編譯鏈接的過程、Makefil寫法等等等等。
所以我建議初學者應該以VisualC++6.0不是VisualC++.NET或者DevC++作為主要的學習環境,而且千萬不要在IDE使用技巧上過多糾纏,因為今後你一定要轉向Unix環境的VisualC++6.0使用很方便,調試也很直觀,但其默認的編譯器對C標準的支持並不好,而DevC++使用gcc編譯器,對C99標准都支持良好。使用順帶提一下,很多大學的C語言課程還在使用TurboC2.0作為實驗環境,這是相當不可取的原因其一是TC2.0對C標准幾乎沒有支持,其二是TC2.0編譯得到程序是16位的這對今後理解32位的程序會造成極大的困擾(當然,用djgpp之類的東西可以使TC2.0編譯出32位程序,不過那過於復雜了
等你學完一本C語言的教材,一定要轉向Unix平台繼續學習,幾乎所有的C語言高級教程都是基於Unix平台的比如《C專家編程》轉變的過程是痛苦的需要面對的各種紛繁復雜的命令,完全不同於Window平台的思考方式,但是這種痛苦是值得的Unix與C共生的Unix思考方式和習慣更加符合C語言的思考方式和習慣。Unix下,可以找到無數優秀的源代碼供你盡情閱讀,可以方便地查看某個庫函數的聯機手冊,還可以看到最優秀的代碼風格(說到代碼風格,會專門寫一篇文章詳細敘述)
歸結起來就是一句話:編程初學者初學C語言,建議使用Window系統和集成開發環境,准備向「高手」方向努力時,請先轉向Unix平台。