
本书从程序设计的一般过程与方法出发,以C++语言为媒介,重点介绍结构化程序设计与面向对象程序设计的基础知识。内容包括三个方面:程序设计概论与基础、结构化程序设计原理、面向对象程序设计原理。以分析人类解决问题的思维过程为开端,介绍计算机的问题求解过程和方法: 从软件工程化的角度,讲解结构化程序设计的起源、基本原理及基本语法;从人类认知世界的过程和方法入手,总结人类认知规律,讲解面向对象技术和方法的基本原理,以及面向对象语言特有的语法。
本书融合了算法分析与设计、现代软件工程、C++语言、UML建模、程序设计方法学、面向对象方法学等多方面的思想和知识,内容从易到难,覆盖面广,适用范围较宽,既适合作为高校计算机及相关专业本科生的教学用书,也可作为其他理工科专业本科生的教学参考书。对于有志于深入学习程序设计的计算机爱好者,本书也是一个好的选择。
坐在计算机前,挥洒自如地驰骋于电脑世界,一行行程序在自己的一双巧手下源源不断地流出,这是一些初学编程者的美好憧憬。然而在学习了程序设计语言的一些具体语法后,真正动起手来编写程序时,却往往会觉得一筹莫展、无所适从;一些读者在遇到一种新型编程语言时,即便是已经掌握了某些编程语言,学起来也常常感到举步维艰,未能体会到已有的知识积累给学习新语言带来的便利。为什么这样?原因在于没有掌握程序设计的一般过程,没有深入了解通用程序设计语言的本质规律。
通用程序设计语言是与人类自然语言具有一定相似性的人造语言,使用通用程序设计语言进行程序设计并不能简单地等价于人们常说的“编程序”。程序设计是一个过程,通常分为三个阶段:算法分析与设计、程序编写与调试、程序测试,正像人们利用自然语言书写文章一样,与此三阶段相对应的是构思、起草与修改、审阅。不同阶段的任务是相对独立的,如果对此没有深入的了解,则很容易将它们混为一谈,在缺乏对问题深入、全面分析的情况下匆匆动手编写程序,自然就会像没有经过构思而书写出来的文章一样,基本上会是一篇流水账,不可能成为绝唱。学习程序设计的目的就在于通过学习,能够从自觉地遵守程序设计的准则,到不自觉、非有意、自然而然地按照程序设计准则去从事程序设计工作。为实现这个目的,学习算法分析和设计自然成为“程序设计基础”课程的主要学习任务之一。
程序设计归根到底要使用程序设计语言将问题的解题过程描述出来,因此学习程序设计语言是本课程的另一重要任务,本书虽然以C++语言为背景介绍命令式程序设计语言的相关知识,但是应该注意到,现有的通用程序设计语言的语法和风格可能迥异,但无论哪一种语言,都是以数据(类型)、操作(运算)、(操作)顺序控制和数据控制为基本内容。也就是说,万变不离其宗,不同的语言都以不同的格式对这4个方面提供不同的支持。读者在学习本书的具体内容时,抛却语言的具体表述格式,深入学习和理解这4个方面的实质,会给学习其他程序设计语言带来便利。
与许多其他同类教材不同的是,本书强调软件开发过程的重要性,为读者介绍了有关软件开发模型与软件测试的基本原理和技术。这样做的原因在于,现代软件开发多为集体合作,这种合作过程中每一个编程者所编写程序的规范性、正确性和可靠性十分重要,在学习程序设计之初就了解程序设计的规范过程,对于培养将来参与大型软件开发所需要的分工合作精神十分重要。
全书分为三个部分:第一部分由第1章和第2章组成,讲述程序设计的一些基本概念和思想,读者在学习过程中应该以了解和掌握结构化算法设计为重点;第二部分由第3章至第8章组成,以C++语言中的非面向对象语法为例,讲述一般程序设计语言所具有的数据(类型)、操作、(操作)顺序控制、数据控制基本内容,同时重点介绍如何进行结构化程序设计及软件开发的一般过程,对于这部分内容的学习,读者应该抛却具体的语言,从最一般的观点(通过程序)理解算法结构与解题过程描述;第三部分由第9章至第12章组成,重点介绍面向对象程序开发技术的基本方法,包括面向对象分析与设计的基本思想和主要步骤,以及C++中的面向对象特征的语法,该部分内容的目标是使读者了解和掌握人类认知的最一般规律,以及如何通过适当的步骤,采用面向对象技术和面向对象语言的基本语法,将自身对客观事物的认识描述出来。
程序设计基础(第2版)三位作者共同参与和完成了整书的编写及修订工作,其中石峰主要负责全书的统筹及第一部分内容的修订;刘彩霞主要负责第二部分的修订;计卫星主要负责第三部分内容的修订.
本教材的内容从简到难,覆盖面广,有些内容涉及一些较深入的知识(标题中带有*号),教师在使用本教材时,应该根据学生及教学的具体情况对内容进行适当剪裁。总之,对于本教材,学习的重点应该放在算法、程序结构的设计以及注重以程序设计语言的习惯和方式表述问题的解决方案上,而不应放在具体语言的语法细节上。
本书中的所有例题和习题中的程序都在Windows XP环境Visual C++ 6.0编译系统下运行,读者在学习时选择Visual C++ 5.0以上的版本即可。
本书是在多年教学实践基础上编写的,适合作为高校计算机及其相关专业本科生的教学用书,也可用于其他理工科专业的计算机教学参考书。对于有志于深入学习程序设计的广大计算机爱好者,本书也是一个好的选择。书中所用到的部分素材来源于教学过程中的积累和其他中外文教材、资料,由于无法在此一一列举,这里谨对这些教材和资料的作者表示衷心的感谢。对于在教材编写过程中,吉林大学张长海教授及编委会成员给予的关心和指导,以及清华大学出版社所给予的大力支持,作者在此表示最衷心的感谢!对于书中一些错误和有待商榷之处,欢迎各位专家不吝赐教。
作 者
2010年1月于北京理工大学
第1章 程序设计概论11.1 问题求解1
1.1.1 思维与语言1
1.1.2 算法3
1.1.3 数据结构5
1.1.4 程序7
1.1.5 程序设计的一般过程7
1.2 程序设计语言8
1.2.1 发展历史8
1.2.2 程序设计语言的实现12
1.2.3 高级语言程序基本结构14
1.2.4 高级语言的语法规则17
1.2.5 程序的编辑、编译和运行23
1.3 程序设计范式的演化25
1.3.1 结构化程序设计25
1.3.2 函数式程序设计26
1.3.3 面向对象程序设计27
1.3.4 事件驱动的程序设计28
1.3.5 逻辑式程序设计28
习题130
第2章 算法设计基础34
2.1 算法的描述34
2.1.1 自然语言方式34
2.1.2 伪代码方式35
2.1.3 程序流程图方式37
2.1.4 PAD图方式39
2.2 结构化算法设计初步40
2.2.1 算法描述40
2.2.2 算法设计42
2.3 算法的计算复杂性47
2.4 常用算法设计策略48
2.4.1 分治法48
2.4.2 递归技术49
2.4.3 贪心法50
2.4.4 回溯法51
习题252
目 录 程序设计基础(第2版)第3章 基本数据类型54
3.1 数据对象54
3.1.1 数据的存储55
3.1.2 生存期与值55
3.2 基本数据类型56
3.2.1 整型与浮点型57
3.2.2 字符类型58
3.2.3 逻辑型58
3.2.4 空值型58
3.3 变量与常量59
3.3.1 常量59
3.3.2 变量61
3.4 指针类型62
3.4.1 指针定义62
3.4.2 指针的初始化63
3.4.3 指针运算64
3.4.4 指针与常量65
3.5 引用类型66
3.6 类型的意义67
习题367
第4章 操作及其控制70
4.1 基本操作与运算符70
4.1.1 赋值操作70
4.1.2 算术操作70
4.1.3 增1(减1)操作71
4.1.4 关系、逻辑操作71
4.1.5 条件运算符71
4.2 表达式72
4.2.1 隐含类型转换72
4.2.2 强制类型转换73
4.2.3 表达式内的顺序控制73
4.2.4 运算符的优先级74
4.2.5 运算符的结合性74
4.3 语句75
4.3.1 表达式语句75
4.3.2 语句间顺序控制76
4.3.3 复合语句76
4.3.4 选择语句76
4.3.5 循环语句80
4.3.6 直接顺序控制85
4.4 预处理指令87
4.4.1 文件包含指令88
4.4.2 宏定义指令88
4.4.3 条件编译指令91
习题494
第5章 函数与数据控制103
5.1 函数定义与说明103
5.1.1 函数定义103
5.1.2 函数说明104
5.1.3 函数的简单调用106
5.1.4 函数的重载106
5.2 数据控制108
5.2.1 参数传递机制108
5.2.2 数据对象的引用112
5.2.3 作用域114
5.3 函数的顺序控制119
5.3.1 函数执行模型119
5.3.2 基于栈的实现122
5.3.3 函数的自嵌套调用122
5.4 相关的其他语法123
5.4.1 数组作函数参数123
5.4.2 函数指针126
5.5 常用系统函数129
5.5.1 数学函数129
5.5.2 字符串处理函数129
习题5130
第6章 构造类型138
6.1 数组类型138
6.1.1 数组定义138
6.1.2 数组的赋值与使用139
6.1.3 数组的存储139
6.1.4 数组的初始化140
6.1.5 字符数组140
6.1.6 指针与数组141
6.2 枚举类型143
6.2.1 枚举类型定义143
6.2.2 枚举变量定义143
6.2.3 类型转换144
6.3 结构类型145
6.3.1 结构的定义145
6.3.2 结构的使用145
6.3.3 结构的实现147
6.4 结构化数据148
6.4.1 单链表148
6.4.2 栈150
6.4.3 存储的动态分配153
6.5 抽象数据类型157
6.5.1 结构的扩展157
6.5.2 C++的抽象数据类型158
6.5.3 C++数据类型的层次159
6.6 自定义类型160
习题6160
第7章 结构化算法的实现167
7.1 基本控制结构的C++实现167
7.1.1 顺序结构的C++实现167
7.1.2 分支结构的C++实现168
7.1.3 循环结构的C++实现170
7.1.4 复杂结构C++实现示例171
7.2 子算法设计与C++实现172
7.2.1 参数为普通类型的子算法173
7.2.2 参数为指针的子算法174
7.2.3 参数为引用的子算法177
7.2.4 子算法设计与C++实现示例178
7.3 递归与迭代182
7.3.1 递归182
7.3.2 迭代184
7.3.3 应用示例186
习题7189
第8章 程序开发过程192
8.1 软件开发方法概述193
8.1.1 软件生存周期193
8.1.2 软件开发方法193
8.2 软件设计194
8.2.1 概要设计195
8.2.2 详细设计196
8.3 软件编码196
8.3.1 程序设计方法196
8.3.2 程序设计语言197
8.3.3 编码风格197
8.4 软件测试与调试198
8.4.1 调试工具及使用199
8.4.2 调试过程200
8.4.3 错误类型200
8.4.4 异常处理203
8.4.5 软件测试207
8.5 程序运行效率209
8.5.1 适当的算法209
8.5.2 选择快速运算210
8.5.3 函数213
习题8213
第9章 面向对象程序设计218
9.1 面向对象方法学218
9.1.1 人类认知规律218
9.1.2 面向对象基本原理220
9.1.3 认知规律与面向对象220
9.1.4 面向对象软件开发221
9.2 基本概念221
9.2.1 对象222
9.2.2 类226
9.2.3 结构与关系228
9.3 面向对象分析233
9.3.1 主要原则233
9.3.2 静态结构分析与对象模型235
9.3.3 动态行为分析238
9.4 面向对象设计241
习题9241
第10章 类与对象的实现243
10.1 C++中的类243
10.1.1 类的说明243
10.1.2 类的定义245
10.2 对象及其成员的使用247
10.2.1 对象实例247
10.2.2 对象成员的引用248
10.2.3 生命周期250
10.2.4 类型转换255
10.2.5 其他应用259
10.3 类的特殊成员268
10.3.1 静态成员268
10.3.2 const成员271
10.3.3 内联函数273
10.3.4 友元273
习题10275
第11章 类间关系的实现284
11.1 一般-特殊关系的实现284
11.1.1 类的继承与派生284
11.1.2 赋值兼容规则293
11.1.3 二义性与作用域分辨294
11.2 多态性与虚函数300
11.2.1 编译时刻的多态性300
11.2.2 运行时刻的多态性301
11.2.3 虚函数303
11.2.4 纯虚函数与抽象类310
11.3 整体-部分关系的实现314
11.4 关联关系的实现317
11.5 关于类层次的总结318
11.5.1 认知规律与类层次318
11.5.2 构造函数的一般形式319
11.5.3 成员函数的特征319
习题11320
第12章 面向对象程序设计的其他技术325
12.1 运算符重载325
12.1.1 友元运算符326
12.1.2 类运算符328
12.1.3 友元及类运算符的应用329
12.1.4 ++和--运算符的重载330
12.2 流类库333
12.2.1 格式化输入输出334
12.2.2 运算符<<和>>的重载335
12.2.3 流式文件336
12.2.4 流错误347
12.3 模板348
12.3.1 函数模板348
12.3.2 类模板351
习题12354
附录A Microsoft C++的保留字358
附录B C++中的基本数据类型359
附录C 扩展ASCII字符集360
附录D C++的运算符362
参考文献364