程序设计:从过程化到面向对象
作者 : 王立柱 编著
出版日期 : 2012-07-09
ISBN : 978-7-111-39039-8
定价 : 33.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 288
开本 : 16
原书名 :
原出版社:
属性分类: 教材
包含CD :
绝版 :
图书简介

C++主要分为两部分内容:C和C++的公共子集,C++直接支持的高级技术部分。本书从公共子集到高级部分逐步讲授,共分22章:机器语言简介、基本数据类型、运算符和表达式、语句组结构、指针和数组、函数、模块化程序设计、C风格串、结构、二维数组和指针、顺序表、单向链表、从C到C++的基本内容、从顺序表到顺序表类、从C风格串到String类串、Date类,继承和动态绑定、函数模板和向量类模板、链表类模板和适配器,C++的I/O流库、C++综合设计实例、命名空间。

图书特色

程序设计
从过程化到面向对象
王立柱 编著
培养程序设计能力是一项系统的工程。作者以逻辑方法进行了长期的程序设计类课程的教学实践,收效显著,并将其心得融入本书中。本书以程序设计的发展过程为对象,以程序设计的基本矛盾运动为主线,把程序设计的需要作为原则,用程序设计的实例来贯穿,使读者以哲学的眼光理解程序设计,更高效地提升程序设计能力。
本书特点:
注重规律。按照程序设计方法的连续发展阶段而编写。
承上启下。在C语言基础上,从需要出发,通过典型问题的出现和解决讲解C++的概念,环环相扣地实现从C到C++的平滑过渡。
实用性强。以典型设计实例贯穿全书,程序设计风格从过程化到面向对象再到泛型循序渐进。
多媒体软件既助教又助学。配套的多媒体教学软件使结构、算法、代码、运行过程和结果综合展现,数据自动输入、运行过程步步跟踪。

图书前言

平凡中的非凡
  辩证逻辑和旧的纯粹的形式逻辑相反,不像后者满足于把各种思维运动形式,即各种不同的判断和推理的形式列举出来和毫无关联地排列起来。相反地,辩证逻辑由此及彼地推出这些形式,不把它们互相平列起来,而使它们互相隶属,从低级形式发展出高级形式。
    —恩格斯
一、“人体解剖”的方法
  C++主要包括两部分内容,一部分是C和C++的公共子集,另一部分是C++直接支持的高级技术部分。公共子集主要有基本类型、指针、数组、结构、函数和C风格字符串。高级技术部分有类、继承和动态绑定、函数模板、类模板和STL(string、vector和list等)。从公共子集到高级技术部分,包含着程序设计风格从过程化程序设计到数据抽象,然后从面向对象程序设计到泛型程序设计的发展。
  C++是从C扩展类型开始的,“C++的每一步演化和发展都是由于实际问题所引起的”,这些实际问题主要来自类型的扩展。Stroustrup指出:“C++支持一种逐步推进的学习方式。你学习一个新语言的方式依赖于你已经知道些什么,还依赖于你的学习目的。”
  本书的目的是掌握C++的演化和发展规律,从C和C++的公共子集开始,然后将其作为已知。“逐步推进的学习方式”是从自定义类型的C描述转换到C++描述,再到vector和list的实现。本书的特点是:分析各种概念,注意概念的隶属关系,建立概念的连锁,不让其中缺少一个环节,而且使整个连锁有一组大家熟悉的典型程序设计作为根据。这是一种逻辑方式,也是马克思提倡的“人体解剖”方式。我们知道,事物的本质只有在它发展到一定阶段的时候才能清晰地显露出来,于是,这一清晰的本质就是一把钥匙,借此,我们可以对整个发展过程重新做出合乎逻辑的描述,展示出其内在规律性。黑格尔形容这种方式是“密涅瓦的猫头鹰从黄昏起飞”。在马克思看来,这种逻辑方式不过是摆脱历史的形式以及起扰乱作用的偶然性,按照现实的历史过程本身的规律进行修正,因而具有逻辑上前后一贯的形式,使每一个要素可以在它完全成熟并且具有典型性的发展点上加以考察。如果把C看做不成熟的“猴体”,把C++看做成熟的“人体”,那么马克思认为“人体解剖对于猴类解剖是一把钥匙”。
  Bruce Eckel在他的《C++编程思想》一书中就探索了这种逻辑方式:他先用C语言实现一个顺序表,然后再转换为C++类。顺序表便是那种“完全成熟并具有典型性的发展点”。显然,这种逻辑方式下的C已不是传统的、由不了解C++的人来讲授的、只为应对考试的C,而是从C++的高度来修正的、按照从C到C++的发展规律和人的认知规律来描述的C。
  本书的创新是把STL的string、vector和list作为C++发展中的成熟点,实现了从C到C++的无缝连接。
二、本书的脉络
  为了阐述从C到C++的发展,并使其具有逻辑上前后一贯的形式,本书以程序设计的基本矛盾为主线,把解决实际问题作为动机,用程序设计的典型实例来贯穿。 
  什么是程序?程序是在某种存储模式上实现的算法,即程序=存储模式+算法。所谓存储模式是指数据和对数据的基本运算或基本操作的存在形式。所谓算法是指可以用基本运算或基本操作来表示的问题求解的有穷序列。算法好比一台机器,构造再复杂,也不过是简单机械动作的重复。最先提出这个思想的人是图灵,他认为,应该用机器保留一些最简单的操作,然后将一个复杂的计算分解为这些操作。冯·诺依曼用固化在硬件中的机器指令表示简单操作。这些机器指令的集合构成的系统成为第一个程序语言—机器语言。从此,存储模式都用程序语言来表示,程序也就成为用某种程序语言实现的算法,例如机器语言程序、C语言程序、C++语言程序、Java语言程序等。
  什么是程序设计?程序设计的关键也是程序设计方法,它是关于存储和算法的关系和发展的科学。“纵观短暂的计算机发展史,存储和算法这两个方面一直存在,发展演化的只是它们之间的关系,这个关系就是程序设计方法”。
  存储和算法是一对矛盾体。存储是为了算法,算法离不开存储。但是存储相对稳定,制约着算法的自由发展,而算法越来越复杂,要求存储不断改进。这样的矛盾推动了程序设计的持续发展。我们的理论正是对这种发展过程的阐明。一切发展,不管其内容如何,都可以看做一系列不同的发展阶段,它们以一个否定另一个的方式彼此联系着。这里的“否定”不是消灭,而是扬弃,是后者克服前者中消极的东西,保留和继承积极的东西,并把它发展到新的阶段。
  本书的内容安排如下(见下图):
  第1章(机器语言简介)从机器语言层面认识存储模式和算法的矛盾,同时引入地址、子程序调用、入口地址、现场保护、栈等概念。算法的发展推动矛盾的发展,矛盾的发展推动概念和语言的发展。
  第2章(基本数据类型)引入基本类型,弥补机器指令系统的不足。
  第3章(运算符和表达式)从基本类型的运算符组合介绍最简单的结构化算法即结构化程序。
  第4章(语句组结构)用结构化的语句组扩展表达式。
  第5章(指针和数组)引入复合类型弥补基本类型的不足。
  第6章(函数)用函数扩展表达式和结构化语句组。
  第7章(模块化程序设计)系统介绍基于函数的过程化程序设计方法。
  第8章(C风格串)介绍系统提供的C风格的数据抽象方法。
  第9章(结构、联合、枚举)介绍C风格的自定义类型方法。
  第10章(二维数组和指针)综合分析指针和数组的复杂关系。
  第11章(顺序表)模拟C风格串,自定义顺序表,以弥补数组的不足。
  第12章(单向链表)自定义单向链表,以弥补顺序表的不足。
  第13章(从C到C++的基本内容)引入C++的基本知识,以解决顺序表中的C语言问题。
  第14章(从顺序表到顺序表类)把顺序表转化为顺序表类,以弥补顺序表的不足。
  第15章(从C风格串到String类串)把C风格串转化为String类串,以弥补C风格串的不足。
  第16章(Date类)把Date结构转化为Date类,以弥补Date结构的不足。
  第17章(继承和动态绑定)介绍面向对象程序设计方法。
  第18章(函数模板和向量类模板)创建向量类模板Vector,改进顺序表类。
  第19章(链表类模板和适配器)创建链表类模板改进单向链表。
  第20章(C++的I/O流库)把标准设备的输入/输出推广到磁盘文件的输入/输出。
  第21章(C++综合设计实例)综合运用前面所学知识,编写中缀表达式求值和事件驱动模拟程序。
  第22章(命名空间)介绍防止命名空间污染的方法。
三、教学经验和体会—平凡中的非凡
  1. 注重规律和方法
  C++不是聪明人苦思冥想的结果,而是程序设计的发展过程使然,我们的逻辑方法正是以这个过程为研究对象。每一个学生,只要经历这个过程,都可以深切地感受到C++产生的必然性,从而认识到积累与创新的正确关系,这对培养学生的学习兴趣、树立学生的学习自信心、提高学生的科学素质都是至关重要的。
  这种方法在中学是学不到的。作为大学教师,不要仅仅从实用的角度或仅仅为了应试来讲授程序设计,这会使课程支离破碎,只剩雕虫小技,而要讲究逻辑,注重整体,前后连贯地讲授知识,促进学生从中学到大学的转变,使学生时刻感觉到自己是真正在上大学,有做大学生的自豪感,这是大学教师的义务、责任和价值。
  学生之所以欣赏计算机的美,不只是因为它体现了令人感叹的人类智慧的美,更是因为计算机是建立在程序设计之上的,而学生通过比较全面而深刻地认识程序设计的发展规律,能够挖掘出自己的潜能,最终欣赏到自身的美。
  2. 因材施教
  本书如果作为计算机专业教材,总学时数不少于80,那么每一章都应该讲。
  本书如果作为非计算机专业的必修课教材,总学时数不少于60,那么第10章、第20~22章可以不讲,仅要求自学。
  3. 多媒体教学
  本书有配套的多媒体软件,既助学又助教,使结构、算法、代码、运行过程和结果同时展现、数据自由输入、运行过程步步跟踪。它适应了多媒体时代的要求,扩展了学生自主学习的空间,解决了算法复杂抽象、学生难以理解、教师难以讲解的难题,加强了师生的切磋交流,为教师采用前后横向对比、全面具体、综合系统、深刻展示思想方法的授课方式搭建了平台。本书配套的学生用助学软件、教师用教学软件以及源代码均可从华章网站(www.hzbook.com)下载。另外,该多媒体软件是基于Authorware应用软件的编程特性开发的,它从各个方面时时彰显着学习程序设计的意义(如下图所示),需要读者有很好的程序设计基础和综合能力。
  4. 考试
  考试要突出整体性,树立学生的全局观和发展观,切忌偏题、编造题。本书章后的习题都是考试的参考题型。
四、致谢
  感谢武警后勤学院贾冬梅老师,她参与了本教材的校对,不仅指出很多文字上的错误,而且提出不少建设性的意见。
  感谢天津师范大学的刘志红老师,她不仅是课程改革团队的主要成员、教学课件的制作者、课程的主讲教师,而且十年来她的学生评教成绩一直很优秀,本书所遵循的逻辑方式不仅经过她的教学实践证明是普遍受学生欢迎的,而且也通过她的实践得到不断的完善。

上架指导

计算机\程序设计

封底文字

培养程序设计能力是一项系统的工程。作者以逻辑方法进行了长期的程序设计类课程的教学实践,收效显著,并将其心得融入本书中。本书以程序设计的发展过程为对象,以程序设计的基本矛盾运动为主线,把程序设计的需要作为原则,用程序设计的实例来贯穿,使读者以哲学的眼光理解程序设计,更高效地提升程序设计能力。
本书特点:
 注重规律,按照程序设计风格的连续发展阶段编写。
 承上启下。从C与C++的公共部分开始,用典型问题的出现和解决,讲解从C到C++的概念,环环相扣地实现从C到C++的平滑过渡。
 实用性强。以典型设计实例贯穿,程序设计风格从过程化到面向对象再到泛型循序渐进。
 多媒体软件既助教又助学。本书配套的多媒体教学软件使结构、算法、代码、运行过程和结果综合展现,数据自动输入、运行过程步步跟踪。

多媒体助学软件示意图  多媒体教学软件示意图
这两个图参见《C语言程序设计》一书,书号为978-7-111-34972-3

图书序言

丛书序言
  作为我国规模最大的理工科专业,计算机本科专业为国家的建设培养了大批人才。2006年,教育部计算机科学与技术专业教学指导委员会发布了《高等学校计算机科学与技术专业发展战略研究报告暨专业规范(试行)》(以下简称《规范》),提出了以“按培养规格分类”为核心思想的专业发展建议,把计算机专业人才划分为研究型、工程型、应用型3个类型。在《规范》的方针指导下,培养合格的计算机本科人才。
教育包括知识、能力、素质三个方面,专业教育不仅要重视知识的传授,更应突出专业能力的培养,实施能力导向的教育。如何以知识为载体实现能力的培养和素质的提高,特别是实现专业能力和素质的提高是非常重要的。对计算机专业本科教育而言,要想实现能力导向的教育,首先要分析专业能力的构成并考虑如何将其培养落实到教学实践中。为此,教育部高等学校计算机科学与技术专业教学指导分委员会开展了计算机科学与技术专业人才专业能力(简称计算机专业能力)的培养研究。该项研究明确了计算机专业本科人才应具有的4大基本能力—计算思维能力、算法设计与分析能力、程序设计与实现能力、系统能力,并将这四大基本能力分解为82个能力点,探讨如何面对不同类型学生的教育需求,在教学活动中进行落实。
为体现研究成果在教学活动中的实现,我们根据《高等学校计算机科学与技术专业人才专业能力构成与培养》,出版了这套教材。本套教材面向高等院校从知识传授向能力培养转型的需求,在内容的选择、体系安排和教学方法上按照专业能力培养的需要进行了探索。其主要特点有:
(1)以教学研究为先导。本套教材以计算机专业能力专项研究成果为基础,体现了先进的教育理念和教学方法,内容选择、知识深度、结构安排更加符合计算机专业教育的需求。
(2)落实能力培养的思想,同时满足课程的要求。本套教材不仅关注知识点的讲授,还凸显能力培养的要求,将能力的培养分解到各门课程的各个知识点的讲授中。
(3)力求贴近教学实际。作者均长期从事实际教学工作且对专业能力培养具有一定研究,教材编写注重科学组织内容、合理安排体系、便于教学实施,更具操作性。
(4)构建立体化教材。为了方便教师的教学活动,配合主教材开发配套的实验教材、教师参考书、学生辅导书、电子课件等教辅资源。
本套丛书的出版是在配合计算机专业能力的培养和落实方面的初步尝试,我们衷心希望本套教材的出版能起到抛砖引玉的作用,也希望广大教育工作者加入到能力培养的研究和实践中来,并对相关的教材建设提出自己的宝贵意见。

丛书编委会

图书目录

出版者的话
编委会
丛书序言
前言
教学建议
第1章  机器语言简介 1
1.1  计算机组成及工作过程 1
1.2  计算机硬件和软件 4
1.3  机器语言程序 5
1.4  汇编语言 7
1.5  深入探讨—存储和算法是一对矛盾体 8
习题 9
第2章  基本数据类型 10
2.1  变量与字面值常量 10
2.2  整型 15
2.3  字符型 16
2.4  实型 19
2.5  布尔型 20
2.6  typedef 名字 20
2.7  基本数据类型的深入探讨 20
2.7.1  字面值常量的意义 20
2.7.2  左值和右值 21
习题 21
第3章  运算符和表达式 22
3.1  表达式 22
3.2  关系操作符 23
3.3  逻辑操作符 23
3.4  自增自减操作符 24
3.5  赋值和复合赋值操作符 25
3.6  条件操作符 26
3.7  逗号操作符 27
3.8  复合表达式 27
3.9  内部类型转换 27
3.9.1  赋值兼容性 27
3.9.2  表达式计算中的类型转换过程 28
3.9.3  强制类型转换 28
习题 28
第4章  语句组结构 30
4.1  选择结构 30
4.1.1  if-else语句 30
4.1.2  switch语句 34
4.2  循环结构 35
4.2.1  for语句 35
4.2.2  while语句 37
4.2.3  do-while语句 39
4.2.4  循环嵌套 40
4.3  其他流程控制语句 40
4.3.1  break语句 40
4.3.2  continue语句 41
习题 41
第5章  指针和数组 43
5.1  指针 43
5.1.1  指针和间接引用 43
5.1.2  指针定义中“*”的位置 47
5.1.3  指针加减整数的基本运算 47
5.2  数组 48
5.2.1  数组变量和数组指针 48
5.2.2  变量和长度为1的数组 50
5.2.3  数组和指针的关系 51
5.2.4  动态数组 52
5.3  指针和数组的应用设计举例 52
5.3.1  数组元素求和 52
5.3.2  求数组最小元素 53
5.3.3  选择排序 53
5.4  指针和数组的深入讨论 55
5.4.1  指针、数组、表达式和左值 55
5.4.2  数组变量指针和数组指针 55
习题 55
第6章  函数 57
6.1  函数定义与调用 57
6.2  值传递和指针传递 61
6.3  返回值与指针传递 62
6.4  函数声明(原型) 62
6.5  函数应用设计举例 64
6.5.1  选择排序 64
6.5.2  起泡排序 65
6.5.3  数制转换 66
6.5.4  折半查找 66
6.5.5  划分数组元素 67
6.5.6  删除重复数据 68
6.5.7  筛法求素数 69
6.5.8  Josephus问题 71
6.6  函数调用与变量的存储类别 71
6.6.1  自动局部变量 72
6.6.2  静态局部变量 74
6.6.3  外部变量 75
6.6.4  寄存器变量 76
6.7  const限定修饰符 77
6.7.1  const型变量 77
6.7.2  间接const型指针 78
6.7.3  const型指针 79
6.7.4  全const型指针 79
6.8  函数指针 80
6.9  递归 81
6.10  函数的深入讨论 83
6.10.1  作为函数退出点的return语句 83
6.10.2  自变量指针不能作为返回值 84
6.10.3  函数表达式和左值 84
6.10.4  移动下标与移动指针 85
6.10.5  数组和指针参数 85
习题 86
第7章  模块化程序设计 87
7.1  全局外部函数 87
7.2  静态外部函数 88
7.3  全局外部变量 89
7.4  静态外部变量 90
7.5  编译预处理 91
7.5.1  无参宏指令 91
7.5.2  带参宏指令 91
7.5.3  条件编译指令 92
7.5.4  文件包含指令 93
7.6  模块化应用设计举例—数组的
输入/输出、排序和查找 95
习题 96
第8章  C风格串 97
8.1  字符串常量和字符串赋值 97
8.2  字符串基本操作函数声明 99
8.3  字符串基本操作函数实现 99
8.4  字符串应用设计举例 102
8.4.1  判断回文 102
8.4.2  删除空格字符 104
8.5  字符串的深入讨论 105
8.5.1  特殊字符串 105
8.5.2  再论字符串常量 105
习题 105
第9章  结构、联合、枚举 106
9.1  结构 106
9.1.1  结构定义 106
9.1.2  结构变量 107
9.1.3  结构变量的初始化和赋值 107
9.1.4  结构数组 108
9.1.5  结构的嵌套 109
9.1.6  结构返回值和指针传递 110
9.2  联合 110
9.3  枚举 111
9.4  结构应用设计举例 113
9.4.1  模拟洗牌 113
9.4.2  Date结构 114
9.4.3  三天打鱼,两天晒网 118
9.5  结构的深入讨论 118
习题 119
第10章  二维数组和指针 121
10.1  二维数组与二维数组指针 121
10.2  二维数组与一维数组 126
10.3  指针数组与二级指针变量(指针的指针) 129
10.4  指针数组与二维数组 130
10.5  二级指针指向的动态数组空间 132
10.6  二维数组和指针的应用设计举例—马鞍点 133
习题 134
第11章  顺序表 135
11.1  顺序表的定义 135
11.2  顺序表基本运算的实现 137
11.3  删除顺序表重复数据 140
11.4  数据抽象和准封装 141
习题 143
第12章  单向链表 144
12.1  单向链表的定义 144
12.2  单向链表基本运算的实现 146
12.3  逆置 150
习题 151
第13章  从C到C++的基本内容 152
13.1  C语言本身的问题 152
13.2  内联函数 154
13.3  运算符重载 155
13.4  函数重载 156
13.5  引用型 158
13.5.1  引用型概念的由来 158
13.5.2  引用型的定义和应用 160
13.6  提取符和插入符重载 162
13.7  默认参数 164
习题 165
第14章  从顺序表到顺序表类 166
14.1  顺序表和顺序表类 166
14.2  顺序表类基本运算的实现 169
14.3  增加的成员函数 170
14.3.1  复制构造函数 170
14.3.2  复制赋值运算符重载 171
14.3.3  下标运算符重载 172
14.4  构造函数与初始化 173
14.5  类定义 173
习题 174
第15章  从C风格串到String类串 175
15.1  String类的声明 175
15.2  String类基本运算的实现 177
15.2.1  构造函数 177
15.2.2  成员赋值运算符 179
15.2.3  成员转换 180
15.2.4  串连接 181
15.2.5  关系运算 184
15.2.6  求子串 184
15.2.7  子串插入 186
15.2.8  子串删除 188
15.2.9  下标运算符 189
15.2.10  字符查找 190
15.2.11  输入/输出 190
15.3  模式匹配 191
15.4  深入讨论 193
15.4.1  转换赋值运算符函数的替代 193
15.4.2  成员函数“类串+C串”的替代 193
15.4.3  explicit修饰符 194
习题 195
第16章  Date类 196
16.1  Date类的声明 196
16.2  Data类基本运算的实现 199
16.3  深入讨论 202
16.3.1  转换赋值成员函数的替代 202
16.3.2  静态数据成员和静态函数成员 202
习题 204
第17章  继承和动态绑定 205
17.1  参数初始化表 205
17.2  继承和受保护成员 207
17.2.1  继承 207
17.2.2  受保护成员 209
17.3  多态性和虚函数 209
17.4  虚析构函数 211
17.5  纯虚函数和抽象类 212
习题 215
第18章  函数模板和向量类模板 216
18.1  函数模板 216
18.2  顺序表类模板 218
18.3  向量类模板Vector 219
18.3.1  Vector定义 220
18.3.2  通用算法和迭代器 223
18.3.3  Vector的插入和删除函数 225
18.3.4  求素数 226
18.4  函数对象 227
18.5  深入讨论—函数模板实例化中的问题 228
习题 229
第19章  链表类模板和适配器 231
19.1  链表类模板List 231
19.2  适配器 237
19.2.1  链栈 237
19.2.2  链队列 238
19.2.3  优先级链队列 238
习题 239
第20章  C++的I/O流库 240
20.1  类ofstream、ifstream和fstream 241
20.2  流模式标志和流成员函数 242
20.3  文件和流的关联与解除关联 244
20.4  无格式读写 245
20.5  格式化输入/输出 246
20.5.1  设置流的格式化标志 246
20.5.2  格式输出函数 248
20.5.3  操作算子 249
20.6  文件错误处理 250
习题 251
第21章  C++综合设计实例 252
21.1  中缀表达式求值 252
21.2  事件驱动模拟 256
习题 263
第22章  命名空间 264
22.1  命名空间的定义 264
22.2  using namespace语句 265
22.3  命名空间的成员 266
22.4  命名空间的别名 267
习题 268
附录A  命名规则 269
附录B  语言操作符的优先级与结合性 270
参考文献 271

教学资源推荐
作者: 赵绪辉
作者: (美)Roger S.Pressman 著
作者: (美)Wayne Wolf 著普林斯顿大学
参考读物推荐
作者: 赵化启 闫广明 孙小君 等编著
作者: 施威铭研究室 编著