王锦程 宋述燕
摘要:面向对象程序设计与各门专业课程,如“计算机基础”、“操作系统”、“数据结构”、“算法设计”、“编译原理”等都是融会贯通、密切相关的。因此在程序设计课程的教学环节中,逐步渗透各专业课的基本知识,运用适当而生动的教学案例,将专业知识融入到程序设计中,将有助于学生从更深层次上理解相关原理和概念,提高学习的信心和兴趣,建立程序设计的思维方式。本文从程序设计的过程出发,通过实例教学的方式论证了这种教学方法。
关键词:高级程序设计;专业课程;教学
中图分类号:G642 文献标识码:B
“高级程序设计”是一门重要的计算机专业课程,目的是通过对面向对象程序设计思想的把握,培养学生掌握用计算机分析问题、解决问题的思维方式。但是由于该课程内容非常抽象,且实践性特别强,对于初学者来说难度较大。同时由于课时限制,Console控制台环境下的简单实例难以体现出面向对象的优势,基于语法的讲解让人感到乏味,许多学生觉得程序设计本身枯燥、难懂,高深莫测。以至于课程结束时,大部分同学对语法实现没有问题,但面对实际问题却不知道如何下手。如何在短时间内建立学生的兴趣,培养解决实际问题的能力,是工科教学中永恒的话题。
计算机的课程体系本身是一个整体,所有课程的结合都是为了理解并充分利用计算机这一现代化工具。在教学中,将各门课程分开是为了简化,但在理解时仍应将相关概念、应用领域相结合。在教学中我们发现,学生们刚开始接触程序设计时,对变量定义、指针分配、数组访问等的理解就比较困难。他们知道用变量来存取数据,但很少关心这个数据究竟存放在内存的什么地方,为什么指针必须先初始化才能使用。这时,不妨给学生讲授一些内存访问的基本知识,让他们建立起变量、指针与地址的对应关系。现在的问题是,教师对于程序设计多是从语法上加以讲解,对于程序的运行效率、应用领域、编程风格极少涉及,许多概念都是在后续专业课的学习后才逐步理解,这给程序设计的初学者带来了很大的障碍。如果在教学中以面向对象的应用为基础,以程序设计为主线,在重点介绍程序设计方法的同时将各门专业课知识融入其中,将会使学生从程序设计应用的视角来理解这些专业概念,从而在解决实际问题时灵活应用;消除对程序设计课程的枯燥感,达到事半功倍的效果。
1 “高级程序设计”的课程定位
随着电子技术和芯片设计工艺的发展,计算机硬件一直按照摩尔定律发展,每18个月翻一番,处理速度越来越快,价格成本越来越低,从价值不菲、主要用于科学研究的大型计算机到现在人们日常工作生活中随处可见的个人PC。程序设计的目的就是为了充分利用这一现代化的工具,可靠、高效地完成任务,因此程序设计其实是一种人机交互的方式,简言之,就是用计算机能够“理解”的语言,告诉它去执行某项任务。当然,这个“理解”需要编译器的支持,将高级程序设计的语法描述进行编译、连接等,变成计算机硬件能够执行的机器码,具体编译的细节在编译原理课程中有重点的介绍。
程序设计是一种语言表达,目的是为了人与计算机之间的沟通。因此程序设计通常有两方面的特点:对于程序设计者,希望能够精练、高效地说明问题;对于计算机,希望语言描述准确,不会出现二义性。通过程序设计解决一个具体问题时,大致需要经过下列步骤:首先从具体问题中抽象出一个适当的数学模型,然后设计出解此数学模型的算法(Algorithm),该算法与数据结构密切相关,最后编写程序、进行测试、调整优化直至得到最终解答。寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间的关系,然后用数学的语言加以描述。
另外,用程序设计解决问题时,需要充分、高效地利用现有的计算机资源。对于汇编语言程序设计来说,通常直接编写底层的硬件驱动及管理程序访问资源;对于C+ +面向对象的程序设计来说,通常立足于计算机硬件、操作系统的基础之上,在编写用户应用程序,如常用的各类工具软件、Office系列等时,通常借助操作系统提供的API(application programming interface)函数来访问资源,如用Create Window()来创建一个窗口,用getchar()来获取键盘上的一个按键值等。操作系统的作用是管理全部的硬件资源、软件资源及数据资源,并提供相关的API函数为程序设计者调用。
2操作系统:计算机资源的管家
计算机可以管理哪些资源呢?操作系统告诉我们,总共要管理4种资源:(1)CPU资源:进程管理,处理机调度;(2)内存资源:存储管理;(3)I/O接口资源:外部设备管理;(4)文件资源:文件管理。如果需要访问计算机资源,通常利用操作系统所提供的丰富的API函数来实现,而无需写驱动程序直接对资源进行访问,应用程序对操作系统的函数调用过程如图1 所示。
箭头①表示操作系统能够管理系统资源,控制输入输出设备的工作,如文件存取、输出显示、声卡发声等;箭头②表示操作系统能够感知输入设备的状态变化,如鼠标移动、键盘按下,并且能够感知鼠标移动的方向,具体按下的键值。设计应用程序需要利用输入输出设备或其他计算机资源时,并不是由应用程序直接访问,而是借助操作系统。箭头③表示程序设计时可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要通过程序设计告知操作系统。箭头④表示操作系统能够将输入设备或其他资源的变化传递给应用程序。如用户在某个程序活动时按了一下键盘,操作系统能够马上感知这一事件,但并不决定如何作出反应,而是将这一事件转交给应用程序,由应用程序决定执行何种反应。
理解了操作系统和应用程序的关系后,对于面向对象程序设计中如何调用现有计算机资源或创建新的应用,就有了十分明晰的思路。
3算法:程序设计的灵魂
在程序设计中,运行效率通常是一个决定性的指标,而程序运行是否高效,很大程度上取决于能否编写出高效的算法。比如在游戏世界中,一只妖怪盯上了目标,并且它足够聪明,会选择一条最短路径向目标杀过去。为什么这只妖怪那么聪明?这就是寻找最短路径算法的魔力。
算法是指完成某个特定任务所需要的具体步骤和方法。在程序设计领域,算法表现为一系列解决问题的清晰指令,对一定规范的输入,能够在有限时间内获得所要求的输出,中国古代的珠算口决及其执行规则就是算法的雏形。算法是计算机处理信息的本质,因为程序就是用算法告诉计算机按照确切的步骤执行指定的任务,如计算职工的薪水或打印学生的成绩单等。程序设计中的算法应用通常分成三个阶段:分析问题、设计算法和实现算法。
算法设计的基本方法有递推法、递归法、穷举法、分治法、迭代法等。目前被设计出来而且应用广泛的算法有很多,如演化算法、蚁群算法、贪婪算法、遗传算法和一些常用的排序算法等,每一种算法都对应着多种不同的应用。如在同一个动画页面中,近处的对象会挡住远处的对象,可以通过对不同的对象进行坐标排序,然后按由远到近的顺序排放而实现。常用的排序算法有四种:选择排序、插入排序、冒泡排序和快速排序。下面是N个元素的冒泡算法C++程序实现。
template < class T >
void bub_sort( T a[], int n )
{
int i,j,last;
i = n - 1;
while( i > 0 )
{
last = 0;
for( j = 0; j < i; j++ )
{
if( a[j+1] < a[j] )
{
T temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
last = j;
}
}
i = last;
}
}
算法中将每个元素想象成一个泡泡,从最底部的元素开始,将各相邻的元素进行比较,若下面的元素大于上面的元素时,则把它们的值进行交换,即较大的元素“往上冒泡”。如此循环N-1次,即可实现从大到小的排序。
当然,算法只是解决某类问题的步骤或方法,同一个算法可用不同的程序设计语言实现,而且能够根据不同的应用目标加以约束和优化。算法设计与数据结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率,在面向对象的程序设计中,二者是一个整体,不可分割。
4数据结构:数据资源的管家
数据结构是计算机存储、组织数据的方式。讨论数据结构必须同时讨论在该类数据上执行的算法才有意义,通常情况下,精心选择的数据结构可以带来最优效率的算法。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。在程序设计中,根据不同的应用需要,可以选择不同的数据结构。
如果有一堆相似数据需要管理,通常会选择线性表。如单位人员的记录、游戏世界里的道具包。线性表一般分为数组与链表两类。数组里的元素以连续的内存空间存放,因此可以用内存地址检索到对应的数据元素,访问元素很方便。但如果要进行插入/删除数据元素,就要做一些内存移动,效率比较低。而链表的数据元素存放在任意的物理内存位置,相邻的元素以指针作为“链扣”串连起来,可以更高效的插入/删除数据元素。
队列和堆栈可能是使用频率最高的数据结构。队列是一种“先进先出(first-in first-out, FIFO)”的数据结构。就好像是在银行里排队,排在前面的先服务。因此顺序执行的任务可以从一端依次压进任务队列里,要做任务时依次从另一端取出,哪个任务先接到就先做哪个任务。也许有些任务报酬更高,如果最求报酬最大化,就需要使用优先级队列。在插入元素时,优先级高的元素插入队列前面,把任务的报酬设成优先级数据就可以了。
堆栈是一种“先进后出”的数据结构。就好像是叠盘子,叠在最上面的盘子最先拿来使用。比如Word中的“撤消”按钮,使用户在编辑误操作时不必惊慌,因为“撤消”功能可以撤消之前的操作。只要把用户的操作压入栈里,撤消操作就是从栈中弹出最近发生的操作,可以很方便地实现这个功能。
此外,树型结构和图形结构也是比较常用的、非线性的数据结构。树的实现与应用比线性数据结构复杂,但其应用很广泛,如Windows操作系统的文件管理。图形结构可以用于地图数据的管理等。
5数据库:智能化的大仓库
在程序设计当中,具有各种数据结构的变量或对象是不可缺少的元素。如果数据量比较小,直接使用内存变量或文件存储就可以了,但在当前信息化的环境中,数据量通常是海量的,为了加快对数据的操作与访问,同时保护数据的安全性,必须借助专门的工具,这就是数据库。严格地说,数据库是按照数据结构组织、存储和管理数据的仓库。
例如,在企事业单位的日常管理工作中,常常要把本单位职工的基本情况(职工号、姓名、年龄、性别、籍贯、工资、简历等)存放在表中,这张表就是数据库的一个基本元素,可以通过不同的“视角”加以查看。如果建立了包含相关信息的多个表,我们就拥有了一个“数据仓库”。在应用程序的设计中,可以模拟现实世界,为不同的人员划分相应的权限,使他们可以根据需要随时在权限范围内处理数据,如查询某职工的基本情况,添加新进的职工信息等。此外,在财务管理、生产管理中、仓库管理时,也可以建立众多的数据库,以实现财务、仓库、生产的自动化管理。
6结语
计算机的课程体系是实现完整应用的一个整体,独立的程序设计教学会使学生对许多概念的理解发生混淆,造成实际应用的偏差。本文论述了将相关的专业课程概念融入C++程序设计的教学过程中,增强学生对程序设计概念的理解,并根据需要灵活应用。当然,面向对象的程序设计也是一门实践性很强的课程,学生对所有概念的理解及应用必须通过上机操作,在程序设计中不断磨练才能提高。
参考文献:
[1] 刘建华. 计算机语言类课程教学模式初探[J]. 高教论坛,2005,2(1):91-93.
[2] 郑莉,董渊,张瑞丰. C++语言程序设计[M]. 北京:清华大学出版社,2005.
[3] 陈渝译. 操作系统:精髓与设计原理[M]. 北京:电子工业出版社,2006.
[4] 王晓东. 算法设计与分析[M]. 北京:清华大学出版社,2008.
[5] 宁正元,王秀丽. 算法与数据结构[M]. 北京:清华大学出版社,2006.
[6] 何玉洁. 数据库管理与编程技术[M]. 北京:清华大学出版社,2006.