赵素萍
(山西农业大学信息学院信息工程系,晋中 030800)
案例嵌套;案例驱动;循环嵌套
编程难已经是我国传统灌输式教学下导致的不争的事实。因为编程必须通过大量的动手实践才能掌握的一项技能。就好比玩游戏,如果将玩游戏作为课堂教学的一部分,课堂上教师讲游戏规则,讲的学生都快睡着了,下课的时候给学生们说你们课后要多练习。等到学生练习了时候又忘了规则是什么,相信很多学生都是干脆放弃不玩了。
同样道理,编程其实就是玩的过程,像搭积木一样,一个模块一个模块地编好,然后整合到一个项目中,最后由测试人员在运行中寻找错误,并将错误反馈给编程人员修改然后再测试,依此反复,直到能成功运行。如果将编程放到课堂上讲,只会将学生的兴趣一点点的消磨掉。正如当我碰到我们学校其他系的同事时,很多人都说“编程好难呀,我当时就没学会”。可想而知,当时的好学生都学的一知半解,传统教学是真的不适合实践性强的课程。
为了吸引学生的学习兴趣,平时要多注意大学生关注的流行元素,将他们生活中的元素融合到教学案例中。
案例教学法指教师在教学过程中,以真实的大学生生活情境或事件为题材提出问题,在讲授知识点的过程中提出小的案例,引导学生解决问题,当学生掌握当堂课的知识点后,分析案例并引导学生解决问题。该方法是激励学生主动参与学习活动的一种教学方法。
每堂课开始时,首先回顾完上节课的内容后,抛出一个大案例,案例的特点必须是之前的知识点不能解决的问题。然后是本堂课内容的讲授,而知识点的讲授又必须引入多个小案例,即案例嵌套。学生学习完本节课的内容后,通过引导学生将大的案例解决。通过提出问题-分析问题-解决问题的流程,帮助学生掌握当堂课的知识点。此外,通过该案例的解决又可以加深对当堂课内容的掌握。最重要的是,学生知道为什么要学,学了能干什么,从而提高学生的获得感。
应选择学生熟悉的案例,这样容易开展案例分析与功能挖掘。然后采用自顶向下的程序设计方法,具体分析案例将实现的功能。下面通过《C语言程序设计》这门课的两个教学实施案例过程来介绍案例教学的应用。
(1)案例九九乘法表
该案例所涉及到的知识点为循环嵌套。通过多年的程序设计课程的教学发现,循环嵌套是较难掌握的知识点,通过案例嵌套法讲解后,学生的掌握效果良好。
先回顾for循环的执行流程,主要通过叫后排学生回答问题的方式来复习前面的知识点,这种做法的好处是:①减少学生玩手机的现状;②提高学生的注意力;③提示学生该知识点的重要性;学生掌握了for循环的执行流程后,让学生分析一个例子:
for(i=1;i<=5;i++)
{for(j=1;j<=5;j++)printf(“%d,%d”,i,j);
printf(“ ”);}
根据学生掌握的for循环执行流程的知识点,通过提示引导的方式,学生能猜出运行结果,然后在软件中运行程序,结果如图1:
图1 执行结果
通过对结果的观察,可以发现,外层循环的循环变量i为行,内层循环的循环变量j为列;该结论是非常重要的,一定要在讲课过程中多次强调。在此基础上,要求学生思考如何写成九九乘法表,即:
i*j=z(z为i和j的乘积)如2*2=4
回忆格式输出的知识点,即可得出只需要将输出语句从:
printf("%d,%d",i,j);
修改为:
printf("%d*%d=%d",i,j,i*j);
同时将行列的范围改为1-9,得出的结果如图2:
图2 不对齐的执行结果
通过观察发现,从美观上来说,并没有对齐。提示学生规定结果z的最小宽度,如果宽度不够,让计算机补空格而不是人为补,若规定z最小宽度为3,则当z宽度为1则补2个空格,为2时补1一个空格,即可实现对齐,通过对知识点的提示,学生即会答出,将上面的输出结果改为:
printf("%d*%d=%-3d",i,j,i*j);
通过对结果的分析,并和九九乘法表对比,即可得出,列j的范围不能超过所在行的行数,即将内层循环改为:
for(j=1;j<=i;j++)printf(“%d*%d=%-3d”,i,j,i*j);
结果就是我们熟悉的九九乘法表,如图3:
图3 九九乘法表
通过一步一步的引导,学生是可以自己写出九九乘法表的。看到最终的结果时,学生脸上洋溢的笑容告诉我,案例驱动的教学方式不仅是可行的,而且是要大力提倡的。因为该教学方式不仅让学生掌握了所要学习的知识点,同时学生也明白了为什么要学习,以及学了可以做什么。达到真正的学以致用,达到应用型本科院校的教学要求。
(2)游戏提示界面是否继续的制作
该案例应用到的知识点是改变循环执行状态的语句,包括goto、break和continue;这三个语句有类似之处,也有区别。首先通过一个动画让学生对三个语句有个初步的印象:
图4 三个语句的作用
首先复习循环嵌套,根据九九乘法表输出由符号“*”构成的三角形,引导学生将直角三角形转换为金字塔的形状,即:
图5
计算机执行的过程其实是对现实世界的模拟,先让学生想象在Word中输入金字塔的步骤,第一步应该先输入空格,第二步输第一行的“*”,第三步输换行,至此第一行输入完成。下面行同第一行。问题是每一行前面的空格数是怎么确定的呢?
假设总行数n,当行数为i时,i行的空格数为k,星号数为j;
i+k=n、i=j
通过分析得出,空格数应该为n-i,*的个数为i,程序为
for(i=1;i<=5;i++){
for(k=1;k<=5-i;k++)printf(“”);//输出所在行的空格数
for(j=1;j<=i;j++)printf(“*”);//输出所在行的*
printf(“ ”);}
当i为1时,输出空格的语句循环执行4次,每次输出一个空格,即为4个空格。输出*的语句循环执行一次,每次输出一个*,即为1个星号。
根据对goto语句的作用分析,然后使用goto语句实现不输出第二行的空格,即当行数为2时,跳过空格直接输星号;
If(i==2)goto JumpSpace;
for(k=1;k<=5-i;k++)printf(“”);//输出所在行的空格数
JumpSpace:
for(j=1;j<=i;j++)printf(“*”);//输出所在行的*
根据对continue语句的作用分析,然后使用con⁃tinue语句实现不输出第二行,即当行数为2时,结束本次循环;
If(i==2)continue;
根据对break语句的作用分析,然后使用break语句实现只输出前三行,即当行数为4时(输出前3行后,i变为4)结束循环。
If(i==4)break;
在掌握了三个语句的作用后,通过对同一个图形的变换,熟悉中又加入了一点点挑战,学生能积极主动地动脑筋,跟着教师的思路走,学生的学习兴趣浓厚,教学效果非常好。
然而这还不够,学以致用才是学习的最高境界,即必须让学生明白学了这堂课可以做什么。而学生正处于对游戏敏感的时期,将所学知识应用到游戏中,也是学生比较感兴趣的案例。
案例分析:用户输入1时重新开始,为了更形象地帮助学生了解continue、break和goto的含义,加入了提示语句“啊!夭折啦”。当用户要退出时加入“拜拜啦”;当用户输入有误时加入“不要捣乱”。
图6
现在几乎人手一台智能手机,很多学生上课玩手机已经成了不争的事实,如果能将学生玩手机和课堂教学结合起来,就会达到一石二鸟的效果。通过观察发现,目前几乎所有的付款方式都可以通过扫码付款,慕课版教材上都有二维码扫码下载教学资料。通过Internet搜索,发现有二维码生成器可以将文件上传并将案例文件制作成二维码,将生成的二维码放到PPT中,学生即可通过扫码的方式下载源程序,以供学生课堂或课后学习。
图7
当今社会信息化高速发展、智能产品已经生活化。大数据、云计算、物联网、人工智能等新兴技术已经成为学校和社会非常受欢迎的热门行业。对于每一个学习计算机知识的学生,想要掌握其中的一种或多种技术,都要通过大量的实践来获得。教师在这个过程中必须由浅入深地寻找大量的贴近学生生活的案例,充分调动学生的学习积极性,激发学生的兴趣。根据应用型本科院校的教学特点,从教学实践出发,阐述了“案例驱动”教学法的应用,提供了二维码分享教学资料的方法。实践证明,教学效果显著。