时间:2024-05-04
樊新华,郭晓宇,陈洪军,郭志
(东北大学计算机科学与工程学院,国家级计算机实验教学示范中心,沈阳110819)
2012年,教育部等七部门联合颁布《教育部等部门关于进一步加强高校实践育人工作的若干意见》的文件,其中着重提出了强化实践教学环节和深化实践教学方法改革,要求制订实践教学标准,增加实践教学比重,并重点推行基于问题、基于项目、基于案例的教学方法和学习方法,加强综合性实践科目设计和应用[1]。2016年,全球著名的Indeed和Glassdoor等门户网站通过收集数据,以总结出全球最受欢迎的编程语言及行业内最需要的编程语言,发现C语言依然是编程人员最受大家欢迎的编程语言之一[2]。
《C程序设计》是大学的一门实践性计算机基础课程,实践教学对学习具有重要作用,尤其是信息类专业。《C程序设计》对后续课程学习至关重要。徐一秋等将PBL教学法应用于程序设计实验教学中,强调以“问题”为中心,以学生自学为主的教学改革[3];陈婷采用“阶梯式”、“案例式”课堂教学方法,以“项目驱动式”实践教学为核心,同时搭建多种自主学习平台,采用更科学和完善的考核方式[4]。这一系列C程序设计实践教学改革,对提高实践教学效果,促进学生掌握程序设计知识,提高编程能力起到了一定促进作用。
因此,根据我校的工科程序设计的实际教学安排及多年的C程序设计实践教学经验和总结,提出了专题案例教学方法并应用实验教学实践中,对学生的思维能力和编程能力的培养有明显的提高。
C程序设计的实践教学,一直是教学工作者探索的一个问题。实验题目的选择和设计,对学生编程能力的培养起到了至关重的作用。其中,黄宏博在函数实验教学中,设计了不同层次的不同问题,并根据学生的水平选取相应的题目[4]。卢瑾等根据学生的认知过程的阶段性和实验难易的层次性,提出了一种阶段式分层实验教学方案[5]。周靖将一个大项目分解成小项目的训练题目,并应用在不同章节部分的实践教学中[6]。但是,这些实验题目内容之间相互独立或题目难度过大,对大多数学生来说,不能激发学习的兴趣,也不能培养学生思维能力。
因此,根据实验性质和不同培训目的,可将程序设计课程实验分为基础验证型、设计开发型和研究创新型三个类型[5-6],并且要求学生熟练掌握基础验证型实验,基本掌握设计开发型实验,鼓励掌握研究创新型实验。设计实验题目时,按照阶梯式思路设计,一步一步地提出相关编程要求,引导学生思考和分析问题。题目前后相互关联,功能进一步完善,以培养学生的逻辑思维能力,引导学会如何解决实际问题[7]。
在C程序设计实践教学中,将紧密相关的知识,做成相应的专题案例,如有趣的整数、素数探索、猜数游戏、小学四则运算、数值计算、方程求解、学生成绩管理等。每个案例所涉及的问题,按基础验证型、设计开发型和研究创新型进行设计,前后问题相关联系,且难度一步步加深。
由于实验课时有限,为使学生在有限的课堂时间掌握更多的内容,必须精心设计实验案例。本文以“素数探索”为例,说明具体案例设计过程。
素(质)数不仅是小学所学数论中的最基本的、最重要的概念,也是信息学竞赛(NOIP)和程序设计竞赛(ACM)中常考的数论知识,而且在密码学中的加密解密算法中,素数也被广泛应用于公钥和密钥的产生。另外,企业招聘的程序设计面试和计算机等级考试中也有一部分很典型的考题就是素数问题的处理。在《C程序设计》教程中,都会有以素数为主题的例题和编程题目[8],但只是一些零散的知识。在此,以素数的概念为基础,并依据学生认知的特点,从易到难的顺序进行“素数探索”专题案例设计[9-10],具体内容如下:
所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。
问题1:素数判断
判断一个正整数是否是素数。
问题2:区间素数
(1)判断1-200之间有多少个素数,并输出所有素数。
(2)求m 和 n之间(m<=n)的所有素数,并求所有素数和。
问题3:素数分解
(1)(哥德巴赫猜想)将任意一个大于6的正偶数分解为两个素数之和。
(2)将一个正整数分解质因数。例如:输入90,打印出 90=2×3×3×5。
问题4:特殊素数
(1)因为151既是一个素数,又是一个回文数(从左到右和从右到左是看一样的),所以151是回文素数。写一个程序来找出范围[a,b](5<=a<=b<10000)间的所有回文素数。
(2)如果n和n+2都是素数,则称它们是孪生素数。输入m(5<=m<=10000),输出2个均不超过 m的最大孪生素数。例如m=20时候,答案为17、19,m=1000的时候,答案等于881、883。
这些题目主要应用到逻辑结构和循环结构的相关知识,要求学生熟悉逻辑结构和循环结构的使用方法及程序测试方法,并掌握解决问题的一些常见算法。
在实验教学过程中,应用实验教学系统平台对C程序设计实验进行全程管理,主要包括实验发布、预习测试、实验指导和实验报告递交等。
(1)实验预习
实验预习是对实验涉及的知识的复习,并深入了解实验内容,学生必须注重这一环节。通过实验教学系统发布实验内容,学生可以根据实验目的和要求,提前检查自己对实验所涉及的基本概念和基础知识的掌握程度,并独立完成所布置的相关测试,对错题的知识点进行查漏补缺。同时,要求学生对于实验内容中的题目进行分析、写出解题思路并画出流程图,然后编写出程序。
(2)实验讲解
在每次实验课前,对于实验中所用到的基础知识和基本技巧进行讲解,就上述专题案例讲解如下:
首先,讲解实验过程中需要的基础知识,主要包括:
①控制结构语句的格式及使用方法,及使用中的注意事项;
②数组的定义、初始化和输入输出方法;
③函数的定义方法、调用方法、参数说明以及返回值,掌握实参与形参的对应关系,以及参数之间的“值传递”的方式。
其次,学会分析问题的方法,并会使用流程图表示算法;掌握一些常用算法,并在编程过程中体验各种算法的编程技巧,进一步学习调试程序,掌握检查语法错误和逻辑错误的方法;分析程序运行效率并进行优化程序。
(3)思路与要求
对于上述案例的实验教学,对每个问题给出要求和提示,并一步步地提出相关问题,引导学生分析问题,最后完成编程和程序测试工作。具体教学过程如下:
问题1:
主要用到C语言中的分支和循环结构。首先输入一个数,判断输入数是否为正整数。其次判断一个正整数m是素数有多种方法:
①让 m依次被2,3,…,m-1除,如果 m不能被2~m-1中的任何一个整数整除,则m是素数。
②让m依次被2,3,…,m/2除,如果m不能被2~m/2中的任何一个整数整除,则m是素数。
③让m依次被2,3,…,sqrt(m)除,如果m不能被2~sqrt(m)中的任意一个整数整除,则m为素数。sqrt(m)为m的平方根。
引导学生用不同的方法来实现素数的判断,并提示用到了sqrt()函数时,别忘了引入头文件#include<math.h>。
为了减少循环判断的次数,提高程序的执行效率,因此,编程需要想办法减少循环的检查次数。通过比较这三种方法的执行次数的数量级,明白程序优化方法,第③种方法判断速度最快,可以采用这种方法。
问题2:
(1)主要用到C语言中的分支、循环和循环嵌套结构的知识。提示学生应用问题1的方法进行素数的判断。也可以要求在显示输出结果时,要求每行输出5个素数,最后一行显示总个数,等等。
(2)方法同问题2(1)。但要判断输入m和n值是否符合要求,并给出相应的提示信息。
问题3:
(1)设n为大于等于6的一个偶数,可将其分解为n1和n2两个数,分别检验n1和n2是否为素数,若都是,则该数得到验证。若n1不是素数,就不必再检查n2是否为素数。先从n1=3开始,检验n1和n2(=nn1)是否为素数。然后使n1+2再检验n1,n2是否为素数……直到n1=n/2为止。
(2)从1到N先找出最小的质因数,如果等于本身,那么说明只有一个质因数,如果不是,那么将该质因数打印出来,并将N/该质因数作为新的N值进行运算。
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
①如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
②如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
③如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
改进:因为在所有的质数中只有2是偶数外,其他的质数都是奇数。所以i可以一次+2跳过所有的偶数。不过2要特别处理。
问题4:
(1)对于判断一个正整数是否是回文数,应该首先要明白回文的概念,其次是如何将一个正整数进行反转过来,最后是判断是否是回文数。如何将一个正整数进行反转有不同的方法,可以应用循环、取模、整除的知识;也可以转换成字符串,可以使用字符串操作的进行反转。求正整数反转的方法很多,这里提供一个简单的方法,代码如下:
int m=0;
while(n>0)
{
m=m*10+n%10;
n=n/10;
}
就可以将n进行反转数位,变为m。
(2)可以把所有满足条件的孪生素数找出来再比较大小,但这样过于繁琐,所以,我们只需用一循环,从小于m的数开始倒序查找符合条件的孪生素数,一找到就输出,那输出的便是最大孪生素数了。
在实际编程过程中,考虑问题必须全面、严谨。例如这里讨论的是素数,所以输入条件时,一定要对其输入值判断,使其满足实际和题目的要求。可以用不同方法实现,例如可使用筛选法(Eratosthenes)求出素数[10],并用数组保存整数。
当生成大量数据时,可以将数据保存到文件中,就涉及到文件的读写知识。可以将这些问题应用到不同章节中,在控制结构部分,练习分支、循环结构的知识;在数组部分,练习数组的定义、读写的知识;在函数部分,练习函数的定义、调用的知识;在文件部分,练习文件的创建、读写的知识。
在实际实验教学中,对基础不同的学生,设计不同的问题,实行分层实验教学。通过这种分层案例可以让学生掌握所学程序设计知识,更进一步训练了学生分析实际问题能力和创新思维。
(4)实验考核
为了真正从程序设计能力角度对学生进行评价,采用以下几方面进行实验课程的考核,并各项分配不同的权重,以期激发学生平时注重实践和能力培养。
①现场验收:通过学生讲解、提问、答辩等方面的表现,了解学生对分析问题、编程技能、程序测试能力的水平。
②自主创新:在所实现程序的基础上,进一步提出新的要求,以考核学生的自主思考与独立实践能力。
③实验考试:通过一组编程题目,测试学生对解决实际问题的编程能力。
④实验报告:实验报告要求规范性与完整性,重点要写清设计思路和程序清单。
C程序设计的实验环节对学生实际动手能力和解决实际问题能力的培养有着重要作用。根据学生兴趣和专业的实际情况,结合实验教学的目标和要求,提出实验专题案例教学方法。通过一个具体的“素数探索”专题案例,说明专题案例的设计、实验教学的全过程。在专题案例设计中,所提问题的知识点前后相关、难度依次加强;在专题案例实验教学中,对不同问题提出不同要求并实现编程。将专题案例教学法应用到《C程序设计》实验课中,大大地提高了学习编程的兴趣,激发了学生讨论问题的热情。同时,使学生掌握程序设计知识,培养了学生分析问题和编程能力,并养成严谨缜密思考问题的习惯。另外,要达更良好的教学效果,实验教学环节还需要进一步重视对学生引导。专题案例实验教学法对于其他语言程序设计(如C++、C#、Java、Python等)的实验教学,也是一种有益的借鉴。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!