基于计算思维的中职C语言程序设计教学研究

2022-09-13 11:01王国兵
河北软件职业技术学院学报 2022年3期
关键词:醉汉空格数据结构

杨 伟,王国兵

(1.诸暨技师学院,浙江 诸暨 311800;2.浙江国际海运职业技术学院 图书馆数字技术中心,浙江 舟山 316000)

2006年,美国卡内基梅隆大学的Jeannette M.Wing周以真教授系统地提出了计算思维的概念[1],并指出计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等一系列思维活动。其后,陈国良院士、李廉教授、董荣胜教授对计算思维的概念进行了补充和发展。李廉教授指出计算思维的本质是抽象和自动化,计算思维是现代社会每个人必须掌握的根本技能。

一、计算思维的本质:抽象和自动化

计算思维没有严格的定义,国内外学者对计算思维的理解各不相同。笔者采用李廉教授的观点,即计算思维的本质是抽象和自动化。抽象指的是使用C语言的符号系统对现实生活中的问题进行精确而严格的描述,自动化指求解问题按照一定的顺序自动执行。

现实生活问题取值不变的数据抽象为常量,取值变化的量为变量,常量和变量都是C语言的操作对象。如果多个变量存在线性关系,可以用数组表示。中职C语言程序设计课程是程序类的入门课程,不涉及树、堆、栈、表等复杂的数据结构。教师可以结合中职一年级上学期的计算机应用基础课程进行讲解。冯·诺依曼计算机体系结构包括输入、输出、存储、运算器和控制器,其中存储是计算机非常重要的概念,计算机本身具有缓存、内存、磁盘等用于存储的硬件设备。如果要在计算机中进行存储,必须先分配空间并且指定空间的大小。定义好数据类型,便于分配一定大小的空间,也便于C语言根据数据类型进行运算。

计算思维的自动化本质内涵比较丰富,但是对于中职学生而言,如果要C语言自动执行一系列复杂的程序,必须借助if、switch等选择结构和for循环结构。循环结构是自动执行的核心,相对于人而言,计算机擅长机械地进行重复、有规律的操作。计算机重复执行指令千万次只在一瞬间,对于人而言不可想象,更重要的是计算机不会犯错且忠实的执行指令,对指令不会有第二种理解。因此,循环结构是中职学生理解计算思维自动化本质的核心。即使不考虑计算思维的培养,学生掌握好循环结构,对于定义数据结构和构造算法也是大有帮助的。

二、借助形象思维,降低学生思维坡度

理解抽象和自动化进而培养计算思维,对于中职学生来说是比较困难的。中职学生普遍数学基础差,而逻辑思维源于数学,因而中职学生逻辑思维和抽象能力欠缺。抽象能力的培养没有捷径可走,需要反反复复、循序渐进地练习。教师在C语言教学过程中,借助形象教学,降低学生思维坡度,将学生的具体形象思维转化为抽象逻辑思维。学生刚刚接触到C语言,对数据结构和算法很难理解,教师应尽量将算法用图像、图形、表格等形象化工具展示出来,再用中文讲解操作步骤并将操作步骤写出来,然后分析步骤之间的关系,找出规律。

笔者以案例1阐述如何借助形象思维培养计算思维。该案例是循环语句的经典例题[4]。

案例1输出图案,如图1所示。

图1 输出效果图

由于初学者抽象思维能力欠缺,教师采用启发式教学,引导学生用中文来描述问题。问题描述有三个基本要求:(1)全面,不能有遗漏;(2)准确,不能有歧义;(3)按照先后次序对所有步骤进行描述。学生的描述各种各样,一般典型的描述如下:

第1步,居中输出1个星号,回车换行;

第2步,居中输出3个星号,回车换行;

第3步,居中输出5个星号,回车换行;

第4步,居中输出7个星号,回车换行;

第5步,居中输出9个星号,回车换行。

将求解问题逐步用C语言来表达,发现用printf()函数无法对输出星号进行居中格式设置。教师引导和启发学生思考,在办公软件Word、WPS中居中输入星号,如果不进行字体格式和段落格式的居中操作,还有没有其他办法,部分学生会发现可以通过输入空格的方式来解决题目居中输出星号的要求,图1表示的案例1求解问题可以转化为图2(用正方形表示空格)。于是将中文描述进一步完善,星号后面的空格不用输出,printf(” ”)用回车换行操作即可,修改如下:

第1步,输出4个空格,1个星号,换行符;

第2步,输出3个空格,3个星号,换行符;

第3步,输出2个空格,5个星号,换行符;

第4步,输出1个空格,7个星号,换行符;

第5步,输出0个空格,9个星号,换行符。

图2 计算机实际输出的效果图

教师引导学生分析这5个操作步骤,从行数、总行数、空格个数和星号个数之间的关系进行分析和归纳,发现存在如下规律:第一,操作步骤顺序是1、2、3、4、5,行数是首项为1,公差为1的等差数列;第二,星号的数量是1、3、5、7、9,星号的数量是首项为1,公差为2的等差数列;第三,星号左边空格的数量是4、3、2、1、0,空格的数量是首项为4,公差为-1的等差数列;第四,每步操作的空格的数量*2+星号的数量=9=操作步骤的总数*2-1;第五,星号左边空格数量最多的是第1步操作,有4个,是操作步骤的总数-1;第六,星号最多的是最后一步操作,有9个,是操作步骤的总数*2-1。

程序=数据结构+算法,C语言程序设计是程序类基础课,中职学生没有学习过数据结构这门课,所以不会涉及到复杂的数据结构,数据结构只能是变量、常量和数组。算法就是对数据进行一系列操作,因此,构造算法时要将数据联系起来,分析数据与数据之间的相互关系,从而找到规律,再将规律转化为算法。

常量是对系统中取值不变的特征进行抽象,而变量是对系统中取值可以改变的特征进行抽象,案例1中输出星号的个数、输出空格的个数、操作步骤的顺序、操作步骤的总数都是可以变化的量,所以用变量表示。

定义变量K用来表示操作步骤顺序,变量N表示操作步骤的总数,将规律和变量K、N联系起来,再对上述5条规律进行选择和综合,发现“每步操作步骤输出星号的数量等于操作步骤顺序K*2-1,输出空格的数量等于操作步骤的总数减去操作步骤顺序,即N-K。

对中文描述进一步抽象,将输出空格和星号的数量和行数、总行数关联起来,可以用C语言转化为下述语句。

上述输出空格、星号和换行符都是重复操作,用最基本的循环语句就可以实现。应用模块化方法,先将复杂的问题进行抽象和分层,然后转化为一个个简单或者已知(用已掌握知识可以解决)的问题。语句1进一步转化为语句2。

三、分析步骤,抽象出规律

案例1的求解步骤有限,如果操作步骤比较多,对操作步骤逐步进行描述就很难进行了。这就需要对所有的操作步骤进行分析和抽象,一般情况下描述前三个步骤或者后三个步骤,然后分析这些操作步骤之间的相互关系,发现规律并抽象和描述,然后转化为一个个简单或者已知(用已掌握知识可以解决)的问题。

案例2:求和,1+2+3+……+100。

对求解问题的前三个操作步骤逐步分析,总结任意步骤,即第N步骤的规律,描述如下:

第一步,对1与2求和;

第二步,对第一步求和结果与3求和;

第三步,对第二步求和结果与4求和。

定义变量K,K用来表述操作步骤的次序。函数F(K)的返回值表示第K步骤的操作结果。前述求解过程的操作步骤和K,F(K)联系起来,描述如下:

第一步,K=1,求和结果是F(0)+K+1,F(0)初始值只有加数1,所以F(0)=1。

第二步,K=2,求和结果是F(1)+K+1;

第三步,K=3,求和结果是F(2)+K+1。

经过分析前三个步骤,发现第N操作步骤和第N-1操作步骤有规律,由此得出结论,第N步骤,K=N,求和结果是F(N-1)+K+1。

一个求解问题无论步骤有多少,只要步骤和步骤之间有联系并可以归纳出规律,且这种规律可以用数学和计算机工具进行描述,那么这个求解问题就可以转化为计算机问题。

四、借助计算思维,解决实际问题

案例3:醉汉在马路上走多少步就会掉到路边的沟里去。

这种现实生活中的问题,首先要对各项事物进行定义,建立模型,构想出解决问题的思路和步骤。马路如何定义,醉汉步速如何定义,为了简化模型,进行如下假设;

第一,醉汉走路距离长度一致,假设每步都为1;

第二,马路是直的,马路的宽度为10,长度为20 000,用坐标表示醉汉在马路上的位置;

第三,醉汉走路方向无法确定,方向有很多种,不妨定义八种方向,以道路的方向为基准,45度为方向变化的幅度,分为东、东北、北、西北、西、西南、南、东南,一共八个方向。

马路和醉汉步速定义完成后,进一步抽象,假设醉汉站在马路的中间位置开始走路,设置醉汉的坐标为X=0,Y=0。路边的沟就是Y=5或者Y=-5。如果醉汉没有掉到沟里,走到马路的尽头,则X=-10 000或者X=10 000。无论醉汉走到马路尽头或者掉到路边的沟里,醉汉都不再走路了,对于计算机程序而言,就是走路的程序结束运行。

醉汉走路描述如下:

定义变量K=随机函数();随机函数课本上没有提及,可以借助互联网搜索随机函数的相关代码。走路的方向有八种,随机函数就产生0、1、2、3、4、5、6、7数值。

醉汉朝不同方向走一步的代码如下:

对醉汉走路程序运行多次求平均值,就可以算出案例3醉汉掉到路边沟里的平均步数,求平均值的程序本文不再赘叙。

案例3比案例1、案例2的算法简单,但是抽象的难度比较大。对于现实生活问题,要用计算的办法求解,就要进行计算机建模与仿真。计算机建模,指借助于计算机建立数学模型、数值求解、定量研究某些现象或过程的研究方法。首先,在假设前提下,对现实生活中的复杂问题抽取比较典型的案例进行分析,复杂的现实生活问题就变成了可以计算的计算机问题。

四、基于计算思维的教学方法

经过多年教学实践,笔者总结出如图3所示的C语言程序教学方法[2]。

图3 教学流程图

求解问题,尽量运用图像、图形、表格等具体的方式形象地展示出来,便于通过形象思维准确理解该问题。用中文对操作步骤进行描述,如果操作步骤比较多,可以对前三步或后三步的操作步骤进行描述,分析步骤与步骤之间、单个步骤与整体操作步骤之间的关系,总结出规律。对现实生活中的求解问题中涉及到的数据进行抽象,构成合适的变量、常量、数组等数据结构。将规律和数据结构结合起来,总结出任意步骤的表示方式,最后构造算法程序。

总之,在程序设计课程教学中不能仅仅局限于程序教学本身,还要注重学生的自学能力、举一反三的思维能力和运用创造性思维解决实际问题等能力的培养。

猜你喜欢
醉汉空格数据结构
趣填成语
空格填数
数据结构线上线下混合教学模式探讨
为什么会有“数据结构”?
醉汉
略知一二
行乞
以为他是我
以为他是我
高职高专数据结构教学改革探讨