基于案例的C语言数组教学

2017-09-30 03:01熊启军谷琼屈俊峰
现代计算机 2017年24期
关键词:数组赋值C语言

熊启军,谷琼,屈俊峰

基于案例的C语言数组教学

熊启军,谷琼,屈俊峰

(湖北文理学院数学与计算机科学学院,襄阳 441035)

针对数组在《C语言程序设计》课程教学中承上启下的重要作用,围绕数组的概念、基本操作、应用和拓展、以及教学方法等方面,通过实例对易犯错误、注意事项、算法及其技巧等展开讨论,目的是为了更好地促进和启发教学,提高教学效率。

C语言;数组;算法;教学方法

0 引言

程序设计课程群贯穿于计算机类专业的整个学习阶段,而《C语言程序设计》则是它们的基础,学生对该课程的掌握程度直接决定其学习兴趣、专业发展、就业方向等。因此,对《C语言程序设计》的教学研究层出不穷、经久不衰。在该课程中,循环结构是重点、数组和函数是升华、指针和结构体是难点,且数组和函数承担着承上启下的作用,凸显了这两章的重要性。文章将采用案例,围绕数组的概念、声明和定义、操作以及应用中的易犯错误、重点、难点等问题,综合运用多种教学方法展开探讨。

1 数组的概念

数组的概念是一组类型相同的数据组成的一个序列。短短的一句话,表达出了三个意思:一是数组中数据的个数是多个(即数组的容量或实际元素个数),二是数组中的数据都是同一种类型的(即数据元素的类型),三是数组中的数据是有次序的(即元素的值)。这三个方面再加上数组名(即代表数组的标识符)一起构成了数组的四要素,且这四要素在数组的基本操作、数组的应用等方面都必须完整地体现出来[1]。这是学习者必须深刻理解和领会的。

2 数组的声明和定义

如何声明或定义一个数组、如何访问数组、如何输入输出数组元素的值,这些属于概念性的内容,必须记忆和理解。下面以使用最频繁的一维数组为例进行讨论。

2.1 数组的声明

数组的声明必须体现出数组四要素中的三个,它们是数组元素的类型、数组的名称、数组的元素个数。假定要声明一个类型为整型、容量为100、名称是arra⁃yA的一维数组,通常使用下述两种方式:

int arrayA[100];

或者

#define maxSize 100

int arrayA[maxSize];

这两种声明数组的方式都只表达出了数组的三个要素:即数组的类型、数组的名称、数组的容量。由于所有元素没有值,所以不能参与运算。数组元素没有值就去参与运算,这是学习者常犯的错误之一。

在声明数组时,数组名后方括号中的数据只能是一个正整数或者结果是正整数的常量表达式,绝对不能含有变量、也不能空缺。因为这个正整数固定了该数组的最大容量。方括号中使用变量或者空缺,是学习者常犯的错误之二。

2.2 数组的定义

一般,把在声明数组的同时给数组的所有元素整体赋值称为数组的定义。即将数组的声明、赋初值放在一起一步完成。即数组的定义是将数组的四要素一并完整地展现出来了。若将声明和赋值分开,则不能称之为数组的定义,且以后只能给数组的元素一个一个地单独进行赋值。

一维数组的定义通常使用下述几种方式(以一维整型数组为例):

(1)同时指定数组的容量和所有元素的值。

例如:

int arrayA[10]={1,3,5,7,9,0,2,4,6,8};

这个定义表明:数组的容量是10(实际元素的个数也是10)、每个元素都指定了确定的值。

但是,

int arrayB[5]={1,3,5,7,9,0,2,4,6,8};

则是错误的。因为数组的容量不能小于元素的个数。

(2)同时指定数组的容量和前部分元素的值。

例如:

int arrayC[10]={1,3,5};

数组的容量是10(实际元素的个数是10)、前3个元素指定了确定的值、后7个元素取缺省值0。

或者

int arrayD[10]={};

表示数组的容量是10(实际元素的个数是10)、所有元素都取缺省值0。

这种方式要求缺失的、取缺省值的只能是后部分的元素,不能是前面的、中间的元素。譬如:

int arrayE[10]={1,3,5,,8,6};

这个定义就是错误的。

(3)指定数组所有元素的值、同时省略数组的容量。因为根据元素值的个数,可以反推数组的容量。譬如:

int arrayF[]={1,3,5,7,9,0,2,4,6,8};

指定的值有10个,数组的容量也就是10。

当然,

int arrayG[]={};

则是错误的。因为无法确定数组的容量。以上几种定义数组的方式,都是把数组的声明和赋值合二为一了。即只有在定义数组时才能对数组进行整体赋值;否则,对数组元素的赋值只能一个一个地进行。

例如:下面的赋值都是错误的。

int arrayH[10];

arrayH={1,3,5,7,9,0,2,4,6,8};

或者

int arrayJ[10];

arrayJ={1,3,5};

这表明:声明数组、赋值分成两步进行的话,是不能对数组名赋值的。

3 数组的简单操作

数组的简单操作包括数组元素的输入输出和访问。一般情况下,对数组元素只能一个一个地进行相关操作,且常与循环配合来完成。数组元素的输入输出和引用,这三种基本操作都涉及到数组元素的表示,而数组元素的表示则通过数组名和下标来完成的,数组的最小下标是0,最大下标是数组的容量减1。初学者常犯的错误是数组的下标越界,但这种非法引用,程序编译时并不会报告语法错误、程序运行时也不会报告运行错误[2]。

4 数组的应用

上述三个方面的知识,都属于概念性和识记性的。数组的应用必然会涉及到上面的基本知识,但关键在于算法设计。

例如:求一个正整数n的所有因子。

求解这个问题的算法采取了枚举法。算法的基本思路是:用i=1~x之间的整数依次整除x,将能整除的i存储于指定的数组之中。难点在于定义数组的适当容量和计数因子的个数(即数组中实际元素的个数),且后者更重要。因为因子的个数事先是未知的、只能在试探的过程中根据模运算的状态来递增,且只能在试探完毕才能最终确定实际因子的个数(即需要一个计数器)和各个因子的值。

从“求一个正整数的所有因子”拓展到“求解一个正整数的所有质因子”,若不使用素数判断的功能代码(或函数),这个问题该如何解答呢?问题的关键仍在于算法。该算法难度增大了;涉及的知识点也增多了,包括质因子的概念、模运算、判断因子是否重复、计数器以及技巧等。算法的基本思想是:以i=2作为最小的除数开始进行模运算,若能整除,则继续以i为除数进行模运算,直到被除数不含i的倍数为止,且仅保留一份这时的除数i;若不能整除,则除数i自增1,再用新的i重复前面的步骤,直到可用来进行模运算的i都试探过为止。

按照上述算法思想,下面是第一种实现方法:

第二种方法是“不存储1这个虚假的质因子”,对上述代码做几处修改即可:

将①修改成 int x,result[100],len=0;

将②修改成if(len==0||result[len-1]!=i)

将⑤修改成 for(i=0;i<len;i++)

上面的if语句中,逻辑表达式的次序不能颠倒,因为存在短路现象;否则,算法就存在Bug了。

第三种方法则是使用标记来判断质因子是否重复,与方法一对照的话,需作如下修改:

将①修改成 int x,result[100],len=0,flag=0;

将②修改成if(flag==0||result[len-1]!=i)

将③修改成 { result[len++]=i;flag=1;}

将④修改成 { i++;flag=0; }

将⑤修改成 for(i=0;i<len;i++)

上面②处的if语句中的逻辑表达式的次序也不能颠倒,原理上与第二种方法一致。

上述三种解答,虽然使用的具体语句有一些差别,但本质是一致的。都紧紧地抓住了数组概念的四要素,特别是数组实际元素的个数,但最重要的仍是算法。因此,只有抓住事物的本质,才能真正理解、才会运用、才有拓展和创新。

最后,特别强调的是:阅读代码或检验代码的正确性,必须实践“三动”——动手、动脑、动眼的学习方法[3]。

5 结语

在教学中,必然会综合使用多种教学方法,如案例法、演示法、类比法、启发法、拓展法……以及师生交互手段等。教学时经常强调:一道题,如果你能讲出令人信服的道理,那么你的解答思路就是正确的,在排除一些意外的情况下,你给出的答案应该是正确的。因此,在解题过程中,概念的严谨性、完整性必然会得到清晰的展现,同时,追求严谨、认真的态度是综合素质培养的重要目标之一。

[1]熊启军,孙文鹤,方磊.C语言程序设计[M].北京:中国铁道出版社,2015:97-100.

[2]李文明,陈哲,李绪蓉,黄志球.C程序数组越界的运行时验证技术研究与实现[J].计算机工程与应用,2015(11):190-192.

[3]熊启军,袁磊,谷琼.基于“四期六段”模式的C语言教学[M].现代计算机(专业版),2012(14):42.

Case Teaching for C Language's Array

XIONG Qi-jun,GU Qiong,QU Jun-feng
(College of Mathematics&Computer Science,Hubei University of Arts and Science,Xiangyang 441053)

In the teaching of C Language Programming,array is in an important position.Discusses the concept,basic operation,application,develop⁃ment and teaching method,and makes some suggestions on how to make mistakes,precautions,algorithms and techniques.These can play a role for teaching in promote and inspire,so as to improve the learning efficiency and teaching quality.

C Language;Array;Algorithm;Teaching Method

湖北省高等学校省级教学研究项目(No.2016388)、湖北文理学院计算机科学与技术省级重点学科开放基金资助项目(No.2017009)

1007-1423(2017)24-0043-04

10.3969/j.issn.1007-1423.2017.24.010

熊启军(1971-),男,湖北仙桃人,研究方向为软件工程

2017-05-23

2017-08-10

猜你喜欢
数组赋值C语言
JAVA稀疏矩阵算法
基于Visual Studio Code的C语言程序设计实践教学探索
JAVA玩转数学之二维数组排序
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
更高效用好 Excel的数组公式
算法框图问题中的易错点
高职高专院校C语言程序设计教学改革探索
抽象函数难度降 巧用赋值来帮忙
利用赋值法解决抽象函数相关问题オ