描述
开 本: 128开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787302408307
本书是初学者学习C 程序设计的经典教材,荣获全国高校出版社优秀畅销书一等奖,是发行逾1250万册《C程序设计(第四版)》的升级篇。本书作者深入调查了大学的程序设计课程的现状和发展趋势,参阅了国内外数十种有关C 的教材,认真分析了读者在学习中的困难和认识规律,设计了读者易于学习的教材体系,于2004年出版了《C 程序设计》一书。该书降低入门起点,不需要C语言的基础,从零起点介绍程序设计和C 。广大师生用后反映非常好,认为该书定位准确,概念清晰,深入浅出,取舍合理,以通俗易懂的语言对C 的许多难懂的概念作了透彻而通俗的说明,大大降低了初学者学习的困难,是初学者学习C 的一本好教材。
根据教学实践的需要,作者对该书进行了两次修订,现在出版的《C 程序设计(第3版)》,内容更加丰富,讲解更加清晰,学习更加容易,依据ANSI C 标准进行介绍,引导读者从一开始就按C 的要求编程,而不是过多地迁就C语言的习惯。全书分为4篇:基本知识、基于过程的程序设计、基于对象的程序设计和面向对象的程序设计。
本书沿袭了发行逾1250万册《C程序设计(第四版)》的写作风格。全书内容全面,例题丰富,概念清晰,循序渐进,易于学习,即使没有教师讲授,读者也能看懂本书的大部分内容。本书是学习C 程序设计的入门教材,可供各类专业学生使用,也可作为计算机培训班的教材以及读者自学参考。
为了便于教学,本书有《C 程序设计题解与上机指导(第3版)》(ISBN:
9787302408420)和《C 程序设计实践指导》(ISBN:9787302110873)两本配套教材,旨在帮助学生通过实践掌握C 的编程方法。本书配有PPT教案、主辅教材配套源代码,可到清华大学出版社官网下载。
本书作者深入调查了大学的程序设计课程的现状和发展趋势,参阅了国内外数十种有关C 的教材,认真分析了读者在学习中的困难和认识规律,设计了读者易于学习的教材体系,于2004年出版了《C 程序设计》一书。该书降低入门起点,不需要C语言的基础,从零起点介绍程序设计和C 。广大师生用后反映非常好,认为该书定位准确,概念清晰,深入浅出,取舍合理,以通俗易懂的语言对C 的许多难懂的概念作了透彻而通俗的说明,大大降低了初学者学习的困难,是初学者学习C 的一本好教材。
根据教学实践的需要,作者在2011年对该书进行了修订,出版了《C 程序设计(第2版)》,现在又进行了一次修订,出版了《C 程序设计(第3版)》,内容更加丰富,讲解更加清晰,学习更加容易,依据ANSI C 标准进行介绍,引导读者从一开始就按C 的要求编程,而不是过多地迁就C语言的习惯。全书分为4篇: 基本知识、基于过程的程序设计、基于对象的程序设计和面向对象的程序设计。
为了便于教学,本书有《C 程序设计题解和上机指导(第3版)》和《C 程序设计实践指导》两本配套教材,旨在帮助学生通过实践掌握C 的编程方法。
本书内容全面,例题丰富,概念清晰,循序渐进,易于学习,即使没有教师讲授,读者也能看懂本书的大部分内容。本书是学习C 的入门教材,可供各类专业学生使用,也可作为计算机培训班的教材以及读者自学参考。
第1篇基 本 知 识
第1章C 的初步知识3
1.1从C到C 3
1.2最简单的C 程序5
1.3C 程序的构成和书写形式12
1.4C 程序的编写和实现13
1.5关于C 上机实践15
习题15
第2章数据的存储、表示形式和基本运算18
2.1C 的数据类型18
2.2常量20
2.2.1什么是常量20
2.2.2数值常量20
2.2.3字符常量22
2.2.4符号常量25
2.3变量26
2.3.1什么是变量26
2.3.2变量名规则26
2.3.3定义变量27
2.3.4对变量赋初值28
2.3.5常变量28
2.4C 的运算符29
2.5算术运算符与算术表达式30
2.5.1基本的算术运算符30
2.5.2算术表达式和运算符的优先级与结合性30
2.5.3表达式中各类数值型数据间的混合运算30
2.5.4自增( )和自减(–)运算符31
2.5.5强制类型转换运算符32
2.6赋值运算符和赋值表达式33
2.6.1赋值运算符33
2.6.2赋值过程中的类型转换33
2.6.3复合赋值运算符35
2.6.4赋值表达式35
2.7逗号运算符和逗号表达式36
习题37
第2篇基于过程的程序设计
第3章程序设计初步41
3.1基于过程的程序设计和算法41
3.1.1算法的概念41
3.1.2算法的表示42
3.2C 的程序结构和C 语句43
3.3赋值操作46
3.4C 的输入与输出46
3.4.1输入流与输出流的基本操作47
3.4.2在标准输入流与输出流中使用控制符49
3.4.3用getchar和putchar 函数进行字符的输入和输出52
3.4.4用scanf和printf函数进行输入和输出53
3.5编写顺序结构的程序54
3.6关系运算和逻辑运算55
3.6.1关系运算和关系表达式55
3.6.2逻辑常量和逻辑变量57
3.6.3逻辑运算和逻辑表达式58
3.7选择结构和if语句60
3.7.1if语句的形式60
3.7.2if语句的嵌套63
3.7.3条件运算符和条件表达式64
3.7.4多分支选择结构与switch 语句65
3.7.5编写选择结构的程序67
3.8循环结构和循环语句69
3.8.1用while语句构成循环70
3.8.2用dowhile语句构成循环71
3.8.3用for语句构成循环72
3.8.4循环的嵌套74
3.8.5提前结束循环(break语句和continue语句)74
3.8.6编写循环结构的程序75
习题80
第4章利用函数实现指定的功能83
4.1什么是函数83
4.1.1为什么需要函数83
4.1.2函数调用举例84
4.1.3函数的分类85
4.2定义函数的一般形式85
4.2.1定义无参函数的一般形式85
4.2.2定义有参函数的一般形式86
4.3函数参数和函数的值86
4.3.1形式参数和实际参数86
4.3.2函数的返回值88
4.4函数的调用89
4.4.1函数调用的一般形式89
4.4.2函数调用的方式89
4.4.3对被调用函数的声明和函数原型90
4.5函数的嵌套调用92
4.6函数的递归调用95
4.7内置函数98
4.8函数的重载100
4.9函数模板102
4.10有默认参数的函数104
4.11局部变量和全局变量106
4.11.1局部变量106
4.11.2全局变量107
4.12变量的存储类别109
4.12.1动态存储方式与静态存储方式109
4.12.2自动变量110
4.12.3用static声明静态局部变量110
4.12.4用register声明寄存器变量113
4.12.5用extern声明外部变量113
4.12.6用static声明静态外部变量115
4.13变量属性小结115
4.14关于变量的声明和定义118
4.15内部函数和外部函数119
4.15.1内部函数119
4.15.2外部函数119
4.16头文件121
4.16.1头文件的内容121
4.16.2关于C 标准库和头文件的形式121
习题122
第5章利用数组处理批量数据124
5.1为什么需要用数组124
5.2定义和引用一维数组125
5.2.1定义一维数组125
5.2.2引用一维数组的元素125
5.2.3一维数组的初始化126
5.2.4一维数组程序举例126
5.3定义和引用二维数组128
5.3.1定义二维数组129
5.3.2引用二维数组的元素130
5.3.3二维数组的初始化130
5.3.4二维数组程序举例131
5.4用数组作函数参数133
5.5字符数组137
5.5.1定义和初始化字符数组137
5.5.2字符数组的赋值与引用138
5.5.3字符串和字符串结束标志139
5.5.4字符数组的输入输出140
5.5.5使用字符串处理函数对字符串进行操作141
5.5.6字符数组应用举例144
5.6C 处理字符串的方法——字符串类与字符串变量145
5.6.1字符串变量的定义和引用146
5.6.2字符串变量的运算147
5.6.3字符串数组147
5.6.4字符串运算举例148
习题151
第6章善于使用指针与引用153
6.1什么是指针153
6.2变量与指针155
6.2.1定义指针变量155
6.2.2引用指针变量157
6.2.3用指针作函数参数159
6.3数组与指针164
6.3.1指向数组元素的指针164
6.3.2用指针变量作函数形参接收数组地址166
6.4字符串与指针169
6.5函数与指针171
6.6返回指针值的函数172
6.7指针数组和指向指针的指针 173
6.7.1指针数组173
6.7.2指向指针的指针175
6.8const指针177
6.9void指针类型179
6.10有关指针的数据类型和指针运算的小结180
6.10.1有关指针的数据类型的小结180
6.10.2指针运算小结180
6.11引用182
6.11.1什么是变量的引用182
6.11.2引用的简单使用183
6.11.3引用作为函数参数184
习题188
第7章用户自定义数据类型190
7.1结构体类型190
7.1.1为什么需要用结构体类型190
7.1.2结构体类型变量的定义方法及其初始化191
7.1.3引用结构体变量193
7.1.4结构体数组195
7.1.5指向结构体变量的指针197
7.1.6结构体类型数据作为函数参数200
7.1.7用new和delete运算符进行动态分配和撤销存储空间203
7.2枚举类型205
7.3用typedef声明新的类型名208
习题211
第3篇基于对象的程序设计
第8章类和对象的特性215
8.1面向对象程序设计方法概述215
8.1.1什么是面向对象的程序设计215
8.1.2面向对象程序设计的特点219
8.1.3类和对象的作用220
8.1.4面向对象的软件开发221
8.2类的声明和对象的定义222
8.2.1类和对象的关系222
8.2.2声明类类型222
8.2.3定义对象的方法225
8.3类的成员函数226
8.3.1成员函数的性质226
8.3.2在类外定义成员函数227
8.3.3内置成员函数228
8.3.4成员函数的存储方式229
8.4对象成员的引用231
8.4.1通过对象名和成员运算符访问对象中的成员231
8.4.2通过指向对象的指针访问对象中的成员232
8.4.3通过对象的引用来访问对象中的成员232
8.5类的封装性和信息隐蔽232
8.5.1公用接口与私有实现的分离232
8.5.2类声明和成员函数定义的分离234
8.5.3面向对象程序设计中的几个名词235
8.6类和对象的简单应用举例236
习题243
第9章怎样使用类和对象245
9.1利用构造函数对类对象进行初始化245
9.1.1对象的初始化245
9.1.2用构造函数实现数据成员的初始化246
9.1.3带参数的构造函数248
9.1.4用参数初始化表对数据成员初始化250
9.1.5构造函数的重载251
9.1.6使用默认参数的构造函数252
9.2析构函数255
9.3调用构造函数和析构函数的顺序257
9.4对象数组259
9.5对象指针261
9.5.1指向对象的指针261
9.5.2指向对象成员的指针262
9.5.3this指针265
9.6共用数据的保护266
9.6.1常对象266
9.6.2常对象成员268
9.6.3指向对象的常指针269
9.6.4指向常对象的指针变量270
9.6.5对象的常引用273
9.6.6const型数据的小结274
9.7对象的动态建立和释放274
9.8对象的赋值和复制275
9.8.1对象的赋值275
9.8.2对象的复制277
9.9静态成员279
9.9.1静态数据成员280
9.9.2静态成员函数282
9.10友元285
9.10.1友元函数285
9.10.2友元类289
9.11类模板290
习题294
第10章运算符重载297
10.1什么是运算符重载297
10.2运算符重载的方法299
10.3重载运算符的规则302
10.4运算符重载函数作为类成员函数和友元函数303
10.5重载双目运算符307
10.6重载单目运算符311
10.7重载流插入运算符“<>”314
10.7.1重载流插入运算符“<
10.7.2重载流提取运算符“>>”316
10.8有关运算符重载的归纳 318
10.9不同类型数据间的转换319
10.9.1标准类型数据间的转换319
10.9.2用转换构造函数进行不同类型数据的转换320
10.9.3类型转换函数321
习题327
第4篇面向对象的程序设计
第11章继承与派生331
11.1继承与派生的概念331
11.2派生类的声明方式334
11.3派生类的构成334
11.4派生类成员的访问属性336
11.4.1公用继承337
11.4.2私有继承339
11.4.3保护成员和保护继承342
11.4.4多级派生时的访问属性346
11.5派生类的构造函数和析构函数347
11.5.1简单的派生类的构造函数347
11.5.2有子对象的派生类的构造函数351
11.5.3多层派生时的构造函数354
11.5.4派生类构造函数的特殊形式356
11.5.5派生类的析构函数356
11.6多重继承357
11.6.1声明多重继承的方法357
11.6.2多重继承派生类的构造函数357
11.6.3多重继承引起的二义性问题360
11.6.4虚基类363
11.7基类与派生类的转换368
11.8继承与组合371
11.9继承在软件开发中的重要意义373
习题374
第12章多态性与虚函数379
12.1多态性的概念379
12.2一个典型的例子380
12.3利用虚函数实现动态多态性385
12.3.1虚函数的作用385
12.3.2静态关联与动态关联389
12.3.3在什么情况下应当声明虚函数391
12.3.4虚析构函数391
12.4纯虚函数与抽象类393
12.4.1纯虚函数393
12.4.2抽象类393
12.4.3应用实例394
习题400
第13章输入输出流401
13.1C 的输入和输出401
13.1.1输入输出的含义401
13.1.2C 的I/O对C的发展——类型安全和可扩展性401
13.1.3C 的输入输出流402
13.2标准输出流407
13.2.1cout,cerr和clog流407
13.2.2标准类型数据的格式输出409
13.2.3用流成员函数put输出字符412
13.3标准输入流414
13.3.1cin流414
13.3.2用于字符输入的流成员函数414
13.3.3istream类的其他成员函数416
13.4对数据文件的操作与文件流419
13.4.1文件的概念419
13.4.2文件流类与文件流对象420
13.4.3文件的打开与关闭421
13.4.4对ASCII文件的操作423
13.4.5对二进制文件的操作428
13.5字符串流433
习题438
第14章C 工具440
14.1异常处理440
14.1.1异常处理的任务440
14.1.2异常处理的方法441
14.1.3在函数声明中进行异常情况指定448
14.1.4在异常处理中处理析构函数448
14.2命名空间450
14.2.1为什么需要命名空间451
14.2.2什么是命名空间454
14.2.3使用命名空间解决名字冲突456
14.2.4使用命名空间成员的方法458
14.2.5无名的命名空间460
14.2.6标准命名空间std460
14.3使用早期的函数库461
习题462
参考文献4671.4C 程序的编写和实现13
1.5关于C 上机实践15
习题15
第2章数据的存储、表示形式和基本运算19
2.1C 的数据类型19
2.2常量21
2.2.1什么是常量21
2.2.2数值常量21
2.2.3字符常量23
2.2.4符号常量26
2.3变量27
2.3.1什么是变量27
2.3.2变量名规则27
2.3.3定义变量28
2.3.4对变量赋初值29
2.3.5常变量29
2.4C 的运算符30
2.5算术运算符与算术表达式31
2.5.1基本的算术运算符31
2.5.2算术表达式和运算符的优先级与结合性31
2.5.3表达式中各类数值型数据间的混合运算32
2.5.4自增( )和自减(–)运算符32
2.5.5强制类型转换运算符33
2.6赋值运算符和赋值表达式34
2.6.1赋值运算符34
2.6.2赋值过程中的类型转换34
2.6.3复合赋值运算符36
2.6.4赋值表达式37
2.7逗号运算符和逗号表达式38
习题38
第2篇基于过程的程序设计
第3章程序设计初步43
3.1基于过程的程序设计和算法43
3.1.1算法的概念43
3.1.2算法的表示44
3.2C 的程序结构和C 语句45
3.3赋值操作48
3.4C 的输入与输出48
3.4.1输入流与输出流的基本操作49
3.4.2在标准输入流与输出流中使用控制符52
3.4.3用getchar和putchar 函数进行字符的输入和输出54
3.4.4用scanf和printf函数进行输入和输出56
3.5编写顺序结构的程序57
3.6关系运算和逻辑运算57
3.6.1关系运算和关系表达式58
3.6.2逻辑常量和逻辑变量59
3.6.3逻辑运算和逻辑表达式60
3.7选择结构和if语句62
3.7.1if语句的形式62
3.7.2if语句的嵌套65
3.7.3条件运算符和条件表达式66
3.7.4多分支选择结构与switch 语句67
3.7.5编写选择结构的程序69
3.8循环结构和循环语句72
3.8.1用while语句构成循环72
3.8.2用dowhile语句构成循环73
3.8.3用for语句构成循环74
3.8.4循环的嵌套76
3.8.5提前结束循环(break语句和continue语句)77
3.8.6编写循环结构的程序78
习题82
第4章利用函数实现指定的功能85
4.1什么是函数85
4.1.1为什么需要函数85
4.1.2函数调用举例86
4.1.3函数的分类87
4.2定义函数的一般形式87
4.2.1定义无参函数的一般形式87
4.2.2定义有参函数的一般形式88
4.3函数参数和函数的值88
4.3.1形式参数和实际参数88
4.3.2函数的返回值90
4.4函数的调用91
4.4.1函数调用的一般形式91
4.4.2函数调用的方式91
4.4.3对被调用函数的声明和函数原型92
4.5函数的嵌套调用94
4.6函数的递归调用97
4.7内置函数100
4.8函数的重载102
4.9函数模板104
4.10有默认参数的函数106
4.11局部变量和全局变量108
4.11.1局部变量109
4.11.2全局变量110
4.12变量的存储类别111
4.12.1动态存储方式与静态存储方式111
4.12.2自动变量112
4.12.3用static声明静态局部变量113
4.12.4用register声明寄存器变量115
4.12.5用extern声明外部变量115
4.12.6用static声明静态外部变量117
4.13变量属性小结118
4.14关于变量的声明和定义120
4.15内部函数和外部函数121
4.15.1内部函数121
4.15.2外部函数121
4.16头文件123
4.16.1头文件的内容123
4.16.2关于C 标准库和头文件的形式124
习题124
第5章利用数组处理批量数据126
5.1为什么需要用数组126
5.2定义和引用一维数组127
5.2.1定义一维数组127
5.2.2引用一维数组的元素127
5.2.3一维数组的初始化128
5.2.4一维数组程序举例128
5.3定义和引用二维数组131
5.3.1定义二维数组131
5.3.2引用二维数组的元素132
5.3.3二维数组的初始化132
5.3.4二维数组程序举例133
5.4用数组作函数参数135
5.5字符数组139
5.5.1定义和初始化字符数组140
5.5.2字符数组的赋值与引用140
5.5.3字符串和字符串结束标志141
5.5.4字符数组的输入输出143
5.5.5使用字符串处理函数对字符串进行操作144
5.5.6字符数组应用举例146
5.6C 处理字符串的方法——字符串类与字符串变量147
5.6.1字符串变量的定义和引用148
5.6.2字符串变量的运算149
5.6.3字符串数组149
5.6.4字符串运算举例150
习题153
第6章善于使用指针与引用155
6.1什么是指针155
6.2变量与指针157
6.2.1定义指针变量157
6.2.2引用指针变量159
6.2.3用指针作函数参数161
6.3数组与指针166
6.3.1指向数组元素的指针166
6.3.2用指针变量作函数形参接收数组地址168
6.4字符串与指针171
6.5函数与指针173
6.6返回指针值的函数175
6.7指针数组和指向指针的指针 175
6.7.1指针数组175
*6.7.2指向指针的指针177
*6.8const指针178
*6.9void指针类型181
6.10有关指针的数据类型和指针运算的小结182
6.10.1有关指针的数据类型的小结182
6.10.2指针运算小结183
*6.11引用184
6.11.1什么是变量的引用184
6.11.2引用的简单使用186
6.11.3引用作为函数参数186
习题190
第7章用户自定义数据类型192
7.1结构体类型192
7.1.1为什么需要用结构体类型192
7.1.2结构体类型变量的定义方法及其初始化193
7.1.3引用结构体变量195
7.1.4结构体数组197
7.1.5指向结构体变量的指针199
7.1.6结构体类型数据作为函数参数202
*7.1.7用new和delete运算符进行动态分配和撤销存储空间205
7.2枚举类型207
7.3用typedef声明新的类型名210
习题213
第3篇基于对象的程序设计
第8章类和对象的特性217
8.1面向对象程序设计方法概述217
8.1.1什么是面向对象的程序设计217
8.1.2面向对象程序设计的特点221
8.1.3类和对象的作用222
8.1.4面向对象的软件开发223
8.2类的声明和对象的定义224
8.2.1类和对象的关系224
8.2.2声明类类型224
8.2.3定义对象的方法227
8.3类的成员函数228
8.3.1成员函数的性质228
8.3.2在类外定义成员函数229
8.3.3内置成员函数230
8.3.4成员函数的存储方式231
8.4对象成员的引用233
8.4.1通过对象名和成员运算符访问对象中的成员233
8.4.2通过指向对象的指针访问对象中的成员234
8.4.3通过对象的引用来访问对象中的成员234
8.5类的封装性和信息隐蔽234
8.5.1公用接口与私有实现的分离234
8.5.2类声明和成员函数定义的分离236
8.5.3面向对象程序设计中的几个名词237
8.6类和对象的简单应用举例238
习题245
第9章怎样使用类和对象247
9.1利用构造函数对类对象进行初始化247
9.1.1对象的初始化247
9.1.2用构造函数实现数据成员的初始化248
9.1.3带参数的构造函数250
9.1.4用参数初始化表对数据成员初始化252
9.1.5构造函数的重载253
9.1.6使用默认参数的构造函数255
9.2析构函数258
9.3调用构造函数和析构函数的顺序260
9.4对象数组262
9.5对象指针264
9.5.1指向对象的指针264
9.5.2指向对象成员的指针264
9.5.3this指针267
9.6共用数据的保护269
9.6.1常对象269
9.6.2常对象成员270
9.6.3指向对象的常指针272
9.6.4指向常对象的指针变量272
9.6.5对象的常引用275
9.6.6const型数据的小结276
9.7对象的动态建立和释放277
9.8对象的赋值和复制278
9.8.1对象的赋值278
9.8.2对象的复制279
9.9静态成员282
9.9.1静态数据成员283
9.9.2静态成员函数285
9.10友元288
9.10.1友元函数288
9.10.2友元类292
9.11类模板293
习题297
第10章运算符重载301
10.1什么是运算符重载301
10.2运算符重载的方法303
10.3重载运算符的规则306
10.4运算符重载函数作为类成员函数和友元函数307
10.5重载双目运算符311
10.6重载单目运算符315
10.7重载流插入运算符“<>”318
10.7.1重载流插入运算符“<
10.7.2重载流提取运算符“>>”321
10.8有关运算符重载的归纳 322
10.9不同类型数据间的转换323
10.9.1标准类型数据间的转换323
10.9.2用转换构造函数进行不同类型数据的转换324
10.9.3类型转换函数326
习题331
第4篇面向对象的程序设计
第11章继承与派生335
11.1继承与派生的概念335
11.2派生类的声明方式338
11.3派生类的构成338
11.4派生类成员的访问属性340
11.4.1公用继承341
11.4.2私有继承343
11.4.3保护成员和保护继承346
11.4.4多级派生时的访问属性350
11.5派生类的构造函数和析构函数351
11.5.1简单的派生类的构造函数351
11.5.2有子对象的派生类的构造函数355
11.5.3多层派生时的构造函数358
11.5.4派生类构造函数的特殊形式360
11.5.5派生类的析构函数361
11.6多重继承361
11.6.1声明多重继承的方法361
11.6.2多重继承派生类的构造函数361
11.6.3多重继承引起的二义性问题364
11.6.4虚基类368
11.7基类与派生类的转换372
11.8继承与组合376
11.9继承在软件开发中的重要意义377
习题379
第12章多态性与虚函数384
12.1多态性的概念384
12.2一个典型的例子385
12.3利用虚函数实现动态多态性390
12.3.1虚函数的作用390
12.3.2静态关联与动态关联394
12.3.3在什么情况下应当声明虚函数396
12.3.4虚析构函数396
12.4纯虚函数与抽象类398
12.4.1纯虚函数398
12.4.2抽象类398
12.4.3应用实例399
习题405
第13章输入输出流407
13.1C 的输入和输出407
13.1.1输入输出的含义407
13.1.2C 的I/O对C的发展——类型安全和可扩展性407
13.1.3C 的输入输出流408
13.2标准输出流413
13.2.1cout,cerr和clog流413
13.2.2标准类型数据的格式输出415
13.2.3用流成员函数put输出字符418
13.3标准输入流420
13.3.1cin流420
13.3.2用于字符输入的流成员函数420
13.3.3istream类的其他成员函数422
13.4对数据文件的操作与文件流425
13.4.1文件的概念425
13.4.2文件流类与文件流对象426
13.4.3文件的打开与关闭427
13.4.4对ASCII文件的操作429
13.4.5对二进制文件的操作434
13.5字符串流440
习题444
第14章C 工具446
14.1异常处理446
14.1.1异常处理的任务446
14.1.2异常处理的方法447
14.1.3在函数声明中进行异常情况指定454
14.1.4在异常处理中处理析构函数454
14.2命名空间457
14.2.1为什么需要命名空间457
14.2.2什么是命名空间460
14.2.3使用命名空间解决名字冲突462
14.2.4使用命名空间成员的方法464
14.2.5无名的命名空间466
14.2.6标准命名空间std466
14.3使用早期的函数库467
习题468
参考文献473
从20世纪70年代末、80年代初开始,我国的高等院校开始面向各个专业的全体大学生开展计算机教育。面向非计算机专业学生的计算机基础教育,牵涉的专业面广、人数众多,影响深远,它将直接影响我国各行各业、各个领域中计算机应用的发展水平。这是一项意义重大而且大有可为的工作,应该引起各方面的充分重视。
20多年来,全国高等院校计算机基础教育研究会和全国高校从事计算机基础教育的老师始终不渝地在这片未被开垦的土地上辛勤工作,深入探索,努力开拓,积累了丰富的经验,初步形成了一套行之有效的课程体系和教学理念。20年来高等院校计算机基础教育的发展经历了3个阶段:20世纪80年代是初创阶段,带有扫盲的性质,多数学校只开设一门入门课程;20世纪90年代是规范阶段,在全国范围内形成了按3个层次进行教学的课程体系,教学的广度和深度都有所发展;进入21世纪,开始了深化提高的第3阶段,需要在原有基础上再上一个新台阶。
在计算机基础教育的新阶段,要充分认识到计算机基础教育面临的挑战。
(1) 在世界范围内信息技术以空前的速度迅猛发展,新的技术和新的方法层出不穷,要求高等院校计算机基础教育必须跟上信息技术发展的潮流,大力更新教学内容,用信息技术的新成就武装当今的大学生。
(2) 我国国民经济现在处于持续快速稳定发展阶段,需要大力发展信息产业,加快经济与社会信息化的进程,这就迫切需要大批既熟悉本领域业务,又能熟练使用计算机,并能将信息技术应用于本领域的新型专门人才。因此需要大力提高高校计算机基础教育的水平,培养出数以百万计的计算机应用人才。
(3) 21世纪,信息技术教育在我国中小学中全面开展,计算机教育的起点从大学下移到中小学。水涨船高,这样也为提高大学的计算机教育水平创造了十分有利的条件。
迎接21世纪的挑战,大力提高我国高等学校计算机基础教育的水平,培养出符合信息时代要求的人才,已成为广大计算机教育工作者的神圣使命和光荣职责。全国高等院校计算机基础教育研究会和清华大学出版社于2002年联合成立了“中国高等院校计算机基础教育改革课题研究组”,集中了一批长期在高校计算机基础教育领域从事教学和研究的专家、教授,经过深入调查研究,广泛征求意见,反复讨论修改,提出了高校计算机基础教育改革思路和课程方案,并于2004年7月发布了《中国高等院校计算机基础教育课程体系2004》(简称CFC 2004),由清华大学出版社出版。国内知名专家和从事计算机基础教育工作的广大教师一致认为CFC 2004提出了一个既体现先进性又切合实际的思路和解决方案,该研究成果具有开创性、针对性、前瞻性和可操作性,对发展我国高等院校的计算机基础教育具有重要的指导作用。在此基础上,根据计算机基础教育的发展,全国高等院校计算机基础教育研究会先后多次发布了CFC的新版本。
为了实现CFC提出的要求,必须有一批与之配套的教材。教材是实现教育思想和教学要求的重要保证,是教学改革中的一项重要的基本建设。如果没有好的教材,提高教学质量只是一句空话。要写好一本教材是不容易的,不仅需要掌握有关的科学技术知识,而且要熟悉自己工作的对象、研究读者的认识规律、善于组织教材内容、具有较好的文字功底,还需要学习一点教育学和心理学的知识等。一本好的计算机基础教材应当具备以下5个要素:
(1) 定位准确。要明确读者对象,要有的放矢,不要不问对象,提笔就写。
(2) 内容先进。要能反映计算机科学技术的新成果、新趋势。
(3) 取舍合理。要做到“该有的有,不该有的没有”,不要包罗万象、贪多求全,不应把教材写成手册。
(4) 体系得当。要针对非计算机专业学生的特点,精心设计教材体系,不仅使教材体现科学性和先进性,还要注意循序渐进、降低台阶、分散难点,使学生易于理解。
(5) 风格鲜明。要用通俗易懂的方法和语言叙述复杂的概念。善于运用形象思维,深入浅出,引人入胜。
为了推动各高校的教学,我们愿意与全国各地区、各学校的专家和老师共同奋斗,编写和出版一批具有中国特色的、符合非计算机专业学生特点的、受广大读者欢迎的优秀教材。为此,我们成立了“中国高等院校计算机基础教育课程体系规划教材”编审委员会,全面指导本套教材的编写工作。
这套教材具有以下几个特点:
(1) 全面体现CFC的思路和课程要求。可以说,本套教材是CFC的具体化。
(2) 教材内容体现了信息技术发展的趋势。由于信息技术发展迅速,教材需要不断更新内容,推陈出新。本套教材力求反映信息技术领域中新的发展、新的应用。
(3) 按照非计算机专业学生的特点构建课程内容和教材体系,强调面向应用,注重培养应用能力,针对多数学生的认知规律,尽量采用通俗易懂的方法说明复杂的概念,使学生易于学习。
(4) 考虑到教学对象不同,本套教材包括了各方面所需要的教材(重点课程和一般课程;必修课和选修课;理论课和实践课) ,供不同学校、不同专业的学生选用。
(5) 本套教材的作者都有较高的学术造诣,有丰富的计算机基础教育的经验,在教材中体现了研究会所倡导的思路和风格,因而符合教学实践,便于采用。
本套教材统一规划、分批组织、陆续出版,希望能得到各位专家、老师和读者的指正,我们将根据计算机技术的发展和广大师生的宝贵意见随时修订,使之不断完善。
全国高等院校计算机基础教育研究会荣誉会长
“中国高等院校计算机基础教育课程体系规划教材”编审委员会主任
20世纪90年代,我曾经写过一本《C程序设计》(现已更新至第四版),由清华大学出版社出版。该书出版后,社会各界反映强烈,许多人说,C语言原来是比较难学的,自从《C程序设计》出版后,C语言变得不难学了。该书已先后重印200多次,累计发行1250多万册,创造了科技书籍的最高纪录,成为广大初学者学习C语言的主要用书。这使我深受鼓舞和鞭策,感受到广大读者的殷切期望,看到了计算机教育工作者身上的重任。
近年来,支持面向对象程序设计的C 语言迅速地在国内推广,不少高校开设了C 课程,由于C 涉及概念很多,语法比较复杂,内容十分广泛,不少人(尤其是非计算机专业的初学者)感到学习难度较大,难以入门。许多热情的读者希望我能在《C程序设计》的基础上,再写一本易于入门的《C 程序设计》教材,以帮助更多的初学者更顺利地迈进C 的大门。我于2004年写成了《C 程序设计》一书,由清华大学出版社正式出版。该书出版后,受到各高校的欢迎,许多师生认为该书定位准确,概念清晰,深入浅出,取舍合理,以通俗易懂的语言对C 许多难懂的概念作了透彻而通俗的说明,大大降低了初学者学习的困难程度,是一本初学者学习C 的好教材。
根据教学的实践,作者于2011年对该书进行了修订,出版《C 程序设计(第2版)》,现在又在此基础上修订出版《C 程序设计(第3版)》,讲解更加清晰,使学习更加容易。
要写好和教好C 程序设计,决不是一个纯技术问题,需要综合考虑多方面因素,作出合理的决策和安排。作者调查了我国大学的程序设计课程的现状和发展趋势,了解了国内外C 的教学和使用情况,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律,并且参阅了国内外数十种有关C 的教材,形成了以下几点看法,并体现在本教材中。
(1) 教材必须准确定位,要求恰当,合理取舍。写书首先要弄清楚本书是为什么人写的,他们学习C 的目的和要求是什么?应当学到什么程度?
目前学习C 的包括以下三部分人:
① 当前需要用C 编写面向对象程序的软件开发人员。
② 将来有可能成为软件开发人员,需要熟练掌握面向对象程序设计的知识和C 语言工具,打好进一步发展基础的人员,其中包括部分计算机专业的学生。③ 希望初步学习面向对象程序设计的知识,了解用C 语言进行面向对象程序设计方法的人员。这部分人中的大多数将来并不是专业的软件开发人员,不要求熟练掌握C 语言进行程序设计。
应当说明: 本书的对象不是C 软件开发专业人员,而是大学各专业(尤其是非计算机专业)的大学生,他们目前尚无程序设计的实际经验,将来也不一定从事C 程序开发。他们对C 程序设计的学习是入门性、基础性的,主要是初步了解软件开发的方法,了解C 语言的特点,扩大知识面,以利于将来的工作。
众所周知,研发C 的初衷是为了解决大型软件开发中遇到的问题,提高软件的开发效率。只有参加过研制大型软件的人才能真正体会到C 的优越性,并善于利用C 的独特机制进行软件开发。
对多数大学生(尤其是非计算机专业的学生)在校期间初学C 程序设计的要求要恰当。主要是初步学习面向对象程序设计方法,能够初步利用C 编写简单的程序,为以后(如果需要的话)进一步学习和应用打下初步的基础。不可能设想,通过几十个小时的学习,能使一个没有程序设计基础的人变成一个熟练的C 开发人员。应当有一个实事求是的分析和估计。因此,本书着力于使读者对面向对象程序设计的概念有清晰的了解,对C 语言的全貌和使用方法有基本的认识,用容易理解的方法讲清楚有关的基本概念和基本方法,而不去罗列C 语法中各种烦琐的细节。否则将会使篇幅过大(常见国外的书厚达近千页),而且会使读者感到枯燥无味,冲淡重点,主次不分。
如果以后从事C 程序开发工作,应当在此基础上再深入学习C 程序设计提高课程。
(2) 需要选好学习C 的切入点。对于怎样介绍C ,国内外的教材有多种模式。有的不介绍基于过程的程序设计,一开始就直接介绍类和对象,有的先介绍基于过程的程序设计,然后介绍面向对象的程序设计,各有特点。作者认为: 不应当把基于过程和面向对象的程序设计对立起来,任何程序设计都需要用到过程化的知识。作为一个程序设计人员,要掌握过程化的程序设计,也要掌握面向对象的程序设计。以前,人们通过C语言学习过程化程序设计,再通过C 学习面向对象的程序设计。其实,C 并不是纯粹的面向对象的语言,它是一种混合语言。学习C 既可以编写过程化的程序,也可以编写面向对象的程序。实际上,C语言相当于C 的过程化部分。
在参考和比较国内外多种教材的基础上,作者确定了本书的结构。全书分为4部分: 第1部分介绍C 的基本知识和基本语法;第2部分介绍C 基于过程的程序设计;第3部分介绍C 基于对象的程序设计;第4部分介绍C 面向对象的程序设计。
许多教师的实践表明,以基于过程的程序设计作为切入点,从编写简单的程序开始,循序渐进,由基于过程到面向对象,逐步深入,比较符合读者的认识规律,每一步的台阶都比较小,学习难度不大,读者容易理解。
这样,人们既可以通过C语言学习基于过程的程序设计,也可以直接通过C 语言学习基于过程和面向对象的程序设计。因此,本书实际上是一本C/C 教材。
(3) 设计合适的教材体系。C 程序设计涉及面向对象程序设计的理论、C 语言的语法以及算法3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成书。显然在一本教材中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者。需要在教学实践中检验,取长补短,不断完善。
作者认为: 要进行C 程序设计,当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是结合C 的使用自然而然地引出面向对象程序设计的有关概念,通过C 的编程过程理解面向对象程序设计方法。在介绍程序设计的过程中,介绍有关算法,引导读者思考怎样构造一个算法。
要用C 编程序,最基本的要求是正确掌握和运用C ,由于C 语法复杂,内容又多,如果对它缺乏系统了解,将难以真正应用,编出来的程序将会错误百出,编译出错,事倍功半。本书的做法是比较全面地介绍C 的主要特点和功能,引导读者由简而繁地学会编写C 程序。有了C 编程的初步基础后,再进一步提高。这样的方法可能符合大多数学习者的情况。
作者认为: 决不能使读者陷于语法细节的汪洋大海之中。在教学中,对于C 的众多功能和语法细节,在初学阶段没有必要全部细讲,必须有所选择,合理取舍,不应追求深而全。建议读者对于语言的细节不必深究,更不必死记,知道怎么用即可。对有些细节,可以在以后编写程序遇到问题时回过头再查阅本书的介绍,这样可以有效地降低当前学习的难度。
(4) 重要的是要建立清晰的概念。由于人们习惯于过程化的编程方法,在开始学习时往往对面向对象的原理和实现机制理解不深,本书把面向对象程序设计划分为两个有机联系的阶段——基于对象的程序设计和面向对象的程序设计。从类和对象开始逐步深入地引出面向对象程序设计的各个概念以及用C 实现的方法。凡引入一个新的概念,都作了通俗而透彻的讲解,把来龙去脉交代清楚,讲清楚“这是什么”,“为什么需要它”, “怎样使用它”,并举例说明。使读者建立起清晰的概念,知其然也知其所以然,而不是盲目地照葫芦画瓢。
本书是入门性、基础性的教材,任务是帮助读者顺利入门,打好基础。有了好的基础,以后根据需要再深入学习和实践,是不困难的。
(5) 努力化解难点,把复杂的问题简单化。为了使学习C 更容易,作者在写作过程花了很大的精力去考虑怎样使读者易于接受和理解。作者一贯认为,教材编著者应当与读者换位思考,要站在读者的立场上思考问题,帮助他们排除学习中的困难,要善于把复杂的问题简单化,而不应把简单的问题复杂化,要善于化解难点,深入浅出。一定不要难倒读者,更不应吓跑读者。我们的任务是要使“难”变成“不难”,循序渐进地引导初学者进入C 的大门。
在学习过程中不应被一大堆高深莫测的名词术语吓唬住,有些问题看起来很深奥,其实换一个角度解释就很容易理解,甚至用一个通俗的例子就可以把问题说清楚。本书尽量用通俗易懂的方法和语言叙述复杂的概念,力求减少初学者学习C 的困难。
为了便于读者理解,本书在介绍编程例题时,一般采取以下步骤展开: 给出任务—解题思路—编写程序—运行结果—程序分析—说明与注意。以帮助读者清晰地掌握程序设计的思路与方法。
本书便于自学,即使没有老师讲解,读者也能看懂本书的大部分内容。这样,老师教学时就可以不必完全按照教材的内容和顺序详细讲解,而可以有选择地重点讲授,其余内容由学生自学。
(6) 按照教学的特点组织教材。不应当把教材写成手册,教材的任务是用读者容易理解的方法讲清基本的概念和方法,而手册的任务则是给出一个包罗万象的备查资料。读者在学习时应重点掌握基本的概念和方法,以后如果从事软件开发,在遇到具体问题时,进一步学习或查阅一下手册即可。
本教材所举的程序,是从教学的角度考虑的,是为了帮助读者更好地理解和应用某一方面的教学内容而专门编写的,并不一定是实际应用的程序。一个实际的C 程序需要考虑许多因素,综合各部分知识,有许多注释行,而且一般是多文件的程序,篇幅较长,往往不适合作为教学程序。教学程序对问题作了简化,尽量压缩不必要的语句,减少注释行,篇幅一般不长,力求使读者能读懂程序。有些在专业人员看来很“幼稚”的程序,在学习者看来可能是一个很合适的教学程序。教材必须通俗易懂,使人能看懂。在初步掌握C 编程方法后,可以逐步使程序复杂些,长一些,更接近真实程序一些。
考虑到教学的不同要求,我们提供了3个层次的程序实例: (1)教材各章中的例题。这是最基本的,对此作了比较详细的分析介绍,读者容易理解与掌握; (2)教材各章所给出的习题。由于教材的篇幅有限,有些很好的例子无法在教材中列出,则将其作为习题,习题的难度比例题大一些,希望读者在学习教材的基础上自己完成。在本书的配套教材《C 程序设计题解与上机指导(第3版)》中提供了全部习题的参考解答。教师可以从中选择一些习题作为例题讲授。建议读者除了完成教师指定的习题外,把习题解答中的程序全部看一遍,以更好地理解C 程序。(3)为了提供更丰富、更贴近实际的实例,在本书的另一本配套教材《C 程序设计实践指导》中提供了一批C 应用程序。教师可以指定学生阅读其中一些程序实例,也可选择一些在课堂上讲授。使学生扩大眼界,启迪思路,丰富知识,增长能力。
关于如何使用本教材:
(1) 学习本教材可以有两个入口: 未学过C语言的读者从第1章学起;已学过C语言的读者可以从第8章学起。由于C 是从C语言发展而来的,它保留了C语言的大部分内容。本书第1~7章介绍的内容主要是C 从C语言继承来的部分,因此,学过C语言的读者可以跳过这几章,而直接学习第8章。但最好在学习第8章之前,简单浏览一下前7章,以对C 与C的异同有所了解。尤其应看一下前7章中带星号(*)的部分,它们是C 对C语言的发展,是C语言中没有的。
由于《C程序设计(第四版)》一书已比较成熟,读者反映很容易看懂,因此本书前7章主要是根据《C程序设计(第四版)》一书进行改写的。这样,把C语言和C 很自然地衔接起来,无论学过C语言还是未学过C语言的读者都会感到本教材容易入门,易于学习。
(2) 本教材提供两本配套参考书:
① 《C 程序设计题解与上机指导(第3版)》,谭浩强编著,清华大学出版社出版。除了提供教材各章中的全部习题解外,还介绍在两种典型的环境下运行C 程序的方法,一种是Windows环境下的Visual C 2010,一种是GCC。GCC是自由软件,可以在Windows环境或非Windows环境(如DOS, UNIX, Linux)下使用。此外,该书还给出上机实践任务,指导学生完成课后上机实践。
② 《C 程序设计实践指导》,谭浩强主编,陈清华、朱红编著,清华大学出版社出版。书中精心选择了五十多个不同类型、不同难度的C 程序。可以供学生进一步深入学习的参考,以提高编程能力。
本书由谭浩强编著,薛淑斌和谭亦峰高级工程师参加了教学研讨、大纲讨论、收集材料、调试部分程序及部分编写工作。全国高等院校计算机基础教育研究会以及全国各高校老师几年来对本书的编写始终给予了热情的支持,清华大学出版社对本书的出版十分重视,使本书在短时间内得以出版。对一切曾经鼓励、支持和帮助过我的领导、组织、专家、朋友和读者,在此谨表示真挚的谢意。
本书肯定会有不妥甚至错误之处,诚盼专家和广大读者不吝指正。
2015年5月1日于清华园
评论
还没有评论。