新编C语言程序设计教程第6章数组1
数组 先看一个程序,它的功能很简单,输入5个学生的英语成绩,输出他们的平均成绩。 数组 数组并非一组数, 而是一组变量,定义一个数组,就是定义了一组变量,并且这组变量类型相同。属于数组的变量也称为数组元素。 6.1.1 一维数组的定义 一维数组的定义方式为: 类型 数组名[整型常量表达式]; 其中,类型用来指明该数组所含变量的类型,它可以是整型,浮点型或字符型,也可以是后面要介绍的指针类型,甚至还可以是数组类型本身。 数组名用来标识这组变量,是一个标识符,应符合标识符的命名规则。 整型常量表达式是一个值为整型的常量表达式,常量表达式通常是指操作数为字面量的表达式。常量表达式的值确定数组含有多少个变量,即数组元素的个数,也称数组的长度。 语句int a[3]; 定义了一个整型数组,数组名为a,它有3个数组元素。 数组a的3个数组元素分别是a[0],a[1]和a[2]。这条语句也可理解为定义了变量名为a[0],a[1],a[2]的3个整型变量。 int a[3]; 注意: (1) 数组元素的下标是从0开始的,这是初学数组时最容易出错的地方。应牢记上面的数组a中并没有数组元素a[3]! (2) 定义数组时,必须用整型常量表达式。如 int n = 3; int a[n]; 中数组的定义方式就是错误的。 (3) 使用数组元素时可以用a[n]的形式,如果n的值为2,则a[n]就是a[2]。 例6-1 求100个学生的英语平均成绩 6.1.2 一维数组的初始化 与一般变量类似,数组也可以在定义时给数组元素赋值,即数组的初始化。构造数据类型常含有多个变量,初始化时需用多个初值,并置于一对花括号中。初始化数组的基本形式为: 类型 数组名[整型常量表达式]={value0,value1,. . . }; 各数组元素的初值按照0至n-1的下标次序由左向右依次放在一对花括号中,中间用逗号分隔。 如有int a[3] = {1, 2, 3}; ,则它相当于 int a[3]; a[0] = 1; a[1] = 2; a[2] = 3。 注意: 1.可以只给前面的部分数组元素赋值,也就是说当花括号中的值用完后,剩余的数组元素自动被赋为0(对于字符型数组,理解为ASCII码值是0的字符)。如char letter[3] ={'A', 'B'}; 则letter[0] = 'A' ; letter[1]= 'B'; letter[2]='\0'。 2.数组初始化时,可以省略数组的长度,此时数组元素的个数为花括号中初值的个数。如有float f[ ] = {3.3, 2.2, 1.1}; , 则数组f有三个数组元素,且f[0]=3.3;, f[1]=2.2;,f[2]=1.1。 注意: 数组初始化时,常见的错误是用一个初值给全部的数组元素赋值。数组b的3个数组元素初值都为1时,不能用int b[3]={1};语句初始化, 这条语句的赋值结果为b[0]=1;,b[1]=0;,b[2]=0。 当然,数组元素的初值均为0时, 则可以用int b[3]={0};语句初始化。 例6-2 数组a中是20个学生的数学成绩,请统计优(5),良(4),中(3),差(2)的学生人数。 6.1.3一维数组的应用 例6-3一维数组元素的倒置。如数组元素的值分别为1,2,3,倒置后则变为3,2,1。 分析:如果数组a有n个元素,则倒置时可以让a[0]与a[n-1]互换值,a[1]与a[n-2]互换值……,这个过程是循环。循环(互换)多少次呢? n为奇数如7时互换3次,n为偶数如6时互换3次,而c语言中7/2 和6/2 的值都是3,可见不管n为何值,均互换n/2 次。 在第i次循环中,a[i]与哪个元素互换值呢? a[0]与a[n-1],a[1]与a[n-2],a[2]与a[n-3],可见a[i]与a[n-1-i]互换。 例6-3一维数组元素的倒置 例6-4 将十进制整数转换成n进制数。 分析:十进制整数转换成n进制数时常用“除以n取余法”。以2进制为例:25=11001B。 例6-4输出十进制正整数的n进制形式。 例6-5 输入5个整数,按升序输出。 本题同练习4中的4.21(如25,22,21,29,23) 分析:考虑例4-17的排序思路。 从第2个数起至第5个数止依次将数插入到前面有序的子序列中构成新的有序子序列,这个过程是循环。在第i次循环中将第i个数插入到前面有序的子序列中。 考虑第i个数的插入过程,这个过程显然也是循环,请结合代码分析程序给出的处理过程。 例6-5 输入5个整数,按升序输出。 例6-6 将有12个元素的数组按3行4列的格式输出。 分析:循环变量i从0到2,每次输出一行,对于第i行,循环变量j从0到3,每次输出一列。 6.2.1 二维数组的定义及初始