一維數組的初始化
給數組賦值的方法除了用賦值語句對數組元素逐個賦值外, 還可采用初始化賦值和動態賦值的方法。數組初始化賦值是指在數組定義時給數組元素賦予初值。數組初始化是在編譯階段進行的。這樣將減少運行時間,提高效率。
一維數組初始化賦值的一般形式為:
數組類型數組名[常量表達式] = {值,值……值};
其中在{}中的各數據值即為各元素的初值,各值之間用逗號間隔。
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算法流程圖
通過上面的程序可以看出,數組的最大優點就是:下標可以是變量甚至是表達式,從而給訪問和操作一組變量帶來了極大的方便。