杨仪 代祥光 张先休 吴鸿娟 朱丙丽
摘 要:本文通过求素数和文件读写等两个实例展示了对比法在C语言教学中的应用。通过简单实例帮助学生理解编程思想,提高学生的动手实践能力。
关键词:C语言;对比法;教学实践
1 引言
C语言是目前大多数高校开设的程序设计入门课程,且通常在大一学年开设。由于C语言基础语法知识繁琐,涉及到数学、数据结构等众多学科,对大一新生来讲,比较抽象复杂。如何让学生对C语言学习不产生畏难情绪,是摆在任课教师面前的一道难题[1-4]。C语言是一门实践性很强的学科,单纯采用PPT授课容易让学生对程序语言学习失去兴趣,教师在课堂上讲解运行程序演示,让学生在电脑上操作实践,分析对比各种不同的算法,体会C语言程序的精妙之处,能够提高学生的编程能力和激发学生的学习热情。
2 同一问题采用不同算法实现
求素数是C语言中的一个经典数学例题[5-6],实现它的算法有多种,通过不同算法的比较,让学生能够体会实现同一问题可以采用多种算法,各种算法各有优劣,加深对问题的理解。
2.1 用定义法求素数
用定义法求素数,首先要知道素数的定义。素数是大于1的自然数,除了1和它本身外没有其它数能被素数整除。用定义法求3到100之间的素数,实现程序如下:
#include
int main()
{ unsigned int i, j, flag; /* 用flag作标志*/
for (i=3;i<=100;i++) /*外层循环判断3到100之间的自然数哪些为素数*/
{ flag=1; /* 首先默认这些数都是素数 */
for(j=2;j
if(i%j= =0) /*能整除,不是素数,标志设为0 */
{ flag=0; break; /* 内循环结束 */
}
if(flag= =1) /* 若flag为1,i是素数 */
{ printf("%4d, ",i); } /* 输出素数 */
}
return 0;
}
以上程序是利用定义法求素数,优点是简单明了,好理解。缺点是需要循环的次数很多,存在一部分不必要的循环次数。可以缩小内层循环控制变量j的取值范圍,即控制变量j取值从2到i/2即可。内层循环代码修改为:
for(j=2;j<=(i/2);j++) /*内层循环控制变量j取值从2到i/2*/
这个程序相比用定义法求素数有了一定的改进,循环的次数是定义法求素数循环次数的一半,但是循环次数还不是最少的。相比于定义法,用根号法求素数的算法循环次数更少。
2.2 用根号法求素数
for(j=2;j<=sqrt(i);j++) /*内层循环控制变量j取值从2到*/
用根号法求素数比用定义法和基于定义法改进的求素数的算法循环次数要少,是目前比较常用的求素数的算法。除了这两种方法,求素数还有埃氏法、欧氏法等等。这些都可以根据学生的接受能力选择其中两种或多种方法作对比讲解。
3 同一问题的不同实现形式
3.1 将源文件内容反序写入目的文件
以下程序实现的功能是,打开一源文件将其中内容复制到字符数组buf中,再将buf数组中的字符反序写入一目的文件。
//读出文件sfile.txt中的内容,反序写入另一个文件dfile.txt中
#include
#define BUFF 100
int main ( )
{ FILE *sfp , *dfp; int i=0; char buf[BUFF];
if ((sfp=fopen("sfile.txt","r" ))==NULL) /* 打开源文件 */
{
printf("源文件无法打开!\n" ) ; exit(1) ;
}
if ((dfp=fopen("dfile.txt","w" ))==NULL) /* 打开目的文件 */
{
printf ("目标文件无法打开!\n "); exit(1) ;
}
while (!feof(sfp)) /* 判断是否文件尾,不是则循环 */
{ buf[i++]=fgetc(sfp); /* 读出数据送缓冲区 */
}
while (- -i>=0) fputc(buf[i],dfp); /* 反序写入目的文件中 */
fclose(sfp); fclose(dfp); return 0;
}
这个程序实现了将源文件的内容读出然后最终写入目的文件,但是目的文件中的字符顺序和源文件中相比是相反的,例如在源文件sfile.txt中输入“hello”保存,程序运行后则dfile.txt中字符串为“olleh”。这是教材例题,但实际中更需要源文件和目的文件内容一致,这个时候就可以引导学生思考,怎样改写这个程序将源文件中的内容按顺序写入到目的文件中。有了前面反序写入的程序,学生就比较容易通过修改前面反序写入的程序实现顺序写入。
3.2 将源文件内容顺序写入目的文件
只需要将反序写入的程序下面这一行代码
while (- - i>=0) fputc(buf[i],dfp); /* 反序写入目的文件中 */
改为
int j=0;
while (j
程序的修改比较简单,只需要另外定义一个局部变量j,让j取值从0开始,j小于buf数组中存放的字符数i,也就是源文件的字符数,这样就变成将buf数组中字符顺序写入目的文件,例如在源文件sfile.txt中输入“hello”保存,程序运行后则dfile.txt中字符串为“hello”。
总结 作者在C语言整个教学过程中都贯穿了这个对比教学法,通过简单实例的对比,降低了教学难度,大部分学生对所解决的问题有了更深层次的理解,学生在学习的过程中学会了举一反三,达到了良好的教学效果。
参考文献:
[1] 樊新華,郭晓宇,陈洪军,et al.基于案例的C程序设计实验教学的探索[J]. 现代计算机(专业版),2019,638(02):79-83.
[2] 程艳.《C语言程序设计》教学中“类比”法的运用[J].职教论坛, 2003(18).
[3] 崔孝凤.C语言用户自定义函数案例教学设计[J].电脑知识与技术,2019,15(09):142-143.
[4] 黄文钧.“联系”与“类比”在《C++/C语言程序设计》教学中的应用[J].广西民族大学学报:自然科学版,2012,17(2):95-97.
[5] 杨路明.C语言程序设计教程(第四版) [M]. 北京邮电大学出版社, 2018.
[6] 谭浩强. C程序设计(第四版)[M].清华大学出版社,2010.