《大学计算机基础教育规划教材:C++程序设计》以c++为基础系统地介绍程序语言、算法与数据结构、高级编程技术。《大学计算机基础教育规划教材:C++程序设计》由16章组成,以程序设计语言、程序设计方法和程序设计技术三大主题组织教材,采用“数据表示”和“程序实现”双线索知识体系,优化了程序设计知识的安排。
本书结构清晰、语言通俗易懂,示例代码具有专业的编程风格;内容由浅入深、知识循序渐进,例题丰富,体现了程序设计和算法、数据结构的紧密结合。本书注重典型案例的精选与提炼,高级编程技术内容便于开展课程设计和研究型学习。
本书使用iso/iecl4882-2003c++语言标准,配套有经过多年教学实践的程序设计综合训练平台。
本书可作为高等院校理工类专业和信息技术类培训机构“程序设计”、“软件开发技术”课程的教材,也可作为计算机程序爱好者学习程序开发和编程技术的自学教材。
程序设计是大学计算机基础教育和计算机专业基础的核心课程,它既为其他技术课程奠定程序开发基础,又是其他专业课程或实践环节的软件工具,因此成为各类专业的必修课程。程序设计覆盖面广、影响大,是卓越工程师教育培养计划的通识教育基础,同时也是大学生参加课程设计、毕业设计、创新实验、科技制作和学科竞赛等活动的重要平台。
C++是国内外广泛使用的计算机程序设计语言。其功能强大、面向对象、数据表示丰富、代码运行效率高、可移植性好,适合编写系统软件和各类应用程序。世界上大多数软件都是由C语言和C++语言开发的,在TIOBE编程语言排行榜上,C语言、C++及其衍生发展起来的Java语言多年来始终处在前三位。学习程序设计从C++入手,对于培养算法设计与分析能力、抽象数据描述与表示能力以及利用计算机求解现实问题的计算思维能力具有其他语言无法比拟的优点。而且在完全掌握了C语言、C++之后,再学习其他程序语言就会轻车熟路。
然而,C++的学习难度也是很大的。很多学生往往是“考完即忘”,学了后面的忘了前面的,低年级时学习的程序设计到了高年级即处于犹如从未学过的状态,更谈不上利用程序设计解决实际应用问题。而且面对庞大、复杂的C++知识系统,不少学生甚至教师在教与学的过程中始终感觉“只见树木,不见森林”,对学过的程序思路不甚了解、数据描述不清楚、算法设计不到位,最后连最基本的语言知识也掌握不住,最基本的开发环境也不会使用。缺少以技能为目标的程序设计教材是造成这一局面的重要原因之一。
现有的C语言和C++程序设计类的教材多偏重语言知识,罗列语法多、千篇一律、大同小异,在如何应用程序解决实际问题方面下的工夫少;程序设计方法与语言结合少,缺少推动学生计算思维的训练;生硬的例子与实际应用脱节,缺少应用编程技术的展开。教学中尽管有诸如“案例教学”、“项目驱动”的做法,但由于缺少成熟的教学平台和系统化、规范化的教学资源,难以培养和提高学生应用程序设计解决实际问题的技能。
需要知道,人类学自然语言时,学的不仅是听还有说;学字时,学的不仅是读还有写。随着人们向一个越来越数字化的信息世界迈进,不仅应该学会如何使用程序,还要学会如何编写程序。当语言知识转化为编程技能时,就没有知识会遗忘了,应用程序设计解决实际问题的计算能力如同学习语言时的听、说、读、写一般。
为此,我们在多年程序设计课程的一线教学经验和软件开发科研工作基础上,结合自主研发的程序设计综合训练平台和系列教育软件,推出以语言知识为工具、以技能培养为目标、以编程技术为核心的系列程序设计教材。
本教材遵循我们多年提倡的“精讲多练、注重技能、开拓设计”教学理念编写。在程序语言知识体系的选取与深度的把握上,在算法、数据结构与程序设计的结合上精心设计,力图适合高等院校和专业计算机培训的教学目标与知识结构的要求,体现了以下7个特色。
(1) 首创双线索的程序设计知识体系。
任何一本程序设计教材必然是以程序语言为背景的,本书也不例外。然而C++具有庞大的语言知识内容,因此以语言知识为教学线索必然是整体感凌乱。表现为教学学时始终处在不够的“高压状态”,学生学习始终抓不住主次。
本教材的双线索程序设计知识体系以“数据表示”和“程序实现”作为教学上的两条主线索,螺旋上升、交叉推进,如图0.1所示。
图0.1 双螺旋线索C++知识体系示意
首先,教材通过简单程序引出程序基本结构,以编程为目标给出两条线索: 数据表示和程序实现。其次,从引入简单数据开始,逐步解决运算和程序组织,进而上升到程序模块化的实现。再次,从基本类型提高到复杂数据类型,上升到数据结构层面的数据表示,程序模块进阶到算法实现。最后,两条线索交汇到高级编程技术应用专题,揭示程序设计与应用软件开发的一般规律。
实际教学效果表明,双线索程序语言知识体系突出了程序设计方法学,使程序语言成为服务于编程的工具而不是目标,学习者既能获取语言知识,又能掌握编程技能。
(2) 优化程序设计知识安排。
多数现有教材中的知识安排导致以技能为目标的程序设计难于实现,出现教学瓶颈。表现在语言阶段冗长,使得以函数、自定义类型等内容为教学中心的编程阶段在实际教学中接近课程末期,从而让应用程序设计教学目标落空。
本教材在程序语言知识方面采用了“快节奏”,在程序设计方法和编程技术方面采用了“慢节奏”,解决了多年来程序设计教与学的难题和瓶颈问题。“快节奏”体现为语言基础知识学时被大幅度压缩, 从一开始即以简单程序框架展开程序知识,直接进入以程序模块化为主的教与学环境。方便教师精讲知识,学生早早练习进而多练,教材不在语言细节、小片段程序上反复循环。“慢节奏”体现为以(较难的)编程技术为研究专题展开(费时的)编程方法教学,方便教师组织技能训练,学生获取编程技巧。本教材将软件开发中的结构化、面向对象、组件模型和敏捷思想融入到每个章节,让学习者接受专业化训练。
如图0.2所示是本教材的知识安排,与传统的C++教学相比,增加了“设计阶段”的教学。显然,优化的知识体系使教师在教学时能够“抓大”(设计方法)“放小”(语言知识),学生学习时能够得到最大化的“饱满感”编程训练。
图0.2 优化的C语言程序知识安排
(3) 首创高级编程技术教学新思想。
由于没有更高层次的应用程序开发内容,许多教材的实际教学效果就是教师和学生都集中在做题上面。如数学一般,将程序设计演变成“程序语言+计算方法”, C++成了数学工具。殊不知计算方法(数值计算、非数值计算)仅是程序设计方法的一种,程序方法学中还有诸如操作系统、人机界面、图形图像、多媒体、网络通信、数据库、硬件接口等技术领域,每个领域都有独特的编程技术和精巧的解决方法。
衡量程序设计教学效果有两个重要指标: 编程累计行数(TLOC)和单个程序行数(SLOC) 。以解题为主的编程训练能提高TLOC,但却止步于SLOC。即使将习题做上百题,虽然TLOC指标上去了,但SLOC却不见长。一般地,在专业的软件开发技术领域,SLOC小于300行时很难让人体会到应用开发的“感觉”.
高级编程技术是本教材主要的创新成果之一。通过研究型专题的技术教学,拓宽了学生的知识面,使其充分认识到程序是如何解决应用问题的,有极大的兴趣展开研究型学习。在这样的教与学环境下,才能从根本上提高SLOC,提升技能训练层次。
(4) 注重程序设计和算法、数据结构的紧密结合。
程序设计与算法、数据结构实际上是一个统一体,不应该也不可能将它们对立与分割。我国计算机基础教育的实际情况是,不少非计算机专业在程序设计课程后不再涉及算法和数据结构。即使是计算机专业开设有专门的算法和数据结构课程,也是“自说自话”,并不是站在软件系统开发(SSD)的角度使之有机地联系在一起。
算法和数据结构是程序设计的理论升华,是培养学生向应用程序开发转型的主要工具。本教材给出算法和数据结构的初步知识,克服了简单罗列算法、数据结构内容和算法与程序设计脱节、数据结构与程序数据表示脱节的问题。在讲述每一种常用算法和数据结构的基本思路与设计步骤的基础上,落实到每一个案例求解,从案例的提出到算法设计与数据描述、从程序实现到案例结果的讨论与分析,环环相扣,融为一体,力求理论与实际相结合,数据描述与数据表示、算法与程序实现相统一,切实提高对所学算法、数据结构的理解和掌握。
(5) 注重典型案例的精选与提炼。
培养学生的学习兴趣,激发学生的学习热情,不是一两句空洞说教所能奏效的,必须通过一些有价值的实际案例来引导。本教材设计了初等难度语言示范型、中等难度算法和数据结构应用型、较高难度综合设计型三种梯度的案例。这些案例的精选与提炼,有利于提高学生学习程序设计的兴趣,有利于学生在计算机现实问题求解上开阔视野,使之在程序设计方法和思路的开拓与编程技巧的应用上有一个深层次的锻炼与提高。其中难度较大的高级编程技术综合设计案例可作为课程设计、大作业与课后专题研究选用。
算法、数据结构与程序设计都不是一成不变的,可以实施多层次多方位的变通,变通出效果,变通长能力。本教材的部分示例给出了算法改进与程序优化的过程,既是提高案例求解效率的过程,也是算法设计能力培养与提高的过程,更是优化意识与创新能力增强的过程。
(6) 注重编程风格。
本书使用ISO/IEC 14882-2003 C++语言标准(简称C++03标准),充分体现了程序语言的最新进展和当前业界的最佳实践。
书中广泛采纳各专业软件公司编程规范的优点,无论语法语义、书写形式、示例代码等,均采用专业编程风格编写,潜移默化地引导学习者与专业化接轨。
书中所有程序均在Visual C++ 6.0和GCC 4.x (Code: : Blocks)上调试通过。同时,教材中的所有源程序与各章习题的完整代码均可在清华大学出版社网站下载。
(7) 配套程序设计教学平台、系列教育软件和教学资源。
学习程序设计,上机实验是重要的环节。而实验环节重要的是什么呢?是性能优越的计算机或者环境良好的机房吗?答案不是。那种在实验课上做题、讲题的教学模式是很难培养程序设计技能的,本质上这种模式一开始就是奔期末考试(等级考试)去的。
程序设计实验环节最重要的是要有优秀的教学平台、教育软件和完整的教学资源。以技能培养为目标、以编程技术为核心的教学模式不是传统实验手段自发实现的,而是通过高集成度的程序设计综合训练平台,全程自动化辅助教学和教学管理来实现的。
自2001年以来,基于专业的软件开发科研优势,结合一线教学和课程改革的经验,围绕课堂、实验、作业、设计、考核5个教学环节,我们开发了系列教育软件。例如,“程序设计在线评测系统INPOJ”采用计算机系统使学生通过大量习题的训练提高解题速度(POJ训练)以解决TLOC; “软件设计协同开发平台DevForge”按专业软件开发方式引导、跟踪、自动评阅学生课程设计程序和报告以解决SLOC; “远程网络考试系统inTest”实现技能测试和实践考核,等等。这些教学平台的使用,使得实验机房变成了学生讨论、思考、相互教授的研究场所,形成数字化课堂教学、网络辅助教学、电子教室、智能答疑、综合训练等立体化教学环境,为落实教学理念和教学目标提供了先进工具。
使用本教材的高等院校和培训机构想要进一步了解有关程序设计综合训练平台和系列教育软件更多的信息,请与作者(jxf@nwpu.edu.cn)联系。
由于C++兼容C语言,因此本书第1~8章主要是C语言的知识内容,不妨称为“C语言的”,其中带号的章节是C++对C语言的扩展。第9~14章完全是C++的知识内容,称为“C++的”. C语言部分以结构化程序设计为主要方法,C++部分将逐步上升到面向对象程序设计方法。之所以如此泾渭分明,是因为C语言是C++的基础,C语言的即C++的,结构化程序设计是面向对象程序设计的起步环节。
本书有两本配套的教学参考书:
(1) 《C++程序设计实验教程》。该书分为四部分。前两部分详细介绍了Visual C++和GCC开发工具的使用方法和程序调试技术;第三部分是与教材知识体系相对应的实验内容,分为验证型实验和设计型实验,主要突出综合性实验,并结合算法、数据结构知识设计了一些有难度的实验题目;第四部分是课程设计专题研究实验内容,其目的是使读者能够训练应用程序开发,获取设计C++程序项目的初步知识和工程经验,掌握高级编程技术。
(2) 《C++程序设计习题与解析》。该书主要包括3个方面的内容: 知识点与考点提炼、经典例题解析、典型习题与解答。内容紧扣课程教材和实验教材,对课程的讲授、学习以及考查起到积极的指导和辅助作用,其目的是使读者加强程序语言知识的掌握。
此外,向使用本书的教师提供讲课的电子演示文稿和素材,以节省教师的备课时间。向使用本书的高校和培训机构提供“程序设计课程教学指南”,方便组织教学、实施课程管理。
本书第1~8章和第15、16章由姜学锋编写,第9章和第10章由周果清、姜学锋共同编写,第11~14章由刘君瑞编写,全书由姜学锋主编并统稿。在书稿的编著过程中,得到了多位专家的关心和热情支持,西北工业大学计算机学院的同事们提出了许多宝贵的意见和建议,清华大学出版社对本书的出版十分重视并做了周到的安排。在此,对所有鼓励、支持和帮助过本书编写工作的领导、专家、同事和广大读者表示真挚的谢意!
由于时间紧迫以及作者水平有限,书中难免有错误、疏漏之处,恳请读者批评指正。
姜学锋2011年7月于西北工业大学
第1章 程序设计基础
1.1 计算机系统和工作原理
1.2 信息的表示与存储
1.3 程序设计语言
1.4 程序设计概述
1.5 c++概述
习题
第2章 数据类型与表达式
2.1 数据类型
2.2 常量
2.3 变量
2.4 运算符与表达式
2.5 类型转换
习题
第3章 程序控制结构
3.1 语句
3.2 输入与输出
3.3 程序顺序结构
3.4 程序选择结构
3.5 程序循环结构
习题
第4章 函数
4.1 函数定义
4.2 函数参数
4.3 函数原型与调用
4.4 内联函数
4.5 默认参数
4.6 函数重载
4.7 函数模板
4.8 函数调用形式
4.9 作用域和生命期
4.10 对象初始化
4.11 声明与定义
4.12 变量修饰小结
4.13 程序组织结构
4.14 函数应用程序举例
习题
第5章 预处理命令
5.1 宏定义
5.2 文件包含
5.3 条件编译
5.4 其他命令
习题
第6章 数组
6.1 一维数组的定义和引用
6.2 多维数组的定义和引用
6.3 数组与函数
6.4 字符串
6.5 c++字符串类
6.6 数组应用程序举例
习题
第7章 指针与引用
7.1 指针与指针变量
7.2 指针的使用及运算
7.3 指针与数组
7.4 指针与字符串
7.5 指针与函数
7.6 动态内存
7.7 带参数的main函数
7.8 引用类型
习题
第8章 自定义数据类型
8.1 结构体类型
8.2 结构体对象
8.3 结构体与数组
8.4 结构体与指针
8.5 结构体与函数
8.6 共用体
8.7 枚举类型
8.8 位域
8.9 用户自定义类型
8.10 链表
习题
第9章 类与对象
9.1 类的定义和声明
9.2 对象的定义和使用
9.3 构造函数和析构函数
9.4 对象数组
9.5 对象指针
9.6 类作用域与对象生命期
9.7 const限定
9.8 静态成员
9.9 友元
9.10 类模板
9.11 数据封装和信息隐蔽
习题
第10章 继承与派生
10.1 类的继承与派生
10.2 派生类成员的访问
10.3 赋值兼容规则
10.4 派生类的构造和析构函数
10.5 多重继承
10.6 多态性与虚函数
10.7 命名的强制类型转换
习题
第11章 运算符重载
11.1 运算符重载的概念
11.2 运算符重载的方法
11.3 典型运算符的重载
习题
第12章 异常处理
12.1 基本概念
12.2 异常处理的实现
习题
第13章 命名空间
13.1 命名空间的概念
13.2 命名空间的定义
13.3 命名空间的使用
习题
第14章 标准库
14.1 c++标准库
14.2 标准输入输出
14.3 标准模板库
习题
第15章 算法
15.1 算法基本概念
15.2 算法分析
15.3 常用算法
习题
第16章 高级编程技术
16.1 配置开发环境
16.2 界面编程
16.3 图形编程
16.4 多媒体编程
16.5 网络编程
16.6 数据库编程
习题
附录a ascii码对照表
附录b c++关键字
附录c c++运算符及其优先级、结合性
参考文献