break-word; clear: both; text-indent: 28px; color: rgb(24, 30, 51); font-family: PingFangSC, 微软雅黑, 黑体, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255);">给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
一维数组初始化赋值的一般形式为:
数组类型数组名[常量表达式] = {值,值……值};
其中在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。
int a[5]={1,2,3,4,5};
这样数组a中的元素a[0]=1;a[1]=2;a[2]=3;a[3]=4; a[4]=5;a中5个元素全部赋初值,则在数组说明中,可以不给出数组元素的个数。
可写为:
int a[]={1,2,3,4,5};
注意:
(1)可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。
(2)只能给元素逐个赋值,不能给数组整体赋值。
例如:
int a[5]={1,2,3};
这表示只给a[0]~a[2]3个元素赋值,而后2个元素自动赋0值。
除了定义数组时同时初始化,也可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
例如:
例如:
int i,a[5];
for(i=0;i<5;i++)
scanf("%d",&a[i]);
【例5-3】输入10个数字,求出最大值和它的下标。
程序的算法流程图如图5-3所示。
例5-3算法流程图
根据流程图写出的程序如下:
#include <stdio.h>
int main()
{
int i,max,a[10],p=0;
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]); /*数组a中输入元素*/
max=a[0]; /*最大值元素赋初值*/
for(i=1;i<10;i++)
{
if(a[i]>max) /*访问的第i个元素是否大于当前最大值*/
{
max=a[i];
p=i;
}
}
printf("maxmum=%d,index=%d\n",max,p);
return 0;
}
程序运行结果:
input 10 numbers:
23 45 -2 0 9 13 4 65 10 3↙
maxnum=65,index=7
【例5-4】输入10个数字,采用交换法逆序输出
分析:将一个数组逆序转换,假如数组存放为1,2,3,4,5,6,7,8,9,10变为10,9,8,7,6,5,4,3, 2,1。对于某一个元素a[i],则前面已有i个元素,与它交换的元素a[k]应该满足与a[k]后面也有i个元素,则这个元素的下标k为:n-1-i,即下标i要与下标n-i-1交换,如图5-4所示。
a[0]
a[1]
a[2]
… … … … a[10-2-1]
a[10-1-1]
a[10-0-1]
图5-4 元素的交换
也就是说,10个数字的话,两两交换需要交换5次,那么N个数据,需要交换N/2次。利用循环实现数组中元素的交换。
#include <stdio.h>
#define N 10
int main()
{
int i,temp,a[N];
printf("input 10 numbers:\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]); /*数组a中输入元素*/
for(i=0;i<N/2;i++) /*元素交换*/
{
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf(”Inverted sequence is:\n”);
for(i=0;i<N;i++)
printf(“%4d”,a[i]);
return 0;
}
程序运行结果:
input 10 numbers:
1 2 3 4 5 6 7 8 9 10↙
Inverted sequence is:
10 9 8 7 6 5 4 3 2 1
【例5-5】输入10个数字并按从大到小的顺序排列。
程序的算法流程图如图5-5所示。
根据流程图写出的程序如下:
#include <stdio.h>
int main()
{
int i,j,p,q,s,a[10];
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]); /*数组a中输入元素*/
printf(“Inverted sequence is:\n”);
for(i=0;i<10;i++) /*采用逐个比较的方法进行排序*/
{
p=i;q=a[i]; /*在i次循环时,把第一个元素的下标i赋于p,而把变量值a[i]赋于q*/
for(j=i+1;j<10;j++)/*从a[i+1]起到最后一个元素止逐个与a[i]作比较*/
if(q<a[j])/*有比a[i]大者则将其下标赋值给p,元素值赋值给q*/
{
p=j;q=a[j];
}
if(i!=p)/*i≠p,p,q值均已不是进入第二层循环之前所赋之值,则交换a[i]和a[p]之值*/
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%5d",a[i]);
}
return 0;
}
程序运行结果:
input 10 numbers:
23 90 -45 0 5 124 -3 34 87 100↙
Inverted sequence is:
124 100 90 87 34 23 5 0 -3 -45
例5-5算法流程图
通过上面的程序可以看出,数组的最大优点就是:下标可以是变量甚至是表达式,从而给访问和操作一组变量带来了极大的方便。