【摘要】C语言程序设计是计算机专业的核心专业平台课程,掌握C语言程序设计的设计思想是关键。从一个教学案例出发提出可解释的C语言程序设计的教学思路,希望对C语言程序设计的教学得到一些交流和启发。
【关键词】可解释性;C语言;程序设计;教学案例
前言:当前,作为人工智能技术核心内容的机器学习、深度学习已经成为学术界和工业界的一个热门话题。然而,一直以来,基于机器学习、深度学习的模型可解释性很差。因此,仅仅考虑机器学习、深度学习所遵循的 “输入输出满足”原则对某些问题而言可能是远远不够的。追求因果关系是科学研究的一个持续动力,我们应该考虑模型对问题世界的可解释性。
C语言程序设计的课程教学不仅要充分考虑与计算机组成原理(硬件)、算法、数据结构(软件)的紧密联系,还要注重每个概念、问题背后的可解释性,不让学生陷入“计算机是一个黑匣子”学习误区。本文从一个教学案例出发,提出可解释的C语言程序设计的教学思路,希望对C语言程序设计的教学得到一些交流和启发。
1. 案例提出
例题求方程ax2+bx+c+=0的实数解。
编程如下:
01 #include<stdio.h>
02 #include<math.h>
03 void main()
04 {
05 float a,b,c,x1,x2,disc;
06 printf(“input a,b,c: ”);
07 scanf(“%f%f%f”,&a,&b,&c);
08 if (fabs(a)<1e-6)
09 printf(“The question is not a quadratic”);
10 else
11 {disc=b*b-4*a*c;
12 if(disc<0)
13 printf(“The question has not real root”);
14 else
15 if(fabs(disc)<1e-6)
16 printf(“The equation has two equal roots:%8.4f,-b/(2*a)”);
17 else
18 {x1=(-b+sqrt(disc)/(2*a);
19 x2=(-b-sqrt(disc)/(2*a);
20 printf(“The question has distinct real roots:%8.4f,%8.4f,x1,x2”);
21 }
22 }
23 }
學生提出问题,程序的第08和15行,好像跟自己的理解不一样。学生认为第08行是表示a=0,判别是否为一元二次方程。第15行是判别式disc=0,判别是否有两个相等的实数根,为什么要写成fabs(a)<1e-6和fabs(disc)<1e-6呢?这是一个好问题。
2. 案例解释:C语言中“0”的认识
这个问题可以归结为C语言中的“0”的认识问题。作为“0”,在计算机的内存中、输入、输出时将以怎样的形式存在?首先,我们思考一下,计算机是一个资源有限的机器。因此,对于仅有的CPU、内存等资源管理十分严格。其次,我们先前定义了变量int m;这是给变量m定义一个变量类型,给变量x分配内存空间大小;还有变量名m是给变量一个存取的地址。
接下来,我们看第05行我们定义了变量a,disc是float类型变量,输出是%f格式。再看一下%f对应的输出格式表示什么?表示按小数形式输出十进制实数(单精度),并输出6位小数。
总之,在C语言中“0”的存在形式是这样的,绝对值小于10-6 的实数是被认定为“0.000000...”。这就是对变量的值在计算机的内存中如何存、如何取、如何输入、如何输出的解释。
3. 解释的循环
实验设计 在Dev_C++6.0平台验证“0”的输入输出及其表示。
编写程序:
#include<stdio.h>
void main( )
{float a,b,c,d;
printf(“print a,b,c,d:”);
scanf(“%d%d%f%f”,&a,&b,&c,&d);
printf(“%d%d%f%f”,a,b,c,d);
}
验证输入:0.0001,0.00001,0.000001,0.0000001
验证输出:0.000100,0.000010,0.000001,0.000000
正如我们所思考的一样。绝对值小于10-6 的实数是被认定为“0.000000...”也即是“0.000000”。
4. 解释再循环
我们似乎达到了完美的理解,得到很好的解释,可是我们还是看看“0”表示的边界在哪里?于是我们又做了一次验证设计。
验证实验1:
验证输入:0.0000004,0.0000005,0.0000006,0.0000009
验证输出:0.000000,0.000000,0.000000,0.000000
似乎再一次验证了我们的想法。可以当我们进行下面的验证时,情况变得不可解释了。
验证实验2:
验证输入:0.0000009,0.0000009,0.0000009,0.0000009
验证输出:0.000001,0.000000,0.000000,0.000000
这又变得不可解释了,我们继续讨论,最后决定换一个开发平台实验。
5. 换个开发平台实验
我们换到开发平台Eclipse+MinGW GCC上验证实验。
验证实验3:
验证输入:0.0000009,0.0000009,0.0000009,0.0000009
验证输出:0.000001,0.000001,0.000001,0.000001
这个结果让我们觉得可以理解,四舍五入就可以解释了。而且这与条件限制相互也不矛盾。反思在浮点类型的数据里,计算机的平台不同,对于浮点型数据的表示不同。
6. 教后反思:基于可解释的课程教学
从这个案例出发,我们可以看出基于可解释的教学是可能的。特别是计算机的课程,不能把计算机变成一个不可解释的“黑匣子”,变成一个神秘所在。运用解释学的方法,在教师与课程文本之间建立理解、師生之间建立理解和对话的关系。教师与课程设计者之间不应该是单独的课程工作者,而是以合作者身份共同参与课程的开发和实施。解释一直是人类存在的方式,其根本特征是对为什么(Why)问题的解答。当构成问题和解答的命题具有经验可检验性并且为真,而解答与问题之间在科学上具有解释相关性时,这才能称之为科学理解,相应的解释称为科学解释。教师要与学生一起“对话”,共同承担科学理解的任务,一起来体验、认识和理解计算机的局限性,人的局限性,课程文本教材的局限性,更加深刻的理解人类创造的艰辛和伟大。教师作为反思性的实践者,在科学文本教学时,可以参考可解释的哲学,把教学改革推向一个新的科学高度。
参考文献:
[1]张长水.机器学习面临的挑战[J].中国科学:信息科学,2013,43(12):1612-1623.
[2]杨路明.C语言程序设计教程(第3版)[M].北京:北京邮电大学出版社,2015.
[3]张志林.科学解释与理解类型[J].科学技术与辩证法,2003(03):29-31+43.
[4]王凌超,吴乐娇.理解与对话:从哲学解释学视角透析教师与课程的关系[J].淄博师专论丛,2019(01):15-18.
作者简介:余红宴(1971— ),男,湖北黄冈,副教授,博士。现主要从事工程教育方向的研究。