基于可解释的C语言程序设计教学案例分析

2019-09-10 07:22余红宴
卫星电视与宽带多媒体 2019年24期
关键词:C语言教学案例程序设计

【摘要】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— ),男,湖北黄冈,副教授,博士。现主要从事工程教育方向的研究。

猜你喜欢
C语言教学案例程序设计
基于OBE的Java程序设计个性化教学研究
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
医学专业“Python程序设计”课程教学改革总结与思考
“C语言程序设计”课程混合教学探索
基于C语言的计算机软件编程技术探究
中职C语言单片机课堂教学中的趣味性探讨
计算机原理中C语言的应用价值
小学数学课堂导入技巧及案例分析
反转课堂模式与数学教学案例