“C语言程序设计”课程指针的教学设计

2019-04-17 13:00马振婴
科教导刊 2019年7期
关键词:数组C语言程序设计指针

马振婴

摘 要 《C语言程序设计》课程的指针概念抽象晦涩,且容易混淆。在教学中引入游戏、动画加强课程的趣味性,并采用渐进式、对比式和启发式方法,提高学生的主动参与性。关卡式实验设计和程序改错练习巩固了学生的编程能力。

关键词 指针 C语言 内存地址 数组 函数

中图分类号:G424 文献标识码:A DOI:10.16400/j.cnki.kjdks.2019.03.047

Abstract In "C programming" course, pointer is abstract, obscure and confusing. Games and animation are used to make the course more interesting, and the progressive, contrast and heuristic methods are applied in order to promote the students' active participation. Level-by-level checkpoint experiment and error-correction practice can improve the students' programming ability.

Keywords pointer; C Language; computer memory; array; function

0 引言

“c语言程序设计”的课程内容中,指针是公认的难点。原因之一是学生无法理解内存地址和存储计算的概念,原因之二是传统的教学方法生动性和系统性不足。因此,学生们对这个章节有畏难情绪,学习积极性极低。针对上述情况,笔者进行了教学和实践环节的一些设计,以求抛砖引玉,与大家共勉。

1 课堂教学环节设计

1.1 内存地址和存储计算

传统教材对计算机内部数据存储和计算过程的叙述比较抽象和枯燥,因此笔者设计了以游戏的方式来增进学生对这部分内容的兴趣。用一个分格的纸盒模拟内存,每个格子用二进制地址编号;用卡片代表变量,卡片上写上变量名和变量值。学生们两个人为一组。一个同学随机喊出指令,另一个同学做出相应的动作。例如指令是“int a=0;”同学必须新建名字为a值为0的卡片放入随机空格里。指令是“return 0;” 必须把所有的卡片都从格子中取出。“输出&a的值;”指令对应着念出a变量存放格子的地址。“++*a”指令对应着把a变量卡片上的值加1。一轮20条指令,然后再交换角色进行。这个游戏反复多加练习,有助于同学们区分变量名,变量值和地址的概念。

1.2 指针和数组

这部分教学采用循序渐进的方法,从指针操作一维数组逐渐递进到二维数组。

1.2.1 指针与一维数组

对方格和卡片游戏进行升级。由普通变量卡片的随机空格存放,变为数组变量卡片的顺序存放,数组变量卡片存放的格子连续编址。另外开辟空格存放指针变量卡片,并涂上不同的颜色区分。游戏中用到的指令增加了定义指针变量、指针变量赋值、指针运算以及用指针取用一维数组元素等等操作。

在游戏的基础上,在课上用动画的方式给大家演示用循环控制指针使一维数组的元素逆序存放,以及一维数组排序经典算法的运算过程。动画和游戏给同学们带来了更直观更生动的体验。

1.2.2 指针与二维数组

二维数组的知识点中出现了更多的易混淆概念,宜采用对比法进行教学。

(1)一级地址和二级地址。在二维数组中,内存编址变得更加复杂,出现了行地址、一级地址和二级地址。数组名(指向行地址的地址)为一级地址,行地址(指向元素的地址)为二级地址。因此在游戏中增加行指针,一级地址和二级地址的模拟。用二维方格表示二维数组(逻辑结构),用红色标记一级地址,蓝色标记二级地址,并分别模拟指针的纵向(沿行)移动和横向(沿列)移动。

(2)逻辑结构和物理结构。二维数组在计算机内存中的存储是一维线性的,但是在逻辑上却表示为m行n列的矩阵形式。这是必须让学生明确区分开的两个概念。虚拟的行地址是物理结构向逻辑结构转化的关键。在学生能够辨别指针中存储的是一级还是二级地址后,开始加入逻辑(二维)模式和物理(一维)模式地址之间的相互转化练习,即逻辑模式下的i行j列元素地址对应物理模式下的第i*M+j个元素。

(3)综合范例演示:用动画演示用指針操作二维数组转置的过程。

1.3 指针和函数

这部分的重点是指针做函数的参数。采用渐进和对比教学法,以及启发式讨论法。先给出两个完成相同功能的程序,结构都是主函数加一个子函数。两个程序的子函数分别采用普通变量做参数,以及指针做参数。提出以下问题并引导学生分组讨论:(1)函数声明及定义时形参写法的区别。(2)函数调用时实参数据类型的区别。(3)传递数组地址和传递数组单元素的区别。(4)函数体内部对形参处理方式的区别。(5)函数计算结果返回方式的区别。学生完成分组讨论后,做得好的小组给予表扬和奖励,并在全班同学面前进行展示,最后由教师点评。

2 实验教学环节设计

2.1 关卡式

指针与数组的实验设计成关卡式,共三个关卡,由简单到复杂。实验内容是扫雷游戏的模拟(布雷过程)。

(1)一维区域布雷。在个一维格子(用一维数组模拟)里随机布m个雷,有雷的格子用*表示,无雷的格子用#表示。如图1。这一关学生可以初步体验通过指针移动取用数组元素的原理。

(2)生成对应的数值矩阵,有雷的格子记9,无雷的格子记该格周围(左右)所有格子中的雷的数量。如图2 。这一关加强指针对一维数组的操作练习。

(3)二维区域布雷。从n个元素的一维格子拓展到n*n的二维格子。布雷的规则同关卡1和关卡2,但计算格子周边的雷数目的算法更加复杂。如图3和图4。这一关学生练习用指针操作二维矩阵行,列元素。

2.2 对比式(函数)

指针做函数参数的编程错误率高,容易打击学生的信心。因此采用程序改错法,使学生先了解易错的地方,然后再进行正式编程。

改错范例:用指针做函数参数的方式实现数组的每个元素加1 。

#include

#define N 3

void addone(float * g); //易错点1

int main()

{

float number[N]={60,75,80};

addone(number); //易错点2

for(int i=0;i

printf(“%.3f\n”,number[i]);

}

void addone(float * g)

{

for(int i=0;i

(*(g+i))++; //易错点3

}

在以上三个易错点,模拟各种出错的可能,反复让学生进行程序调试和改错。然后再让学生改写这个范例,用void addone(float g[])和float addone(float g)的形式实现同样的功能。

3 教学效果及结论

《指针》章节的单元小测平均分为65.326,比去年提高了7.1%。实验报告8分以上的同学人数占比提高10%。蓝墨云答疑活动的参与人数和问题数量分别增加22%和36%。由此可证本文所述教学设计取得了一定的成效,但是仍需要进一步提高教学方式和实验内容的丰富性、趣味性和系统性。

参考文献

[1] 霍艳玲,王党利.c语言中指针使用技巧探[J].邢台职业技术学院学报,2006.23(5):71-73.

[2] 王必晴.论c语言指针的启发式教学[J].福建电脑,2010(8):40-42.

猜你喜欢
数组C语言程序设计指针
JAVA稀疏矩阵算法
JAVA玩转数学之二维数组排序
郊游
更高效用好 Excel的数组公式
为什么表的指针都按照顺时针方向转动
以“学生为中心”的《C语言程序设计》教学设计探究
基于翻转课堂的《C语言程序设计》课程教学系统的实现与研究
浅谈《C语言程序设计》课程的教学改革
《C语言程序设计》课程的教学改革与实践
寻找勾股数组的历程