4.1.3 一维数组的初始化

更新于 2026年10月10日 版权声明
4.1.3 一维数组的初始化

可以在定义的时候初始化数组各元素,在定义数组的同时,给各数组元素赋值。

方法1:给全部元素均赋初值,如

int s[6]={0,1,2,3,4,5};

在定义数组时将数组元素的初值依次放在一对大括号里,结果是

s[0]=0,s[1]=1,s[2]=2,s[3]=3,s[4]=4,s[5]=5

方法2:给部分元素赋初值,如

int s[6]={0,1,2};

只给前3个元素赋初值,其他没有赋值的元素值默认为0。结果是

s[0]=0,s[1]=1,s[2]=2,s[3]=0,s[4]=0,s[5]=0

等价于:

int s[6]={0,1,2,0,0,0};

方法3:给全部元素均赋0值,如

int s[6]={0,0,0,0,0,0};

可以在大括号中用6个0为6个元素赋初值,也可以用1或5个0为1个或5个元素赋初值,其他没有赋值的默认为0。

等价于:

int s[6]={0};

或

int s[6]={0,0};

或

int s[6]={0,0,0};

或

int s[6]={0,0,0,0};

或

int s[6]={0,0,0,0,0};

或

int s[6]={0,0,0,0,0,0};

也可以用“0*6”表示6个0,如

int s[6]={0*6};

方法4:有些情况下数组的长度可以省略,如

int s[6]={0,1,2,3,4,5};

可简写为:

int s[]={0,1,2,3,4,5};

如果给每个元素都赋初值了,那么方括号中的数组长度可以省略。如果没有全部赋值,数组长度就必须指定,不能省略。

例4-3 编写程序:输入5个学生的年龄,要求将年龄值从小到大进行排序后输出。

分析:

对输入的5个学生的年龄中相邻的两个年龄进行比较,如果这两个年龄是按从小到大的顺序排列,则保持不变,如果是按从大到小的顺序,则将小的年龄调到前面。假设5个学生的年龄都是整数,那么此题的分析可以简化为对5个数进行从小到大的排序。

前面的章节中讨论过两个数从小到大的排序,如果两个数原始的顺序是从大到小的,可以通过第三变量t将两个数i和j交换。

t=i;

i=j;

j=t;

对于5个数从小到大的排序也是一样的道理,只是多了几轮比较的过程。

下面具体分析比较过程。

设5个学生的年龄分别是15,12,10,8,5,定义一个整型数组s[5]用来存放这组年龄数据。

int s[5]={15,12,10,8,5};

第一轮比较过程:

图示

第一次比较15和12,因为15>12,因此要交换15和12的顺序,12上浮,15下沉;第二次比较15和10,因为15>10,因此要交换15和10的顺序,10上浮,15下沉;第三次比较15和8,因为15>8,因此要交换15和8的顺序,8上浮,15下沉;第四次比较15和5,因为15>5,因此要交换15和5顺序,5上浮,15下沉。第一轮比较的结果是最大的数15沉到底,这样经过第一轮四次的比较,可将最大的数沉到底,也就是找到了最大数15的位置。

第二轮比较过程:

图示

第一次比较12和10,因为12>10,因此要交换12和10的顺序,10上浮,12下沉;第二次比较12和8,因为12>8,因此要交换12和8顺序,8上浮,12下沉;第三次比较12和5,因为12>5,因此要交换顺序,5上浮,12下沉。第二轮比较的结果是第二大的数12沉到底,这样经过第二轮三次的比较,可将第二大的数沉到底,也就是找到第二大数12的位置。

第三轮比较过程:

图示

第一次比较10和8,因为10>8,因此要交换10和8顺序,8上浮,10下沉;第二次比较10和5,因为10>5,因此要交换10和5的顺序,5上浮,10下沉。第三轮比较的结果是第三大的数10沉到底,这样经过第三轮两次的比较,可将第三大的数沉到底,也就是找到第三大数10的位置。

第四轮比较过程:

图示

第一次比较8和5,因为8>5,因此要交换8和5的顺序,5上浮,8下沉。第四轮比较的结果是第四大的数8沉到底,这样经过第四轮一次的比较,可将第四大的数沉到底,也就是找到第四大数8的位置,同时最小的数5也排在了最上面,也找到了5的位置。

这样经过四轮比较,5个数都找到了正确的位置,实现了5个数从小到大的排序。

在四轮比较过程中,不难发现一个规律:

第一轮经过4次比较;(https://www.daowen.com)

第二轮经过3次比较;

第三轮经过2次比较;

第四轮经过1次比较。

5个数一共要进行4轮比较,而每轮进行的两数比较次数又有如下规律:

轮数+比较次数=数据个数

因此,如果有m个数,则一共要进行m-1轮比较。在第1轮比较中要进行m-1次两两比较,在第2轮比较中要进行m-2次两两比较,依次类推,在第i轮比较中要进行m-i次两两比较。

程序如下:

图示

分析:

“int age[6];”是定义年龄的数组,此处定义包含6个元素的数组,目的是不使用age[0],而使用age[1]到age[5]来存放5个学生的年龄。使用for循环scanf函数输入5个学生年龄,定义j为比较的轮数,i为第j轮比较中第i次比较。第i次比较中,比较的是age[i]和age[i+1],最后使用for循环输出按从大到小排序好的5个年龄。

程序运行结果为:

图示

如果要求从大到小排序输出,只需将程序中两两比较的表达式改为“age[i]<age[i+1]”即可,其他程序不变。

运行结果为:

图示

思考:如果定义的数组长度和数据的个数相等,程序该怎样编写?

程序如下:

图示

程序运行结果为:

图示

同样地,10个或20个数的比较也是使用同样的方法,只需要更改某些地方就可以了。

例4-4 输入10个学生的成绩,要求按从小到大的顺序输出。

注意:成绩是浮点型的,因为有可能有小数位,因此定义数组时要定义为浮点型数组。输入和输出数组元素时,也都要在格式控制字符中用“%f”表示浮点型。

程序可改写为:

图示

图示

如果要求按从大到小的排序输出,只需将程序中两两比较的表达式改为“score[i]>score[i+1]”,并将“printf("从低到高排序后的成绩为:\n");”改为“printf("从高到低排序后的成绩为:\n");”即可,其他程序不变。

程序运行结果为:

图示

图示

例4-5 编程实现输出以下矩阵:

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

分析:

此矩阵一共20个数,因此可定义一个数组s[20],且在定义的同时进行初始化。输出此数组元素时,每行有4个元素,可以通过每计4个数输出一个换行符来实现。

程序如下:

图示

t的初值为0,循环输出每一个元素。循环每执行一次,t增加1,输出s[5]、s[10]、s[15]前先输出换行符,这时if语句括号中的表达式应为“t%5==0”,从而判断计数是否到了5的整倍数,输出5个数后要输出一个换行符,切换到下一行继续输出下一个元素。

图示

方框里的程序也可以互换顺序,运行结果都是一样的。

思考:如果将if语句和输出语句互换,结果还是正确的吗?

将if语句和输出语句互换后的运行结果为:

图示

很显然这个运行结果是不对的,如果互换,需要将程序做以下变化,也就是先输出s[4]、s[9]、s[14]、s[19]后再输出换行符,这时if语句括号中的表达式应改为“(t+1)%5==0”。

修改后的程序为:

图示

图示

思考:如果不用计数变量t,直接用下标i是否可以?

因为t的初值为0,i的初值也为0,每次循环执行一次,t和i的值都是增加1,所以这两个变量是同步变化的。因此,可以用i代替t。

程序如下:

图示

图示

程序的运行结果与上面的结果是一致的。

当然对于程序在定义时赋的初值,如果使用for循环为数组s赋值也是可以的。

for(i=0;i=19;i++)

s[i]=i+1;

读者可以自己运行一下。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)