发布时间:2023-03-07 15:05:58
序言:写作是分享个人见解和探索未知领域的桥梁,我们为您精选了8篇的数据结构与算法样本,期待这些样本能够为您提供丰富的参考和启发,请尽情阅读。
>> 数据结构排序算法可视化的设计 选择排序算法的分析与改进 《数据结构与算法》课程教学改进与探索 论数据结构中的外排序与内排序 数据结构实验教学中排序算法的动态演示 基于VC++的数据结构算法演示系统 基于数据结构的最小生成树算法 基于项目导向的数据结构与算法课程教学研究与实践 基于C语言排序的算法改进与应用 基于C程序冒泡排序算法的研究与改进 试论算法与数据结构的相关性 《数据结构与算法》的教改问题研究 “算法与数据结构”课程教学体系的建设 数据结构中排序方法的研究 数据结构算法应用 基于Visual C++的数据结构经典算法的演示系统 基于K―D树数据结构的平面插值算法的优化 “算法与数据结构”教学探索与实践 通用题库数据结构与组卷算法设计 算法与数据结构理论教学技巧探讨 常见问题解答 当前所在位置:l.
[4]黄福员.冒泡排序算法的改进[J].微机发展,2003,13(11):65-66.
[5] Mark Allen Weiss.数据结构与算法分析C++描述[M].张怀勇,译.北京:人民邮电出版社,2007.
[6]Thomas H Cormen.算法导论[M].2版.北京:机械工业出版社,2006.
[7]Sartaj Sahni.计算机算法[M].北京:机械工业出版社,2006.
[8]徐士良.实用数据结构[M].北京:清华大学出版社,2006.
关键词:数据结构;算法;图示教学法;最小生成树
中图分类号:G642 文献标识码:B
1背景
数据结构和算法是计算机科学与技术、软件工程等相关专业的专业基础课,其重要性不言而喻,在教学过程中需要运用多种教学方法,让学生领会算法实现的过程和本质,加深对所学知识的理解、记忆和应用。在数据结构和算法课程教学中,图状结构的教学是一个难点,特别是涉及到图的具体应用时,更让学生难以掌握,本文将图示教学法应用到数据结构中关于图状结构的一个典型应用――最小生成树问题,给出该教学方法的基本方法和过程,取得了良好的教学效果。
最小生成树是图状(网络)结构中一个典型的实践应用,可以解决实际中诸如公路网的规划,即在n个城市中,如何规划n-1条公路,使得n个城市都可以连接起来,而所有城市间的连接线长度的总和最短(所要修建的公路长度最短,因而费用最少)。
对于这个典型的应用,绝大多数教科书均介绍了普里姆(Prim)算法,用于求最小生成树问题,然而教科书对这个算法实现的论述,一般是先介绍应用背景,然后就给出算法实现的过程,缺少形象的算法分析过程,课堂教学讲解如果按照这种方式去传授,学生在理解上十分吃力,而且不能有效地长期记忆。笔者结合自己在教学中的经验,将以上算法采用了图示教学法来分析其基本原理和实现过程,并给出算法实现过程,取得了良好的效果。
2教学方法
图示教学法就是用各种图形表示的方法描述问题、引导学生的思考,增强对新知识的记忆,并在教学中被广泛使用。最小生成树属于网络的实践应用,下面以图1为例,用图示教学法来对最小生成树算法进行图示过程分析。
假设某一区域内有n个城市,现要为这些城市修建城间公路,使得任意两城市间都能够相互通达(连通),由于要求所有的城市都在该公路网上,某两个城市间的道路称为一个路段,则修建的道路路段总数应等于n-1个(容易理解:如果路段总数小于n-1,则会有存在城市不能处在该道路网的节点上;如果路段总数大于n-1则会存在某两个城市间有至少两个路段,则路段距离的总和将不是最小),先从这些城市中任选一个作为种子,把剩下的城市用路段连接到由该种子城市为起始点的城市网络中,保证路段长度总和最小(最优路段网),则最后连接好的路段即为最小生成树。
如图1,每个带圈的数字表示一个城市,城市间的边表示城市间的距离,如果两城市间没有边存在,则表示这两个城市间不适宜修道路(如有山脉或河流隔断,造价太高),假设种子城市为数字1(选定的网络的起始顶点),通过图示教学法求最优路段网的过程如图2:
图中,Li-j表示城市i与城市j间的距离,例如在(b)中,当把城市2加入到最优路段网后,城市3、4、6与该最优路段网的距离发生了变化,例如城市3,由于由L1-3(=∞)> L2-3(=5),故其与最优路段网的距离由原先的∞也转变为5
首先构造一个初始最优路段网,但该网络只有一个节点,即“种子城市”,其位于图2(a)中的中心圆圈内,圈外的节点称为节点或城市。然后根据图1城市间的距离(网络节点间的边的权值),求其它所有城市(网络节点)与种子城市间的距离(通过访问网络的物理存储结构如邻接表获取),该图表示仅通过了种子城市来连接所有的其它城市,图中中心圆圈外的城市当前还没有加入到最优路段网规划中,圈外连接每个城市与中心圆圈的实线表示该城市如果按当前规划方案加入到该路段网时所需要建造的路段长度(即网络边的权),圈内的虚线表示当前城市通过某一个最优路段网中的某城市为“桥梁”,而进入到该网络中。例如,城市2如果通过城市1进入规划网,则需要修建长度为16(仅表示相对数值)的道路,城市5要修建长度19的道路,城市6要修建长度21的道路,而城市3和城市4无法通过城市1来连接到最优路段网中(距离为无穷大,∞),而必须通过其它城市作为“桥梁”,来进入该规划网络中。很明显,如果按照该方案来把所有的城市都加入到初始最优路段网,得到的路段网如图2(g),需要修建的路段网总长度为∞,显然不是最优路段网。
注意到为了使规划的路段网是最优的(路段长度总和最小),只要保证每次加入到最优路段网中的城市都具有最短路段长度,则最后的路段总长度也必然最小。在图2(a)中,城市2与种子城市具有最小的距离(16),因而不可能找到其它任何一个路段,实现“种子城市与其它城市实现互连时,种子城市到其它任意一个城市的路段距离小于该值”,因而路段②-①必然是满足种子城市连通其它城市的最优路段,将城市2加入到最优路段网后,得到图2(b)。注意到当城市2加入到最优路段网后,城市3、4、6如果是通过城市2为“桥梁”(图中的虚线所示),加入到该最优路段网中,可以使各自的路段长度由原先的∞、∞和21分别缩短到5、6、11(其它城市通过城市2无法实现路段长度缩短,因为保持不变),此时路段总长度也由原先的∞缩小到57(即16+5+6+19+11),较图2(a),该方案有了很大的进步。然而该网络仍不是最优路段网,因为其仅保证了路段②-①的最优性(注意圆圈内的网络是最优的),而其它城市到该网络中的路段并非最优,这样不能保证路段总长度最小。
进一步注意到,在所有的当前城市中,城市3距离最优路段网的距离最短(5),也就是为了使当前最优路段网(圆圈内的城市及连线)与其它城市能够实现连通,且连通后的路段总长度最小,所以当前应加入城市3(图2(c))。城市3的加入或许可以使得其它的城市通过该城市为“桥梁”,而缩短城市到最优路段网的距离(当然这里城市3的加入实际并没有使其它城市到最优路段网的距离缩小)。同样的道理,在第4步(图2(d)),将城市4加入到最优路段网中(因为在余下的城市中,城市4到最优路段网的距离最小),该城市的加入,也使得城市1以该城市为“桥梁”而到最优路段网的距离由原来的19缩短到18(其它路段不变)。第5步将城市6加入到最优路段网中(图2(e)),该城市的加入没有影响余下的城市(当前仅剩一个城市,即城市5),最后将城市5加入到最优路段网中(图2(f))。得到的最终的最优路段网如图2(h),其路段长度的总和为56(16+5+11+6+18)。
3算法求解
有了如上的图示教学法描述的计算最小生成树实现基本过程,在讲解算法时就比较容易了。算法在实现时需要构造三个辅助数组:第1个数组A[n](n为节点数)记录当前节点是节点还是已加入最短路段(路径)网的节点,数组元素A[i]=0或1,0表示节点i是一个节点,当加入到最短路段(路径)网后,A[i]=1;第2个数组B[n]记录各节点到最短路段(路径)网的距离,用B[n]表示;第3个数组C[n]记录节点通过最短路段(路径)网内的哪一个节点为“桥梁”而进入该路段(路径)网的。注意这里的路径R和路段L是两个不同的概念,路段是节点的边,而路径是具有共同节点的有序边起节点与尾节点首尾相连在一起的序列,如在图1中,其中的一个路径R1-3=L1-2+L2-3。下面结合图2和图3,给出这些数组的值在计算过程中的变化情况。
辅助数组的变化情况如下图3所示,其中图3(a)即对应于图2(a),图3(b)对应于图2(b),依此类推。在图3(a)中,首先只有第一个节点进入最短路段网,因此A[1]=1,其它的A元素均为0,节点与最短路段网的距离B[i]与图2(a)中的距离对应,这里节点1由于已在最短路段网,所以B[1]=0,由于所有的节点目前都是通过节点1与最短路段网连接,因而所有的C[i]的值都是1。在图3(b)中,由于节点2距最短路段网的距离最小(16),节点2进入最短路段网,因而A[2]=1,此时由于节点2已进入最短路段网,因而B[2]=0,而节点3和节点4通过节点2,使它们距最短路段网的距离由原先的∞缩短到5和6,节点6也通过节点2使B[6]由21缩小到11。图3(c)、3(d)、3(e)、3(f)的过程不再赘述。最后的结果(图3(f))表明,节点1通过其本身进入最短路段网,节点2通过节点1进入最短路段网,节点3、4、6均通过节点2为“桥梁”进入最短路段网,而节点5通过节点4进入最短路段网。
基于上述分析,不难给出以上算法的实现描述:
(1) 初始化数组A、B、C,结果如图2(a)、图3(a),这里假设以节点1为起始(源)节点,共有n个节点。
(2) 反复执行如下操作:将B[i]中值最小的元素对应的编号i(即节点i)放入A中(即修改A[i]为1),然后修改A[j]!=0(j!=i)对应的B[j]和C[j]的值,修改的依据是:如果B[j]>Li-j,则用B[j]的值更改为Li-j。直至所有的A[i](1
(3) 输出结果,将B、C的最后值输出即可以得到最后结果,B所有的元素最后都为0,表示所有的元素都进入了最短路段网(最小生成数网),而C中的元素值表示的是当前节点元素(即节点1、2、3、4、5或6)是通过C中表示的节点编号而进入最短路段网的,即:节点1是通过其自身进入路段网,节点2通过节点1进入路段网,节点3、4和6均通过节点2进入路段网,节点5通过节点4进入路段网。
4结论
本文提出将图示教学法可应用于数据结构和算法课程教学的多个环节中,有些算法在大多数教科书中有了一定的图示过程表示,而有些算法却没有给出形象的图示表示,因而需要在教学中应补充。本文以图状结构中的最小生成树算法为例,通过图示分析,详细地讲解这个算法的核心思想和实现过程,通过视觉刺激,使学生能够加深对这个算法过程的把握,取得了良好的教学效果。
参考文献:
[1] 戴敏,于长云,董玉涛. 高效学习数据结构[J]. 计算机教育,2006(2):59-60.
[2] 余腊生,石献. 基于创新理念的数据结构教学方法探讨[J]. 计算机与信息技术,2006(11):110-114.
全书共20章。1.Python编程101:对使用Python语言编程进行总体介绍,包括创建对象、对象调用方法、运算符重载、读取文件方法、XML文件等内容;2.计算复杂度:包括计算机体系结构介绍、常见的计算复杂性、摊销复杂度的方法等;3.递归:包括时栈和堆的概念、简单递归函数的编写、运行,递归计算机图形学、列表与字符串等;4.排序:包括选择排序、归并排序、快速排序、链表、栈和队列等内容;5.集合与映射:数独游戏介绍、集、散列等相关概念,最后分析规划问题;6.树:抽象语法树和表达、前缀和后缀表达式、解析前缀表达式、二叉搜索树等内容;7.图:包括图的定义及理论、存储结构及算法实现、Kruskal算法、Dijkstra算法、图的表示方法等;8.Bloom过滤器、Trie数据类型等相关内容;9.堆:包括堆的主要思想及其建立、排序算法、与其他算法的比较等;10.平衡二叉搜索树:二叉搜索树的概念、存储结构与性质、AVL树与 Splay树等具体实例;11.B树:包括关系型数据库的概念、B树的组织结构、优势、实现、B树的插入与删除等内容;12.启发式搜索:包括深度优先搜索与广度优先搜索、A*搜索、最佳搜索等相关内容;13.附录A:整数操作符;14.附录B:浮算子;15.附录C:字符串运算符和方法;16.附录D:列表操作符和方法;17.附录E:字典操作和方法;18.附录F:Turtle方法;19附录G:TurtleScreen方法;20.附录H:完整的程序。
作者Kent D.Lee博士是美国艾奥瓦洲路德学院计算机科学教授,已成功出版两本著作:Python编程基础和编程语言基础。另一作者Steve Hubbard博士是路德学院数学与计算机科学系教授。
本书介绍了初级与高级的数据结构和算法问题,每一章开始提供了学习目标,复习题和编程练习,以及众多的例证;同时在相关的网站提供可下载的程序和补充文件。本书可以作为计算机学科相关专业的教材或参考书,同时对计算机科技工作者也有参考价值。
关键词:数据结构;多线程;VC++;动态演示
中图分类号:TP312文献标识码:A文章编号:1009-3044(2011)31-7685-03
Demonstrate System Based on VC++ for Data Structure Algorithm
SHEN Li-min
(Computing Center of the PLA University of Foreign Languages, Luoyang 471003, China)
Abstract: In view of the characteristic of data structure, on the analysis of insufficiency and limitation for traditional teaching method. How to illustrate algorithm performing process to the studuentsin a simple way becomes vital to the teaching of this course. Based on the reansons above, a teaching platform demonstrating the processing of algorithm has been designed and presented in this paper. This algorithm demo system to display a variety of programming languages to achieve a variety of algorithms and dynamic process, has the image of the interface, clear display of the various algorithms realize the process. The system is friendly, easy to use, it serves to the study of the student as well as the teacher's teaching.
Key words: data structure; multhread; VC++; dynamic demonstrate
数据结构是计算机专业的核心课程,对各类算法的理解是课程教学的重点和难点,算法动态演示系统作为辅助教学过程的手段可以有效帮助学生更快的理解、掌握算法。在教学过程中能加以计算机辅助教学,不仅可以提高教学效果,而且能够激发学生浓厚的学习兴趣并加强其编程能力,本系统采用多线程技术来实现数据结构算法的算法动态演示设计,实现了源代码跟踪、变量跟踪、模拟动态效果的算法演示系统。
1 数据结构定义
1.1 抽象数据类型迷宫
为了便于介绍,本文以迷宫求解为例。
ADT Seek{
数据对象:
D={ai,j|0
数据关系:R={ROW,COL}
基本操作:
InitSeek(&M,a,row,col)
初始条件:二维数组a[row+2][col+2]已存在,其中自第1行至第row+1行,每行中自第1列至第col+1列的元素已有值,并且以值0表示通路,以值1表示障碍。
操作结果:构成迷宫的字符型数组,以空白字符表示通路,以字符‘砖墙’表示障碍,并在迷宫四周加上一圈障碍。
Seek(int k,int x,int y,BOOL &succ)
初始条件:布尔型变量succ为fause。
操作结果:若迷宫M中存在一条通路,则按以下规定改变迷宫M的状态:根据布尔变量succ的值来判断有无路径可走。
PrintSeek(M)
初始条件:迷宫M已存在。
操作结果:以字符形式输出迷宫。
} ADT Seek[1];
1.2 整体框架
本程序包含三个模块
1)栈模块――实现栈抽象数据类型
2)迷宫模块――实现迷宫抽象数据类型
3)主程序模块:
void mian()
{ 初始化;
Do{
接受命令;
处理命令;
}while(命令!=“退出”);
}
2 动态系统的设计
2.1 多线程技术
系统的核心部分是动画演示、变量跟踪和源代码同步的实现,对于每一个算法的演示都要求实现这部分,数据结构算法动态演示的关键技术多线程技术
多线程(Muhithread)是指程序含有多个执行流。多线程机制允许单个程序通过建立多个并行执行的线程来完成各自的任务。这些并行执行的线程可以执行相同的代码,也可以执行不同的代码[2]。
在dotNET类库中,System.Threading命名空间下包含了各种线程组件、接口来帮助程序员使用C#编写多线程程序。在这个命名空间中最重要的就是Thread类,它是C#多线程程序设计的基础。Thread类提供了创建线程、控制线程的方法,它主要有以下几种重要的成员[3,6]:
启动线程:Start()
终止线程:Abort()
线程休眠:Sleep()
挂起线程:Suspend()
恢复线程:Resume()
2.2 具体的线程设计
AlgorithmThread.//用户自定义线程
{//类成员变量声明处
public AlgorithmThread()
{//构造函数体
} //类AlgorithmThread的构造函数
public void Run(){//定义线程体,以实现自定义线程类AlgorithmThread的功能
int i;String str;
for(i=0;i
{
str="Stepumber"+i.ToString()+"executed";
Thread.Sleep(500);
}
}
}
主程序中建立和启动线程:
public class mainForm
{ public delegate
void DelegateStep(int s);
public void startAlgorithmThread()
{ m_algotithmThread=new
Thread(newThreadStart(this.ThreadFunction));
//创建线程实例
m_algotithmThread.Start();//启动线程,即调用ThreadFunction线程函数
}
private void ThreadFunction()
{ /线程函数
AlgorithmThread algorithmThread;
algorithmThread=new AlgorithmThread();
algorithmThread.run();//调用AlgorithmThread的run函数,执行线程体
}}
2.3 实现思路
数据结构算法演示系统采用Windows应用程序项目来创建,在算法演示系统的主页上有启动各个算法的按钮,通过这些按钮启动每个算法演示界面,该界面有几个主要区域,每个区域对应一个组件[4-5]。
主窗口:包括标题栏和工具栏,用来实现系统控制。
动画演示区:以图形和动画的方式模拟和显示算法执行的过程和结果。
源代码区:用来显示类C语言编写的算法描述,为了更清楚地描绘算法的执行过程,当程序运行到当前行时,用一条高亮度光带罩住此语句,表示该语句被执行。
变量当前值显示区:由控件ListView实现,负责当前演示算法的重要参数及变化值的显示。
3 实验设计与结果分析
实验分别从算法进行动态模拟、代码同步跟踪来形象直观地反映算法的设计思想与动态过程,图1是迷宫求解算法求解过程。
3.1 算法动态模拟
本文利用多线程技术实现算法动态模拟演示,对一个具体的算法演示子模块,须满足执行、暂停、速度可调、任意时刻复位并能重新执行等复杂切换控制功能,从图1可以看到,菜单区有自动执行、单步执行、择暂停所得到的效果,从图1的动画显示区和变量区看到算法执行的过程。如图2中(a)是迷宫这种数据结构的初始化,(b)是随机生成的迷宫。
3.2 代码同步跟踪
本文AlgorithmThread线程负责执行迷宫求解算法,而在主窗口中需要同步显示被执行到的源代码行和该行代码中涉及到变量的当前值的获取和显示,这涉及到多线程间的同步和交互的问题。如图3所示蓝色的横条表示算法执行到到位置,结合图1和图3可以清楚看到代码的同步跟踪情况。
4 结论
本文是基于VC实现的数据结构算法动态演示系统,采用了多线程技术,对算法进行动态模拟、代码同步跟踪,可以形象直观地反映算法的设计思想与动态过程,便于加深学习者对算法的理解和掌握。
参考文献:
[1] 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2008.
[2] Nagel C,Evjen B,Glynn J,et al.C#高级编程[M].李敏波,译.4版.北京:清华大学出版社,2006.
[3] Schneider G,Winters J P.用例分析技术[M].姚淑珍,李巍,译.北京:机械工业出版社,2002.
[4] 刘怀亮,陈荣国,吕国华.软件组建技术[M].北京:冶金工业出版社,2007.
关键词 数据结构 教学模式 层次化教学
中图分类号:G424 文献标识码:A
1 数据结构在本科生教学中的地位
数据结构是计算机学科本科教学中的核心课程,课程知识丰富,内容抽象,实践性强,主要研究各种基本的数据结构在存储器中的映像和各种基本操作在相应的存储映像上的实现。学习本课程旨在使学生增强分析计算机所加工数据的数据结构特性,选择合适的逻辑结构、存储结构和相应的算法的能力,并初步掌握算法的时间效率分析和空间效率分析的技术,编写出高效的程序。①
数据结构作为实践性很强的计算机专业基础课,在计算机科学教育中有着重要的地位和作用。美国IEEE和ACM的教学计划均把算法与数据结构类课程列为计算机以及信息技术相关学科专业的本科必修基础课程。②
2 数据结构教学体系的实施和效果
数据结构课程内容比较抽象,教学中长期存在一部分老师重理论轻实践的现象,即使老师花费很多时间备课和授课,却经常出现学生只能大致明白算法思想,而无法真正实现算法的情况,学生逐渐对这门课程的学习失去了兴趣和信心。
由于我院的授课对象是三本学生,如果只是枯燥地介绍各种数据结构以及算法实现,学生很难理解并掌握相应知识点,最终只能勉强应付考试,而失去了学习该门课程的真正意义。为了实现课程的教学目标,使学生不但掌握数据结构的基本理论知识点,更要掌握各种经典算法,学会分析实际执行的算法,培养学生创造性地应用各种数据结构和算法,解决实际的应用问题的能力,以及探索和创新能力。针对我院学生的特点,在教学中采取层次化教学,既要培养多数应用型人才的实践能力,又要培养少数研究型人才的科研能力。
2.1 强化实践,注重培养能力
数据结构是一门理论性和实践性都很强的课程,培养学生的实践能力是教学的首要目的,理论知识的传授是为提高实践能力的,因此必须通过上机实验来加强实践能力。由于学生的学习主动性和学习能力各不相同,为了达到因材施教的目的,每个上机题目既要考虑学生总体的动手编程能力,又要考虑学生的个体差异,上机内容采取层次化思想。上机题目中包括了基础性、设计性和综合性实验,各种类型的上机题目之间存在着承接关系。经实践证明,采用由浅入深的上机实践环节,既有全体学生都能顺利完成的基础验证性题目,可以巩固并深化理论内容,实现教学要结合实际应用的特点,又考虑到学生专业特点和个性的设计综合题,培养了学生独立运用所学知识解决实际问题的能力,最大程度挖掘自身潜能。
2.2 注重引导学生思考,采用多样化的理论教学
课堂教学应把学生放在一种根本的、重要的位置上,从根本上确立以学生为主体的地位,把学生看成是积极的、富有创造性的程序语言使用者,而不是被动的接受者。为了避免传统的学生被动地接受书本知识的教学模式,在数据结构的教学中,采用“问题”组织教学,包括问题设置、学生通过思考和讨论提出解决方案、教师对学生的解决方案的评价并给出最佳解决方案。这样可以把课程的知识点转化为对某个问题的求解过程,使学生通过解决问题掌握知识。强调学生在学习和发展中的主体性和潜力的发挥,同时又不忽视教师的主导作用,通常采用小组协作式、个别化等教学形式或采用多种教学形式组合起来进行教学。数据结构教学的过程,实际上就是师生互相协作的一个过程。在课堂教学中充分发挥学生的主体性,让学生主动积极地去学习。
在教学方式中,如果只通过传统的黑板加粉笔的教学模式让学生通过脑海中执行静态的程序代码来了解数据结构的动态变化,这种方式缺乏直观性效果,难以充分展示算法的动态变化过程,学生难以想象数据之间的复杂关系。因此要充分利用多媒体教学课件动态地演示各种数据结构和算法,把知识生动、形象、动态地呈现给学生。
2.3 加强前导课程复习
学习本课程前学生虽已学过C语言程序设计与离散数学,但仅仅是初步掌握,并不精通,不能熟练运用程序设计语言进行编程。很难将算法转化成程序设计语言中的函数并编写出调用该函数的主函数,有的同学甚至直接将算法放到机器上运行,这是摆在学生面前的难题。针对以上情况,在开始讲授数据结构前,都会将之前学习的C语言程序设计中的数组、指针、函数、结构体和离散数学中的树和图相关知识进行复习,然后再开始学习数据结构。对于课程中的算法,除了讲解之外,部分算法在课上都会写出完整的源程序并运行,使学生理解算法和源程序之间的关系。
2.4 激励个性化学习,改革考核方式
在教学内容和实施上,适当考虑多样性和灵活性,对于应用型人才着重培养学生通过典型数据结构和算法实现的学习和训练,逐步掌握根据实际问题分析数据和数据结构,设计相应的运算和处理算法。对于研究型人才着重培养学生建立数据结构与算法的思维方法,形成数据结构和问题求解的知识体系,理解抽象的概念和复杂算法。对于能力较强的同学,可以选择一些数据结构应用等高级主题予以介绍,例如红黑树、伸展树、后缀树等复杂结构。学生在将来的科学研究和工程项目实践中将广泛接触到这些实用的数据结构和算法技术。
为了体现上机实践对该课程的重要性,我们在数据结构课程考核中采取重视上机实践成绩的考核方式,即平时成绩30%(其中上机占20%)+期末考试成绩70%的形式对学生学习成绩予以评价。
3 结语
以“学”为中心的教学设计,设计起来容易,因为那只是做一些决策。难在具体地教学实施。只有在教学实施过程中才会检验出教师是否真的坚持以“学”为中心的教学。教学过程中,以学生为主体,教师为主导,让学生体会到数据结构是一门与实践紧密联系且非常有趣的课程。通过数据结构的学习提高了学生的逻辑思维能力和数据抽象能力,提高了设计高质量程序的能力,为学生奠定了扎实的软件开发基础。
注释
关键词:数据结构;可视化;设计
在我国的科学技术得到迅速发展的过程中,科学计算的工作量也开始变得愈来愈大,可视化的方法能够有效的帮助工作人员进行获取更多的信息,从而更为直观的来对计算的结果进行分析。由于受到计算机性能以及软件平台限制,在最初的可视化软件系统方面都是在高性能图形工作站进行发展的,对数据结构可视化类库的设计能够有效的将效率得到提高。
一、数据结构可视化类库设计的重要性及目的
(一)数据结构可视化类库设计的重要性
在使用以及学习数据结构和程序设计过程中,实现数据结构的可视化能够有效的提高对数据结构的直观分析,从而加深理解。在对程序进行调试的过程中,通过数据结构可视化类库能够有效的将编程的效率得以提高。从目前的发展情况来看,已经有了诸多的应用广泛的可视化集成开发环境,其中最为常见的就是Visual C++等,这些可视化的集成开发环境简化了程序界面的设计,对编写界面的程序降低了难度,从而有效的提高了软件的开发效率。
(二)数据结构可视化类库设计的目的
在数据结构可视化类库设计的目的上就是使得JVDSCL能够比较容易的在不同用途中进行应用,这就是要加强其灵活性,JVDSCL能够直接的应用到软件应用程序的开发方面,在开发人员方面也能够通过JVDSCL来进行对新的数据结构进行构造,另外就是加强其可靠性的目的,在这一方面是JVDSCL的最为主要的目的,还有就是面向对象的目的,数据结构是JVDSCL的主要对象,同时算法也是对象,它们保存运行的结果以及提供访问结果的接口。
二、数据结构可视化类库的设计和实现探究
(一)数据结构可视化类库的设计探究。在对数据结构可视化类库进行设计的过程中,要对问题进行综合性的考虑,其中在JVDSCL方面它主要是在Java集合库基础上来进行对原有的数据结构类中进行的扩展,与此同时也在这一过程中添加了相应的较为复杂化的数据结构,最为常见的就是树图。在JVDSCL过程中对可视化数据结构进行构造来实现数据结构的可视化,而这一可视化的数据结构也是在Java集合库当中的原有数据结构类的操作基础上进行的,另外就是增添了一些可视属性以及对可视化的接口进行了提供。在每种数据结构都会有着多种显示的模式,这就需要开发人员进行有机的选择,而在JVDSCL当中,对于每种数据结构会有这多种布局的方法来对其加以布局。
在对数据结构可视化类库进行设计的内容上主要就是基本的可视化接口的设计以及显示模式和布局方法。其中在可视化接口的设计方面,最为主要的接口就是V Collection接口,它不仅是能够提供Collection接口的基本方法,同时也提供可视化接口,在这一内容上主要有 void draw,操作上就是重画指定的数据结构,通过display Mode参数值来决定选用的显示模式,在这一接口中的参数c是表示数据结构所显示的颜色。在显示模式的设计当中,JVDSCL的每种数据结构都会有不相同的显示模式,如下图所表示的两种模式。
另外,在布局的设计上,关于数据结构可视化的关键问题就是图形的布局问题,这对于相关的研究人员对数据结构和算法的效果理解有着非常密切的关系。而在JVDSCL当中的最为主要的就是线性布局的方法以及图布局的方法,针对于每种不同的布局在算法的实现上也是不同的。其中在线性的布局方面,主要是能够适用于队列和线性表的数据结构,在对线性的布局方法上其基本的算法框架就是获取数据的元素个数以及依靠着所显示大小和数据元素个数进行对布局的大小值进行计算。如下图所示。
在图布局的设计方面在算法上是属于二维弹性模型的算法,最为基本的思想就是在二维平面上进行计算。这一方法比较的适合图等数据结构,在JVDSCL当中能够提供的多种算法实现图的可视化,其中有基于遗传模拟退火算法图的三维可视化以及以上所说的二维弹性模拟算法等。可视化技术的主要目的就是来辅助人们增强认知上的能力,而在计算机的可视化技术方面能够将其作为是信息的处理工具,以此来考虑多样化的样本以及变量和联系。
(二)数据结构可视化类库的实现分析。在数据结构的可视化类库的实现方面由于本论文的篇幅有限简要进行讲述,数据结构动态演示系统演示了各种不同算法的数据结构变化的过程,这还需要相关的设计人员在大量的画图操作上得以实现,比如对链表的结点的绘制,对于JVDSCL的应用就不需要自己来编码就能够实现画图的操作,在动态演示系统方面有了很大程度上的层次性提高,在这一过程中设计人员不需对数据结构的布局进行考虑,在JVDSCL自身已经有了布局的功能,只需要根据自身的的需要来进行重写即可实现。另外,在对数据结构中的draw()进行调用也能够有效的实现数据结构的可视化。
三、结语
总而言之,对于数据结构的可视化类库的设计以及实现能够有效的将软件的重用性和扩展性得到提高,在JVDSCL的基础上进行对其加以设计,对软件的开发设计的效率有了明显的提高,在未来我国的软件技术设计水平不断提升的过程中,也定能够在这一领域取得更加优异的设计成果。
参考文献:
[1]杨晓波,陈邦泽.数据结构课程实践教学体系研究[J].实验技术与管理,2013,(08).
[2]冯月华.《数据结构》课程改革下的一堂教学实例――最小生成树[J].陇东学院学报,2014,(03).
[关键词]软件学院 数据结构 项目导向
[作者简介]王峰(1970- ),男,河南汤阴人,华北水利水电学院,副教授,硕士,研究方向为软件工程、数据库。(河南 郑州 450011)魏秀然(1975- ),女,河南郑州人,河南农业大学,实验师,硕士,研究方向为软件工程。(河南 郑州 450002)
[中图分类号]G642.3 [文献标识码]A [文章编号]1004-3985(2013)27-0140-02
河南省自2004年开始启动示范性软件职业技术学院建设工作,到现在共批准郑州大学等43所院校立项建设。软件学院的办学目标,是为快速发展的软件行业培养急需的一线工程师,培养层次一般为两年制专科或四年制第三批本科,专业大多是软件技术、信息管理等软件开发类专业。课程设置充分考虑企业需要,聘请具有丰富软件开发经验的优秀教师和软件企业资深工程师任教,较注重培养学生的实践动手能力。
本文针对软件学院“数据结构”课程教学的现状及课程建设中存在的相关问题进行分析,并结合多年的数据结构课程教学的经验,给出软件学院“数据结构”课程建设的思路。
一、软件学院“数据结构”课程建设中存在的问题
一是课程学习难度大。软件学院学生录取分数较低,基础相对较差,因此理论性课程的教学难度较大。而“数据结构”是一门理论性较强的课程,其概念抽象且算法复杂,导致在教学过程中,理论教学和实践教学不能很好地结合起来, 加上学生的基础薄弱,学习起来难度特别大。
二是学生的前导课程基础不牢。按照教学要求,学生学习数据结构前,必须学习一门程序设计语言,程序设计语言如果掌握不好,就无法理解和学习“数据结构”课程中的诸多算法,直接影响了学生的学习能力和信心。
三是理论和实践联系不够。数据结构理论性强,主要介绍常用数据结构和相关算法。教材中一般只给出了算法的关键代码,不包含相关的宏定义和结构体定义,学生无法直接上机验证算法,学习的积极性不高。而且因为算法的理论性较强,离实际开发项目较远,学生代入感差,理解算法较困难。
四是教师的教学方法单调。目前河南省的软件学院均是由本科院校依托原有的计算机等院系进行建设,大多数教师以前并没有职业教育的经历和实践工作经验,如果照搬本科院系的办学模式和课程建设方式,就会导致学生觉得“吃不消”。
五是实践环节教学时间少。因受总学时限制等,大多数学校“数据结构”实验课课时所占比重偏低,学生实践机会少。
二、软件学院数据结构课程建设目标
与本科高等教育不同,软件学院主要强调工程实践与理论基础并重,以能力培养为核心,着力培养具有高水平实践能力的应用型计算机人才,以满足社会的需求。在课程学习过程上,应当以“必需、够用”的原则,设置课程教学目标。通过近几年的教学实践,笔者认为软件学院的“数据结构”课程应当这样建设:基于职业教育的特点、用人单位的需求及后续课程的需要,设置相应的教学计划;采用现代化的教学手段和教学方法,深入浅出,使学生理解“数据结构”课程的基本知识;要考虑到学生参差不齐的水平,课程教学应当能够满足不同程度学生的需求;简单和常用算法要求学生理解掌握,复杂算法要求应知即可。利用多媒体等各种手段来改善课堂教学的过程,加强课外辅导和实践环节;利用动画、FLASH等手段帮助学生理解和掌握相关算法。
三、改革方式
1.调整教学计划。(1)加强前导课程学习。学习是环环相扣的,数据结构的学习也是一样。如果没有学好数据结构的前导课程,可能就无法较好地学习数据结构。C语言程序设计是数据结构的关键前导课程。“数据结构”课程教材多数选用C语言描述算法,算法中大量使用C语言中的数组、结构体、宏定义、指针和函数体这些编程知识,学生对它们的熟悉掌握程度,直接关系到数据结构课程的教学效果。仅通过一学期的课程学习,学生的程序设计水平还不是很强,这时直接开始复杂算法的学习与设计,难免会有畏难情绪产生。如何来解决这个问题呢? 通过对省内软件学院的调研,提出以下建议:首先,增加C语言程序设计课程的学时,多数学校设置的64学时应增加到80学时,同时实践教学应由原来的16学时增加到30学时;其次,不能照搬本科的教学大纲,应按照“必需、够用”的原则修订教学大纲,同时加强实践能力训练;最后,在“数据结构”这门课开始,可以利用一两次课的时间来复习C 语言的相关知识(主要是指针、链表),并将这些学时纳入到教学进度表中。(2)调整数据结构课程计划。应增加数据结构课程的学时,由原来的64学时增加到80学时,同时实践教学由20学时增加到30学时。目的是放慢讲授速度,多上习题课,给学生留出充分消化吸收的时间。(3)增加C语言实训。建议在开设数据结构的学期初或前一学期末,增加1~2周的C语言实训,通过设计3~4个小型C语言程序来巩固复习C语言的相关知识。
2.教材建设。目前,市场上有大量的数据结构课程教材,大多比较注重理论上的探讨。对于软件学院,需要根据学生实际情况,选择难易程度相当,教学内容分量适中的教材。教材选择上,我们调研了大量的面向职业教育的教材,但发现大多是对清华大学严蔚敏编写的数据结构教材的删减,并没有增加更多的实用性或引导性内容,反而使内容变得不易理解。因此建议软件学院仍选用严蔚敏编写的“数据结构”为主教材,再参照其他一些实用性教材为辅助教材。同时,河南省各软件学院已经开始联合编写适合软件学院教学的“数据结构”教材。
3.分层次教学方式。软件学院的学生入学成绩有差异,理解能力有差异,因此更适合采取分层次教学方式。分层次教学方式的目的是让每个学生都能在学习过程中一步步学到知识,有所收获并赢得自己的成就感,最大程度地调动学生学习的积极性。
对于“数据结构”课程中的一些基本理论和算法,要求所有同学必须掌握,如线性表、排序、查找等,这些内容要放慢讲课节奏,不断重复强调重点,多讲解习题,并充分利用多媒体技术,采取直观形象的教学方式,动态演示算法过程等,加深学生对算法的理解。并尽量对照现实生活中的例子来引入知识点,如排队、插队、压箱底(堆栈)等。
而对一些像找最短路径这样的复杂算法,要求多数同学明白算法目的和基本原理即可。对于个别成绩较好的同学,利用答疑时间、实验时间对他们进行额外辅导,单独布置作业,要求他们充分理解算法,并最好能把算法转化为程序运行,还能根据教师要求对代码进行改进。
4.项目导向。数据结构课程中的多数知识理论性较强,在教学过程中应注意引导分析,还应提供一些有代表性的案例或小项目让学生讨论,如长整数相加问题、迷宫问题、马跳棋盘问题、八皇后问题等,由学生分组讨论完成。讨论前允许学生利用网络等手段搜索相关资料,开始可以把问题简化,逐步加大难度,最终把完整程序提供给学生学习。对学习基础好的学生要求逐步完成程序设计,对学习基础差的学生要求明白思路即可。这样一方面锻炼了学生的动手能力,促进了学生间的交流与团结协作;另一方面确实能将理论与实践相结合,学以致用,从而大大激发学生的学习热情,培养创新思维。
对于课程中的排序和搜索部分,可以设计一个简单的信息管理系统,让学生完成按人名搜索、按电话搜索等项目,并比赛谁的搜索速度快,从而练习相关算法。因为C语言操作数据库比较烦琐,可以使用结构体数组存放学生信息,把相关信息存放在文件中,并由教师把数据的输入输出部分实现,把一些搜索、排序函数留出让学生去实现。这样,学生既能享受到编程的乐趣,又不至于陷于烦琐的数据输入输出处理部分。
5.丰富教学手段。目前,大多数高校的教室里都配备了计算机和投影设备,在“数据结构”的教学过程中,应充分利用多媒体设备和多媒体技术进行教学。
可以将数据结构课程中的大多数算法制作成FLASH动画,FLASH不仅可动动态演示算法执行过程,还可以直接看到每一句代码的单步执行效果,非常有利于学生对算法的掌握。例如,把堆排序的过程用动画来进行演示,就可以很清楚地明白堆排序建堆、输出堆顶、堆调整、完成排序的全过程。
这些FLASH动画可以嵌入到PPT课件中,也可以放到课程网站上供同学们查看。通过这些课件和动画的使用,教学效率和教学效果比传统的教学方法有很明显的提高,对学生的科研开发能力有直接的启发作用,同时,在适当的引导和浓厚的兴趣驱使下,学生会跃跃欲试,进行模仿设计。
除此以外,还应该建立数据结构课程网站,网站内容包括:教学课件、习题与测试、实验项目、在线学习、动画演示、课堂视频、作业上传等。
“数据结构”课程学生难学,教师也难教,但我们并不是束手无策,通过以上各种方法可以大大改善数据结构的教学效果。教学改革不是一蹴而就的,这是一项长期的任务,在以后的教学过程中,我们仍会通过不断探索、不断总结,让学生在掌握知识的基础上,举一反三,能分析问题、解决问题,这样才能较好地体现软件学院培养应用型人才的目标。
[参考文献]
王:确切地说,是把顺序结构部分融入从C到C++的发展过程中,然后用C++描述非顺序结构部分。应该表明,我们不是要否定数据结构作为一门独立课程的意义,可是独立不表示孤立,独立表示这门课程有其特有的、重点研究的内容,孤立是它与其他课程没有联系。而程序语言和数据结构是有内在联系的,我们要研究这种联系,目的是探索程序语言发展的规律,促进程序语言和数据结构的学习。
奚:数据结构重点研究的内容是什么呢?
王:算法分析。对一个问题,仅仅编写一个求解程序还不够,处理大规模的复杂数据,一个程序能够在合理的时间内结束才有意义,这就需要对程序正文所代表的算法进行严格的时间复杂度分析,而这种分析又必须和数据结构一起进行,因为没有不依赖数据结构而设计的算法,也没有不为算法服务的数据结构。
奚:所以数据结构这门课程也可以叫做数据结构和算法分析。
王:是的。我国最早引进的一本数据结构经典教材的名称便是“算法+数据结构=程序”。
奚:数据结构用伪码描述在很长一段时间是占主流的研究方法,您如何看待这种方法呢?
王:要历史地看待这个问题。在二十世纪六十年代,数据结构刚刚成为一门科学的时候,霍尔的“计算机程序设计公理化基础”一文清楚地表明它的研究方法:把注意力集中到程序的构成和分析方面,说得更明确点,就是集中到程序正文所代表的算法的结构上,以便在数学推理的基础上对程序进行严格的分析。[1]而用伪码描述,可以不受程序实现细节的影响,突出重点。再加上当时个人电脑还不普及,描述数据结构的语言还只是主要供教学使用的PASCAL,而非实用的软件开发语言,使数据结构的应用范围受到很大限制,这也从另一个方面促进了这种偏向于学者的研究方法的形成。
奚:您不赞同这种方法吗?
王:不能简单地说赞同还是不赞同,要看研究的重点和学习的主体。《算法+数据结构=程序》一书的作者沃思说过:“尽管对于学者们来说,纯粹描述算法原则及其数学分析可能具有刺激性和挑战性,但这对于实际工程人员似乎是不实在的。因此,我严格遵循这一原则:将程序的最终形式以某一语言表述出来,以便确实能在计算机上执行。”[1] 他认为把程序表示为充分考虑细节的最终形式对工程人员是很重要的,因为程序设计中,错误正是隐藏在细节之中。[1]
奚:用伪码描述和重视程序实现细节是两种对立的方法吗?
王:不应该是。用伪码描述,可以突出数据结构的研究重点――算法分析,重视程序实现细节,可以认识到数据结构对程序语言发展的积极作用。
奚:这两种方法可以统一起来吗?
王:可以。随着计算机的不断普及,数据结构这门课程不仅成为各大学计算机专业本科的主干课程,也成为非计算机类学生和研究生学习计算机的必修课程,这些学生大部分不属于学者群,他们很难把伪码描述的数据结构用程序语言描述出来,并且在计算机上通过。
奚:他们需要用程序语言描述数据结构的方法。
王:是的。
奚:可是如您所说,数据结构最初的描述语言是PASCAL,您为什么选择了C呢?
王:从描述数据结构的作用上说,PASCAL和C是一样的,但是从研究程序语言发展规律上说,从C到C++比从PASCAL到C++更容易讲述,而且C和C++都是软件设计的核心语言,这种研究更有实际价值。
奚:现在不仅有许多用C描述的数据结构教材,而且还有用C++、JAVA描述的,它们都不能满足您的要求吗?
王:应该说,是程序语言和数据结构相互脱节的教学模式不能满足计算机科学发展的要求,教材是为教学服务的。这种教学模式的思想根源是,程序语言仅仅是描述数据结构的工具,而数据结构不依赖任何编程语言的描述,或者说,数据结构既不影响程序语言的发展,也不受程序语言发展的影响。现在,C++的最新发展将运用最广的一些数据结构实现出来,而且成为C++新标准的一部分,使这种教学模式陷入一种困境:如果用C++描述数据结构,就要先学习C++,而学习C++又需要数据结构的知识。你中有我,我中有你。
奚:如何走出这个困境呢?
王:C++新标准为我们具体指出了走出这个困境的道路:首先把C++新标准实现的数据结构内容,例如连续顺序存储结构、链式顺序存储结构、string,归入到C 语言教学中,用C语言实现这些数据结构,完成对C语言的第一次辩证意义上的否定。
奚:如您在本期文章中所讲述的那样。
王:是的。然后发现问题,再完成第二次辩证意义上的否定,把数据结构的C代码转化为C++代码,达到C++的新标准。这是我们下一期要讲述的内容。
奚:这是一个否定之否定的过程。
王:是的。这是C、C++和结构的辩证关系决定的C的必然发展过程:C需要创建结构,但是C语言结构不能像语言内部类型一样使用,这不利于软件重用程度的进一步提高,于是,用户从设计自定义数据类型开始扩展C语言 [2],C++对C的结构体类型作了实质性的扩充 [2]。可以说,C++的许多性能都围绕着一个根本的思想:创建新的数据类型的能力[3]。这就是哲学所说的事物内部的必然的自己的运动。
奚:这就是规律。
王:是的。这两次否定过程构成我们的教材《C/C++与数据结构》(第3版)(上册),可以作为C和C++语言教材。
奚:教材下册的内容呢?
王:用C++描述数据结构非线性部分和算法的时间复杂度分析构成我们的教材《C/C++与数据结构》(第3版)(下册)。这样,数据结构教学就可以在比较坚实的C++语言基础上,相对独立地开展算法研究。
奚:两种方法统一了,既促进C语言的学习,也促进数据结构的学习。
王:是的。从C语言,到数据结构的顺序部分的C描述,再到C++,再到数据结构的非顺序部分的C++描述,
奚:那么就可以说C、C++和数据结构已经成为相互包含的整体了?
王:可以这样说。我们要知道,辩证法所说的相互包含或某物中包含他物,并不是指他物作为一个现成的细小的东西包含在某物中,而是作为某物的一个方面、一种趋势、一种因素包含在某物中。C包含C++,是指C包含着C++作为其必然的发展。C++包含C是因为它是更好的C。
奚:这是否定之否定运动的结果。
王:或者说是辩证运动的结果。
奚:那么如何把握这种辩证运动的实质呢?
王:“两个矛盾方面的共存、斗争以及融合成一个新范畴,就是辩证运动的实质。谁要给自己提出消除坏的方面的任务,就是立即使辩证运动终结”。[4]
奚:就程序设计而言,两个矛盾的方面就是存储和处理。
王:或者说是数据结构和算法,数据结构是发展的存储。纵观短暂的计算机发展史,这两个方面一直保持不变。发展演化的是它们之间的关系,就是所谓的程序设计方法。[5]
奚:算法+数据结构=程序,简明地表示了这种辩证运动的实质。
王:是的。抓住矛盾,否定之否定这个过程就容易看出来了。可以用个比喻,形象的说明这个否定之否定的过程。一颗麦粒种子,在适宜的土壤和气候中发芽,是麦粒的一次否定,在精心培育下,它生长,开花,结果,最后又产生了麦粒,这是否定之否定。这两次否定的结果就不仅是收获更多的麦粒种子,而且种子的品质得到改良。这个过程的每一次否定都推进事物的完善化。
奚:可以把第一颗麦粒种子比作C,把在适宜的土壤和气候中发芽比作数据结构的C描述,把精心培育和收获比作C++。
王:是这样的。没有适宜的土壤和气候,种子不会发芽结果,类似,没有数据结构的C描述过程,就没有C++的新标准。在数据结构的C描述过程中,C语言内部类型代表存储,函数代表处理。要实现数据结构,就需要存储复杂数据,而C语言没有相应的内部类型,这就要求程序员自己在C语言的机制上构造这样的存储。例如,虽然C数组类型提供了数据的连续存储模式,但是没有提供对数组插入、删除等基本处理,而这是存储应该包含的内容,它们是算法或者说处理所依赖的方法。于是程序员通过创建基本函数克服了C的这种局限性,他们由此创建了基本顺序表,结构串等,作为语言类型的补充。不仅如此,C语言没有直接支持链式存储模式的类型,程序员还创建了链表存储结构(由于篇幅的限制,我们没有在文章中一一讲述这方面的内容)。这个过程持续了约40年,可是人们简单地把它归结为传统的设计方法,如《标准C++宝典》一书中所说,“在传统的程序设计方法中,程序员先设计几组数据结构,然后用函数和过程处理这些数据。该方法称为过程化程序设计,这种方法已经沿用了40年”。[6]而实际上,在这个过程中,程序员不仅最大限度地克服了C语言局限性,而且也具体表达了对C语言未来方展的要求,这是改造世界的主体的主观能动性。
奚:程序语言和数据结构脱节的教学模式,把从C到C++的过程给抽象掉了。
王:是的,也可以说是把人的主观能动性给抽象掉了,把改造世界的主体给抽象掉了,把认识的主体也给抽象掉了,因为人首先是改造世界的主体,然后才是认识世界的主体。
奚:那就是说把学习的主动性和积极性也给抽象掉了。
王:是的。主动性和积极性不是固有的抽象物,而是产生于包含主体的改造世界的实践活动。
奚:这个活动不存在了,主动性和积极性也就不存在了。
王:C++迫使我们走上辩证唯物主义道路。这样我们就会少走很多弯路。
参考文献
[1] 沃思著.曹德和,刘椿年译. 算法+数据=结构程序[M]. 北京: 科学出版社,1987.1,5.
[2] AI Stevens,Clayton Walnum著.林丽闵,别红霞译.标准C++宝典.北京:电子工业出版社,2001.245.
[3] Bruce Eckel著.刘宗田,邢大红,孙慧杰译.C++编程思想[M].北京:机械工业出版社,2001.前言.
[4] 马克思恩格斯全集(第4卷). 北京: 人民出版社,1960. 145-146.