时间:2023-08-08 16:46:01
序论:在您撰写程序设计的结构时,参考他人的优秀作品可以开阔视野,小编为您整理的7篇范文,希望这些建议能够激发您的创作热情,引导您走向新的创作高度。
关键词:VB选择结构;IF语句;评价
Visual Basic(简称VB)是面向对象的可视化编程语言,它简单易学的语法深受广大编程爱好者的青睐,同时也是中职学校计算机专业学生的一门必修课程。通过学习VB程序设计,培养学生的程序设计能力和开发软件的兴趣。VB有三种基本的程序控制结构:顺序结构、选择结构和循环结构。当一个问题涉及到对条件进行分析、比较、判断,并根据判断所得的结果采取相应的处理方式,这时就要用选择结构来解决问题。在教学过程中如何突破VB选择结构教学的重点、难点,如何让初学者理解选择结构的执行过程,掌握选择结构的应用,培养他们的逻辑思维能力、实践操作能力和解决实际问题的能力,这是笔者在教学中一直思考的问题。现就结合VB选择结构中IF语句教学的主要环节进行探讨。
一、实例导入,焕发热情
中职学生的知识基础较差,普遍学习兴趣不高。如果在选择结构教学中按照传统的先讲解IF语句的格式和功能,再进行实践操作,则未必能取得较好的教学效果。兴趣是学习的原动力,这就需要计算机教师暂时抛开晦涩难懂的概念和语法,采用生活化的实例来焕发学生的学习热情。
新课之前,首先通过局域网分发几个用IF语句编写的VB可执行程序到学生电脑上,如:手机价格竞猜游戏,让学生一开始就动手体验选择结构的魅力。学生运行程序的过程仿佛置身于游戏中,他们结合实际生活经验很轻松便推断出:如果输入的价格大于1999,则提示“猜高了”;如果输入的价格小于1999,则提示“猜低了”;如果输入的价格等于1999,则提示“恭喜您,猜对了”。学生用自己的语言思路清晰地总结出竞猜过程中的三种情况,教师顺势引出条件判断这个概念。通过讲解这个例子让学生对价格判断和提示信息对应起来,理解根据不同的判断结果执行不同的语句。通过实例导入,学生对VB编程产生了好奇心,教师结合实例让学生理解VB选择结构的执行过程,从而将将学生的被动学习转化为主动学习。
二、加工半成品,突出重点
VB选择结构教学中,如果给学生一个完整的任务书,那么按照实际的流程,学生在任务前期首先要进行界面设计、属性设置以及一些顺序结构语句的编写等。由于学生的理解程度不一样,完成进度也不一样,有些学生花长时间停留在前期工作中,一节课下来都没有进入到选择结构代码的编写,这就影响到了选择结构学习目标的落实,评价也变的非常困难。针对这一情况,VB选择结构IF语句教学中采用“半成品”加工策略,给学生一个不完整的任务,仅对IF分支语句环节进行“留白”,“留白”部分即教学的重点。学生在“半成品”到“成品”的加工过程中既学到了知识、掌握了重点,又提高了实践效率、获得了成功的体验。
如在IF双分支语句教学中,采用实例:商城迎新年促销活动,单价满200元减40,不满200元则按原价出售,根据商品原价求实付金额。教师给出界面和部分代码, 对代码中IF双分支语句部分进行“留白”。教师引导学生自主探究,分析问题,学生由活动规则总结出两种判断情况(a>=200和a
三、条件迁移,化解难点
多分支IF语句的应用是VB选择结构IF语句的难点。教学中若采用条件迁移法,即通过在已掌握的双分支IF语句实例的基础上对判断条件进行增加或改变来过渡到新的例题,从而降低多分支语句应用的难度。这样的方法符合学生的认知规律和发展规律,让学生对多分支IF语句的认识、理解、运用有一个逐步深入的“螺旋式”上升的过程。
如商城迎新年促销活动,在原有基础上增加条件:单价满1000元的商品在享受满200减40后再享受9折优惠。基于学生之前已掌握了双分支IF语句应用,结合已有的数学知识,解决问题的方法和步骤便得到了简化,并能根据实际情况写出逻辑表达式和相应的执行语句。如对百分制成绩进行等级评定,在一开始的双分支IF语句(及格和不及格)的基础上通过对百分制成绩的分数段范围进行逐步细化,对应的评定等级则也有所变化(及格、良好、优秀),从而过渡到多分支IF语句。通过简单的改进实现小小的目标,通过条件迁移法化解多分支IF语句这个教学难点。条件的迁移,就是用一个接一个的问题,牵着学生的思维,让他们不停的跟着教学内容思考并实践,而不是一味的坐着被“灌”。
四、课堂教学评价
课堂教学评价是促进学生成长、教师专业发展和提高课堂教学质量的重要手段。在VB选择结构程序设计的实际教学中采取多向立体式评价方式:教师对学生的学习效果评价、学生对教师的教学满意度评价、学生的自我评价,这些评价贯穿于整个教学活动中。通过教师对学生的学习效果评价,及时反馈学生对重、难点的掌握情况,帮助学生正确认识自我,树立不断进取的信心。通过学生对教师教学满意度的评价,帮助教师了解自己的课堂教学水平以及不足之处,为优化教学过程提供科学依据,有利于教师提高课堂教学质量。通过学生自我评价对VB选择结构IF语句的知识点进行回顾与梳理,将感性知识理性化,并进行学习方法的总结与交流等。
五、结束语
基于中职学生的学习特点,我们计算机教师需要用心设计课堂,在教学中努力给学生提供生活化的问题解决环境,让学生带着疑问主动学习。采用适合学生认知规律和发展规律的教学方法突破重点、化解难点。教学中进行有效的课堂教学评价,从而切实有效地提高VB选择结构程序设计的课堂教学质量。
参考文献:
关键词:程序设计基础;数据结构;计算思维;教学衔接
0、引言
程序设计基础与数据结构是计算机类专业的两门专业基础课,在计算机类专业教学中具有举足轻重的作用,都旨在培养学生的编程能力和计算思维能力,并为后续课程打下坚实的专业基础,但在这两门课程的教学过程中,存在一系列问题,严重影响课程的教学效果。笔者分析和研究产生这些实际问题的原因,对这两门课程的知识融合、内容衔接以及教学实践等进行探讨,提出切实可行的解决方案,更好地实现两门课程的教学目标。
1、课程教学内容和教学目标
程序设计基础课程是学生接触的第一门专业基础课,也是进行计算机编程的入门课程。课程的教学目标是使学生掌握程序设计的基本方法,培养其拥有良好的程序设计风格、较强的软件开发能力以及一定的计算思维能力,为后续课程打下良好的基础。
数据结构是继程序设计基础课程之后的一门综合专业基础课,是计算机类专业的核心课程之一,具有举足轻重的作用。它是程序设计基础课程所讲知识的自然延伸和具体应用。对数据结构的理解、掌握和应用拓展,将对学生解决具体实际问题时的数据分析、数据组织、数据处理和编程能力有着深远的影响。课程的教学目标是培养学生缜密的逻辑思维和数据抽象能力以及学生在软件设计领域中科学的计算思维能力,帮助学生将数据结构和算法与具体的编程实现相结合并灵活地应用到实践和工程实际中。
2、两门课程间的关系
从程序与数据结构本身的关系来说,一个好的程序离不开合适的数据结构,而数据结构中算法的实现离不开具体的程序设计。在计算机类专业的课程体系中,数据结构和程序设计基础课程虽然独立开设,但是它们之间的联系是紧密的。在课程设置上,程序设计基础是数据结构的前导课程,两门课程一脉相承,不可分割。
学生对程序设计基础课程的掌握程度、具备的计算思维和编程能力,直接关系到以程序设计语言实现算法的数据结构课程的教学效果。数据结构课程通过创造性思维的训练,重点突出数据抽象与程序抽象能力的培养,从而进一步提升学生的计算思维能力和编程能力,但两门课程在实际教学中存在一些问题,主要原因是课程设置、教学内容、教学方法和教学实践方式等多方面存在缺陷。经分析,对程序设计基础和数据结构课程进行知识整合和内容衔接,采用适当的教学方式,改进教学实践是探讨和研究的主要内容。
3、两门课程在实际教学中存在的衔接问题
3.1 两门课程教学内容的脱离
目前,在实际教学中,程序设计基础和数据结构课程虽然关系紧密,但是一直被设定为两门完全独立的课程,而且教师在制订教学大纲和教学目标时容易忽视两门课程问的联系,在教学过程中出现一些盲区,要么两门课程在教学内容上出现不同程度的交叉,要么出现知识衔接的断层,令学生对两门课程的内在联系没有整体概念和认识,从而导致不能深入系统地学习相关知识。尤其是先行课程序设计基础的教学内容和课程案例完全脱离了数据结构课程,使数据结构中最频繁使用的知识和内容在程序设计基础课程中甚少提及,不能为数据结构课程的讲解打下扎实的程序设计基础。
3.2 程序设计编程语言与数据结构实现语言不一致
程序设计基础课程所教授的编程语言与数据结构教材或实验所使用的实现语言不一致,如将C++语言作为程序设计基础的教授语言,而在数据结构的实现上选择c语言或Java语言,以至于数据结构的理论教学与具体上机编程实现脱节,严重影响了上机实验和课程设计环节。
3.3 程序设计方法与数据结构实现方法不一致
程序设计基础课程中或注重面向过程的程序设计方法,或注重面向对象的程序设计方法,但在数据结构课程中却很难利用前导课程中学到的程序设计方法实现相关的数据结构和算法,从而影响了学生对数据结构课程知识的应用与实现。另一方面,学生在学习过程中没有充分理解数据结构课程的作用和实际意义,以至于在实际项目和问题中不知使用什么方法(面向过程或面向对象)分析解决问题,不知如何运用数据结构知识解决实际问题。
3.4 前导课程对后续课程实践环节的影响
数据结构实验环节相对课堂理论环节较薄弱。此问题的存在多半是因为数据结构具体实现的关键技术在程序设计基础课中未被讲解或强调,在进行数据结构算法从理论到伪代码、再由伪代码到真代码转换的过程中难以真正编程实现,使学生对数据结构的理解和掌握仅停留在抽象层、概念层、理论层,难以上升到实现层,从而影响学生的学习兴趣和积极性。同时,课程中的实践项目过于单一且相对独立,使实践环节与实际项目的联系过于松散,学生运用所学知识解决实际问题的能力和实际工程能力很难得以锻炼。
3.5 缺少计算思维能力的培养,缺乏理论知识与实际应用的联系
提高学生计算思维能力是程序设计基础和数据结构课程共同的目标。计算思维是抽象的多个层次上的思维,而抽象是表达实际的方法。然而,现行教学方法过多关注程序设计和数据结构知识点的讲解,缺乏对学生思维能力的培养。
如果缺乏理论联系实际,那么将影响学生计算思维的培养。数据结构中的知识又太抽象,如果缺乏相应的实际案例对抽象知识加以应用,那么就会导致学生不知道怎样将所学的知识应用到实际中,缺乏具体问题具体分析和解决的能力。
3.6 教师本身知识结构欠缺,上机实践指导教师数量不足
授课教师知识结构的缺乏将导致一些现实问题:如果程序设计基础的教师不懂数据结构,那么其自然不会将相关知识引入课堂,同时也缺乏用所教授的语言具体实现数据结构中结构和算法的能力;如果数据结构的教师缺乏相关编程语言知识,那么就会给上机辅导带来困难。同时,两门课程具有很强的实践性,若上机实践辅导教师不足,将不利于学生编程能力的提升以及相关软件大赛学生的培养和辅导。
针对以上实际教学中存在的问题,可知为提高程序设计基础与数据结构课程的教学效果,根据计算机类专业这两门课程教学内容和目标,对两门课程进行知识整合和内容衔接的必要性,对课程衔接的方法和思路等进行探讨势在必行。同时,课程教学不仅要关注知识的传授,还要培养学生主动获取知识并综合已有知识创造新知识的能力。
4、程序设计基础和数据结构课程衔接的新方法和思路
4.1 做好两门课程教学内容的融合和衔接
教师需紧密结合计算机类专业的培养目标,精心设计程序设计基础和数据结构课程的教学内容,既要满足课程的专业基础性,又要满足后续课程学习的需要,严密制订教学大纲,做好程序设计基础与数据结构教学内容的衔接以及相关教材的选定。
在程序设计基础课程教学中,教师需要关注学生计算思维能力的培养,将重点放在讲解思路上,教学生如何对问题进行抽象,还要介绍一些简单的基础算法和数据结构。程序设计与数据结构的联系过程必须做到循序渐进,若引入的数据结构相关知识过难,会打击学生的学习积极性。例如,教师讲数组时可引入几种数据结构中简单的排序算法冒泡排序、选择排序等;讲完指针和结构体后可引入最基本的数据结构――链表;讲完嵌套函数调用后可引入“递归”,它是数据结构中解决问题的常见思想和算法,可以通过简单的递归函数帮助学生理解递归思想和递归调用过程,这些是理解数据结构中复杂递归函数的基础。在程序设计基础教学中,只讲递归函数的简单应用,而在数据结构教学中,需要介绍递归函数的复杂应用:栈、树、八皇后问题、N个数的全排列等。围绕“递归”这一重要知识点,从易到难并结合课程本身特点进行理论分析,将有益于整合课程教学内容,引导学生循序渐进地学习和思考。
针对在程序设计基础课程中不重要但在数据结构及算法中被广泛使用的知识点,教师需要在讲解程序设计课程时将其点出并告诉学生此知识在后续数据结构课中的重要性,引起学生对该知识点的兴趣和重视,如指针的灵活使用、结构体类型的复杂应用、类型重命名、类的拷贝构造函数(深拷贝)、函数模板、类模版等。
同时,教师要对程序设计基础课程内容进行适当补充和扩充,如增加c++函数模板、类模板的相关知识,为将泛型程序设计、c++的STL引人数据结构课程奠定知识基础,缩小教学知识与实际运用的距离,提高学生的动手编程能力和知识运用能力。
4.2 保证程序设计编程语言与数据结构实现语言的一致
程序设计基础课程所教授的编程语言要与数据结构教材或实验所使用的编程语言一致,这样不仅能大大提高学生的编程能力,还有利于数据结构课程的上机实现。
4.3 将面向对象思想引入程序设计与数据结构中
随着程序设计方法从传统的结构化程序设计演化到面向对象程序设计,数据结构在面向对象程序设计中也将成为面向对象的数据结构,且将随着程序设计理论和技术的发展而不断变化发展。在程序设计基础课程中讲授面向对象的编程语言如c++语言,既可以实现面向过程的数据结构,又能实现面向对象的数据结构。数据结构课程采用面向对象的观点讲授并以C++语言作为算法的描述工具,从而强化数据结构基本知识和面向对象高级程序设计基本能力的双基训练以及实际动手能力培养。在设计数据结构实践项目时,将面向对象的程序设计思想、面向对象的程序设计语言和数据结构课程教学内容恰当地融合,有效整合两门课程中的重叠部分,突出各自的侧重点,符合当前软件设计思想和软件开发趋势。
4.4 加强课程中计算思维能力的培养
在程序设计和数据结构的教学方法上,将面向语法为中心的教学逐渐转变为面向问题求解的教学,从问题出发采用适当的数据结构,将其抽象成解决问题的算法描述,用程序设计语言实现问题求解,使课程从过去的仅讲授孤立的知识点,转变为讲授计算思维和问题求解的过程,从而达到突出思维方法训练的目的。在程序设计基础和数据结构授课时尽量将理论联系实际,将知识点解释和应用为身边容易理解的真实案例。例如,讲“图”时,可以把现在流行的复杂网络、社交网络引入其中;讲解“队列”时,可将春节买票引入其中,让学生从身边的例子理解理论知识的具体应用。对有些案例可以提倡“一题多解”,不局限于一种数据结构、解题思路和实现方法,通过一题多问、一题多解带动学生探索、比较、寻求更好的解决途径,达到学生分析解决问题能力的提高和计算思维能力的培养。
4.5 提升教师能力,配备充足的上机辅导教师
学校要加强程序设计基础与数据结构课程相关授课教师整体能力的提升。教师不仅要掌握自己所教授课程的知识,还要对该课程的前续及后续课程内容有所了解,便于维护教学的整体秩序和融合学生的知识体系。同时,教师要积极参与各种软件大赛和企业培训,将教授的理论知识和实际项目相结合,达到应用知识解决复杂问题的目的。此外,两门课程的上机实践环节要配备足量的辅导教师,不让学生输在编程入门的起跑线上。
4.6 依托程序设计竞赛,提高学生的编程能力
依托全国软件大赛、ACM大赛等程序设计竞赛,将竞赛题目引入程序设计基础和数据结构课堂中。此类题目强调考查学生对各种算法的应用能力,综合性较强,非常适合辅助学生学习和体会数据结构的妙用,提升学生分析和解决实际问题的能力,引导学生将所学知识准确而灵活地运用到实际生活中,大大提高学生的实践动手和程序设计能力,促进其知识的融会贯通。另外,通过竞赛等多种活动可以为学生提供展现程序设计能力的舞台,激发学生学习的主动性,培养其计算思维能力。
例如,在教授程序设计基础时,讲完逻辑表达式和多重循环结构后,可以将大赛中的逻辑推理题目引入教学中并引出常见的解题方法和思路一枚举法,从而加深对枚举法的认识。通过采用数据结构中的双向链表和线性数组两种方式实现大赛中常见的约瑟夫环问题。
4.7 引入OJ平台。加强课程实践环节
引人在线判题(Online Judge,oJ)系统,提高学生的实践能力。能力需要以丰富的知识作为支撑,而实践是能力赖以生长的土壤。在OJ系统中,学生可以在线提交程序源代码,系统对源代码进行编译和执行并通过预先设计的测试数据检验程序源代码的正确性。引入0J系统不仅可以辅助教师批改作业,减轻教师工作压力,还可以促使学生加强平时上机编程练习,通过编程排名方式提高学生的学习兴趣。OJ系统中拥有大量题库,可以让学生进行上机实践,培养自身的计算思维能力,提高编程能力。0J系统不仅可以作为程序设计基础课程的实践平台,还可作为数据结构课程的实践平台。
1.在《C程序设计》与《数据结构》教学中对课程整合概念的理解
理论上,课程整合是指对课程设置、各课程教育教学目标、教学设计、评价等诸要素作系统的考察与操作。在实际教学中,课程整合是指考虑到各门相互分裂的课程之间的有机联系,将这些课程综合化。
在传统的教学模式中,《C程序设计》是先行课程,《数据结构》是后续课程,它们都是学习操作系统、数据库原理和应用、面向对象程序设计等课程的基础。《C语言程序设计》是学生最先接触的结构化程序设计语言,其教学目的主要是使学生了解结构化程序设计的算法和思路,掌握程序设计和调试的基本技巧,培养良好的软件设计基础。《数据结构》主要是研究非数值应用问题中数据之间的逻辑关系和对数据的操作,同时还研究如何将具有逻辑关系的数据按一定的存储方式存放在计算机内。其教学目的主要是使学生掌握数据的逻辑结构、存储结构及其相应的算法,培养学生解决实际问题的能力,即能够把现实世界中的客观问题,变换为在计算机内的表示形式,学会组织数据、选择算法、养成良好的程序设计风格。
《数据结构》课程中分析数据之间的逻辑关系和确定数据在计算机内的存储结构是所有程序设计过程中必须完成的两大任务,且《数据结构》中算法描述的语言又多采用C语言,两门课程之间存在着紧密而内在联系,为两门课程的整合提供了可能性。
2.《C程序设计》与《数据结构》的教学现状
在传统的教学模式中,《C程序设计》是先行课程,《数据结构》是后续课程,将两门课程分开来教学,人为地割断了它们之间的内在联系,导致学生在学习《C程序设计》时,仅局限于C语言的语法层面上,不能把C语言的程序设计思路和语法知识具体运用到数据结构的算法中去,使理论知识与实践运用脱钩。而在学习《数据结构》时,由于教师的更换和教材的多样化,任课教师又不得不花掉一、两周的时间来复习C语言的相关知识,造成了课时的浪费和学生反感。在具体运用时,又出现学生能理解数据结构中的算法和读懂算法,却不能运用C语言去实现算法等程序设计能力较差的现象。笔者长期从事这两门课程的教学工作,一直在探索如何提高这两门课程的教学效果,培养学生运用C语言这个工具去解决实际问题的能力。
3.《C程序设计》与《数据结构》课程整合的思路
在高职院校计算机应用专业的课程体系中,实现《C程序设计》和《数据结构》这两门课程的整合,要结合职业教育培养实用型人才的目标,根据后续专业课程的需要来确定。《C程序设计》和《数据结构》课程整合化的思路以C语言为工具,以实践为中心,重视基础知识,注重能力培养,对两门课程教学内容和教学模式进行优化和整合。
在实施过程中,将这两门课程整合为一门课程,课程名称为《C程序设计与数据结构》,在一个学期内完成授课内容。坚持理论联系实践的教学模式,突出实践教学的重要性,去掉繁琐的理论推导,重新设计教学、实训大纲,处理教材,合理分配学时。在具体教学中,以C语言为主线,将数据结构的内容溶入到C语言的教学中,对数据结构的内容以“适度够用”为原则,适当地进行删减,以满足高职教育培养应用型人才的教学需要。
4.《C程序设计》与《数据结构》课程整合的具体实施
(1)整合后理论课教学的内容和学时分配
整合后周学时为6节,总学时为102节(按17个教学周计),其中理论课时为68节,上机实践课时为34节。
(2)课程整合后的实践教学设计
在实践教学中,要进一步巩固对理论知识的理解,提高学生灵活运用数据结构和算法的能力,使学生在编程、上机操作、程序调试与正确性验证等基本技能方面得到训练和提高。实验可分两部分,一是验证性实验,主要结合课堂理论教学内容展开,学生可以对在课堂上学到的基本算法进行验证;二是运用性实验,组织学生以小组为单位设计一些实用程序,要求学生从实际出发,在具体、真实的环境中分析研究数据对象的特性,构造合理的数据结构以及相应的算法。
(3)课程整合后的考试要求
整合后的课程培养目标是提高学生的计算机应用能力,计算机应用能力包括了三个层次:操作使用能力、应用开发能力和创新能力。因此整合后的课程考核,应采取理论基础闭卷和上机操作开卷相结合的方式进行,综合评价应从以下三个方面来着手。
①笔试。笔试主要是考察学生对理论知识的系统性的理解,可由客观题型(如选择、填空题等)和主观题型组成,客观题型要立足于基础知识,小而全,避免死记硬背。主观题型要灵活多样,如问题解决分析、程序编写等。占整个评价的30%。
②上机实践。上机实践贯穿于整个教学当中,所以要注重过程考核,结合实训计划,在各单元模块结束时,进行随堂考核,并认真检查和记录学生考核情况,作为期末上机实践成绩的一部分。实行各单元过关,有了各单元模块的考核,到期末上机操作综合考核时就不成问题了。通过对上机操作实践的评价,可以考察学生应用计算机解决实际问题的能力。占整个评价的40%。
③学生的平时表现。学生的平时表现是指是否认真上课、听课,上机练习的任务是否独立完成,上机设计的任务是否有创意,作业是否按时上交等等,这些资料的积累,有利于对学生学习情况的全面认识。学生在整个授课过程中的表现,占整个评价的30%。
在课程整合中,合理的考核方案能促进学生知识的积累,避免学生考前突击和死记硬背现象,使学生真正学到知识。
关键词:目录式菜单;C51;结构体;函数指针
中图分类号:TP368.12
随着矿用产品智能化越来越高,人机界面越来越丰富,而在目前矿用产品中,人机界面多基于单片机及按键方式实现,对于复杂的人机界面程序设计工作量很大,且存在经常需要修改的问题。因此设计了运行可靠、修改方便的菜单程序框架可以降低工作量,提高产品开发效率,且为以后程序设计建立模板。多级菜单程序的设计方法很多,最典型的方法是根据按键动作及显示界面建立索引关系表,具体实现方法见文献[1]。该方法基于这个关系表,增加或调整界面时,对结构表修改较大,特别是在界面很多时不方便,在修改及通用性方面差。作者通过总结已往的各种菜单设计方法,根据设计菜单经验,设计了一种基于C51结构体的目录式菜单,通过目录查询和函数指针调用,实现菜单各种操作功能。
1 目录式菜单程序设计
通过对菜单的共性分析,提炼出菜单结构特点,形成菜单条结构体。一般每个菜单项有菜单标签和子菜单列表;可以通过上下选择键对子菜单项上下选择;在选择后进行确认操作,调用功能函数执行,且可进入下一级子菜单或进入当前菜单的参数修改;在参数修改时通过上下选择键修改;取消或返回可通过取消键操作。为实现以上功能首先建立菜单条结构体,并根据菜单功能项目,分级建立菜单结构体,确立菜单的显示内容、菜单条之间关系及执行的功能等,然后再设计各功能函数。因此本设计的关键是要定义好菜单的目录结构体以及菜单的操作及显示函数。
2 结构体定义
2.1 菜单条结构体定义
菜单条结构体确立本菜单的显示内容、附加数据、结构关系、执行功能等属性,包含内容有当前菜单条数、菜单标签、菜单条名称、菜单条数据指针、父菜单指针、子菜单指针、执行功能函数等关系,结构体如下定义。
struct MenuItem
{ uchar MenuCount; //当前菜单条数
char *MenuCaption; //菜单标签
char *DisplayString; //菜单条名称
struct MenuData *DisplayData; //菜单条数据指针
struct MenuItem *ParentMenus; //父菜单指针
struct MenuItem *ChildrenMenus; //子菜单指针
void (*Subs)(); }; //执行功能函数
2.2 菜单条数据结构体定义
为了减少程序量和操作方便,在有些最底层菜单后附带数据,而这些数据的属性不同,操作显示都有区别,因此根据他们的共性将数据的属性和操作、显示等封装成结构体,包含内容有当前数据个数、数据名称、数据属性、修改操作、显示操作等,结构体如下定义。
struct MenuData
{ uchar Count; //数据条数
char * Name; //数据名称
uchar Attribute; //数据属性,
void (*Set)(); // 设置函数
void (*Show)(); }; // 显示函数
2.3 菜单目录结构体定义
在菜单条结构体基础上,根据每个界面菜单的内容填写菜单目录结构体,再根据具体功能写各功能函数。菜单目录结构体示例如下。
struct MenuItem code Menu[]=
{ {3,"-菜单-", "1 菜单1", &MenuData1, ParentMenu, Menu1, Subs1},
{3,"-菜单-", "2 菜单2", &MenuData2, ParentMenu, Menu2, Subs2},
{3,"-菜单-", "3 菜单3", &MenuData3, ParentMenu, Menu3, Subs3},};
3 菜单目录操作函数设计
定义好菜单目录结构体后,关键还要实现菜单目录检索和显示,具体由以下两个功能函数实现。
3.1 菜单目录检索函数设计
通过菜单检索函数建立按键操作和菜单目录的关系,可以在菜单目录中检索出当前需要的菜单及其相关的功能。void SearchMenu(void)函数根据按键状态,实现菜单上选、下选、返回、执行菜单功能函数等操作功能。
3.2 菜单显示函数设计
菜单显示函数根据当前操作状态显示菜单条及相关数据,以及实现反白显示等功能。
void ShowMenu(void)函数实现菜单标签、子菜单条显示,并实现多条子菜单条行循环显示操作,对选中的菜单条反白显示等。
3.3 菜单函数设计
为了使程序结构一体化,将读键、菜单检索、菜单显示等函数封装到一起,同时还具备对实时数据刷新、超时返回默认界面等功能。
4 实例分析
根据以上的目录式菜单设计方法,以水泵阀门控制箱显示单元实例应用进行分析。其硬件环境如下,CPU选用C8051F340,采用内部12MHz频率运行,使用内部4K RAM作为显存;显示采用DM160128图形液晶显示模块,不带字库,可以显示16行20列字符或8行10列汉字;输入采用按键和红外遥控方式,设置有四个功能键(上选、下选、确认、取消/返回)。根据该项目的需要,显示主菜单分实时数据、记录查询、参数设置、系统设置、参数校准、系统信息等六大项,而每项有多级子项,总共所有菜单条近300条。根据结构体菜单设计,菜单目录结构体及数据结构体部分示例如下。
4.1 主菜单目录
struct MenuItem code MainMenu[]=
{ {6,"-主菜单-", "1 实时数据", &NullData, RootMenu, ViewMenu, NullSubs},
{0,&Null, "2 记录查询", &NullData, RootMenu, FindMenu, NullSubs},
{0,&Null, "3 参数设置", &NullData, RootMenu, SetupMenu, NullSubs},
{0,&Null, "4 系统设置", &NullData, RootMenu, SystemMenu, NullSubs},
{0,&Null, "5 出厂校准", &NullData, RootMenu, DebugMenu, NullSubs},
{0,&Null, "6 系统信息", &NullData, RootMenu, HelpMenu, NullSubs},
};
4.2 子菜单目录
struct MenuItem code SystemMenu[]=
{ {3,"-系统设置-","1 通信设置",&NullData,MainMenu,ComSetup, CopyCom},
{0,&Null, "2 时间设置",&NullData, MainMenu, ClockSetup, CopyClock},
{0,&Null, "3 记录清除",&NullData, MainMenu, ClearSoe, NullSubs},
};
4.3 带显示数据子菜单目录
struct MenuItem code ComSetup[]=
{
{ 5, "-通信设置-","1 通信方式:", ComData, SystemMenu, &Null, NullSubs},
{ 0, &Null, "2 通信地址:", ComData, SystemMenu, &Null, NullSubs},
{ 0, &Null, "3 RS485速率:", ComData, SystemMenu, &Null, NullSubs},
{ 0, &Null, "4 CAN速率:", ComData, SystemMenu, &Null, NullSubs},
{ 0, &Null, "5 保存", ComData, SystemMenu, &Null, SaveCom},
};
4.4 菜单数据结构体
struct MenuData code ComData[]=
{ { 5, "Mode", 2, SetCom, ShowCom},
{ 0, "Addr", 2, SetCom, ShowCom},
{ 0, "RS485 Buad", 2, SetCom, ShowCom},
{ 0, "CAN Buad ", 2, SetCom, ShowCom},
{ 0, "Save", 1, SetCom, ShowCom},
};
5 目录式菜单的技术优势
本文提出的菜单设计方法在多个项目的显示单元中的应用实践,验证了该方案显著优点如下:(1)菜单目录基于C语言结构体定义,菜单内容及菜单项之间的关系明确,一目了然,阅读修改方便;(2)形成菜单目录后,增加、删除和修改菜单只需对应的菜单目录结构体和对应函数改动,不影响其他部分。(3)菜单条和数据融合成一体,显示丰富,操作简便;(4)所有功能采用函数指针调用,程序代码紧凑,运行稳定可靠;(5)目录式菜单框架通用性强,可移植性好;(6)根据设置参数或程序运行状态,可以实现动态变化的菜单。
6 结束语
本文介绍了基于C51的结构体和函数指针调用的特点,设计目录式菜单程序,并在矿用产品中成功的应用。通过该方法设计的菜单具有结构紧凑、性能稳定、功能强、移植性好等优点,具有很好的实用价值。
参考文献:
[1]陆铮,罗嘉.单片机C语言下LCD多级菜单的一种实现方法[J].工矿自动化,2006(01):48-51.
[2]童长飞.C8051F系列单片机开发与C语言编程[M].北京:北京航空航天大学出版社,2004.
关键词:C语言;程序设计;教学;结构体;实验
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2015)09-0163-02
Abstract: C language programming is a profession course in the computer special field of study, and it is usually the first programming course to the students. So the experiment teaching of the course is too important. It mainly discusses the teaching design of structures in this paper, which can help the students to grasp the basic knowledge about structures, and can solve problems by using arrays of structure and linked lists. It proves that the teaching design can stimulate the students’ study interest.
Key words:C language; programming; teaching; structure; experiment
《C语言程序设计》这门课一般是计算机专业学生入学时所接触到的第一门程序设计课程,这门课程需要学生掌握程序设计的方法,用C语言编程解决问题。在现实问题求解时,往往用简单数据类型描述问题对象时可能不是很方便和准确,例如,描述职工信息这样不同类型的数据组合时,这时就需要定义一种构造类型的数据结构来描述,这就是结构体。而且,本文认为结构体是实现了数据的封装,在一定程度上体现了封装的特性,对后续课程的教学有一定的启发性。所以,结构体教学是C语言程序设计的一个重要的部分,同样,在实验课教学中结构体的实验教学也是重要的一个环节,特别是链表方面的实验教学对后续课程,如《数据结构》起着基础性的作用。本文主要是对结构体的实验教学的设计进行探讨。
1 结构体实验教学的设计
结构体实验教学在教学时设计了3个实验题目,这三个实验题目的难度由易到难,试图让学生掌握结构体变量、结构体数组和链表的使用。
1.1 结构体变量的实验设计
结构体变量的实验属于结构体实验中比较简单的实验,这个实验就是让学生练习如何根据实际问题,用结构体定义自己所需的类型,再使用这种类型定义变量,编写程序去解决问题。
在实验教学中,教师要求学生解决如下的问题:要求用户输入三个点的坐标,编程判断这三个点是否可以构成一个三角形,如果可以则输出三角形的类型,即直角三角形、锐角三角形或者钝角三角形。这个题目在实验课上是以程序填空题的形式提供,这样既可以引导学生初次使用结构体进行编程,在填写缺失的代码过程中,锻炼学生的程序阅读能力。在题目设计中尽可能的考察学生以前的所学知识点,比如,函数形参、函数调用、选择结构编程等等。
这个程序填空题首先要求完成图1中所示的点的结构体的设计,从而让学生掌握如何根据实际需要来定义结构体这种类型。再要求学生完成图1中input函数和len函数的填写,让学生掌握如何使用结构体变量的成员分量,并注意函数的类型;judgeexist函数用于判断三个点能否构成三角形,在这个函数中强调逻辑运算符的使用,同时让学生注意函数的返回值类型,强调C语言的数据类型没有逻辑型,若想表示真假这样的逻辑型值可以用1和0这样的数值型数据来表示。
图2中的qcos函数在设计填空时主要考察的是指针的使用,让学生加深指针作为函数形参传递的是地址值这一个概念的理解。这个函数在编写时并不是很难,就是三角形余弦函数的使用,关键在于形参变量中指
针变量的引用,即诸如*cosA的赋值。而图2中judgetype函数就是依据三个角的余弦值来判断三角形是直角三角形、锐角三角形,还是钝角三角形。这个函数在设计填空时,主要是考察学生关系运算符的使用,以及嵌套的选择if语句的理解和应用。图3中主函数的设计填空主要是考察学生是否了解上述用户自定义函数的功能,并通过填写函数调用语句能正确的使用这些函数,此外,还考察了switch多分支语句的使用。
这个题目总体来说设计的并不是很难,当学生完成程序填空后,要求学生必须完成4种情况,即无法构成三角形、构成直角三角形、锐角三角形和钝角三角形的数据测试,通过输出的结果与预期结果作比较,从而检查程序是否编写正确。
1.2 结构体数组的实验设计
结构体数组的实验在结构体实验中是中等难度的实验,这个实验题目的设计主要是让学生掌握结构体数组的定义,让学生了解结构体数组元素的访问和其他基本数据类型的数组元素访问是类似的,如若要访问某个数组元素的成员分量时,需要在结构体数组元素后加上“.成员分量名”。
在实验课时,布置了如下的实验题目:输入职工的职工号、姓名、工资和出生年、月、日,按职工工资由高到低输出职工的职工号、姓名和周岁年龄。注意:输入“#”表示输入结束,假设最多只处理200个职工记录。此题在定义职工信息这种数据类型时,涉及到了出生年、月、日这种日期类型,而C语言的基本类型中没有这种类型,因此,教师可以引导学生先写出如图4(a)所示的日期类型struct date,再引导学生思考职工类型如何定义,提示学生职工信息包含出生日期这样的日期型数据,建议定义出如图4(b)所示的职工信息类型struct zg。一般地,学生会依据题目要求定义出struct zg的数组,其数组的大小为200。这个题目之所以这样设计就是希望通过这个练习让学生了解结构体类型中的成员分量没有具体类型要求,完全根据需要而设。
此题的另一个设计要点是排序算法在结构体数组中的应用,在课堂练习时,有的学生使用的是冒泡排序法,有的则使用选择排序法,但是在交换两个struct zg的数组元素时,有部分学生会注意交换结构体数组元素的成员分量,那么这时就需要声明交换结构体数组元素和交换整型数组元素的方法类似,将结构体数组元素看作一个整体。这个设计要点在于复习数组章节中所提到的排序算法。
此题最后一个设计要点是由已知的职工出生年、月、日求出该职工的周岁年龄,此处要求学生使用计算机的系统时间计算出职工的周岁年龄。为了能成功获取计算机的系统时间,则要求学生在帮助菜单或者网上查找C中“time.h”所定义的time_t这个数据类型,让学生了解typedef的用法;了解函数time()和localtime的用法,并能在程序中正确的使用;了解结构体struct tm,掌握该结构体中关于年、月、日表示的成员分量,让学生特别注意每个成员分量所表示的意义及其取值的范围,例如,成员分量tm_year表示的是年份,但是它的取值是从1900开始的一个整数,若想正确获得当前的年份值,应该是tm_year+1900。当学生能正确地完成获取系统时间的年、月、日的程序代码设计后,引导学生思考如何计算周岁年龄,实际上就是用if嵌套语句完成多分支结构的设计。这个设计要点是希望学生了解C程序设计过程中可能会出现书本上所未介绍过的知识,这就需要学生通过其他方式,例如查阅工具书或者上网等手段来获取所需的知识,同时,也复习了多分支结构的程序设计。
此外,在编程时要求学生尽量不要程序中只有一个main()函数,要尽量根据需要编写用户自定义函数。
1.3 链表的实验设计
链表实验的题目主要是让学生熟悉结构体与指针相结合,对链表有个初步认识,了解链表中的一些操作。题目与1.2中结构体数组的题目非常类似,但是要求必须用链表来完成,从而让学生熟悉链表这种结构。实验题目是:输入学生的学号、姓名和年龄,要求按学号由小到大输出学生的学号、姓名和年龄,要求输入“#”表示输入结束。这个题目解决的方法很多,因为学生初次接触链表,因此实验教学时没有提出任何方法的限制,只是要求学生用单链表求解,在求解过程中要求学生注意链表的创建算法,链表的输出算法,以及链表修改结点指针的一些操作。
首先,教师要引导学生正确的完成链表结点的定义,即指针与结构体相结合,学生信息结点的定义可以如图5所示。在求解问题时,需要学生注意结点指针的操作。实验课上,有的学生在输入学生信息时,即建链表时采用插入排序的思想,将待插入的学生信息的结点插入到已建好的且有序的链表中,用这种方法创建链表后,链表本身就是有序的,那么只需用循环结构输出链表就可以完成问题的求解。在实验课上,会发现有的学生有了这个想法但是算法编写有问题,教师在指导的过程中可以建议学生在建链表过程中,每插入一个结点后就完成当前链表的输出,从而有助于发现算法设计出错之处。
在实验课上,有的学生则先是创建链表,即将学生信息结点按输入的顺序插入到链表中,此时链表中的学生信息结点是无序的,再采用冒泡排序法或者选择排序法对链表中的结点调整顺序,最后编写循环完成链表输出。在调整结点时有的学生会出现算法思路不够清晰,有点混乱这种现象,这时教师可以建议学生在草稿纸画出链表结点的调整草图,再依据图示编写代码。在实验课上,有的学生采用排序算法调整结点时直接交换图5所示结点的no、name和age值,这种方法很便捷,但是达不到链表练习的目的,因此,教师可以鼓励学生再换一种算法。
2 结束语
本文给出了结构体实验教学的三个实验题目,这三个题目有各自的重点,而且题目有程序填空,也有程序设计,让学生由浅入深地逐步掌握结构体的定义,使用结构体变量和数组编程求解实际问题。并且实验题目中有的内容是对课本上的知识进行一定的扩展,力图培养学生的自学能力,因为在实际解决问题时,有的知识可能是课堂上没有提到的,因此,学生要学会查阅资料进行自学。
参考文献:
[1] 胡明, 王红梅. 程序设计基础――从问题到程序[M]. 北京: 清华大学出版社, 2011.
[2] 孙燮华. C程序设计导引实验与习题解答[M]. 北京: 清华大学出版社, 2011.
[3] 罗永龙, 方群. C语言程序设计[M]. 北京: 科学出版社, 2013.
全书共20章。1.Python编程101:对使用Python语言编程进行总体介绍,包括创建对象、对象调用方法、运算符重载、读取文件方法、XML文件等内容;2.计算复杂度:包括计算机体系结构介绍、常见的计算复杂性、摊销复杂度的方法等;3.递归:包括时栈和堆的概念、简单递归函数的编写、运行,递归计算机图形学、列表与字符串等;4.排序:包括选择排序、归并排序、快速排序、链表、栈和队列等内容;5.集合与映射:数独游戏介绍、集、散列等相关概念,最后分析规划问题;6.树:抽象语法树和表达、前缀和后缀表达式、解析前缀表达式、二叉搜索树等内容;7.图:包括图的定义及理论、存储结构及算法实现、Kruskal算法、Dijkstra算法、图的表示方法等;8.Bloom过滤器、Trie数据类型等相关内容;9.堆:包括堆的主要思想及其建立、排序算法、与其他算法的比较等;10.平衡二叉搜索树:二叉搜索树的概念、存储结构与性质、AVL树与 Splay树等具体实例;11.B树:包括关系型数据库的概念、B树的组织结构、优势、实现、B树的插入与删除等内容;12.启发式搜索:包括深度优先搜索与广度优先搜索、A*搜索、最佳搜索等相关内容;13.附录A:整数操作符;14.附录B:浮算子;15.附录C:字符串运算符和方法;16.附录D:列表操作符和方法;17.附录E:字典操作和方法;18.附录F:Turtle方法;19附录G:TurtleScreen方法;20.附录H:完整的程序。
作者Kent D.Lee博士是美国艾奥瓦洲路德学院计算机科学教授,已成功出版两本著作:Python编程基础和编程语言基础。另一作者Steve Hubbard博士是路德学院数学与计算机科学系教授。
本书介绍了初级与高级的数据结构和算法问题,每一章开始提供了学习目标,复习题和编程练习,以及众多的例证;同时在相关的网站提供可下载的程序和补充文件。本书可以作为计算机学科相关专业的教材或参考书,同时对计算机科技工作者也有参考价值。
关键词:循环结构;C语言程序设计;非计算机专业
中图分类号:TP393文献标识码:A文章编号:1009-3044(2012)26-6323-05
Discussion on Loop Structure Teaching in C Language Programming of Non-computer Specialty
XIA Yun
(College of Mathematics and Computer Science, Anhui Normal University , Wuhu 241000 , China)
Abstract: The teaching of loop structure is an important component in C language programming. This paper designed 5 teach? ing examples for the students of non-computer specialty. This paper analyzes the teaching progress in detail and emphasizes the teaching points of the loop structure teaching. And it produces a good effect in the actual teaching progress.
Key words: loop structure; C Language programming; non-computer specialty
大学计算机应用基础作为一门课程大约于20世纪90年代中期开设,现在已成为大学里的计算机学习基础课程,是所有非计算机专业大一新生的必修公共基础课,也是培养学生基本素质的一门重要课程[1]。作为大学计算机应用基础课程,理工类专业大部分会开设程序设计课程,有部分专业会开设C程序设计课程。C语言是一种语法灵活、适用范围广的高级程序设计语言。结构化程序设计方法有三种基本结构:顺序结构、分支结构和循环结构。顺序结构和分支结构比较简单,循环结构从教学上来说是重点也是难点。本文主要对C语言循环结构教学进行探讨。
1教学内容的分析
C语言循环结构编程主要涉及到三种循环结构语句while、do-while和for。本文作者认为非计算机专业开设这门课程,主要是讲解程序设计的方法,培养学生的编程能力和思维能力,因此,在教学中上述的三种语句可以以while语句为重点,讲解循环结构编程的思想,do-while和for语句可以简单举例说明它们的流程。在讲解循环结构编程分析时,可以以流程图或者用自然语言逐步描述操作步骤的形式,指出循环结构编程关键是找到在什么情况下需要反复执行某些操作,并找到这些反复执行的操作是什么。
2教学用例的分析
在课程教学过程中,需要用一些例子来配合讲解循环结构的编程。在教学时,选取一些比较合适的例子,可以很好地帮助学生理解所教授的内容。教师在教学过程中除了要加强课堂启发外,尽可能结合课程自身的特点,注重学生现场演练,并采用任务驱动、师生互动、鼓励学生等教学手段来提高其学习的主动性和积极性[2]。
2.1导入的例子
在教学活动中,讲授后面知识内容时要与前面知识相互呼应[3],因此,在上课时,可以以这样的问题开始,例题1:用户输入正整数n值的大小后,要求计算1+2+3+…+n,将所得出的结果输出。这个例题主要是复习前面的内容,复习输入、输出函数和分支结构的编程。该问题提出后,可以让同学们思考一下,然后再进行提问,提问时可以让学生说出编程思路,若课堂时间比较多也可以请学生直接编写源代码并运行。
提问时,有的同学可能给出如下的顺序结构编程的解答:
步骤1:输入整数n
步骤2:求s=(1+n)*n/2
步骤3:输出s
while (j
{输出i*j
j++;}
由此,得出在循环while (i
循环结构是结构化程序设计的一种重要结构,在教学中不仅需要学生掌握这种结构的语法,更重要的是培养学生的设计思维和思考方法,本文主要是从教学的角度,对循环结构的整个教学过程设计了5个教学用例,并对其进行展开分析,重点是让学生掌握循环结构编程的思想,实际上就是在问题分析过程中找循环条件和循环操作,在实际教学中取得了较好的效果。
[1]何文海,吴明珠,谢剑刚.情商与智商相结合的教学模式[J].现代计算机,2007(8):73-75.
[2]郭海花,陈允芳,王健.非计算机专业中“VB程序设计”教学方法初探[J].计算机教育,2009(18):98-100.