“数据结构”虚拟课堂的设计与实现 肖正兴 徐人凤 赵志亮摘要:“数据结构”是软件专业课程中难教、难学的一门课程,本文针对高职学生特点,设计实现了用于辅助教学的虚拟课堂,重点探讨了Authorware动画的实现、Agent的加入和Java中的多线程技术关键词:数据结构;虚拟课堂;Agent;多线程:G642:B1引言“数据结构”课程是计算机学科非常重要的专业理论课程这在ACM多次提出的计算机课程建议报告书中得到了充分体现通过本课程的学习,使学生掌握如何把现实世界的客观问题变换为在计算机内的表示形式;学会组织数据、选择算法、养成良好的程序设计风格;提高逻辑思维和抽象思维的能力,为以后有关的计算机课程的学习和从事软件开发奠定坚实的基础不同层次的院校,根据要求不同,在“数据结构”课程教学的侧重点上有所分别,针对高职学生,主要是培养学生算法的应用能力,所以在教学内容选择上,应以“理论够用,广而不深”为原则;教学方法的选择上,注重培养学生对理论成果的应用能力;教学手段上尽可能生动形象,帮助学生理解掌握概念理论为了达到上述要求,仅仅通过课堂上的传统方式讲解数据结构,教学上存在难度,学生也容易失去兴趣。
多媒体课件是计算机多媒体技术在教育领域中应用的典型范例,本文针对高职学生的特点,尝试使用多媒体技术构建一个学生能够自主学习的虚拟课堂,帮助学习、理解和巩固这些算法2系统设计2.1虚拟课堂设计思想虚拟课堂主要由自主学习环境和算法交互环境两部分组成,其中自主学习环境主要是让学生进行算法的自学习,以讲解和演示为主;算法交互环境提供学生动态产生数据,学习和验证算法,交互性要求高,所以采用Java语言实现如图1所示2.1.1自主学习环境该环境对用户的交互性要求不高,所以针对这部分内容,系统使用Authorware软件进行制作,在算法的教学过程中,采用“实例引入→动画演示→实战练兵”的教学模式,由浅入深,并由特殊到一般的方式辅助学生学习算法本质,并利用Microsoft Agent技术构建的Merlin老师,在教学过程中指导学生进行算法的学习每个算法的教学按照上述模式进行自主学习如图2所示实例引入”模块主要通过一个实例演示算法的操作过程;并在演示过程中,讲解算法的主要思想;“算法思想”通过对“实例引入”的学习,通过归纳、总结的方式表达出该算法的思想;“动画演示”模块通过动画技术和程序可视化相结合技术,将宏观的运行和微观的算法执行相对照,理解算法程序的代码;“实战练兵”模块通过互动的方式测试前面阶段学习的基本算法知识;“交互环境”模块主要是算法的运行的可视化环境,在该环境下,学生能够利用该工具互动加强算法的理解,并能检测自己对算法的掌握程度。
在以上模块中“课程导入”、“实例引入”、“算法思想”、“动画演示”、“实战练兵”几个模块都是采用递进的方式组织教学内容,以讲授为主,主要以声音、动画等形式展现教学内容,同学可以按照上面的组织过程进行学习,也可以自己根据自己的进度,选择相应的模块进行学习2.1.2算法交互环境在该环境中,采用程序可视化和动画动态演示技术相结合的手段来演示算法的运行,对于算法本质的理解有积极作用,辅助教师进行课堂的算法教学,并提供测试环境,并能根据测试的数据,产生正确演示效果1) 二叉树前、中、后序遍历演示界面在上面环境中,遍历演示主要由三块组成,画板区、代码显示区和演示提示区其中画板区显示遍历的动态效果,代码显示区显示代码的同步执行情况,演示提示区显示遍历过程中关键性的提示信息用户可以随机建立一个二叉树,并能调节演示的速度,如图3所示2) 二叉树前、中、后序遍历演测试界面通过点击1号按钮开始进行测试,点击初始数据按钮,能够在手动建树区域进行二叉树的建立,在答案区域,选择前、中或后序遍历中的一种,然后在编辑框内输入响应遍历的结果,结点与结点间用英文状态下的逗号隔开,单击检验数据按钮,检验输入的答案是否正确,并给予相应的提示,单击正确数据按钮,程序进入演示状态。
2.2系统功能和特点2.2.1交互性强的人机交互界面系统的特点是:较强的交互能力、动态的算法演示、形象的图形设计、充分应用动画和色彩体现算法的细节、运用Microsoft Agent充当课件的虚拟教师,贯彻教学策略,增加学习的兴趣,突出教学内容的重点2.2.2程序可视化和动画动态演示技术相结合使教师脱离黑板和粉笔,采用程序可视化和动画动态演示技术相结合的手段来演示算法的执行过程,对于算法本质的理解有积极作用,辅助教师进行课堂的算法教学,并能为学生自主学习算法提供良好的支撑环境,从而实现用形象的图形界面为学生搭起通向掌握抽象思维方法的桥梁2.2.3多样的测试环境按照内容,分别提供有“实战练兵”模块,对数据结构中的已知算法进行测试;“交互环境”中,提供有测试功能,通过测试检验学生对算法思想的理解,并能在测试的过程中用利用程序可视化与动画动态演示技术结合,显示当前测试过程中的执行过程,进一步巩固学生对算法的理解3系统实现关键技术3.1Authorware中动画的实现在Authorware中,组合运用【显示】图标、【等待】图标、【擦除】图标和【判定】图标,可以设计出多种动画效果下面以课件“冒泡排序→动画演示”部分为例,简单介绍Authorware中的动画设计与实现。
图4、图5形象地展示了程序执行过程动画设计:屏幕右侧模拟演示程序单步执行过程(图5),红色线框表示当前正在执行的语句当遇到判断语句时,屏幕右侧出现红色箭头提示,指示当前正在进行比较的数据;比较结束,如果需要交换,则使用动画展示两个数的位置发生交换动画程序部分流程如图6所示3.2Authorware中Agent的添加为了提高程序易用性、增强软件界面效果,使软件具备人性化的交互功能,该软件在课件中引入了“微软助手(Microsoft Agent)”——魔法师默林(Merlin)Microsoft Agent是一种基于微软视窗平台的可编程的即时交互性动画角色,在Authorware中添加Agent的过程如下:3.2.1检测课件目标机器上是否安装了Agent控件在流程线上添加【计算】设计图标,并在其中输入如下代码:--定义变量IDAgent记录agent控件的ClassIDIDAgent:="{D45FD31B-5C6E-11D1-9EC1-00C04FD7081F}"--根据控件的ClassID检测是否已经安装Agent控件,如果未安装,则运行msagent.exe进行安装if ActiveXControlQuery(IDAgent)=0 thenJumpOutReturn("msagent.exe")end if3.2.2导入Agent在Authorware中执行【Insert】→【Control】→ 【ActiveX】菜单命令,在【Select ActiveX Control】窗口中选择Microsoft Agent Control 2.0 控件,将Agent控件插入到程序流程之中。
该控件具有大量的属性和方法,通常需要使用控件的“CallString”方法才能进行访问3.2.3Merlin初始化在流程线上添加【计算】设计图标,把它命名为“Merlin初始化”,在代码窗口中输入如下代码:-- 启用Agent控件与Microsoft Agent Server的连接SetSpriteProperty(@"char1", #Connected, 1)-- 加载角色agentchar1:="merlin"agentfile1:=FileLocation^"\chars\merlin.acs"String:="Characters.Load("^agentchar1^","^agentfile1^")"CallSprite(@"char1", #CallString, String)-- 定位角色String:="Characters.Character("^agentchar1^").MoveTo("^WindowLeft+60^","^WindowTop+80^")"CallSprite(@"char1", #CallString, String)-- 显示角色String:="Characters("^agentchar1^").Show"CallSprite(@"char1", #CallString, String)-- 移动角色String:="Characters.Character("^agentchar1^").MoveTo("^WindowLeft+60^","^WindowTop+300^")"CallSprite(@"char1", #CallString, String)-- 禁止错误提示信息SetSpriteProperty(@"char1", #RaiseRequestErrors, 0)3.2.4Agent语音输出控制大部分Agent角色都可以利用基于SAPI4.0的TTS (Text To Speech)引擎产生语音输出(事先需下载安装SAPI及兼容的TTS引擎)。
Agent角色控件的Speak方法可以通过两种方式产生语音输出:利用文本或者播放事先录制的声音文件由于没有找到适用的汉语发音的TTS引擎,我们只好借助事先录制好的wav文件进行语音输出实现过程如下:在流程线上添加【计算】设计图标,把它命名为“说开场白”,在代码窗口中输入如下代码:String:="Characters.Character("^agentchar1^").Play("^"wave"^")"CallSprite(@"char1", #CallString, String)-- 调用Speak方法,播放事先录制好的“main1.wav”文件String:="Characters.Character("^agentchar1^").Speak("^"欢迎进入奇妙的算法世界!"^","^"main1.wav"^")"CallSprite(@"char1", #CallString, String)3.2.5程序主流程图(图7)3.3Java中多线程技术Java中多线程机制,多个线程不仅可以单独工作,而且可以相互协作,共同完成一个任务,因此多个线程之间的通信成为多线程共同协作的关键。
Java多线程的主要分成三种通信方式:管道类进行通信、标志变量进行通信、wait(),notify()通信在上面三种通信方式中,管道类实现的通信使用起来非常方便,但他并不是Java中的最基本的通信方式,而是在第二、三种通信机制上实现的,而第二种通信方式由于要不断地循环测试标志变量的值、效率低下第三种方式由于采用了“等待——唤醒”策略,提高了程序运行的效率比较上述三种通信方式,在实现过程中,多线程之间的通信一般采用第三种通信方式,使得在演示过程中,不仅没有影响用户界面的响应,而且保证了多线程运行时效率实现过程中使用三个线程:选边线程、画边线程和提示信息线程图8为此三线程之间的交互过程:其中选边线程为主动线程,画边线程和提示信息线程受控于选边线程,选边线程选出的边为共享边,选边线程选出边后,唤醒画边线程和提示信息线程,当两个线程一次运行完后,进入睡眠状态,同时唤醒选边线程继续选边,这个过程一直往复,直到选完所有的边如图8所示4展望“数据结构”虚拟课堂可以在很大程度上帮助教师进行抽象算法教学,同时帮助学生进行课后自学提供辅助工具该课题是一个跨。