地方高校C语言程序设计课堂教学内容探讨

2021-06-28 18:39洪留荣
电脑知识与技术 2021年10期
关键词:数据类型C语言程序设计表达式

洪留荣

摘要:针对C语言程序设计课对于地方高校初学者学习上的困难,本文探讨了在课堂教学上的一些教学思路。从数据类型、表达式以及复合语句三个方面探讨了教学上应关注的重点和核心,分析了这样做的优点,强调了课堂教学从教材上提炼相关课堂内容的重要性。

关键词:C语言程序设计;课堂教学;数据类型;表达式;复合语句

中图分类号:G642      文獻标识码:A

文章编号:1009-3044(2021)10-0117-03

C语言程序设计是计算机类专业的重要专业基础课,教授的对象一般是高校低年级学生,地方高校学生优点是视野天阔、个性强、接受新事物的能力强,不足之处在于自控能力差、缺乏目标、自我学习能力欠缺。因此,目前出现了诸多教学模式的探讨。文献[1]提出了基于“学习成果导向”理念的计算机基础教学改革模式,从教学设计到最后的评价进行了改良;文献[2]针对学生能力提升问题改了教学模式,提出了培养学生C语言编程能力和工程实践能力的教学模式;文献[3]和[4]从教学的教法上进行了C语言教学改革,分别讨论了翻转课堂和网络教学模式的应用;文献[5]从精炼课程内容上入手并提出了“MOOC+翻转课堂教学模式”。这些改革的方法均发挥了各自的优点,考虑到无论教学模式如何,将课堂教学内容简化、厘清知识的本质是最根本的问题,它可以有效提升学生学习的兴趣,使学生乐于进一步探索学习,更好地发挥新教学模式的作用,从而有效地培养他们的计算思维能力和编程能力,因此,本文从三个方面探讨C语言程序设计课堂教学的教学思路,抓住本质,简化学生理解难度。

1 以“数据类型”与“地址”统领整个C语言程序设计教学

绝大多数人在谈到C语言时,都把“指针”作为它的精华,但这只对了一部分,C语言真正的精华在于“数据类型”,从指针的运算、格式符对值的解释、各种数据类型的转换、数组及函数等均是在“数据类型”这个概念的基础之上处理的,而且指针仅是一种数据类型,其表现出的形式是整型值。

基于此,在课堂教学中,从讲述常量和变量的概念起,把重点放在内存地址的概念以及格式符对内容的解释上,包括存放的字节数、符号位、存放的格式与数据类型的关系,以及获取值、赋值、格式符与数据类型的关系,培养学生理解数据与数据类型的密切关系,讲清了这种关系,学生就可以快速地理解各种类型数据的核心本质,从而准确地理解类型提升与强制转换这些概念以及在这些过程中发现的变化,也为后续需要用内存解释C语法打下很好的思维基础。比如,初始时,把握了这个本质学生自己就很容易解释像float型数据用“%d”输入输出时出错的现象,少犯一些自己无法解释和无从修改的低级错误,这些错误如果经常出现对许多初学者的学习积极性打击非常大,从而失去学习的兴趣。

数组作为重要的构造类型,在C语言中占重要地位,它的应用非常灵活,数组名的意义是关键内容,许多高校使用的教材把重点放在了数组所定义的变量上,重点讲述各变量的引用,这使得学生在后续的数组作为参数以及与指针的关系理解起来困难非常大,经常出现一个例程中的语句照抄到自己的代码中也出错的现象,尤其是二维数组、多维数组这些复杂的结构。因此,在数组一章中,如果用数据类型对数组名和它的元素进行分析,指出数组名本身的数据类型就是数组本身;数组名作为表达式的操作数时是地址(sizeof(数组名)、&(数组名)除外),此地址指向的数据类型就是数组元素的类型,这样,学生就可以很容易把数组名赋值给指向一维数组的指针、指针数组、多级指针时,从数据类型的角度考虑问题。这样当用数组名作为实参传值给指针类型的形参时,就容易正确定义形参的数据类型及结构。当时参与形参类型不一致后出现的运行错误,可以再根据数据类型这个关键的东西进行分析。

强调数据类型,可以非常明确地把指针变量转换成C语言的基本数据类型变量一样的思维方式来理解,指出指针变量就是一个变量,只是类型与基本数据类型不同,其存放的是整数形式的值,即地址,因为前面讲述的地址概念到此处学生已经非常熟悉,已经形成良好的思维模式,所以理解起来很容易,所以此时的指针概念只是地址换了一个说法而已。

为了突出指针变量是“值”且数据类型为指针类型的概念,在教学过程中,把声明指针变量的一般写法,如教材上定义指针变量的方式,如int  *p;,强调成(int*) p;这样的方式,指出数据类型为(int *),后面只是一个简单变量,并提醒学生引用时数据类型的一致性;这样,把指针变量使用的思维与使用一般基础类型变量的方法统一起来。强调指针变量的数据类型相同指的是它指向的数据类型一致这个概念。例如,二维数组名作为实参时,其对应形参的写法就非常容易理解了;再如函数指针(*fun)(),强调不同函数的数据类型不同,学生就可以快速理解一个函数指针做形参的意义以及实参的正确写法。

在抓住了这些本质以后,一些同学还可以比较好地理解像这样的函数指针数组int (*s[10])(int),并且可以正确调用它,而这并不在教学内容之列。

这种以数据类型为纲的教学思路,可以把构造类型的变量转换成基本数据类型这种简单的变量进行理解。从笔者多年的教学经历来看,学生对指针和数组(包括二维数组、多数数组、多级指针)之间的传参、指向一维数组的指针、指针数组以及函数指针这些相对较复杂的概念理解起来并不存在大的困难,有些平时训练多一点的同学,可以写出水平较高的代码,调试时遇到的一般性问题通常有解决的思路。学生如果有了这些核心知识和思维的铺垫,指针一章的教学内容并不是困难的。

以数据类型为主线,同时对后续结构体类型、共同体类型等都可以转换成基本数据类型的思维方式来理解,只需要强调一下各自类型的独有特点就可以了,比如结构体类型成员变量的赋值、输入与输出等,剩下的教学重点就可以放在算法思维上了,即如何应用结构体这些数据类型解决链表问题。

有了数据类型这个本质基础,在课后阅读别人所写的纷繁复杂的代码时,也就变得相对容易,从笔者的教学经历来看,学生如果把握了数据类型这种C语言本质,就可以很好地理解本科生C语言程序设计教学大纲上规定的重点和难点,加之适当编程练习和阅读代码就可以把握核心内容。更重要的是学生持续学习C语言的能力增强,这是因为能理解代码增加了他们学习的积极性,有了积极性,学习C语言兴趣更高,更加乐于去实践,更能加强理解,起到一个良性循环的作用。

2 以表达式的值统领各表达式的讲解

地方高校学生在开始接触C语言时一般在低年级,并没有好的计算思维能力,很多人在入学前,没有真正接触过台式电脑,因此往往以一般性逻辑思维和高中时的数学表达式思维来看C语言的表达式,经常会以一般的逻辑方式去考虑问题,而许多教材所给内容又恰好加深了这种误解,例如,所给的例题多类似if(x>60)这样的写法,如果教师也以这种方式去讲解,许多学生就会陷入“如果x大于60就执行什么”的思维方式中,因而,对表达式的理解就不透彻,比如对于后续常用的像if(!x) 、while(1)这样的写法理解起来非常吃力,要花时间去讲解这些()中的表达式要作为逻辑表达式或关系表达式等内容,给学生造成思维上的混乱。所以,表达式的讲解一定要以C语言标准上(如C11、C17标准)的定义进行简化,强调表达式的结果是一个值,以值的方式去理解,单个变量是一个表达式、函数是一个表达式,表达式中的运算符,根据优先级和顺序点参与运算,它们都有一个最后的结果值,这样学生对诸如x=3、a>b>c这样的表达式理解起来就方便了。有了这种基础,后续讲解选择语句、循环语句等就()中的表达式值以0和非0值作为统一标准进行讲解,即当表达式为非0时执行语句,为0时不执行语句,这样,初学者对if(!x) 、while(1)写法理解起来就很容易,并很快能阅读并编写出类似的代码,也不会把“a>b && b>c”这样的表达式写成“a>b>c”。因此,强调表达式的值,可以统一所有选择语句和循环语句中涉及的表达式部分,可以用“值非0执行,0不执行”这样简单的话来描这类语句的执行过程。这不仅适用于关系表达式、逻辑表达式,也适用于函数表达式,同时也与_Bool类型的值统一。

3 以复合语句统领选择语句和循环语句

C语言初学者一般容易理解基本的选择语句和循环语句,代码阅读不会存在大的困难,也可以写出比较简单的程序代码,但对于这类语句的嵌套结构理解起来就相对困难,像if-else语句if部分和else部分分别嵌套有if或if-else语句;for循环中又嵌套其他循环的情况。对于这些知识点,可均以复合语句作为切入点进行教学,以while循环为例,首先给出while语句的基本语法结构:

while(表达式) 一条语句;

强调上述全部代码是一条while语句,其执行过程为当表达式值非0时,只执行其后的一条语句,如果当表达式值非0时,需执行多条语句,需要用{}括起来。这个一般教学中都会讲到,但很多教材并没有强调{}是一条复合语句,如果把{}这个看成一条语句,则while{}后面如何复杂,都与while语句定义的格式一致,是一条while语句。比如有以下代码:

while(i>1)

{

printf("%d ",i);

for(j=1;j

{

jc=jc*j;

}

while(a--)

jc=jc+5;

i++;

}

t++;

按照上述以语句的分析方法,把while循环作为一条语句,则学生很容易看出整个代码实质上是两条语句:

while语句

t++;

while()后跟一条复合语句,执行的过程是先把while语句执行完成,再执行t++;语句,然后再介绍while中的复合语句的分析,它只包含四条语句:

printf("%d ",i);

for语句

while语句

i++;

外层while()中的表达式值非0时,依次顺序执行这些语句。因为把循环看成了一条语句,这也意味着这四条语句中先执行完printf("%d ",i);,然后执行for这条语句,这条语句执行完才执行后面的while语句,所以从顺序上看这非常清晰,学生容易理解,且须记的内容很少。

把问题拆成一条一条语句的讲授方法,有以下好处:

(1)选择语句、循环语句以语句统一,函数体内语句就可以用简单的顺序结构进行思维。对于初始者,这样的简单描述,使学生容易理解、掌握程序代码的执行过程,如果当教学中没有给出这种简易的结构说明,而只是用一段代码来说明什么是多重循环且用代码来解释它们的运行过程,大多数学生的注意力往往就会集中在每一行代码本身,缺乏整体的概念。强调复合语句看成一条语句,可以把表面非常复杂的代码进行简化,让学生容易从整体上把握编程的思路,培养他们的算法思维能力,同时可有效提升他们的编程能力和阅读代码的能力。

(2)可以间接培养学生函数递归调用的部分思维,为后续学习函数打下基础。选择语句、循环语句当中的复合语句可包含选择语句、循环语句,虽然这部分内容没有讲述到“递归”的概念,但这里实际上已經切入了函数递归调用的部分思维,这种思维就是外层中有相同内层。

(3)可以为模块化编程打下思维基础。这里复合语句虽然没有说明模块化,但用整条语句进行分析,可以让学生体会到一条语句是作为一个整体,一条语句可以包含多条语句,以完成一定的任务,这些虽然在课堂教学中没有指出,但这样的方式显然可以引导学生做这样直觉性的思考,从而为后续模块化编程的教学打下思维基础。

4 结束语

C语言这种简洁紧凑、灵活方便计算机语言,学好它有一定难度。从整体上讲,一般地方院校的学生自学能力和学习积极性相对不足,更需教师在课堂教学上多下功夫。我国古代最早一篇专门论述教育、教学问题的论著《学记》中强调的教师应“其言也,约而达,微而臧”[6],因此,提炼出C语言的本质,以简单的过程描述复杂的问题显得非常重要。本文把前后教学内容有意识的提炼、提前铺垫,用简单的方式去解释C程序设计中纷繁复杂的代码,使学生易于理解,更好地提升他们的学习兴趣,培养他们的算法思维能力和编程能力;思维的铺垫可以让学生在前期逐步形成学习后期知识的所需的思维意识,这样后续新知识的学习就相对容易。

参考文献:

[1] 张翠平,赵晖.基于“学习成果导向”理念的教学研究——以C语言程序设计课程为例[J].计算机教育,2020(3):153-156,161.

[2] 陈涛,朱俊,裔传俊,等.面向编程能力培养的C语言教学模式研究[J].计算机教育,2020(1):100-103.

[3] 何迎生,王从银.基于慕课的C语言程序设计翻转课堂教学实践[J].计算机教育,2020(1):160-163.

[4] 骆春妹,袁三一.基于网络教学平台的C语言课程教与学研究[J].教育教学论坛,2020(9):372-373.

[5] 李薇,黑新宏,王磊.C语言程序设计课程的金课建设实践[J].计算机教育,2020(6):142-146.

[6] 王凌皓,姬天雨.中国古代师道观评析[J].河北师范大学学报(教育科学版),2019,21(1):15-20.

【通联编辑:光文玲】

猜你喜欢
数据类型C语言程序设计表达式
详谈Java中的基本数据类型与引用数据类型
如何理解数据结构中的抽象数据类型
一个混合核Hilbert型积分不等式及其算子范数表达式
表达式转换及求值探析
浅析C语言运算符及表达式的教学误区
范畴数据类型上的子类型*