陣列

文章推薦指數: 80 %
投票人數:10人

一維陣列的定義方式為: ... C語言對陣列的初始化給予值還有以下幾點規定: ... 前面介紹的陣列只有一個下標,稱為一維陣列,其陣列元素也稱為單下標變數。

高一課程>C語言>陣列 陣列   在程式設計中,為了處理方便,把具有相同類型的若干變數按有序的形式組織起來。

這些按序排列的同類資料元素的集合稱為陣列。

在C語言中,陣列屬於構造資料類型。

一個陣列可以分解為多個陣列元素,這些陣列元素可以是基本資料類型或是構造類型。

因此按陣列元素的類型不同,陣列又可分為數值陣列、字元陣列、指標陣列、結構陣列等各種類別。

本章介紹數值陣列和字元陣列,其餘的在以後各章陸續介紹。

一維陣列的定義和引用 一維陣列的定義方式 在C語言中使用陣列必須先進行定義。

一維陣列的定義方式為:    類型說明符陣列名稱[常量運算式]; 其中: 類型說明符是任一種基本資料類型或構造資料類型。

陣列名稱是用戶定義的陣列識別字。

方括號中的常量運算式表示資料元素的個數,也稱為陣列的長度。

例如:    int a[10];          說明整型陣列a,有10個元素。

   float b[10],c[20];  說明實型陣列b,有10個元素,實型陣列c,有20個元素。

   char ch[20];        說明字元陣列ch,有20個元素。

對於陣列類型說明應注意以下幾點: 1)陣列的類型實際上是指數組元素的取值類型。

對於同一個陣列,其所有元素的資料類型都是相同的。

2)陣列名稱的書寫規則應符合識別字的書寫規定。

3)陣列名稱不能與其他變數名相同。

例如: main()      {        int a;        float a[10];        …… } 是錯誤的。

4)方括號中常量運算式表示陣列元素的個數,如a[5]表示陣列a有5個元素。

但是其下標從0開始計算。

因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。

5)不能在方括號中用變數來表示元素的個數,但是可以是符號常數或常量運算式。

例如:    #defineFD5         main()       {        int a[3+2],b[7+FD];        …… } 是合法的。

但是下述說明方式是錯誤的。

   main()        {         int n=5;         int a[n];         …… } 6)    允許在同一個類型說明中,說明多個陣列和多個變數。

例如:    inta,b,c,d,k1[10],k2[20]; 一維陣列元素的引用 陣列元素是組成陣列的基本單元。

陣列元素也是一種變數,其標識方法為陣列名稱後跟一個下標。

下標表示了元素在陣列中的順序號。

陣列元素的一般形式為:    陣列名稱[下標]; 其中下標只能為整型常量或整型運算式。

如為小數時,C編譯將自動取整。

例如: a[5] a[i+j] a[i++] 都是合法的陣列元素。

陣列元素通常也稱為下標變數。

必須先定義陣列,才能使用下標變數。

在C語言中只能逐個地使用下標變數,而不能一次引用整個陣列。

例如,輸出有10個元素的陣列必須使用迴圈語句逐個輸出各下標變數:    for(i=0;i<10;i++)            printf("%d",a[i]); 而不能用一個語句輸出整個陣列。

下面的寫法是錯誤的: printf("%d",a); 【例1】 #include main() {  int i,a[10];   for(i=0;i<=9;i++)      a[i]=i;  for(i=9;i>=0;i--)       printf("%d",a[i]); }   【例2】 #include main() {  int i,a[10];   for(i=0;i<10;)       a[i++]=i;   for(i=9;i>=0;i--)       printf("%d",a[i]);  }   【例3】 #include main() {  int i,a[10];   for(i=0;i<10;)       a[i++]=2*i+1;   for(i=0;i<=9;i++) printf("%d ",a[i]);   printf("\n%d%d\n",a[5.2],a[5.8]); }   本例中用一個迴圈語句給a陣列各元素送入奇數值,然後用第二個迴圈語句輸出各個奇數。

在第一個for語句中,運算式3省略了。

在下標變數中使用了運算式i++,用以修改迴圈變數。

當然第二個for語句也可以這樣作,C語言允許用運算式表示下標。

程式中最後一個printf語句輸出了兩次a[5]的值,可以看出當下標不為整數時將自動取整。

一維陣列的初始化 給陣列給予值的方法除了用給予值語句對陣列元素逐個給予值外,還可採用初始化給予值和動態給予值的方法。

陣列初始化給予值是指在陣列定義時給陣列元素給予予初值。

陣列初始化是在編譯階段進行的。

這樣將減少運行時間,提高效率。

初始化給予值的一般形式為:    類型說明符陣列名稱[常量運算式]={值,值……值}; 其中在{}中的各資料值即為各元素的初值,各值之間用逗號間隔。

例如:    inta[10]={0,1,2,3,4,5,6,7,8,9}; 相當於a[0]=0;a[1]=1...a[9]=9; C語言對陣列的初始化給予值還有以下幾點規定: 1)  可以只給部分元素給予初值。

當{}中值的個數少於元素個數時,只給前面部分元素給予值。

例如:    inta[10]={0,1,2,3,4}; 表示只給a[0]~a[4]5個元素給予值,而後5個元素自動給予0值。

2)  只能給元素逐個給予值,不能給陣列整體給予值。

例如給十個元素全部給予1值,只能寫為:    inta[10]={1,1,1,1,1,1,1,1,1,1}; 而不能寫為:    inta[10]=1; 3)  如給全部元素給予值,則在陣列說明中,可以不給出陣列元素的個數。

例如:    inta[5]={1,2,3,4,5}; 可寫為:    inta[]={1,2,3,4,5}; 一維陣列程式舉例 可以在程式執行過程中,對陣列作動態給予值。

這時可用迴圈語句配合scanf函數逐個對陣列元素給予值。

【例4】 #include main() {  int i,max,a[10];   printf("input10numbers:\n");   for(i=0;i<10;i++)       scanf("%d",&a[i]);  max=a[0];   for(i=1;i<10;i++)       if(a[i]>max)max=a[i];   printf("maxmum=%d\n",max); }    本例程式中第一個for語句逐個輸入10個數到陣列a中。

然後把a[0]送入max中。

在第二個for語句中,從a[1]到a[9]逐個與max中的內容比較,若比max的值大,則把該下標變數送入max中,因此max總是在已比較過的下標變數中為最大者。

比較結束,輸出max的值。

【例5】 #include main() {  int i,j,p,q,s,a[10];   printf("\ninput10numbers:\n");   for(i=0;i<10;i++)       scanf("%d",&a[i]);   for(i=0;i<10;i++){       p=i;q=a[i];       for(j=i+1;j<10;j++)      if(q main() {  int i,j,s=0,average,v[3],a[5][3];   printf("inputscore\n");   for(i=0;i<3;i++) {       for(j=0;j<5;j++)     {         scanf("%d",&a[j][i]);        s=s+a[j][i];}         v[i]=s/5;        s=0;   }   average=(v[0]+v[1]+v[2])/3;   printf("math:%d\nclanguag:%d\ndbase:%d\n",v[0],v[1],v[2]);   printf("total:%d\n",average); }   程式中首先用了一個雙重迴圈。

在內迴圈中依次讀入某一門課程的各個學生的成績,並把這些成績累加起來,退出內迴圈後再把該累加成績除以5送入v[i]之中,這就是該門課程的平均成績。

外迴圈共迴圈三次,分別求出三門課各自的平均成績並存放在v陣列之中。

退出外迴圈之後,把v[0],v[1],v[2]相加除以3即得到各科總平均成績。

最後按題意輸出各個成績。

二維陣列的初始化 二維陣列初始化也是在類型說明時給各下標變數給予以初值。

二維陣列可按行分段給予值,也可按行連續給予值。

例如對陣列a[5][3]: 1)   按行分段給予值可寫為:        int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}}; 2)按行連續給予值可寫為:        int a[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};    這兩種給予初值的結果是完全相同的。

【例7】 #include main() {  int i,j,s=0,average,v[3];  int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};   for(i=0;i<3;i++)      { for(j=0;j<5;j++)        s=s+a[j][i];        v[i]=s/5;        s=0;      } average=(v[0]+v[1]+v[2])/3;   printf("math:%d\nclanguag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]);   printf("total:%d\n",average);  } 對於二維陣列初始化給予值還有以下說明: 1)     可以只對部分元素給予初值,未給予初值的元素自動取0值。

       例如:        inta[3][3]={{1},{2},{3}};    是對每一行的第一列元素給予值,未給予值的元素取0值。

給予值後各元素的值為:               100 20 0 30 0 int a[3][3]={{0,1},{0,0,2},{3}}; 給予值後的元素值為:        010 00 2 30 0 2)如對全部元素給予初值,則第一維的長度可以不給出。

       例如:    inta[3][3]={1,2,3,4,5,6,7,8,9}; 可以寫為: int a[][3]={1,2,3,4,5,6,7,8,9}; 3)  陣列是一種構造類型的資料。

二維陣列可以看作是由一維陣列的嵌套而構成的。

設一維陣列的每個元素都又是一個陣列,就組成了二維陣列。

當然,前提是各元素類型必須相同。

根據這樣的分析,一個二維陣列也可以分解為多個一維陣列。

C語言允許這種分解。

如二維陣列a[3][4],可分解為三個一維陣列,其陣列名稱分別為: a[0] a[1] a[2] 對這三個一維陣列不需另作說明即可使用。

這三個一維陣列都有4個元素,例如:一維陣列a[0]的元素為a[0][0],a[0][1],a[0][2],a[0][3]。

必須強調的是,a[0],a[1],a[2]不能當作下標變數使用,它們是陣列名稱,不是一個單純的下標變數。

【例】把一個整數按大小順序插入已排好序的陣列中。

為了把一個數按大小插入已排好序的陣列中,應首先確定排序是從大到小還是從小到大進行的。

設排序是從大到小進序的,則可把欲插入的數與陣列中各數逐個比較,當找到第一個比插入數小的元素i時,該元素之前即為插入位置。

然後從陣列最後一個元素開始到該元素為止,逐個後移一個單元。

最後把插入數賦予元素i即可。

如果被插入數比所有的元素值都小則插入最後位置。

#include main() {  int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};   for(i=0;i<10;i++)      { p=i;q=a[i];     for(j=i+1;j<10;j++)     if(q
a[i])       {for(s=9;s>=i;s--)a[s+1]=a[s];      break;}      a[i]=n;     for(i=0;i<=10;i++)       printf("%d",a[i]);     printf("\n"); }     本程式首先對陣列a中的10個數從大到小排序並輸出排序結果。

然後輸入要插入的整數n。

再用一個for語句把n和陣列元素逐個比較,如果發現有n>a[i]時,則由一個內迴圈把i以下各元素值順次後移一個單元。

後移應從後向前進行(從a[9]開始到a[i]為止)。

後移結束跳出外迴圈。

插入點為i,把n賦予a[i]即可。

如所有的元素均大於被插入數,則並未進行過後移工作。

此時i=10,結果是把n賦於a[10]。

最後一個迴圈輸出插入數後的陣列各元素值。

   程式運行時,輸入數47。

從結果中可以看出47已插入到54和28之間。

【例】在二維陣列a中選出各行最大的元素組成一個一維陣列b。

a=(3 1687  65  4 32 11108 10 2512 37) b=(8710837) 本題的程式思路是,在陣列A的每一行中尋找最大的元素,找到之後把該值賦予陣列B相應的元素即可。

程式如下: #include main() {    int a[][4]={3,16,87,65,4,32,11,108,10,25,12,27};    int b[3],i,j,l;     for(i=0;i<=2;i++)      { l=a[i][0];     for(j=1;j<=3;j++)     if(a[i][j]>l) l=a[i][j];     b[i]=l;}     printf("\narraya:\n");     for(i=0;i<=2;i++)      { for(j=0;j<=3;j++)     printf("%5d",a[i][j]);     printf("\n");}       printf("\narrayb:\n");     for(i=0;i<=2;i++)       printf("%5d",b[i]);     printf("\n"); } 程式中第一個for語句中又嵌套了一個for語句組成了雙重迴圈。

外迴圈控制逐行處理,並把每行的第0列元素賦予l。

進入內迴圈後,把l與後面各列元素比較,並把比l大者賦予l。

內迴圈結束時l即為該行最大的元素,然後把l值賦予b[i]。

等外迴圈全部完成時,陣列b中已裝入了a各行中的最大值。

後面的兩個for語句分別輸出陣列a和陣列b。

  字元陣列 <1>字元陣列的宣告方式如下所述: char陣列的名稱[陣列的大小]; orchar陣列的名稱[列陣列的大小][行陣列大小]; Forexample:chararray1[10]; chararray2[5][25]; <2>宣告陣列的位置為程式之最上端. <3>我們可以在宣告陣列時,指定字元給陣列.例如: 例一:intstring[6]={'A','B','C','D','E','\0'}; 或intstring[5]="ABCDE"; 例二:intstring1[2][6]={{'A','B','C','D','E','\0'}, {'F','G','H','I','J','\0'}; 或intstring1[2][5]={"ABCDE","FGHIJ"};



請為這篇文章評分?