翁省辉,吴方
(北京理工大学珠海学院计算机学院,广东珠海519085)
C语言作为程序设计的入门课程,我校各理工科专业均有开设。该课程的主要目的是培养学生的计算思维能力,初步掌握程序设计和程序实现方法,对培养学生程序设计基本思想、利用计算机求解问题能力有着重要的意义[1-2]。
本文针对学生在学习该课程中普遍存在的一些问题,探讨以渐进式案例教学为主线的模式,使学生更容易掌握课程知识点。本次探讨并不是完全放弃传统的教学方式,而是将两者有机结合,教学过程中将案例教学融入传统教学中[3]。
以北京理工大学珠海学院面向全校非计算机专业开设的C语言程序设计课程为例,该课程重点讲授计算机基础、进制转换、C语言简介、编程环境、基本数据类型、标识符、运算符、输入输出、顺序结构、分支结构、循环结构、数组、字符串、函数等内容,而课程学时为48学时。
由于课程性质以及学时等原因,传统教学容易出现注重语法算法知识,辅以例题讲解,学生被动地接受知识[4]。这类方法虽能较好地保证知识的系统性,但是容易导致学生死记硬背知识点、学习兴趣不大、掌握知识不牢固等问题,不能充分发挥学生学习的兴趣,导致教学效果较差。
教材中的传统案例多数以数学知识为主[5]。一方面我校部分学生数学较薄弱,对案例的理解有一定困难,并且离实际应用较远,学生普遍存在疑惑:学习C语言到底有什么用,无法感受C语言带来的成就感与自豪感;另一方面这些案例大都围绕知识点设计成一个个独立的案例,无法有效串联起来。
渐进式案例教学是指在教学过程中以一个综合案例做为主线来展开教学,功能由简到难,不断引入新问题,利用每个章节的知识点逐步解决问题、完善功能,最终达到一个完整的、具有较强实际意义的综合案例,从而培养学生兴趣、培养学生分析、解决问题的能力的一种教学方法。具体实施时,先向学生展示案例的最终效果,然后逐步引导学生完成。
该教学模式有以下几个原则:
教学案例的选择直接影响学生的积极性。兴趣是最好的老师,如果案例没选好,学生初学时很难认可它的价值,学习缺乏目地性。这就需要在选择案例时要充分考虑其趣味性,让学生产生兴趣,从而调动学生的学习热情。
学生参与讨论是案例教学重要的一环,通过分析案例,学生可由被动学习变为主动,教师组织学生讨论,并通过恰当的引导,让学生主动提出问题,并思考如何解决。
初始的案例可能覆盖部分知识点,这就要求要对案例进行扩展,既要符合实际需求,又要尽量覆盖大部分知识点。
本文所采用的案例是一个定时关机的综合案例。多年的演示情况可以看出学生对这个案例表现出较大的兴趣。整个程序的运行结果如图1所示。
图1 定时关机运行界面Fig.1 Timing shutdown operation interface
下面以课程教材李凤霞教授主编的《C语言程序设计教程(第3版)》[6]为例,列举该案例覆盖教材中的章节内容和知识点(我校非计算机专业学生只要求讲到函数,如有需要,案例可以再进行扩展),如表1所示。
表1 定时关机案例覆盖的章节内容及知识点Tab.1 Timing shutdown case covered sections of content and know ledge points
例中的关机功能是通过执行DOS命令中的shutdown来实现的,所以在讲解案例前需要讲解一些预备知识点。首先需要讲解shutdown这个命令以及参数的意义,然后再讲解stdlib.h中的system函数的用法。最简单的关机代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("欢迎使用定时关机程序 ");
system("shutdown-s-t 100");/*“-s”表示关闭计算机,“-t”表括示设置关机倒计时,后面的100是时间*/
return 0;
}
取消关机代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
system("shutdown-a");/*“-a”表示取消关闭计算机*/
return 0;
}
下面就以上两段代码探讨渐进式案例教学。
在学习完最简单的HelloWolrd程序之后,就可以利用printf函数和转义符‘ ’在关机代码的基础上进行主界面设计。主要代码如下:
printf("---------------------------------- ");
printf("欢迎使用定时关机程序! 1表示关机 2表示取消关机 0表示退出 ");
printf("---------------------------------- ");printf("请输入您的选择: ");
不难看出,以上的代码分别实现了关机和取消关机功能,能否将以上代码合在一起实现一个既可以关机又可以取消关机的程序?接下来可以引导学生应用所学知识来实现此功能。该问题的解决包括3个方面:
1)如何实现让用户输入自己的选择。此时可以使用scanf函数,同时提醒学生注意标识符的命名规范以及良好的代码规范。主要代码如下:
int choice=0;
printf("---------------------------------- ");
printf("欢迎使用定时关机程序! 1表示关机 2表示取消关机 0表示退出 ");
printf("---------------------------------- ");
printf("请输入您的选择: ");
scanf("%d",&choice);
2)如何跟据用户的选择完成相应的功能。此时可以使用多分支if语句来实现。值得注意的是,学生经常将”==”与‘=’混淆,此时可以故意写漏一个‘=’以加深学生的印象。另外,此时可以讲解1==choice与choice==1的区别,前者能够避免将”==”写成‘=’而编译器检查不出的问题。主要代码如下:
if(1==choice)
{
system("shutdown-s-t 100");
}
else if(2==choice)
{
system("shutdown-a");
}
else if(0==choice)
{
/*此处代码之后再添加*/
}
else
{
printf("您的输入有误! 请重新输入: ");
}
3)程序运行后一旦用户完成输入程序立即退出。这一问题可以通过引入getch()函数(需要添加头文件conio.h)来解决。在程序语句return 0之前添加getch()即可实现。
以上的程序只能让用户做出一次选择,而且一旦用户输入错误,程序运行结束,程序设计不够人性化,此时通过引入while语句和break语句可以解决这一问题。主要代码如下:
while(1)/*条件为1,永远满足,会一直循环直至break
退出*/
{
if(1==choice)
{
system("shutdown-s-t 100");
}
else if(2==choice)
{
system("shutdown-a");
}
else if(0==choice)
{
break;/*此处在3.2的基础上增加break是为了在用户输入0时跳出循环*/
}
}
以上的代码实现了定时关机功能,但是时间并不能由用户自己指定,案例的实用性大打折扣,此时可以引导学生使用scanf函数让用户输入一个时间(int型),然后通过使用itoa函数将int转换成字符串型,最后使用字符串函数strcat函数将两个字符串连接在一起。主要代码如下:
int hour=0,minute=0;
int seconds=0;
printf("请设置关闭超时时间:如1 20表示1小时20分钟后关机,请输入 ");
scanf("%d%d",&hour,&minute);
seconds=hour*3600+minute*60;
char strTime[20];
itoa(seconds,strTime,10);
char strCommands[30]="shutdown-s-t";
strcat(strCommands,strTime);
printf("系统将在%d小时%d分钟(%d秒)后关闭! ",hour,minute,seconds);
system(strCommands);
在讲解函数这一章节内容的时候将以上代码中功能相近的代码写在一个函数中。如3.1中主界面中的代码可以作为一个函数的函数体。主要代码如下:
void PrintUI
{
printf("---------------------------------- ");
printf("欢迎使用定时关机程序! 1表示关机 2表示取消关机 0表示退出 ");
printf("---------------------------------- ");
printf("请输入您的选择: ");
}
C语言程序设计课程概念抽象、语法枯燥、知识众多,对学生的学习带来很大的压力。鉴于该课程的重要性,应该对该课程进行各种探索,本文提出的教学模式也是一个尝试。多年的实践结果表明,本文中的定时关机案例能够让学生认识到C语言的实用性,引起学生的极大兴趣,能改变学生被动学习的局面,取得了较好的教学效果。
[1] 徐大华.C语言程序设计教学探索[J].信息技术,2010(12):26-28.XU Da-hua.Discussion on teaching-method with C programming language[J].Information Technology,2010(12):26-28.
[2] 葛文庚,蔺莉.程序设计基础课程教学模式研究与设计[J].电子设计工程,2012(4):44-46.GE Wen-geng,LIN Li.Research and design of the program design foundation course teaching[J].International Electronic Elements,2012(4):44-46.
[3] 徐新海,林宇斐.注重计算思维的启发式C语言语法教学[J].计算机教育,2014(17):1-4.XU Xin-hai,LIN Yu-fei.Pay attention to the heuristic C language grammar teaching of Computational Thinking[J].IT Education,2014(17):1-4.
[4] 米磊,贲可荣,赵皑.“面向学生”的C语言教学方法研究与实践[J].计算机工程与科学,2014(A1):5-9.MI Lei,BEN Ke-rong,ZHAO Ai.“Student-Oriented”teaching method of C language[J].Computer Engineering&Science,2014(A1):5-9.
[5] 刘淑娴,阿里甫·库尔班,李晓华.简单案例为主线的教学模式在C语言教学中的应用[J].计算机教育,2011(4):89-93.LIU Shu-xian,A Li-pu·KU Er-ban,LI Xiao-hua.Application of a simple case of the main line of the teaching model in C language teaching[J].IT Education,2011(4):89-93.
[6] 李凤霞.C语言程序设计教程[M].3版.北京:北京理工大学出版社,2011.