以“任务驱动”的《面向对象程序设计》教学案例设计
2016-09-20翁佩纯马慧张远海
翁佩纯,马慧,张远海
(1.电子科技大学中山学院,中山 528400;2.中山火炬职业技术学院,中山 528400)
以“任务驱动”的《面向对象程序设计》教学案例设计
翁佩纯1,马慧1,张远海2
(1.电子科技大学中山学院,中山 528400;2.中山火炬职业技术学院,中山 528400)
《面向对象程序设计》是一门实践性很强的课程,教学案例将直接影响其教学效果。针对目前教学案例存在的问题进行分析总结,提出以“任务驱动”的教学案例设计方法。通过实例讲述从案例选题、内容设计、任务分解等方面,将面向对象设计的知识点融入到一个案例中,并以任务驱动学生进行团队协作开发,提供一种新的教学思路。
任务驱动;案例设计;面向对象程序设计
0 引言
《面向对象程序设计》课程是计算机科学与技术专业一门重要的且实践性很强的专业基础课,其教学案例的设计将直接影响本课程的教学质量。由于课程的学习对象一般是大一的学生,多数学生属于第一次接触计算机编程,加上面向对象程序设计本身的抽象性和复杂性,使很多学生望而却步。任务驱动教学法,是指学生在教师的帮助下,紧紧围绕一个共同的任务活动中心,在强烈的问题动机的驱动下,通过对学习资源的积极主动应用,进行自主探索和互动协作的学习,并在完成既定任务的同时,引导学生产生一种学习实践活动[1]。本文将以“任务驱动式”来进行教学案例的设计,研究出一套符合《面向对象程序设计》课程的教学案例。
1 目前教学案例设计存在的问题
目前《面向对象程序设计》课程的教学案例,普通存在以下几个问题:
(1)教学案例多数以知识点为目标进行设计,比较单一,缺乏案例之间的连贯性。
(2)以标准化习题和简单的编程题为主,缺少对知识综合运用能力的训练和考核,这种脱离实际应用的案例最终导致学生失去学习兴趣。
(3)从教学效果上来看,学生基本程序设计能力差,遇到实际应用问题毫无头绪,无法分析和解决实际问题。
2 教学案例设计原则
在教学案例的设计上,以“任务驱动式”来进行设计主要有以下几个原则:
(1)教学案例的设计应该逐步提高、前后连贯,要能紧密联系实际,让学生在实践中巩固课堂知识的同时,进一步增强学生独立分析问题、解决问题的能力。
(2)由教师对任务进行分解,完成示范性教学,让学生分组进行程序开发,同时学习如何按“分而治之”策略解决一个具有相当规模与复杂性的实际问题。
(3)鼓励学生在完成任务的基础上进行一定程度的创新,以任务为驱动,但不是以任务为终结,从而培养学生的创新能力。
3 教学案例设计思路
3.1 案例选题
首先案例的选题应具有一定挑战性,同时应兼有趣味性。在实施任务驱动的过程中,“以任务为主线、教师为主导、学生为主体”的教学模式,每成功完成一个子任务都能给学生带来极大的成就感,激发学生实践的兴趣。例如,模拟银行柜台存取款程序、模拟图书馆借还书程序等。
3.2 内容设计
案例的内容应注重前后知识运用的综合性和连贯性,后续案例以前续案例为基础。例如,在讲授类与对象的知识时,设计的案例包含如何类的定义和实现,成员函数的调用等内容,后续的内容如对象数组、类的继承与派生、文件读写等知识要点都可以不断的融入到前面案例中。这样一方面可以复习前面的知识,一方面可以培养学生系统化意识,以帮助学生建立知识体系。
3.3 任务分解
对于难度和规模较大的案例,为了避免学生突然面对这类实验时毫无头绪,须将其分解为一个个学生可把握复杂性的任务,再为每一任务提供足够的指南与参考资源,每一任务同时也是可交付、可评价的。任务分解可使学生同时学习如何按“分而治之”策略解决一个具有相当规模与复杂性的实际问题。
3.4 兼顾实践创新
以任务驱动进行教学时,可提供一些进一步完善开发的意见,作为选做的进阶任务。通过加分等奖励方式,鼓励动手能力较好的学生去尝试。同时,鼓励学生在此基础上自行创新,收集这些素材作为以丰富教学资源库。
4 具体案例设计
下面将以一个具体的教学案例来说明以 “任务驱动”的教学案例设计思路和方法。
4.1 案例描述
在讲授“类与对象”这一概念时,对于初次接触“面向对象”这个抽象的概念,多数学生一时难以接受。因此在设计教学案例时应遵从“由易入难,逐步推进”的设计原则,把各个知识点包含在案例的讲授当中[2]。例如,如何定义类、使用对象数组、动态申请内存、拷贝构造函数等。这个案例将设计一个简易图书馆借阅管理系统,把抽象的概念用具体的实例展示给学生,使学生能融会贯通。
下面的案例将以面向对象的方法设计一个简易图书馆借阅管理系统,实现查找图书、登录系统、借书、还书等功能,按需求设计并实现Book类、Reader类、Library类。
4.2 任务分解
这个题目对于刚刚接触面向对象程序设计的学生来说,会觉得任务超出负荷且毫无头绪。因此下面将进行任务分解,使每一个任务做到学生能接受并相信此任务的难度是在自己的实践能力之内。
(1)Book类定义与实现
【任务1-1】编写一个Book类,用于描述图书,其数据成员(私有)如表1所示。
表1 Book类数据成员表
通过组织学生分小组讨论该题目,让学生进行自主学习,主要包含以下几个知识点:
(1)类的定义
(2)数据成员的定义
(3)构造函数的定义
(4)成员函数的定义
接下来进行示范性教学,可由教师给出类的定义头文件”Book.h”,由学生来完成类的实现。这样不仅给学生主动思考自主学习的机会,而且有助于培养学生良好的编程风格。以下是参考代码。
class Book {
private:
string name;string ISBN;string writer;
string public_name;double price;int number;
public:
Book(string myname="Unknown",string myISBN="Unknown",string mywriter="Unknown",string mypub="Unknown",double myprice=0.0,int mynum=0);
void setData(string myname,string myISBN,string mywriter,string mypub,double myprice,int mynum);
void print();
string getName();
string getWriter();
string getISBN();
int getNumber();
void borrow();
void restore();
};
【课堂讨论】完成以上Book类的实现之后,组织学生进行课堂讨论:
①图书馆中有多本书,如何表示和存储?
②目前暂未实现Reader读者类,如何测试借还书?
在经过充分讨论之后,给出下一个任务。
【任务1-2】本任务的设计目的是将Book类的定义与实现设计成为一个可交付的题目,从而让学生收获一个子任务的成就感。
·在main函数中,定义一个Book类的对象数组,包含5本书,参考代码如下。
Book arrBooks[5]={
Book("Java编程思想","埃克尔","机械工业出版社",78.0,3,"9787111213826"),
Book("C++程序设计","陈可","电子工业出版社",45.6,2,"9787145513853"),
Book("程序设计基础","张欣易","北京大学出版社",35.0,3,"9784380850350"),
Book("Linux入门","李旺","机械工业出版社",56.7,1,"9784254465775"),
Book("Unix编程大全","程查斯","清华大学出版社",128.5,2,"9784343465729")};
·设计一个系统主菜单,要求有以下选项,如图1所示。
·编程模拟10次借还书的操作,要求所操作的图书序号是随机的,借还书的操作是等概率的。参考代码如下。
srand((unsigned)time(0)); //#include<ctime>
for(int i=0;i<10;i++)
{
int j=rand()%2;
if(j==0)
{
//模拟借书操作
int index=rand()%5;//总共5本书,模拟其下标
arrBooks[index].borrow();
}
else{
模拟还书操作;}
}
图1 任务1的系统主菜单
(2)Reader类定义与实现
【任务2-1】编写一个Reader类,用于描述读者,其数据成员(私有)如表3所示。
表2 Reader类数据成员表
【课堂讨论】引导学生对下面几个方面进行课堂讨论并进行程序开发:
①缺省构造函数的作用;
②析构函数的作用;
③成员函数borrow算法描述如下:
void borrow(Book&b)
{
如果已借书本数未达到max上限,则
b.borrow();//调用Book类的borrow函数,使该书书目减1
//把书本b的各项信息复制到数组中的第number个元素中
arrBooks[number++]=b;
}
④成员函数restore算法描述如下:
void restore(Book&b);
{
首先查找书本b在books数组中的下标index
如果找到这本书,则把它从arrBooks数组中删除
b.restore();//调用Book类的restore函数,使该书书目加1
number--;
}
【任务2-2】本任务的设计目的是融合任务1和任务2,设计成为一个可交付的题目,从而让学生完成读者借还书操作的功能。
①定义Reader类的对象数组,参考代码如下。
Reader arrReaders[2]={Reader("陈小艺","150302","计算机",10),Reader("吴海","150204","人文社科",5)};
②设计一个系统主菜单,要求有如图2所示的选项。
图2 任务2的系统主菜单
(3)借书和还书时,首先要输入该读者的借书证号登录系统。设计子菜单如图3所示。
【问题反馈】学生经过编程运行之后,发现了如下问题:
①初始化Reader对象数组后,每个对象所包含的arrBooks指针是错误指针。
图3 登录系统后的菜单
②借还书成功后图书库存数量未发生变化。
根据所反馈的问题,教师进行重点知识点讲解,问题①讲解拷贝构造函数的知识点,问题②讲解函数的参数为对象引用的知识点,贯彻“示范-模仿-实践”的教学方式。
(3)Library类定义与实现
通过上述任务1和任务2的练习,学生基本能掌握类的定义格式,构造函数的含义与作用,对象数组,动态对象数组的申请与释放等,此时在原基础上提出新的任务要求,学生只需将已完成的项目略加整合和修改即可,较容易被接受。
【任务3】编写一个Library类,用于描述图书馆,其数据成员(私有)包含有:
①Book*arrBooks;//Book对象数组,包含所有图书馆的书
②int book_num; //目前已有书目数
③Reader*arrReaders; //Reader对象数组,包含所有读者
④int reader_num;//目前已有读者数
要求实现图书管理函数:查看所有图书,查找图书功能;实现读者功能函数:登录系统,借书,还书功能等。
【任务进阶】丰富Library类的功能,增加管理员用例,以区分普通读者。管理员可对图书和读者进行增删改操作。
这个进阶任务虽然看似简单,却包含了许多知识点,如管理员身份的表示,登录后的菜单调用等。可以组织学生以2~3人的团队形式进行讨论和课后开发,再由团队进行演示。从教学效果来看,不少学生能完成以上进阶任务,其中有不少学生还考虑到字体颜色、背景颜色等效果,锻炼了学生的创新能力。
经过以上任务分解,学生基本可以清楚整个图书馆借阅管理系统流程和架构,熟悉面向对象程序设计思想,并在每一个任务中得到了锻炼。在任务驱动的过程中,教师应发挥指导作用,引导学生将所接触到的知识自我消化,融合新旧知识,探索知识创新应用,从而超过课本的局限,应用到解决实际问题上。
5 结语
以任务驱动的教学案例,通过课堂讨论、团队协作、模仿并创新等方式,让学生在实践中消化和理解知识难点。连续的几届教学实践证明,采用“以任务驱动的案例式教学模式”,有利于培养学生分析问题、解决问题的能力,进一步提高学生的协作能力和创新能力。
[1]张松敏,王国强.案例—任务驱动模式的计算机程序语言教学探究[J].计算机教育,2010(2).
[2]杨瑞龙,朱征宇,朱庆生.引入软件设计模式的面向对象程序设计教学方法[J].计算机教育,2012(10).
Design of Task-Driven Teaching Cases in OOP Course
WENG Pei-chun1,MA Hui1,ZHANG Yuan-hai2
(1.University of Electronic Science and Technology of China,Zhongshan Institute,Zhongshan 528400;2.Zhongshan Torch Polytechnic,Zhongshan 528400)
OOP course is a very practical course.Teaching cases will directly affect its teaching effect.Analyzes and summarizes the currently problems existing in the teaching cases,proposed task-driven teaching cases.Gives an example to show how to put OOP knowledge points into a teaching case from the case topics,content and decomposition.
Task-Driven;Teaching Case Design;OOP
电子科技大学中山学院教学团队项目(No.JXTD201502)、“十二五”规划2013年青年课题子课题项目(No.W_QNZ201401)
1007-1423(2016)21-0050-05
10.3969/j.issn.1007-1423.2016.21.011
翁佩纯(1982-),女,广东潮安人,硕士,讲师,研究方向为网络计算、移动应用开发
马慧(1981-),女,广东中山人,博士,副教授,研究方向为数据库理论、图数据查询
张远海(1978-),男,黑龙江牡丹江人,本科,工程师,研究方向为通信技术
2016-05-17
2016-07-20