當前位置:首頁 » 編程語言 » c語言入門案例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言入門案例

發布時間: 2022-06-05 19:02:38

❶ 舉幾個c語言的簡單實用的例子

弄個3.1版的C語言,比較方便。

❷ 從零開始學C語言的目 錄

第1篇 C語言入門
第1章 C語言入門基礎 14
1.1 計算機語言的演變 14
1.1.1 機器語言 14
1.1.2 匯編語言 14
1.1.3 高級語言 14
1.1.4 面向對象或面向問題的高級語言 15
1.2 數制、數制轉換與存儲 15
1.2.1 數制 15
1.2.2 數制的轉換 16
1.2.3 計算機中數據的存儲 17
1.3 程序設計思想——演算法 18
1.3.1 演算法的概念 18
1.3.2 演算法的特點 18
1.3.3 演算法的表示方法 19
1.3.4 演算法分析 21
1.4 C語言的發展簡史和特點 21
1.4.1 C語言的誕生與發展 22
1.4.2 C語言的特點 23
1.5 本章小結 24
1.6 習題 24
第2章 認識C語言程序 25
2.1 C語言程序的結構特徵 25
2.2 C語言程序的書寫風格 27
2.3 C語言程序的開發過程 28
2.4 Visual C++集成開發環境 29
2.4.1 熟悉Visual C++ 6.0集成開發環境 30
2.4.2 C語言在Visual C++ 6.0的開發過程 31
2.5 用Visual C++運行一個C程序 32
2.6 本章小結 33
2.7 習題 33
第2篇 C語言基礎
第3章 常量、變數與標識符 34
3.1 標識符 34
3.1.1 標識的命名 34
3.1.2 保留字 34
3.2 常量 35
3.2.1 直接常量 35
3.2.2 符號常量 35
3.3 變數 36
3.3.1 變數的定義 36
3.3.2 變數的初始化 36
3.4 變數的初始化 37
3.5 本章小結 37
3.6 習題 37
第4章 數據類型 38
4.1 C語言中的數據類型 38
4.1.1 基本數據類型 38
4.1.2 構造數據類型 39
4.1.3 指針數據類型 39
4.1.4 空類型 39
4.2 整型數據 39
4.2.1 整型常量 40
4.2.2 整型變數 40
4.3 實數型數據 41
4.3.1 實數型常量 42
4.3.2 實數型變數 42
4.4 字元型數據 43
4.4.1 字元型常量 43
4.4.2 字元型變數 44
4.5 數值型數據間的混合運算 46
4.5.1 自動類型轉換 46
4.5.2 強制類型轉換 47
4.6 本章小結 49
4.7 習題 49
第5章 運算符及其表達式 50
5.1 算術運算符及算術表達式 50
5.1.1 算術運算符 50
5.1.2 算術表達式 52
5.2 賦值運算符及賦值表達式 52
5.2.1 賦值運算符 53
5.2.2 賦值表達式 54
5.3 關系運算符及關系表達式 55
5.3.1 關系運算符 55
5.3.2 關系表達式 56
5.4 邏輯運算符及邏輯表達式 57
5.4.1 邏輯運算符 57
5.4.2 邏輯運算規則 58
5.4.3 邏輯表達式 59
5.5 條件運算符及條件表達式 61
5.5.1 條件運算符 61
5.5.2 條件表達式 62
5.6 逗號運算符及逗號表達式 65
5.6.1 逗號運算符 65
5.6.2 逗號表達式 66
5.7 位運算符 67
5.7.1 位邏輯運算符 67
5.7.2 移位運算符 69
5.7.3 位自反賦值運算符 70
5.8 位運算符 71
5.9 本章小結 72
5.10 習題 72
第6章 輸入與輸出 73
6.1 C語句概述 73
6.1.1 流程式控制制語句 73
6.1.2 函數調用語句 77
6.1.3 表達式語句 77
6.1.4 空語句 77
6.1.5 復合語句 77
6.2 輸入與輸出函數 78
6.2.1 格式輸出函數 78
6.2.2 格式輸入函數 81
6.2.3 字元輸入與字元輸出函數 85
6.3 整型數據的輸入與輸出 87
6.3.1 整型數據的輸出 87
6.3.2 整型數據的輸入 89
6.4 浮點型數據的輸入與輸出 89
6.5 本章小結 90
6.6 習題 90
第7章 順序結構與選擇結構 91
7.1 順序結構程序設計 91
7.2 選擇結構程序設計 93
7.2.1 if語句 93
7.2.2 switch語句 98
7.3 應用舉例 101
7.4 本章小結 104
7.5 習題 104
第8章 循環結構程序設計 105
8.1 while語句 105
8.2 do…while語句 107
8.3 for語句 110
8.3.1 for循環結構 110
8.3.2 for循環語句的嵌套 113
8.4 總結應用 115
8.4.1 幾種循環的比較 115
8.4.2 循環語句的嵌套 116
8.4.3 應用舉例 118
8.5 本章小結 121
8.6 習題 121
第9章 結構語句的轉移 122
9.1 break語句 122
9.1.1 跳出switch結構 122
9.2 跳出循環結構 124
9.2.1 問題1 124
9.2.2 問題2 125
9.3 continue語句 126
9.4 goto語句 127
9.5 本章小結 128
9.6 習題 128
第3篇 C語言進階
第10章 數組 129
10.1 數組的概述 129
10.2 一維數組 130
10.2.1 一維數組的定義 130
10.2.2 一維數組的初始化 131
10.2.3 一維數組的引用 132
10.2.4 一維數組的程序舉例 133
10.3 二維數組 139
10.3.1 二維數組的定義 139
10.3.2 二維數組的初始化 140
10.3.3 二維數組的引用 142
10.3.4 數組的程序舉例 144
10.4 本章小結 146
10.5 習題 146
第11章 字元數組 147
11.1 字元數組的定義 147
11.2 字元數組的初始化 147
11.3 字元數組的引用 148
11.4 字元數組與字元串的關系 148
11.5 字元數組的輸入與輸出 149
11.6 字元串處理函數 150
11.6.1 輸入字元串函數gets 151
11.6.2 輸出字元串函數puts 151
11.6.3 字元串測長度函數strlen 151
11.6.4 字元串比較函數strcmp 151
11.6.5 字元串復制函數strcpy和strncpy 152
11.6.6 字元串連接函數strcat 152
11.7 應用舉例 153
11.8 本章小結 158
11.9 習題 158
第12章 函數 159
12.1 函數的初步認識 159
12.2 函數定義 161
12.2.1 無參函數定義 161
12.2.2 有參函數定義 162
12.2.3 空函數定義 162
12.3 函數參數及返回值 163
12.3.1 函數的參數 163
12.3.2 函數的返回值 165
12.4 函數的參數傳遞 166
12.4.1 函數參數的數值傳遞 166
12.4.2 函數參數的地址傳遞 167
12.5 應用舉例 168
12.6 本章小結 170
12.7 習題 170
第13章 函數的調用 171
13.1 函數調用的一般形式 171
13.2 函數調用的形式 172
13.3 被調用函數的聲明與函數原型 173
13.4 函數的嵌套調用和遞歸調用 176
13.4.1 函數的嵌套調用 176
13.4.2 函數的遞歸調用 177
13.5 變數作用域 178
13.5.1 變數作用域和生存期 178
13.5.2 局部變數和全局變數 178
13.5.3 變數存儲類別 181
13.6 編譯預處理 185
13.6.1 宏定義 186
13.6.2 文件包含處理 189
13.6.3 條件編譯 190
13.7 本章小結 191
13.8 習題 191
第14章 指針操作 192
14.1 指針與地址 192
14.2 指針和指針變數 192
14.2.1 指針變數的定義 193
14.2.2 指針變數的引用 194
14.2.3 指針的運算 196
14.3 指針和數組 199
14.3.1 數組的指針和指向數組的指針變數 200
14.3.2 指針數組和指向指針的指針 203
14.3.3 指向字元串的指針 206
14.3.4 數組名作為函數參數 207
14.4 指針和函數 211
14.4.1 函數的指針和指向函數的指針變數 211
14.4.2 用指向函數的指針作為函數參數 212
14.4.3 指針數組作為函數參數 218
14.4.4 返回指針值的函數 219
14.4.5 字元串指針作為函數參數 220
14.5 本章小結 221
14.6 習題 221
第15章 結構體 222
15.1 結構體類型定義 222
15.1.1 結構體類型的說明 222
15.1.2 結構體類型的定義 222
15.2 結構體變數的定義與引用 224
15.2.1 結構體變數的定義與初始化 224
15.2.2 結構體變數的引用 226
15.3 結構數組 229
15.3.1 結構數組的定義 229
15.3.2 結構數組的引用 230
15.4 結構體指針 232
15.4.1 結構體指針變數的定義 232
15.4.2 結構體指針變數的引用 233
15.5 鏈表 236
15.5.1 鏈表概述 236
15.5.2 單鏈表建立 238
15.5.3 單鏈表簡單操作 242
15.6 本章小結 251
15.7 習題 251
第16章 共用體 252
16.1 共用體類型定義 252
16.1.1 定義共用體 252
16.1.2 共用體的存儲 253
16.2 共用體類型變數、數組和指針變數的定義 254
16.2.1 先定義共用體,再定義共用體變數、數組及指針變數 254
16.2.2 定義共用體的同時定義共用體變數、數組及指針變數 254
16.2.3 定義共用體變數、數組及指針變數時省略共用體名 255
16.3 共用體類型變數、數組和指針變數的引用 255
16.4 共用體應用舉例 257
16.5 枚舉類型 259
16.5.1 枚舉類型的定義 259
16.5.2 枚舉類型變數的賦值和引用 260
16.6 用typedef定義數據類型 262
16.7 本章小結 266
16.8 習題 266
第17章 文件 267
17.1 文件概述 267
17.1.1 文件名 267
17.1.2 文件的類型 268
17.2 文件類型指針 268
17.3 文件的打開與關閉 270
17.3.1 文件打開函數fopen() 270
17.3.2 文件關閉函數fclose() 272
17.4 文件的讀寫操作 272
17.4.1 字元讀寫函數 272
17.4.2 字元串讀寫函數 275
17.4.3 數據塊讀寫函數 278
17.4.4 格式數據讀寫函數 281
17.5 文件的定位 282
17.5.1 文件頭定位函數rewind() 282
17.5.2 文件隨機定位函數fseek() 283
17.5.3 測試當前位置函數ftell() 284
17.6 文件的檢測 285
17.6.1 文件末尾檢測函數feof() 285
17.6.2 文件讀寫出錯檢測函數ferror() 286
17.6.3 清除文件末尾和出錯標志函數clearerr() 287
17.7 本章小結 287
17.8 習題 287
第4篇 案例實戰
第18章 學生成績管理系統設計 288
18.1 學生成績管理系統功能 288
18.2 功能模塊的描述 288
18.2.1 數據結構 288
18.2.2 main()主函數 289
18.2.3 score *creatlink()創建動態鏈表 289
18.2.4 void print(score *head)顯示學生信息 290
18.2.5 score *add(score *head,score *stu)向鏈表中添加學生數據 290
18.2.6 score *search(score *head)查詢學生成績 290
18.2.7 score *dele(score *head)刪除數據 291
18.2.8 score *sortdata(score *head)對數據進行排序 291
18.2.9 save(score *p1)保存數據 291
18.2.10 score *load(score *head)從文件中讀取數據 291
18.2.11 score *statistics(score *head)成績統計 292
18.2.12 int menu(int k)菜單 292
18.2.13 用到的頭文件和全局變數 292
18.3 程序代碼 292
18.3.1 主函數main()代碼 292
18.3.2 創建鏈表函數creatlink() 293
18.3.3 顯示學生信息函數print() 296
18.3.4 向鏈表中添加學生數據函數add() 296
18.3.5 查詢學生成績函數search 298
18.3.6 刪除數據函數dele 299
18.3.7 對數據進行排序函數sortdata() 300
18.3.8 保存數據函數save() 303
18.3.9 從文件中讀取數據函數loadfile() 303
18.3.10 成績統計函數statistics() 304
18.4 程序運行 306
18.4.1 編輯學生成績 306
18.4.2 顯示學生成績 306
18.4.3 保存學生成績信息 307
18.4.4 查詢學生的成績 307
18.4.5 添加學生的成績 307
18.4.6 刪除學生的成績 307
18.4.7 學生成績排序 308
18.4.8 從文件中讀取學生的成績 308
18.4.9 統計學生的成績 308
18.5 本章小結 308
附錄A ASCII字元集 309
附錄B 運算符的優先順序與結合性 311
附錄C C語言常用庫函數 314

❸ C語言的經典編程例子


程序員》推薦C++ 圖書三人談

主持人:熊節(透明),《程序員》雜志編輯,C-View成員
嘉 賓:孟岩(夢魘),聯想公司掌上設備事業部應用開發處任職,C-View成員。與侯捷先生合譯《C++ Standard Library》一書
金尹(惡魔),上海天宇公司CTO,在《程序員》連載有「自由與繁榮的國度」系列文章

透明:「學C++用哪本書入門」,這是被問得最多的一個問題。但是哪一本書是最好的入門書?似乎很難找到答案。《C++ Primer》太厚,《Effective C++》對讀者要求比較高,《Essential C++》又常常被批評為「太淺」。
其實說穿了:no silver bullet。想從一本書學會C++,那是不可能的。有朋友問我如何學C++,我會建議他先去找本數據結構書,把裡面的習題全部用C++做一遍,然後再去看《Effective C++》。myan經常說「要在學習初期養成好習慣」,我對此頗不以為然。
個人認為,《Essential C++》適合作教材,《C++ Primer》適合作參考書,《Effective C++》適合作課外讀物。

惡魔:很後悔當初買了《C++ Primer》。因為從我個人角度來看,它的功能效用基本是和《The C++ Programming Language》重合。當然對於入門來說,它還是很不錯的。但是《C++ Primer》太厚,一來導致看書極其不方便,二來系統學習需要花比較長的時間。對於目前這個越來越快餐化的時代來說,的確有很多不適合的地方,不過可以作為初學者的參考書。現在我以一塊K3 CPU的代價把它借給了別人,希望我那位同事能夠從中得到一些益處。
如果已經具備了C基礎,我建議看國內的書,例如錢能的《 C++大學教程(第二版) 》。(如果沒有C的基礎還是看譚浩強的C語言)。這本書對C講得還算比較清晰,有很多習題值得一做,特別是最後的struct和union兩個部分。其中的一些演算法比較拖沓和繁瑣(比如樹和鏈表的遍歷演算法),讀者可以嘗試修改這些例子,作為最後對C語言的一些總結測試。

夢魘:這個問題讓我想起四五年前的情形。今天對於C++有一點認識的人,多半是從那幾年就開始學C++了。那時根本沒有品牌觀念。從書店裡找一本C++書,如果看著還算明白,就買下來。我記得那時候宛延闓、張國鋒、麥中凡教授的書都受到很高的贊譽。我個人最早的一本C++書是Greg Perry的一本書,今天想起來,其實是一本打著C++旗號的C語言教程。對我作用最大的一本書是國防科技出版社出版的一本書,書名記不得了,作者叫斯蒂芬·布萊哈。
透明:還記得以前曾批評過一本C++書,是北航出的,整本書就沒有出現過class關鍵字。那本書,說穿了其實只是介紹了C語言和iostream庫的用法,根本不能算C++。而當時我常常推薦的一本書是電子科技大學張松梅老師的C++教程。那本書,直到今天來看也沒有太大的問題,唯一的缺憾就是由於年代久遠,許多東西已經過時了。而對於一本技術書籍來說,「過時」是最不可接受的。
總體來說,那時使用C++的人真是在「盲人摸象」。不過這也有好處,就是對C++的很多細節能搞清楚,以後看到經典好書時比較容易理解;當然壞處就是概念不清,甚至都不知道C++和Visual C++、Borland C++到底有什麼不一樣。

夢魘:整個90年代,其實大部分人對於C++的認識都似是而非。一開始是等同於Borland C++,後來是等同於Visual C++和MFC。所以一般來說,打著BC和VC旗號的書賣得很好,人們覺得這就是C++。而我比較幸運,布萊哈的那本書雖然從現在的眼光來看談不上高超,但基本路子是對的。可能是因為原書是給UNIX程序員的培訓教材,所以沒有讓我一開始就形成「C++ == VC++」的認識。
其實一直到1996年,我們那裡搞計算機的都是唯Borland C++馬首是瞻的,到了VC 4.0出來,一下子格局全變了。1997年VC5推出之後,書店裡MFC書鋪天蓋地,學MFC的人,頭抬得都比別人高一些。不過現在看來,那時候大部分的MFC書都是三流貨色。我曾經有一段時間認為,那一批程序員中間有不少被誤導了。根本原因就是相對的封閉。

透明:我覺得一本書的價值有兩方面:第一,教給你實用的技術;第二,促使你去思考。對於一本介紹VC(或者說MFC)使用方法的書,我根本不希望它能促使我有什麼思考,所以我就一定要求它在技術上精益求精完美無瑕。我剛開始用VC的時候,買的第一本書就是潘愛民老師翻譯的《VC技術內幕》(第四版),沒有受到那些「三流貨色」的誤導,應該說是很幸運的。

夢魘:1999年機械工業出版社開始出版「計算機科學叢書」,其中的《Thinking in C++》第一版受到了廣泛的歡迎。其實我一直不認為這本書很出色,雖然拿過一次大獎。然而我們都得承認,這本書在C++書籍領域里第一次建立了品牌觀念,很多初學者開始知道,不是隨便買哪一本都一樣的。再往後就是2000年的《 深入淺出MFC(第二版) 》第二版,以及侯先生在《程序員》上發表的那一篇《C++/OOP大系》,加上整個大環境的變化,品牌觀念深入人心,C++書籍市場終於開始逐漸與世界同步。
回想往事,我的感覺是,那個需要戰戰兢兢選擇入門書的時代已經過去,今天的C++初學者,大可以放心地買口碑好、自己讀起來思路順暢的書,入門不再是太大的問題。還有一些程序員已經學了幾年C++,但看到今天出版的一些新書,感覺比較陌生,這也不是什麼問題。侯先生經常說「凡走過必留下足跡」,所謂「走彎路」,未必不是一件好事。
至於具體的推薦表,就不好一概而論了。總之在我的印象里,《Essential C++》、《C++ Primer》、錢能教授的C++教程,都不錯。甚至有人一上來就看Bjarne Stroustrup的《The C++ Programming Language》,只要他喜歡,也沒什麼不可以。

透明:我同意你的觀點。不管怎麼說,編程是門實踐性非常強的學問。要想對C++對象模型有深入的了解,最好的辦法就是寫一串程序去看結果;要想學會OOP,也只能從項目中學。對於初學者,最好的學習方法就是不停地寫程序,寫真正有用的程序,寫到有問題的時候就去查書,於是自然就會知道哪本書好哪本書不好。不過我們的教育制度能不能讓大學里的學生們有這樣的學習機會,我表示懷疑。
以我的經驗,學C++有兩個門檻:入門和使用。完全看不懂C++,這是一個門檻,但是只要有一本合適的入門書,很快就能跨過。要想真正用上C++,卻不是件很容易的事情。尤其對於學生來說,接觸到的東西多是「玩具」,很難有實戰的機會。所以經常看見有人問「C++到底能做什麼」,這是C++學習中一個比較麻煩的問題。我們都是做了相當長時間的C++程序之後才看到一些真正經典的書,也正是因為走了相當長的彎路之後才知道這些書的經典之所在。所謂彎路,我想也是一種必須的積累。就算一開始就看《Essential C++》和《C++ Primer》,沒有兩三年的時間恐怕還是難有所得。

惡魔:有兩句十分有道理的話,一是我大學的C語言老師說的「寫程序不如說是抄程序」,另一句是一網友說的「好的設計來自借鑒,天才的設計來自剽竊」。對於我這個理性批判主義者來說,這兩句話的確不太適合。但是無論從哪個角度來講,對於初學者來說,剽竊大師的作品是通向成功的最快捷徑。
我個人認為,對於C++的初學者來說,首先要確定自己專業領域內主要使用的特性的方向。因為C++的特性如此眾多,初學者想貪多基本是不可能成功的。C++的編程範式基本可以分為ADT+PP、GP和OO三個方向。對於ADT+PP範式來說,初學者的主要問題不是學習C++,而是學習C的使用。對於這樣的初學者,國內的幾本書還是寫得比較清楚,符合中國人的習慣,比如譚浩強的《C語言教程》、錢能的《C++語言大學教程》。這兩本書我首推第一本,因為這一本我潛心研究了一年,這本書當中很多程序是可以剽竊的,而且可以對這些程序進行加工和提升。比如結構這一章中,它所給出的用struct來實現鏈表、二叉樹的演算法是相當蹩腳的。學習ADT+PP的初學者將這本書揣摩透以後可以嘗試修改這兩個程序。另外這本書的第二版稍微涉及了一些關於「類」的內容。學習ADT+PP的初學者,可以不被OO中的一些專有特性擾亂自己的思路,對於類層次扁平、無繼承、無多態的程序編寫是有很大好處的。

透明:你好象比較推崇國內教授寫的書。現在社會上有種不好的風氣:一捧就捧上天,一貶就貶下地。就好象對待譚教授的書,前幾年是奉為經典,這幾年又有很多人使勁批評。學C++更是有點「崇洋媚外」,總是覺得初學就應該看《Essential C++》。我看這種觀點也是片面的。

惡魔:當然《Essential C++》也值得看看。但是我個人覺得這本書沒有譚浩強的《C語言教程》來得好。主要原因是:第一,C++的所有特性都點到了,但是不深,看了以後會三心二意沒有方向;第二,可以抄襲借鑒的例子太少。《C語言教程》中有很多有趣的問題,比如猴子吃桃、漢諾塔等等,這些例子對於剛剛涉及C/C++語言編程的人來說是學習編程很好的例子。《Essential C++》只能是前兩本書看透以後,作為學習C++特性的一個過渡性的書籍。讓讀者真正領略到什麼是C++的編程、和C編程的不同點在哪裡。

透明:我發現一個很有趣的現象:初學者往往喜歡問「哪本書比較好」,這讓我很是不解。這有點像一個剛學打籃球的人問「王治郅和科比誰比較厲害」。當然科比更厲害一些。但如果你是想學打籃球,這兩個人都非常非常有資格教你,你跟誰學都能學得很強——關鍵不是在於你選哪個老師,而是在於你自己用多少功夫去學。

透明:回到原來話題。學會了C++的語法,能看懂C++代碼之後,必須有些書來指導進階(或者叫指點迷津)。我覺得《設計模式》很好,能夠讓讀者看到一些精妙的用法。不過正如我經常說的,模式帶來的麻煩和好處一樣多,甚至麻煩還要更多。而且,C++本身的問題使得在C++中使用GoF模式愈加麻煩。

夢魘:《Design Patterns》這本書絕對是不可以沒有的,而且中英文版都不可少。最初我看中文版,說實話看不懂,但是也不覺得人家翻譯得不好,所以就想,大概是原文就很難懂,加上自己水平有限。於是總是想著再找幾本patterns的書來看。後來找到幾本書,口碑還不錯,不過水平高下,一比就出來了,還是那本《Design Patterns》最經典,最耐看。英文版出來之後,兩個版本對照看,明白多了。現在覺得,其實就設計模式來講,把這本看明白了就很不錯了,不用再花費很多心思找其他的書。我現在的包里始終夾著這本書,隨身攜帶,有備無患。
至於說設計模式的副作用,和可能帶來的弊端,我的體會也挺多。不過是這樣,我們想一想,究竟什麼情況下設計模式可以用得很好呢?一種是有經驗豐富的人引導,比如要是Robert Martin帶隊,你在某個地方用錯了設計模式,他就會指出來,說這里不對,將來會產生什麼樣的弊端。對於他來說,豐富的實踐經驗足以支持他進行「預測型」設計。但是大部分人沒這個能力,因此我們只好走第二條路和第三條路,就是「試探型」設計和「重構型」設計。遇到一個問題,你覺得用某種模式挺合適的,就大膽地用了,成功是積累經驗,發現不好,出了問題了,只好改回來,那也是積累教訓。這叫做「試探型」。至於重構,應該算是最有組織、成功率最高的工程化方法。先把問題「quick and dirty」地解決了,所有的暗礁都暴露出來,然後再根據實際情況採用合適的模式優化設計。現在XP和UP都高度重視refactory,UP在Elaboration和Construction階段都鼓勵抽出專門的iterations進行重構。所以說如果組織快速的軟體開發,當然比較傾向於這條路——打成功率嘛。

透明:講到重構,我順便說說《Refactoring》這本書的影響。從工程本身的角度來說,你所謂的「重構型設計」是沒有什麼問題的。但中國的開發者(也包括我在內)往往比較沖動,比較容易相信銀彈的存在。曾經有那麼一段時間,我在Java中嘗試過了重構的方法之後,又拿到C++中去嘗試。結果發現,在Java中速度非常快的重構過程,到C++中就被減慢了。究其原因,就是因為C++和Java的約束條件不同。拿著Java中成功的案例直接套C++,不失敗才怪。
所以,我必須說:《Refactoring》這本書很有價值。但對於C++程序員來說,它的價值是讓你思考,思考這種方法的可行性。如果一個C++程序員沒有打算遷移到Java,那麼我必須告訴他:《Refactoring》這本書不是讓你照著它用的,甚至不是讓你去相信它的。對於C++程序員,《Refactoring》全書可以放心相信的只有第13章,其他的部分,都必須非常謹慎地對待。

夢魘:我還要就「試探型」的方法多說兩句,我覺得對於個人發展來講,「試探」也是必不可少的,撞牆不可怕,高水平的人不都是撞出來的嗎?你失敗了一次,就知道這個模式有什麼潛在的問題,下次再用,就會多看幾步,像下棋似的。撞的多了,路數就出來了。
我不知道你們是否有這個感覺:用錯了模式,吃了虧,再回過頭去翻翻《Design Patterns》,看到人家早就指出來這個問題,不過就是那麼幾句話,原來看上去乾巴巴的,現在覺得句句都講到心坎上,GoF的形象馬上就高大起來,還帶著光環,感覺是既興奮又懊悔。

透明:現在回頭來看,我更欣賞myan推薦給我的《Designing Object-Oriented C++ Applications Using Booch Method》。這本書能夠幫助C++程序員理清思路培養習慣,可惜國內沒有引進。相比後來商業味濃厚的UML系列書籍,我覺得這本書對於面向對象的闡釋精闢獨到,至今未有能出其右者。

夢魘:剛才我們兩人都說到Robert Martin,他可是我的榜樣。那本1995年的《Designing Object Oriented C++ Application》,我覺得是每一個C++軟體工程師都應該反復研讀的書。可惜不僅國內沒有引進,在國外的名氣也不大。如果你覺得面向對象的那些道理你好像都明白,可就是一遇到實際問題就使不上勁,那這本書就是你的最佳導師。
提到理清思路,還有一本書不得不提,就是Andrew Koenig的《Ruminations On C++》。每個人都應該問自己,我學了這么多年的C++,究竟什麼是C++最基本的設計理念?遇到問題我第一個直覺是什麼?第一個試探型的解決方案應該具有那些特點?如果你不能給出明確的答案,就應該認真地去讀這本書,讀完了你就有了「主心骨」。

透明:插一句話,談談「推薦書」的問題。入門書基本上是放之四海而皆準的,所以推薦的意義也不大。而入門後的發展方向,每個人不同,這個時候就需要「高人」的指點。舉個例子:我學C++的時候,myan還不認識我,所以也沒有給我推薦書,我還是學過來了,所以即使你當時向我推薦了《Essential C++》或者《C++ Primer》,我也不會太感謝你;但在我認真研究OO的時候,你推薦Robert Martin那本書給我,對我幫助就特別大,而且我從別的地方也很難找到類似的推薦,所以我就很感謝你。
一個程序員,必須有framework的意識,要學會用framework,還要主動去分析framework(在這方面,《Design Patterns》能有一定的幫助)。但是,真正高質量、成氣候的framework的書恐怕也就只有針對MFC的。從這個角度來說,MFC縱有千般不是,C++程序員都非常有必要先去用它、熟悉它、研究它,甚至藉助《深入淺出MFC》這樣的書來剖析它。不然,很難有framework的意識和感覺。
當然,另一個framework也很好,那就是STL。不管用不用MFC、STL,對這兩個東西的掌握和理解都是極有幫助的。最近我又在看《深入淺出MFC》,雖然已經不用MFC編程了,但幫助是一定有的。

夢魘:MFC和STL方面,我還是比較推崇侯先生的兩本書《深入淺出MFC》和《STL源碼解析》。
《深入淺出MFC》這本書,名氣自然是大得不得了,不過也有不少人批評。其實書也沒有十全十美的,批評當然是少不了的,不過有的時候我看到有人評論這本書,把它跟Inside VC相比,真的是牛頭不對馬嘴。
你剛才其實說得很對,程序員應該有一點framework意識。而這本《深入淺出MFC》與其說是在講MFC編程,不如說通篇是在拿MFC為例分析Application Framework的架構和脈絡。所以無論你對於MFC本身是什麼態度,這本書對每一個C++程序員都有很大的益處。

透明:是的。《VC技術內幕》會告訴你「DYNAMIC_CREATE這個宏怎麼用」,《深入淺出MFC》則告訴你「DYNAMIC_CREATE這個宏是怎麼實現的」。所以,如果你只需要在VC下寫一些小應用程序,《深入淺出MFC》的價值並不太大;但是,如果你需要設計一個稍微大一點的東西(不一定是framework),MFC的設計思想就會有所幫助。

夢魘:另外,我覺得對於MFC也應該有一個公允的評價。過去是吹捧得天上有地下無,書店裡鋪天蓋地都是MFC的書,搞得大家只知有MFC,不知有C++,甚至直到現在還有人問:「我是學MFC呢,還是學C++?VC++是不是比C++更高級的語言?」MFC成了一尊神像,阻礙了人們的視線。所以得把它從神壇上拉下來。這就是過去一兩年有很多人,包括我在內批評MFC的一個目的。可是現在大家視野開闊了,.NET也出來了,MFC不再是神像了,少數人就開始以貶損MFC為樂了。我覺得這種態度是不對的。
什麼叫好的框架?我覺得在十幾年的時間能夠象MFC這樣保持穩定並且不斷進步的框架就是好的框架。可能我們在一些具體的設計問題上有不同看法,覺得「這個地方這么設計不是更漂亮嗎?」很多時候是的,但是這不重要,重要的是MFC成熟穩定、有十幾年的成功經驗,這是最了不起的東西。
另外一點,MFC中間包括著學習Win32 API編程的最佳資料。這是除了其framework方面之外的另一個亮點。我現在使用Win32 API開發,但是經常參考MFC的源代碼,收獲很大。

透明:STL方面,我對於剖析它的源代碼興趣並不大,畢竟裡面源代碼多是演算法問題。所以,《STL源碼剖析》我也只是隨便翻翻就束之高閣了。我覺得這本書用來做計算機系的數據結構和演算法教材不錯,不知道有沒有老師樂意這樣做。
對於STL,我的態度一向都是「應用至上」。不過,我一直認為SGI STL本身就是一本精彩的書,一本數據結構和演算法的經典參考書,同時也是泛型技術的參考書。想知道一個演算法是如何實現的,看看STL源代碼就行;想知道如何使用type traits,STL源代碼裡面也有例子。看別人寫的書,總覺得隔著一層紗,有點撓不到癢處的感覺。SGI STL的代碼寫得非常漂亮,一個C++程序員如果不看看這本書,實在是可惜。

夢魘:至於STL,除了《STL源碼解析》之外,我舉賢不避親,強烈推薦侯先生與我合譯的那本《The C++ Standard Library》。這本書質量之高是無需懷疑的。我現在手邊常備此書,隨時查閱,對我幫助很大。

透明:C++和Java相比,最大的優勢就是它沒有一個專門的公司來管它,最大的弱點也是它沒有一個專門的公司來管它。Java程序員在學會簡單的語法之後,立刻進入SUN提供的framework,一邊用這個現成的framework做實際開發,一邊在開發過程中繼續學習Java一些幽深的特性。而這個時候,C++程序員恐怕還在問「VC和BCB哪個好」呢。這無疑是浪費時間。

夢魘:剛才你說Java和C++的優劣,這個話題已經成了我們這個年代永不消失的聲波了。我也不想再談這個。不過有一點我得說清楚:現在我們很多用C++的人吃了不少苦頭,探過脖子去看看Java,覺得它真是太可愛了,這種印象是不準確的。另外,Java也不簡單,而且會越來越龐大復雜。在很多場合,Java還不具有競爭力。至於將來如何,我看有些Java愛好者也過分樂觀了,似乎計算機科學界幾十年解決不了的問題都可以借著Java的東風解決掉,恐怕沒那麼容易。

透明:那當然。我再次強調:No Silver Bullet。讀書很重要,但古人說「行萬里路,讀萬卷書」,還是把「行路」放在「讀書」前面。尤其對於技術書籍,如果它不能幫我解決問題、不能給我帶來非常實際的利益,那麼我是不會去讀它的。惡魔說得對,我們這個社會很快餐,我們這個行業尤其很快餐,我們也只能努力適應它。

❹ 求c語言基礎的簡單例子,如排序,加減等 越多越好

排序問題需要用中間值來交換如三個數來排序從大到小
#include<stdio.h>
void main()
{
int a,b,c,t;
scanf("%d%d%d",&a,&b,%c);
if(a<b)
{ t=a;
a=b;
b=t;}
if(a<c)
{ t=a;
a=c;
c=t;}
if(b<c)
{
t=b;
b=c;
c=t;
}
printf("%d,%d,%d\n",a,b,c);
}
加減就更好做了很簡單只要定義好變數就好,熟悉程序的環境
例如兩個數相加
#include<stdio.h>
void main()
{
int a,b,sum;
scanf("%d%d",&a,&b);
sun=a+b;
printf("%d\n",sum);

}
多個數就多設計個變數

❺ C語言實例

#include
<stdio.h>
#define
N
50
//
排隊人數(可任意更改)
#define
CAL
3
//凡報3的人出列(可任意更改)
//下面是排隊編號函數:從h
開始的n個人依次編號1到n
void
stdline(int
*h,int
n)
{
int
i;
for(i=1;i<n+1;i++)
*(h+i-1)=i;
}
/*下面函數表示從指針h處開始的人數為boy個人排隊,從1報數,每報到call的人出列*/
void
outline(int
*h,int
boy,int
call)
{
int
*p,
chu,
callnum;
/*說明:
p
工作指針,表示從頭依次指向每個元素,點名
chu
計數器,記錄出列的人數
callnum
計數器,記錄點名次序
*/
chu=0;
callnum=0;//各計數器清零
p=h;
//開始時,工作指針指向數組首
printf("出列順序是:\n");
while(chu<boy)
{
if(*p!=0)
callnum++;
//每次加報數
if(callnum==call)
//如果某一個人報到出列數call...
{
printf("%5d",*p);
//列印編號,表示出列
chu++;
//出列人數加1
if(chu==boy)//如果全部出列....
{
*h=*p;
//把最後一個出列人的編號記入地址開始處
return;
//結束
}
if(chu%10==0)printf("\n");//每輸出10個換行
callnum=0;
//出列後,重新報數
*p=0;
//出列後,將其編號賦零,以示區別
}
p++;
//工作指針移向下一個人,即下一個數組元素
if(p>h+boy-1)p=h;/*如果移到最後一個元素的後面,則讓指向地址開頭繼續報數*/
}
}
void
main()
{
int
a[N];
//用數組模擬隊列,每個元素代表一個人
stdline(a,N);//編號
outline(a,N,CAL);//計算並列印出列順序
printf("\n最後留下來的是
%d
號\n",*a);/*在函數中,已經把最後一個人的編號寫入了數組首地址處,
這里輸出就可以了*/
}

❻ c語言實例講解

以下這一段出了問題
for(i=2;i<n;i++);
if(n%i==0)
break;

for()後面跟的是語句,你打的for(i=2;i<n;i++);就壞在括弧外面的 「; 」
這相當於,不執行任何東西……因為 ; 是一個空語句……
你的本意是當for循環條件成立時執行
if(n%i==0)
break;
但是for()後面的;使得這兩個語句沒有發揮應有的作用……
請記住,for(),while(),do while,if()後面一般都不會緊跟著 」 ; 「

修改後程序如下,應該能實現的你要求
#include<stdio.h>
int main(void)
{
int n,i;
printf("please input a number>2:");
scanf("%d",&n);
for(i=2;i<n;i++)
{
if(n%i==0)
break;
}
if(i<n)
printf("%d not a sushu\n",n);
else
printf("%d is a sushu\n",n);
return 0;
}

❼ C語言入門經驗:零基礎如何學習C語言

工作中,接觸過很多想到學習c語言而又沒有一點計算機基礎的人。經常有人問」我沒有一點基礎,該怎麼入門c語言啊」。看過很多初學者久久摸不到門路,每到這個時候,腦海中總會浮現一個問題:學習c語言真的就那麼難嗎? 不難。


多人學習c語言,上來就去背語法,甚至連各種高深的演算法都是死背出來的,大學里流行考計算機二級C語言證書,手抄資料的有之,背全書者有之,終於可憐又可悲的拿到了所謂的證書,真正用c語言編寫程序處理問題時,滿腦子空了。可能這樣學過之後,把許多c語言語法記住了,但是卻學不會如何編寫程序處理問題。所以,掌握學習方法很重要。如果你覺得很難,那是因為你缺少一個好的方法。
學習c語言也離不開記憶語法,但是死記的話,肯定不行。c語言,無

非也就是一種工具,用它來表達我們的思路,讓計算機幫我們思考,寫程序的過程就變成了告訴計算機該怎麼做的過程。很多人遇到問題,自己都沒有思路,更別提用c語言寫程序了。很遇到問題的時候不要滿腦子去想怎麼用c語言處理這個問題,記住:程序
= 數據結構 + 演算法,把思路轉變到對數據的組織和對演算法的思考上 來。
數據結構歸根結底就是一些數據的組織形式,而數據在c語言里都有各自的類型,各種復雜的數據結構也都是從最基本數據類型組織起來的,所以學習

c語言,首先要記住c語言里可用的數據類型都有哪些,掌握每種數據類型的定義和使用規則。任何一種計算機編程語言,最根本都是對數據的操作。每種語言都有不完全相同的數據組成形式,很多時候,對於同樣一個問題,你可以構建不同的數據結構對它進行處理。初學者,不必太深究要把數據做成什麼類型可以寫出漂亮的程序。你只需要記住:你需要什麼樣的數據。
學習c語言,其次要學習演算法。演算法的好壞直接影響了程序的好壞。有人建議學程序的時候多看別人的例子程

序,研究別人是如何處理問題的。不錯,這是必不可少的,但是不要總是去看,也要自己多思考。這里的思考不是讓你思考如何處理這個問題,你要思考的是如何教
會計算機幫你解決這個問題。我們寫出來的程序畢竟是讓計算機來運行的。你必須按照計算機的特點來思考才可以。

❽ c語言基礎知識入門書籍有哪些

1、《啊哈C語言》


這本書在c語言界的殿堂級寶藏,可謂是經典之中的經典。縱向上,從hello world衍生出計算機的發展歷程,橫向上不斷深入,層層拔高。在短短的100多頁之內,幾乎就手把手教寫了stdio.h stdlib.h string.h當中大部分常式,實現了二分查找、快速排序、二叉樹、哈希表這些重要的數據結構和演算法。

❾ C語言簡單例子

C語言中,一般會用到函數。系統默認從主函數開始運行,即main()函數。一般結構為:
void main(void)
{
....
}
一般函數是帶有參數的,即後面括弧中需要一個或n個變數。中間用逗號隔開。例如
void add(int a, int b)
{
...
}
其中a,b為整形的參數,在大部分系統中int 代表16位的數。
有的函數還有返回值:像上面的一個加法函數,可以寫成:
int add(int a,int b)
{
return (a+b); //retuen為返回值
}
當我們要調用該函數時,只需要這要寫:
void main(void)
{
int sum = 0;
sum = add(x1,x2); //x1,x2為兩個常數
}

❿ 經典C語言程序例子

題目01:在一個已知的字元串中查找最長單詞,假定字元串中只含字母和空格,空格用來分隔不同的單詞。

(10)c語言入門案例擴展閱讀:

C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。