描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302566915丛书名: 清华大学计算机系列教材
本书的特色是内容全面、深入浅出、灵活剪裁、立体配套。在学堂在线平台(https://next.xuetangx.com)上,有与本教材配套的国家精品在线开放课程“C 语言程序设计基础”、“C 语言程序设计进阶”,这两门在线课程合起来是清华大学本科生“C 语言程序设计”课程的在线版,包括了校内授课的全部内容、与校内学生作业相同的在线自动评测的编程练习题,可下载PDF格式的讲稿、全部例题的源代码。
本书以面向对象的程序设计思想为主线,以通俗易懂的方法介绍C 语言,引导读者以*自然的方式,将人类习惯的面向对象的思维方法运用到程序设计中。主要内容包括程序设计基础知识、类与对象的基本概念、继承与多态、输入输出流,以及泛型程序设计。此外,本教材还介绍了一些常用数据结构基础知识,使得读者学习本书后,能够解决一些简单的实际问题。整套教材语言生动、流畅,深入浅出。适用于各类学校的C 语言程序设计课程。
第1章绪论1
1.1计算机程序设计语言的发展1
1.1.1机器语言与汇编语言1
1.1.2高级语言2
1.1.3面向对象的语言2
1.2面向对象的方法2
1.2.1面向对象方法的由来2
1.2.2面向对象的基本概念3
1.3面向对象的软件开发5
1.3.1分析5
1.3.2设计5
1.3.3编程5
1.3.4测试6
1.3.5维护6
1.4信息的表示与存储6
1.4.1计算机的数字系统6
1.4.2几种进位记数制之间的转换8
1.4.3信息的存储单位10
1.4.4二进制数的编码表示11
1.4.5定点数和浮点数14
1.4.6数的表示范围14
1.4.7非数值信息的表示15
1.5程序开发的基本概念15
1.5.1基本术语15
1.5.2完整的程序过程16
1.6小结17
习题17
第2章C 语言简单程序设计18
2.1C 语言概述18
2.1.1C 语言的产生18
2.1.2C 语言的特点19
2.1.3C 语言程序实例19
2.1.4字符集20
2.1.5词法记号20
2.2基本数据类型和表达式22
2.2.1基本数据类型23
2.2.2常量24
2.2.3变量26
2.2.4符号常量28
2.2.5constexpr与常量表达式28
2.2.6运算符与表达式29
2.2.7语句38
2.3数据的输入与输出38
2.3.1I/O流38
2.3.2预定义的插入符和提取符38
2.3.3简单的I/O格式控制39
2.4算法的基本控制结构40
2.4.1用if语句实现选择结构40
2.4.2多重选择结构42
2.4.3循环结构45
2.4.4循环结构与选择结构的嵌套51
2.4.5其他控制语句53
2.5类型别名与类型推断53
2.5.1类型别名53
2.5.2auto类型与decltype类型54
2.6深度探索55
2.6.1变量的实现机制55
2.6.2C 语言表达式的执行原理58
2.7小结59
习题60
第3章函数64
3.1函数的定义与使用64
3.1.1函数的定义64
3.1.2函数的调用65
3.1.3函数的参数传递77
3.2内联函数82
3.3constexpr函数83
3.4带默认形参值的函数84
3.5函数重载86
3.6使用C 语言系统函数88
3.7深度探索90
3.7.1运行栈与函数调用的执行90
3.7.2函数声明与类型安全94
3.8小结95
习题96
第4章类与对象98
4.1面向对象程序设计的基本特点98
4.1.1抽象98
4.1.2封装99
4.1.3继承99
4.1.4多态100
4.2类和对象100
4.2.1类的定义101
4.2.2类成员的访问控制102
4.2.3对象103
4.2.4类的成员函数104
4.2.5程序实例105
4.3构造函数和析构函数107
4.3.1构造函数107
4.3.2默认构造函数109
4.3.3委托构造函数110
4.3.4复制构造函数110
4.3.5析构函数114
4.3.6移动构造函数115
4.3.7default、delete函数116
4.3.8程序实例117
4.4类的组合119
4.4.1组合119
4.4.2前向引用声明123
4.5UML图形标识124
4.5.1UML简介125
4.5.2UML类图125
4.6结构体和联合体131
4.6.1结构体131
4.6.2联合体132
4.7枚举类型——enum135
4.8综合实例——个人银行账户管理程序138
4.8.1类的设计138
4.8.2源程序及说明139
4.9深度探索141
4.9.1位域141
4.9.2用构造函数定义类型转换144
4.9.3对象作为函数参数和返回值的传递方式145
4.10小结148
习题148
第5章数据的共享与保护150
5.1标识符的作用域与可见性150
5.1.1作用域150
5.1.2可见性153
5.2对象的生存期153
5.2.1静态生存期153
5.2.2动态生存期154
5.3类的静态成员156
5.3.1静态数据成员157
5.3.2静态函数成员159
5.4类的友元161
5.4.1友元函数163
5.4.2友元类164
5.5共享数据的保护165
5.5.1常对象165
5.5.2用const修饰的类成员166
5.5.3常引用169
5.6多文件结构和编译预处理命令170
5.6.1C 程序的一般组织结构170
5.6.2外部变量与外部函数173
5.6.3标准C 库174
5.6.4编译预处理175
5.7综合实例——个人银行账户管理程序179
5.8深度探索182
5.8.1常成员函数的声明原则182
5.8.2代码的编译、连接与执行过程184
5.9小结187
习题187
第6章数组、指针与字符串189
6.1数组189
6.1.1数组的声明与使用189
6.1.2数组的存储与初始化191
6.1.3数组作为函数参数194
6.1.4对象数组195
6.1.5程序实例197
6.2指针200
6.2.1内存空间的访问方式200
6.2.2指针变量的声明201
6.2.3与地址相关的运算——“”和“&”201
6.2.4指针的赋值202
6.2.5指针运算204
6.2.6用指针处理数组元素206
6.2.7指针数组208
6.2.8用指针作为函数参数210
6.2.9指针型函数211
6.2.10指向函数的指针213
6.2.11对象指针215
6.3动态内存分配220
6.4用vector创建数组对象226
6.5深层复制与浅层复制228
6.6字符串231
6.6.1用字符数组存储和处理字符串231
6.6.2string类232
6.7综合实例——个人银行账户管理程序236
6.8深度探索242
6.8.1指针与引用242
6.8.2指针的安全性隐患及其应对方案244
6.8.3const_cast的应用247
6.9小结249
习题250
第7章类的继承252
7.1基类与派生类252
7.1.1继承关系举例252
7.1.2派生类的定义253
7.1.3派生类生成过程255
7.2访问控制256
7.2.1公有继承257
7.2.2私有继承259
7.2.3保护继承261
7.3类型兼容规则263
7.4派生类的构造和析构函数265
7.4.1构造函数265
7.4.2复制构造函数269
7.4.3析构函数269
7.4.4删除delete构造函数271
7.5派生类成员的标识与访问271
7.5.1作用域分辨符272
7.5.2虚基类277
7.5.3虚基类及其派生类构造函数279
7.6程序实例——用高斯消去法解线性方程组280
7.6.1算法基本原理281
7.6.2程序设计分析282
7.6.3源程序及说明282
7.6.4运行结果与分析287
7.7综合实例——个人银行账户管理程序288
7.7.1问题的提出289
7.7.2类设计289
7.7.3源程序及说明290
7.7.4运行结果与分析295
7.8深度探索296
7.8.1组合与继承296
7.8.2派生类对象的内存布局298
7.8.3基类向派生类的转换及其安全性问题302
7.9小结303
习题304
第8章多态性306
8.1多态性概述306
8.1.1多态的类型306
8.1.2多态的实现306
8.2运算符重载307
8.2.1运算符重载的规则307
8.2.2运算符重载为成员函数308
8.2.3运算符重载为非成员函数312
8.3虚函数315
8.3.1一般虚函数成员316
8.3.2虚析构函数320
8.4纯虚函数与抽象类321
8.4.1纯虚函数322
8.4.2抽象类322
8.5程序实例——变步长梯形积分算法求解函数的定积分324
8.5.1算法基本原理324
8.5.2程序设计分析326
8.5.3源程序及说明327
8.5.4运行结果与分析329
8.6综合实例——对个人银行账户管理程序的改进329
8.7深度探索336
8.7.1多态类型与非多态类型336
8.7.2运行时类型识别337
8.7.3虚函数动态绑定的实现原理340
8.8小结343
习题344
第9章模板与群体数据345
9.1函数模板与类模板346
9.1.1函数模板346
9.1.2类模板349
9.2线性群体353
9.2.1线性群体的概念353
9.2.2直接访问群体——数组类353
9.2.3顺序访问群体——链表类362
9.2.4栈类367
9.2.5队列类373
9.3群体数据的组织376
9.3.1插入排序376
9.3.2选择排序377
9.3.3交换排序378
9.3.4顺序查找380
9.3.5折半查找380
9.4综合实例——对个人银行账户管理程序的改进381
9.5深度探索384
9.5.1模板的实例化机制384
9.5.2为模板定义特殊的实现387
9.5.3模板元编程简介392
9.5.4可变参数模板简介394
9.6小结396
习题396
第10章泛型程序设计与C 语言标准模板库399
10.1泛型程序设计及STL的结构399
10.1.1泛型程序设计的基本概念399
10.1.2STL简介400
10.2迭代器403
10.2.1输入流迭代器和输出流迭代器404
10.2.2迭代器的分类406
10.2.3迭代器的区间408
10.2.4迭代器的辅助函数410
10.3容器的基本功能与分类410
10.4顺序容器413
10.4.1顺序容器的基本功能413
10.4.25种顺序容器的特性417
10.4.3顺序容器的插入迭代器424
10.4.4顺序容器的适配器425
10.5关联容器429
10.5.1关联容器的分类及基本功能429
10.5.2集合432
10.5.3映射433
10.5.4多重集合与多重映射436
10.5.5无序容器437
10.6函数对象438
10.6.1函数对象的概念438
10.6.2lambda表达式442
10.6.3函数对象参数绑定444
10.7算法445
10.7.1STL算法基础446
10.7.2不可变序列算法447
10.7.3可变序列算法449
10.7.4排序和搜索算法452
10.7.5数值算法457
10.8综合实例——对个人银行账户管理程序的改进459
10.9深度探索464
10.9.1swap464
10.9.2STL组件的类型特征与STL的扩展466
10.9.3Boost简介471
10.10小结474
习题474
第11章流类库与输入输出477
11.1I/O流的概念及流类库结构477
11.2输出流479
11.2.1构造输出流对象479
11.2.2使用插入运算符和操纵符480
11.2.3文件输出流成员函数484
11.2.4二进制输出文件486
11.2.5字符串输出流487
11.3输入流488
11.3.1构造输入流对象488
11.3.2使用提取运算符489
11.3.3输入流操纵符489
11.3.4输入流相关函数489
11.3.5字符串输入流492
11.4输入输出流493
11.5综合实例——对个人银行账户管理程序的改进494
11.6深度探索499
11.6.1宽字符、宽字符串与宽流499
11.6.2对象的串行化502
11.7小结505
习题505
第12章异常处理507
12.1异常处理的基本思想507
12.2C 异常处理的实现508
12.2.1异常处理的语法508
12.2.2异常接口声明510
12.3异常处理中的构造与析构510
12.4标准程序库异常处理512
12.5综合实例——对个人银行账户管理程序的改进515
12.6深度探索518
12.6.1异常安全性问题518
12.6.2避免异常发生时的资源泄露520
12.6.3noexcept异常说明523
12.7小结523
习题524
参考文献525
一、 版本说明
本书第1版于1999年出版,第2版于2001年出版,第3版于2003年出版,第4版于2010年出版。第5版是在前4版的基础上,广泛听取了读者和同行的建议,参考了最新的资料,并根据作者本人在授课过程中的经验修订而成。第5版的主要修改是增加了C 11、C 14的部分语法,并按照新的C 标准重新修订更新了原有内容。
本书第1版于2001年获得中国高校科学技术奖二等奖;第3版于2005年获得北京市高等教育精品教材奖、2008年获得清华大学优秀教材特等奖;第4版于2011年获得教育部普通高等教育国家级精品教材奖。同时,本书也是国家级教学成果二等奖、北京市教学成果一等奖和二等奖成果的重要组成部分。该书于2008年和2011年分别获评教育部“普通高等教育‘十一五’国家级规划教材”和“‘十二五’普通高等教育本科国家级规划教材”。该书英文版于2019年由德国德古意特公司正式出版。
二、 本书的编写背景
C 语言是从C语言发展演变而来的一种面向对象的程序设计语言。C 语言的主要特点表现在两方面: 一是兼容C语言,二是支持面向对象的方法。
面向对象的程序设计(ObjectOriented Programming,OOP)方法将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通信。这样,程序模块间的关系简单,程序模块的独立性、数据的安全性具有良好的保障,通过继承与多态性,使程序具有很强的可重用性,使得软件的开发和维护都更为方便。
由于面向对象方法的突出优点,目前它已经成为开发大型软件时所采用的主要方法。而C 语言是应用最广泛的面向对象的程序设计语言之一。
长期以来,C 语言被认为是较难使用的专业开发语言,所以有很多老师和学生也都认为C 语言作为大学第一门程序设计课是很难的。C 语言与面向对象的程序设计方法真的很难吗?不是的!
其实C语言产生的初期,也只被少数专业开发人员使用。但随着计算机科学的发展,计算机技术已渗透到各学科的研究和应用中,C语言已经被各专业的工程技术人员广泛应用于本专业的科研开发,也被很多学校作为第一门程序设计语言来讲授。C 语言兼容了C语言的主要语法和特点,同时提供了比C语言更严格、更安全的语法,更适合开发大型复杂程序。从这个意义上讲,C 语言首先是一个更好的C语言。
C 语言是一个面向对象的编程语言,而面向对象的编程方法一度被看作是一门比较高深的技术。这是因为在面向对象分析(ObjectOriented Analysis,OOA)和面向对象设计(ObjectOriented Design,OOD)理论出现之前,程序员要写一个好的面向对象的程序,首先要学会运用面向对象的方法来认识问题和描述问题。现在,OOP的工作比较简单了,认识问题域与设计系统成分的工作已经在系统分析和设计阶段完成,OOP工作就是用一种面向对象的编程语言把OOD模型中的每个成分书写出来。
面向对象方法的出现,实际上是程序设计方法发展的一个返璞归真的过程。软件开发从本质上讲,就是对软件所要处理的问题域进行正确的认识,并把这种认识正确地描述出来。面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。
那么,学习C 语言是否应该首先学习C语言呢?不是的,虽然C 语言是从C语言发展而来的,但是C 语言本身是一个完整的程序设计语言,完全适合作为程序设计的入门语言来学习。
三、 本书的特色
本书的特色是内容全面、深入浅出、灵活剪裁、立体配套。在学堂在线平台(https://next.xuetangx.com)上,有与本书配套的国家精品在线开放课程“C 语言程序设计基础”和“C 语言程序设计进阶”,这两门在线课程合起来是清华大学本科生“C 语言程序设计”课程的在线版,包括了校内授课的全部内容、与校内学生作业相同的在线自动评测的编程练习题,可下载PDF格式的讲稿、全部例题的源代码。
对于使用本书作为教材的老师,可以联系清华大学出版社向教师提供参考讲稿(pptx格式和PDF格式的演示文稿,含课堂练习题)、课堂讨论题目和参考答案(可用于混合式教学的翻转课堂)。
使用本书的教师、学生和自学读者,可以同时使用配套的《C 语言程序设计(第5版)学生用书》,其中有习题的参考解答、实验指导。
本书是面向广大初学者的教材,也是为大学的“计算机程序设计”课程教学量身定制的,这类课在多数学校一般只有32~48讲课学时和同等的实验学时,所以本书包含了标准C 的主要内容,但是C 的语法并没有100%涵盖,对泛型程序设计和STL库只做了简单介绍。
自1999年第1版出版以来,本书已经在清华大学等100多所学校的不同专业中使用,取得了良好的教学效果。
本书将C 语言作为大学生的计算机编程入门语言,不仅详细介绍了语言本身,而且介绍了常用的数据结构和算法、面向对象的设计思想和编程方法、UML建模语言。全书以面向对象的程序设计方法贯穿始终,每章都是首先阐述面向对象的程序设计思想和方法,由实际问题入手,然后引出必要的语法知识,在讲解语法时着重从程序设计方法学的角度讲述其意义和用途。编写本书的宗旨是,不仅要使读者掌握C 语言本身,而且要能够对现实世界中较简单的问题及其解决方法用计算机语言进行描述。当然,要达到能够描述较复杂的问题域还需要学习“面向对象的软件工程”等其他课程。
针对初学者和自学读者的特点,本书力求做到深入浅出,将复杂的概念用简洁浅显的语言娓娓道来。不同学校可以针对自身的教学特点,选择不同的章节组合进行教学。如果学时较少,可以只选择第1~8章、第11章。每章的深度探索也是选学内容,可以根据不同专业的教学需求进行选择。
作者本人使用本书讲授的清华大学本科生课程,有讲课32学时和48学时两种,实验课学时数均为32学时,课外学时数为32学时,每学时45分钟。建议讲课学时数至少32学时,分配如下:
第1章2学时,第2章4学时,第3章2学时,第4章4学时,第5章2学时,第6章 4学时,第7章 2学时,第8章 2学时,第9章4学时,第10章 2学时,第11章2学时,第12章2学时。
如果课程安排的讲课学时超过32学时,可以酌情在课上穿插安排课堂练习、课堂讨论等。
实验学时数的分配请参考配套的《C 语言程序设计(第5版)学生用书》。
四、 内容摘要
第1章绪论。从发展的角度概要介绍了面向对象程序设计语言的产生和特点;面向对象方法的由来和主要的基本概念;并简单介绍了什么是面向对象的软件工程。最后,介绍了信息在计算机中的表示和存储以及程序的开发过程。
第2章C 语言简单程序设计。讲述C 语言程序设计的基础知识。首先简要介绍C 语言的发展历史及其特点;接着学习构成C 语句的基本部分:字符集、关键字、标识符、操作符等。还有C 语言的基本数据类型和自定义数据类型,以及算法的控制结构:顺序、选择和循环结构。“深度探索”介绍变量的实现机制和C 语言表达式的执行原理。
第3章函数。讲述C 语言的函数。在面向对象的程序设计中,函数对处理问题过程的基本抽象单元,是对功能的抽象。同时,使用函数也为代码的重用提供了技术上的支持。我们主要从应用的角度讲述各种函数的定义和使用方法。“深度探索”介绍运行栈与函数调用的执行、函数声明与类型安全。
第4章类与对象。首先介绍面向对象程序设计的基本思想及其主要特点:抽象、封装、继承和多态。接着围绕数据封装这一特点,着重讲解面向对象设计方法的核心概念——类。其中包括类的定义、实现以及如何利用类来解决具体问题。最后,简单介绍了如何用UML描述类的特性。“深度探索”介绍位域、用构造函数定义类型转换,以及对象作为函数参数和返回值的传递方式。
第5章数据的共享与保护。讲述标识符的作用域和可见性及变量、对象的生存期;使用局部变量、全局变量、类的数据成员、类的静态成员和友元来实现数据共享,共享数据的保护,以及使用多文件结构来组织和编写程序,解决较为复杂的问题。“深度探索”介绍常成员函数的声明原则,代码的编译、连接与执行过程。
第6章数组、指针与字符串。讨论数组、指针与字符串。数组和指针是C 语言中最常用的复合(构造)类型数据,是数据和对象组织、表示的最主要手段,也是组织运算的有力工具。本章首先介绍数组、指针的基本概念,动态内存分配以及动态数组对象。接着围绕数据和对象组织这一问题,着重讲解如何通过使用数组和指针解决数据、函数以及对象之间的联系和协调。对于字符串及其处理,本章重点介绍string类。“深度探索”介绍指针与引用的联系、指针的安全性隐患及其应对方案,以及const_cast的应用。
第7章类的继承。讲述类的继承特性。围绕派生过程,着重讨论不同继承方式下的基类成员的访问控制问题、添加构造函数和析构函数。接着讨论在较为复杂的继承关系中,类成员的唯一标识和访问问题。“深度探索”介绍组合与继承的区别与联系、派生类对象的内存布局,以及基类向派生类的转换及其安全性问题。
第8章多态性。讲述类的另一个重要特性——多态性。多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。C 语言支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。“深度探索”介绍多态类型与非多态类型的区别、运行时类型识别机制,以及虚函数动态绑定的实现原理。
第9章模板与群体数据。群体是指由多个数据元素组成的集合体。群体可以分为两大类:线性群体和非线性群体。本章介绍模板的基础语法和几种常用的群体类模板。
本章讨论的群体的组织问题,指的是对数组元素的排序与查找方法。排序(sorting)又称分类或整理,是将一个无序序列调整为有序序列的过程。查找(searching)是在一个序列中,按照某种方式找出需要的特定数据元素的过程。
最后“深度探索”介绍模板的实例化机制、为模板定义特殊的实现、模板元编程简介和可变参数模板简介。
第10章泛型程序设计与C 语言标准模板库。泛型程序设计就是要将程序写得尽可能通用,同时并不损失效率。本章简单介绍C 语言标准模板库(STL)中涉及的一些概念、术语,以及它的结构、主要组件的使用方法。重点介绍容器、迭代器、算法和函数对象的基本应用。目的是使读者对STL与泛型程序设计方法有一个概要性的了解。“深度探索”深入介绍深层复制与浅层复制的问题;还介绍了STL组件的类型特征与STL的扩展问题;以及Boost库。
第11章流类库与输入输出。讲述流的概念,然后介绍流类库的结构和使用。就像C语言一样,C 语言中也没有输入输出语句。但C 编译系统带有一个面向对象的I/O软件包,它就是I/O流类库。“深度探索”介绍宽字符、宽字符串与宽流,以及对象的串行化问题。
第12章异常处理。讲述异常处理问题。异常是一种程序定义的错误,在C 语言中,异常处理是对所能预料的运行错误进行处理的一套实现机制。try、throw和catch语句就是C 语言中用于实现异常处理的机制。有了C 异常处理,程序可以向上层模块传递异常事件,这样程序能更好地从这些异常事件中恢复过来。“深度探索”介绍异常安全性问题和避免异常发生时的资源泄露。
五、 作者分工
本书前4版的合作作者董渊、何江舟编写的内容仍继续作为本版的重要内容。另外,王勇、梁嘉骏参与了本版教材的编写工作,对全部例题按照C 11、C 14标准进行了重新调试,补充了部分新的语法内容。
感谢读者选择使用本书,欢迎您对本书内容提出意见和建议,我们将不胜感激。作者的电子邮件地址为[email protected],来信标题请包含“C book”。
作者2020年8月于清华大学
评论
还没有评论。