C 语言课教学中软件工程思想的熏陶

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:piaoye2008
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:在计算机相关专业的C 语言课教学中渗透软件工程的思想,不但有助于本门课程的教学而且为后期软件工程课程的教学打下良好的基础。该文结合精心设计的案例进行说明,探讨提高学生编程能力的教学思路,在教学实践中取得良好效果。
  关键词:C ;软件工程;教学实践
  中图分类号:G642文献标识码:A文章编号:1009-3044(2011)04-0949-03
  The Edification of Software Engineering Idea in C Language Lesson Teaching
  SONG Zhen-fang,LIU Wei-qun
  (Academy of Information Technology, Luoyang Normal University, Luoyang 471022, China)
  Abstract: The Software engineering idea permeates teaching of C language lesson in computer related specialty, which will not only help to the teaching of this course but also lay a good foundation for late software engineering courses. This paper combining case to show how to improve students’ programming ability, giving teaching ideas, obtaining good results in the teaching practice.
  Key words: C ; software engineering;teaching practice
  《C 高级语言程序设计》是计算机类相关专业的一门重要且实践性很强的专业基础课程,学生对C 语言课的掌握程度对其后续课程的学习有深刻影响。《软件工程》是另一门重要的课程,在文献[1-2]中指出了在语言类课程教学中贯彻软件工程思想,对后期《软件工程》课程的教学效果有很大影响。本文结合特设的案例,将软件工程中以需求为驱动力进行软件开发的思想运用于该案例。在阐明了常规动态链表实现原理后提出特别的需求,进而设计了一个“另类”动态链表以锻炼学生灵活应对需求变化的能力,并继续以需求的变更为线索将动态链表变化为动态链式栈、动态链式队列,让学生感受到了软件中的“变”与“不变”的辩证统一,在潜移默化中使其受到软件工程思想的熏陶。
  下面首先介绍常规动态链表及其实现,然后依次介绍“另类”动态链表、动态堆栈和动态队列的实现,最后论述它们之间的辩证统一关系和分析了教学设计思路。
  1 动态链表案例教学实践
  1.1 常规动态链表
  为了突出讨论的重点和叙述的方便性,教学案例选取动态单链表并只讨论其最基本的功能和只涉及整型数据类型。
  在教学时首先解释客户方和服务方的概念。main.cpp代表客户方,动态链表代表服务方,从main.cpp中提取客户需求。给出一个main.cpp的完整内容如下所示。
  #include "list.h"//list.h中有#include "listnode.h"语句
  void main()
  {List alist;
  for (int i=0;i<10;i )
  alist.InsertTail(i 1);
  alist.Print();}
  初步分析需求发现:①链表需具备在链表末尾插入数据的能力和用于输出链表数据的能力;进一步深入分析发现;②客户方只与链表类打交道;③客户方不考虑动态内存的释放问题。
  常规的动态链表是由两个密切配合的类相互协调实现的。这两个类是链表结点类和链表类,分别用ListNode和List表示。为了突出两者角色的不同,稱ListNode为ListNode“员工类”、List为List“管理者类”。List“管理者类”和ListNode“员工类”进行协调共同为客户方提供服务。ListNode“员工类”的两个数据成员分别用int data和ListNode* link表示,List“管理者类”的数据成员用ListNode* head表示。
  我们的讨论将围绕两个重要的观测点进行。由于设计动态链表时要考虑内存空间的释放,而客户方不同的需求会导致内存空间释放的时机不同,所以把内存的释放做为一个观测点。另一个观测点是链表的功能。
  结合本案例中客户端的需求,List“管理者类”和ListNode“员工类”做了不同的分工。内存空间的释放由List“管理者类”的析构函数来完成,ListNode“员工类”的析构函数暂时什么也不做。链表数据的底层操作由ListNode“员工类”来完成,而List“管理者类”则负责管理ListNode“员工类”。
  常规动态链表的设计层次分明、结构合理、设计完美,具有很好的现实应用价值,似乎没有对其产生质疑的理由,但是我们鸡蛋里面挑刺,从软件工程的角度观察List“管理者类”和ListNode“员工类”是一种强耦合的关系,试图解耦的习惯性思维引发了设计一个”另类”动态链表以训练学生编程能力的思考。
  1.2 “另类”动态链表
  main.cpp的内容修改如下:
  #include "list.h"//list.h中有#include "listnode.h"语句
  void main()
  { List alist;
   ListNode* pListNode=NULL;
   for (int i=0;i<10;i )
  { pListNode=new ListNode(i 1);
   alist.InsertTail(pListNode);
   } pListNode=NULL;
   alist.Print();
  }
  观察客户方的需求,发现有以下变化:①客户方直接操控ListNode“员工类”,负责其构造但不负责其析构;②对链表类的使用方式发生改变,List“管理者类”的InsertTail方法的参数由整型类型变为ListNode*;③客户方负责将pListNode指针置空值,防止“野指针”的出现。另外,为了增加“另类”链表设计的趣味性,特增加一个新的需求;④要求List“管理者类”的析构函数如下所示。
  List::~List()
  { if (this->head)
   delete this->head;
  }
  深入分析需求的变化,由于客户方申请内存空间但却不负责释放,那么职责交给了链表,对List“管理者类”析构函数的特殊需求又导致了ListNode“员工类”也需要负责内存空间的释放。客户方需求改变前ListNode“员工类”的析构函数内容为:ListNode::~ListNode(){},客户方需求改变后ListNode“员工类”的析构函数内容如下所示。
  ListNode::~ListNode()
  { if (this->pNextListNode)
   delete pNextListNode;
  }
  List“管理者类”和ListNode“员工类”的析构函数相互配合,非常优雅地完成了内存空间的释放任务。对于List“管理者类”的InsertTail方法参数的改变导致的代码修改比较自然,由于篇幅原因在此不做对比了。
  通过此例使学生真切感受到需求变化所导致的代码修改。接下来再给学生布置自学任务,要求其上网查资料或者翻阅数据结构的书籍,重点弄清链表、堆栈、队列的数据结构特征,然后进一步提出将已有的“另类”动态链表分别改造为“另类”动态链式栈、“另类”动态链式队列的问题。在教学实施中,遵从学习循序渐进的规律,先以“另类”动态链式栈的改造为例,然后再放手让学生动手实践“另类”动态链式队列的改造。
  1.3 动态链式栈
  main.cpp的内容修改如下。
  #include "stack.h" //stack.h中有#include "stacknode.h"语句
  void main()
  { Stack aStack;
   StackNode* pStackNode=NULL;
   for (int i=0;i<10;i ) {
   pStackNode=new StackNode(i 1);
   aStack.Push(pStackNode);
   } for (int j=0;j<10;j ) {
   pStackNode=aStack.Pop();
   if (pStackNode) {
   cout << pStackNode->GetData() << ",";
   delete pStackNode;
   } }
   pStackNode=NULL; }
  由“另类”动态链表变为“另类”动态链式栈,需求发生了重大变化,客户方在使用“另类”动态链式栈时,也要额外考虑一些新问题的产生。比如,客户方负责释放堆栈“吐出”的栈结点对象的内存空间。对于“另类”动态链式栈的代码修改涉及到的部分较多,在此仅以Stack“管理类”的Pop()方法的代码特点为例做说明,代码内容如下所示。
  StackNode* Stack::Pop()
  { StackNode* pTop=NULL;
   if (!(this->IsEmpty())){
   pTop=this->top;
   this->top=this->top->pNextStackNode;
   pTop->pNextStackNode=NULL;
   }return pTop;
  }
  代码中pTop->pNextStackNode=NULL;语句非常重要,因为根据客户方需求,Stack“管理类”的Pop()方法要把栈顶的Stack“成员类”对方的控制权完全交出还给客户方,所以必须做到“藕断丝也断”,否则,客户方在释放 Stack“成员类”对象的内存空间时,会因为Stack“成员类”对象的析构函数而将与其“藕断丝连”的后续Stack“成员类”对象一起析构,造成重大损失。
  2 动态链表案例教学思考
  常规动态链表到“另类”动态链表的变化,破坏了链表管理者类和链表成员类之间密切的耦合关系,侧重于内存空间回收的变化观测点。后续“另类”动态链式堆栈和“另类”动态链式队列则侧重于功能变化观测点。需求的变化引起了代码在很多地方的修改,但他们又存在着本质上的“同构”关系。比如,两个类的结构及其相似,学生可以感受到代码级的复用。
  在教学的设计中紧紧围绕先提出需求,然后分析需求发现新特点,在问题求解过程中尽可能复用已有的解决方案,既让学生感受到变化也要让他们感受到不变,在教师的主导下步步启发学生思考,展示了由常規动态链表到“另类”动态链表和“另类”动态链式栈的实现过程,达到了示范的目的,最后只需给出一个如下所示的main.cpp,放手让学生自己去实现“另类”动态链式队列。
  #include "queue.h" //queue.h中有#include "queuenode.h"语句
  void main()
  { Queue aQueue;
   QueueNode* pQueueNode=NULL;
   for (int i=0;i<10;i ){
   pQueueNode=new QueueNode(i 1);
   aQueue.EnQueue(pQueueNode);
   } for (int j=0;j<10;j ) {
   pQueueNode=aQueue.OutQueue();
   if (pQueueNode){
   cout << pQueueNode->GetData() << ",";
   delete pQueueNode;
   } }
   pQueueNode=NULL;
  }
  学生们也在观察、思考并通过动手实践实现“另类”动态链式队列的过程中得到了训练,他们们不仅提前学习到了数据结构的知识而且开阔了其观察问题的视野,培养了其透过现象看本质的能力。教师教学时在汲取常规教学方法优点的同时,依据教学内容的特点适当做一些创新,不仅能提高教师的教学积极性,学生也会从教师的创新思考中受到熏陶,培养良好的思维习惯。本文案例教学的过程中,重视培养学生主动查资料独立解决问题,这种能力的培养对于计算机专业学生应对未来专业知识的不断更新变化非常必要。本文教学案例的设计思想和教学思路受益于文献[3-6]的启发。
  3 结束语
  计算机相关专业一年级开设高级语言程序设计课程是普遍现象。在常规教学中,学生主要学到了语法知识和使用它们描述典型问题的算法及应用知识,关注的重点是求解问题的细节而失去了对原始问题求解的高层思考。本文特设的案例制造了许多需求的变化,使得学生在应对需求变化的过程中不仅受到了软件工程思想的熏陶,也通过解决C 指针方面的难题提高了其编程能力,在教学实践中取得理想的教学效果。
  参考文献:
  [1] 王灿辉,林郎碟.软件工程思想在计算机语言类课程教学中的贯彻实施[J].高教论坛,2010(1).
  [2] 龚建华,刘惠安.在高级语言程序设计课程中融入软件工程思想的教学改革思路[J].贵州教育学院学报,2009(3).
  [3] 小议《C语言程序设计》的教学方法——由一个编程实例展开[J].时代教育:教育教学版,2008(Z1).
  [4] 杨立勤.《高级语言程序设计》教学中能力培养的探索与实践[J].电脑知识与技术,2009(30).
  [5] 《C语言》教学中学生学习兴趣的培养[J].电脑知识与技术,2010(21).
  [6] 王秀芳,鲁法明.C语言中指针的教、学与高效编程[J].电脑知识与技术,2010(28).
其他文献
针对织物染色配色这一复杂的非线性求解问题,本文主要对实验数据进行相关性分析,初步确定了染料质量浓度d1,d2,d3与三刺激值C,M,Y的基本关系,并利用插值法分别对实验数据进行一维和二维插值,以获得更多的数据;同时,利用Matlab拟合工具箱以及多元非线性回归,求出染料的质量浓度和三刺激值C,M,Y的非线性方程,并利用牛顿迭代法求解非线性方程组,以获得染料的质量浓度。实验结果表明,该模型所求出的染
针对电液位置控制系统在负载弹性刚度含有负值时系统出现不稳定现象,以及外负载力方向切换时干扰大而导致系统定位刚度差等问题,对负载弹性刚度为负值的电液位置控制系统构成
针对传统的常模盲均衡算法(CMA)均衡高阶正交幅度调制(QAM)信号会产生失效问题,在利用坐标变换、双曲正切误差函数和非线性判决反馈结构特点的基础上,提出了一种基于坐标变换的多
为研究钢铁基材表面处理程度对环氧防腐涂料作用效果的影响,本文将环氧防腐涂料分别涂装在不同打磨处理程度后的碳钢板上,待其完全固化后,参照相关国家标准对涂层的铅笔硬度、耐
针对弹头激波信号混杂其他噪声干扰无法分离时延特征参数问题,利用奇异谱分析(SSA)的自适应滤波特性进行处理,并对嵌入维数和重构主分量数目对分离效果的影响进行了讨论,建立性
研究、应用现场总线技术支持下的PLC控制系统,是目前工厂自动化得以实现的有效途径之一,它是工厂数字通信网络的基础。该文主要阐述PLC专用现场总线、基于Profibus的PLC控制
针对列车上桥前位移、速度及加速度等初始条件对桥梁结构振动产生的影响,本文以单跨简支梁为例,采用10个自由度的列车垂向振动模型,通过Ansys和Matlab编程,从时域和频域两方
摘要:分析腾讯社区开放平台QQ登录功能、接入规范、登录过程和OAuth认证过程,编写了ASP关键函数代码,实现ASP网站的QQ登录功能。  关键词:ASP;QQ登录;OAuth认证;API接口;网站集成  中图分类号:TP393.092 文献标识码:A 文章编号:1009-3044(2011)30-7433-04  The Development and Integration of Connec
电子档案袋直观、高效、全方位地记录了计算机机房管理员从业后的专业成长轨迹,是描述机房管理员工作生涯中专业发展的有效工具,有利于机房管理员专业知识的积累,专业能力的
近几年来,大学VFP程序设计课程教学改革在全国各个高校纷纷展开,教学模式的改革成为VFP课程教学改革的主要内容,新的教学模式应采用案例式教学、互动式教学等教学方法。"双主