❶ 举几个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)以及超级电脑等作业平台。