基于“信息学奥林匹克竞赛”培养程序设计习惯的研究
2009-01-20李军玲邵洪艳
李军玲 邵洪艳
摘要:本文针对NOIP竞赛中学生普遍不重视养成良好程序设计习惯的问题,通过以竞赛试题中阅读程序为例,分析说明培养程序设计习惯的措施,提出正确使用程序设计工具,以达到养成良好的程序设计风格、加强良好程序设计习惯养成的目的,这对提高学生的程序设计能力具有较好的现实指导意义。
关键词:信息学;奥林匹克竞赛;程序设计;习惯
中图分类号:G642 文献标识码:B
1现状与对策
全国青少年信息学奥林匹克联赛(National Olympiad in Informatics in Provinces,简称NOIP)是全国信息学奥林匹克竞赛(NOI)系列活动中的一个重要组成部分,旨在向中学生普及计算机基础知识。从早期只考核学生对程序设计语言的理解、熟悉程度以及编程技巧发展到模型设计、离散数学、动态规划的思想及算法,由单纯的培养学生学习兴趣转变为创造性地运用程序设计知识解决实际问题的能力。然而学生在程序设计习惯方面普遍重视不够,为软件项目开发埋下了巨大隐患。
1.1现实中存在的问题
信息学奥林匹克竞赛上由于教学单位出现急功近利的思想,造成学生不能较好地正确掌握计算机程序设计过程,没有养成良好的程序编程习惯。在现实中,程序设计普遍存在以下一些共性问题:
(1) 不愿意读别人的程序。强调自己程序设计方法的优点,不愿意学习和借鉴他人的设计思路。
(2) 不画流程图。程序流程图本来是程序设计的最简单最直白书面表达,然而没有得到足够的重视与平时养成,学生不乐意用流程图来表达设计思想与过程,实际上往往导致程序逻辑交叉,当程序出错时排除费时费力。
(3) 不写程序功能说明。程序设计过程中普遍存在只写源代码的语句,对程序实现的功能没有描述,别人阅读程序很难,有时编程者自己对程序的处理技术方法也遗忘。
(4) 不写代码的注释。不对程序进行必要的注释,造成阅读困难,程序可读性差。
(5) 忽视出错处理。只完成程序功能的单一实现过程,对程序可能的具体出错处理分析不够。
(6) 忽视程序算法分析。程序算法对程序运行的效率影响是非常大的,程序算法的复杂度直接影响程序的时间和空间。
(7) 忽视程序设计过程中文档资料的积累。普遍认为编程就是写程序和调试过程,忽视文档的书写,其后果导致程序维护困难。
1.2对策
信息学奥林匹克竞赛注重学生终生学习能力的培养,而不停留在唯竞赛而学。在平时的教学中培养学生良好的程序设计习惯,使学生学会准确运用程序设计工具,养成良好的程序设计风格,将达到事半功倍的效果。
(1) 勤于思考、克服困难的习惯。由于学生对知识层次理解的深度有限,思维是发散而新颖,学生所编写的程序必然有别于专业人员,但是要培养其具有专业人员的素养,要养成解决问题的好习惯,从解决方法和基本原理上勤于推敲。
(2) 与人协作的习惯。NOIP考试形式上看是学生个人的行为,而真实的软件工程是多人合作、信息共享的活动,互学互助、取长补短、与人沟通、信息交流的好习惯将使学生受益终身。
(3) 培养全局规划习惯。不论是程序语言的学习例题还是NOIP的考试命题,题目功能典型,学生要善于从短小的程序代码中分析计算机解决问题的方式、途径,将小代码功能扩充完善,利用程序设计工具对问题从全局角度进行分析处理。
(4) 良好的代码编写习惯。包括程序流程图、变量命名、代码标注、功能注释、捕获代码异常、测试样例、文档记录等多个环节。如果在软件开发和程序编写过程中养成良好的习惯,那么程序中存在的漏洞就易于发现,为将来大型软件项目的开发打下良好基础。
(5) 养成善于总结分析、勤于记录文档资料的习惯。建立自己的知识库,不仅有源程序代码,还要有完备的文档资料记录。
2培养正确程序设计习惯的措施
学生在学习过程中主要接触的是以掌握基本算法为主的程序例题和NOIP独立命题题目,而软件开发过程是一系列活动,包括方法、工具和过程三个要素。因此,如何让学生以小见大,培养良好的程序设计习惯才是学习的根本。以第14届NOIP提高组C++初赛题目阅读程序4为例题,说明如何借助程序设计工具,养成良好的程序设计风格,培养良好的程序设计习惯,例题的源程序如下。
#include
#include
using namespace std;
int i,j,len;
char s[50];
int main()
{ cin>>s;
len=strlen(s);
for(i=0;i {if (s[i]>='A'&&s[i]<='Z') s[i]- ='A'-'a';} for(i=0;i {if(s[i]<'x') s[i]+=3;else s[i]+= -23;} cout< for(j=1;j<4;j++) { for(i=0;i {s[i]=s[i+j];} } cout< return 0; } 2.1准确使用程序工具的习惯 学生在学习程序设计过程中不要过分强调上机调试运行,学会正确运用程序设计工具是根本。程序设计工具不仅能正确将程序分析过程转变为程序实现,而且还能够帮助学生快速分析源程序的语句功能,生成程序设计过程中所需要的文档资料。 2.1.1数据字典 数据字典以字典式顺序组织精确严格地定义了每个数据元素。通过读例题源程序,得到例题的数据变量的数据字典,具体变量描述如表1所示,这有助于理解各变量在程序中的输入、输出、存储和中间计算。 2.1.2N-S图 N-S图是适应结构化程序设计特点,逐步求精模块化程序设计方法的有力工具。阅读例题源程序语句可以快速画出它的N-S图(图1),从而确定例题的程序顺序结构功能,如图2所示。 2.2良好程序书写风格的养成 程序不仅要保证运行正确,也是让别人读的。程序书写设计风格包括4个方面:源程序文档化、数据说明、语句结构和输入输出方法。针对NOIP命题特点,学会从编码原则提高程序的可读性着手。由于例题已具有完好的缩进格式,只需要加入相关的序言性和语句注释。程序部分修改内容如下。 /* 4.cpp 程序功能: */ /*首先,大小写混合字母的字符串变成小写字母;然后以26字母循环形式,逐个字符替换为其位置后的第3个字符;最后,重新赋值指定位置字符。*/ .... int main() { cin>>s; //字符串s初始化 len=strlen(s); //求s长度 for(i=0;i ... //逐字符转换为其后面的第3个字符 for(i=0;i ... cout< //3次循环将s指定字符s[i]重新赋值s[i+j] for(j=1;j<4;j++) ... cout< return 0; //返回 }
2.3程序算法分析的习惯
算法的空间复杂度和时间复杂度是分析一个程序算法的执行效率与存储需求,可以有效避免只强调偏僻技巧而忽略算法复杂性。
int main()
{ cin>>s; //执行次数1
len=strlen(s); //执行次数1
for(i=0;i ... for(i=0;i ... for(j=1;j<4;j++) //执行次数4 for((i=0;i s[i]=s[i+j] //执行次数4*n cout< } 通过对例题的基本语句执行次数分析,得出程序的时间复杂度为O(n2)。 2.4面向对象程序设计的习惯 目前面向对象的程序设计技术在软件开发中占据主导地位,是指导学生学习软件的发展方向。根据例题程序的功能实现,通过定义一个obj类,含有实现程序功能的4个成员函数,将例题的面向过程编程改写为面向对象的程序设计,使数据和操作具有封装性。改写后的程序源代码如下。 #include #include using namespace std; class obj //定义obj类 {public: //定义公有成员函数 obj( ) {*s=NULL;len=0;} //定义构造函数 void input( ); //输入函数 void change( ); //字符转换函数 void setvalue( ); //字符重赋值函数 //定义输出函数 void print(){cout<<"s="< private: //定义私有成员变量 char s[50]; //字符串s int len; //字符串长度len }; void obj::input( ) //定义输入函数 {cout<<"inputs="; cin>>s; len=strlen(s); } void obj::change( ) //定义转换函数 { for(int i=0;i {if (s[i]>='A'&&s[i]<='Z') s[i]- ='A'-'a';} for(i=0;i {if(s[i]<'x') s[i]+=3;else s[i]+= -23;} } void obj::setvalue ( ) //定义字符重赋值函数 { for(int j=1;j<4;j++) { for(int i=0;i s[i]=s[i+j];} } int main( ) //主函数 { obj x; //obj类的对象x x.input ( ); x.change ( ); x.setvalue ( ); x.print ( ); return 0; } 3结语 NOIP重点是培养学生学习计算机的兴趣,使学生对信息技术的一些核心内容有更多的了解,提高创造性地运用程序设计知识解决实际问题的能力,而不是一味学习专业教材。因此,只有开始养成一个良好的程序设计习惯,才能为将来的软件开发打下好基础,而不是追求唯竞赛而学的短期效果。 参考文献: [1] 马苗,田红鹏. “面向对象程序设计与C++”教学中的问题与思考[J]. 计算机教育,2008(6):81-82. [2] 杨显霞. 信息学奥林匹克竞赛教学模式初探[J]. 西南农业大学学报:社会科学版,2008(4):169-171. [3] 林小华. 计算机程序设计风格探讨[J]. 软件导刊,2006(17):33-35. [4] 谭浩强. C++程序设计[M]. 北京:清华大学出版社,2004. [5] 覃征,何坚,高洪江,等. 软件工程与管理[M]. 北京:清华大学出版社,2005.