程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++中的一維數組和二維數組

詳解C++中的一維數組和二維數組

編輯:關於C++

詳解C++中的一維數組和二維數組。本站提示廣大學習愛好者:(詳解C++中的一維數組和二維數組)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++中的一維數組和二維數組正文


C++一維數組
界說一維數組

界說一維數組的普通格局為:
    類型標識符  數組名[常量表達式];
例如:

  int a[10];


它表現數組名為a,此數組為整型,有10個元素。

關於一維數組的幾點解釋:
1) 數組名命名規矩和變量名雷同,遵守標識符命名規矩。

2) 用方括號括起來的常量表達式表現下標值,以下面的寫法是正當的:

  int a[10];
  int a[2*5];
  int a[n*2]; //假定後面已界說了n為常變量

3) 常量表達式的值表現元素的個數,即數組長度。例如,在“int a[10];”中,10表現a數組有10個元素,下標從0開端,這10個元素是: a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7], a[8],a[9]。留意最初一個元素是a[9]而不是a[10]。

4) 常量表達式中可以包含常量、常變量和符號常量,但不克不及包括變量。也就是說,C++不許可對數組的年夜小作靜態界說,即數組的年夜小不依附於法式運轉進程中變量的值。例如,上面如許界說數組是不可的:

  int n;
  cin>>n; //輸出a數組的長度
  int a[n]; //妄圖依據n的值決議數組的長度


假如把第1,2行改成上面一行就正當了:

  const int n=5;


援用一維數組的元素

數組必需先界說,然後應用。只能逐一援用數組元素的值而不克不及一次援用全部數組中的全體元素的值。

數組元素的表現情勢為:
    數組名[下標]
下標可所以整型常量或整型表達式。例如:

  a[0]= a[5]+ a[7]- a[2*3]

【例】數組元素的援用。

#include <iostream>
using namespace std;
int main( )
{
  int i, a[10];
  for (i=0;i<=9;i++)
   a[i]=i;
  for (i=9;i>=0;i--)
   cout<<a[i]<<" ";
  cout<<endl;
  return 0;
}

運轉成果以下:

9 8 7 6 5 4 3 2 1 0

法式使a[0]~a[9]的值為0~9,然後按逆序輸入。
一維數組的初始化

1) 在界說數組時分離對數組元素付與初值。例如:

  int a[10]={0,1,2,3,4,5,6,7,8,9};

2) 可以只給一部門元素賦值。例如:

  int a[10]={0,1,2,3,4};

3) 假如想使一個數組中全體元素值為1,可以寫成:

  int a[10]={1,1,1,1,1,1,1,1,1,1};


不克不及寫成

  int a[10]={1*10};


不克不及給數組全體賦初值。

4) 在對全體數組元素賦初值時,可以不指定命組長度。例如:

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


可以寫成

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


一維數組法式舉例

【例】用數組來處置求Fibonacci數列成績。

可以用20個元素代表數列中的20個數,從第3個數開端,可以直接用表達式f[i]=f[i-2]+f[i-1]求出各數。法式以下:

#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
  int i;
  int f[20]={1,1}; //f[0]=1,f[1]=1
  for(i=2;i<20;i++)
   f[i]=f[i-2]+f[i-1]; //在i的值為2時,f[2]=f[0]+f[1],依此類推
  for(i=0;i<20;i++) //此輪回的感化是輸入20個數
  {
   if(i%5==0) cout<<endl; //掌握換行,每行輸入5個數據
   cout<<setw(8)<<f[i]; //每一個數據輸入時占8列寬度
  }
  cout<<endl; //最初履行一次換行
  return 0;
}

運轉成果以下:


【例】編寫法式,用起泡法對10個數排序(按由小到年夜次序)。

起泡法的思緒是:將相鄰兩個數比擬,將小的調到前頭。見圖5.2。然落後行第2趟比擬,對余下的後面5個數按上法停止比擬,見圖。



可以推知,假如有n個數,則要停止n-1趟比擬(和交流)。在第1趟中要停止n-1次兩兩比擬,在第j趟中要停止n-j次兩兩比擬。

依據以上思緒寫出法式,今設n=10,本例界說數組長度為11,a[0]不消,只用a[1]~a[10],以相符人們的習氣。早年面的論述可知,應當停止9趟比擬和交流。

#include <iostream>
using namespace std;
int main( )
{
  int a[11];
  int i, j, t;
  cout<<"input 10 numbers :"<<endl;
  for (i=1;i<11;i++) //輸出a[1]~a[10]
   cin>>a[i];
  cout<<endl;
  for (j=1;j<=9;j++) //共停止9趟比擬
   for(i=1;i<=10-j;i++)//在每趟中要停止(10-j)次兩兩比擬
     if (a[i]>a[i+1]) //假如後面的數年夜於前面的數
     {
      t=a[i];a[i]=a[i+1];a[i+1]=t;
     }//交流兩個數的地位, 使小數上浮
  cout<<"the sorted numbers :"<<endl;
  for(i=1;i<11;i++) //輸入10個數
   cout<<a[i]<<" ";
  cout<<endl;
  return 0;
}

運轉情形以下:

input 10 numbers:
3 5 9 11 33 6 -9 -76 100 123↙
the sorted numbers:
-76 -9 3 5 6 9 11 33 100 123

C++二維數組
具有兩個下標的數組稱為二維數組。有些數據要依附於兩個身分能力唯一地肯定,例若有3個先生,每一個先生有4門課的成就,明顯,成就數據是一個二維表,如書中表所示。


想表現第3個先生第4門課的成就,就須要指出先生的序號和課程的序號兩個身分,在數學上以S3,4表現。在C++中以s[3][4]表現,它代表數據73。
界說二維數組

界說二維數組的普通情勢為:
    類型標識符 數組名[常量表達式][常量表達式];
例如:

  float a[3][4], b[5][10];


界說a為3×4(3行4列)的單精度數組,b為5×10(5行10列)的單精度數組。留意不克不及寫成“float a[3,4], b[5,10];”。C++對二維數組采取如許的界說方法,使我們可以把二維數組看做是一種特別的一維數組:它的元素又是一個一維數組。例如,可以把a看做是一個一維數組,它有3個元素:a[0],a[1],a[2],每一個元素又是一個包括4個元素的一維數組,見圖5.4。a[0],a[1],a[2]是3個一維數組的名字。


下面界說的二維數組可以懂得為界說了3個一維數組,即相當於:

  float a[0][4], a[1][4], a[2][4];


此處把a[0],a[1],a[2]作一維數組名。C++的這類處置辦法在數組初始化和用指針表現時顯得很便利,這在今後會領會到。

C++中,二維數組中元素分列的次序是:按行寄存,即在內存中先次序寄存第一行的元素,再寄存第二行的元素。圖表現對a[3][4]數組寄存的次序。

下面界說的二維數組可以懂得為界說了3個一維數組,即相當於:

  float a[0][4], a[1][4], a[2][4];


此處把a[0],a[1],a[2]作一維數組名。C++的這類處置辦法在數組初始化和用指針表現時顯得很便利,這在今後會領會到。

C++中,二維數組中元素分列的次序是:按行寄存,即在內存中先次序寄存第一行的元素,再寄存第二行的元素。圖5.5表現對a[3][4]數組寄存的次序。


C++許可應用多維數組。有了二維數組的基本,再控制多維數組是不艱苦的。例如,界說三維數組的辦法是:
    float a[2][3][4];
界說float型三維數組a,它有2×3×4=24個元素。多維數組元素在內存中的分列次序:第一維的下標變更最慢,最左邊的下標變更最快。例如,上述三維數組的元素分列次序為:
a[0][0][0]→a[0][0][1]→a[0][0][2]→a[0][0][3]→a[0][1][0]→a[0][1][1]→a[0][1][2]→a[0][1][3]→a[0][2][0]→a[0][2][1]→a[0][2][2]→a[0][2][3]→a[1][0][0]→a[1][0][1]→a[1][0][2]→a[1][0][3]→a[1][1][0]→a[1][1][1]→a[1][1][2]→a[1][1][3]→a[1][2][0]→a[1][2][1]→a[1][2][2]→a[1][2][3]
二維數組的援用

二維數組的元素的表現情勢為:
  

 數組名 [下標][下標]


如:

  a[2][3]


下標可所以整型表達式,如a[2-1][2*2-1]。不要寫成a[2,3],a[2-1,2*2-1]情勢。

數組元素是左值,可以湧現在表達式中,也能夠被賦值,例如:

  b[1][2]=a[2][3]/2;


在應用數組元素時,應當留意下標值應在已界說的數組年夜小的規模內。常湧現的毛病是:

  int a[3][4]; //界說3行4列的數組
  ┆
  a[3][4]=15; //援用a[3][4]元素


界說a為3×4的數組,它可用的行下標值最年夜為2,列坐標值最年夜為3。最多可以用到a[2][3],a[3][4]就跨越了數組的規模。

請嚴厲辨別在界說數組時用的a[3][4]和援用元素時的a[3][4]的差別。前者a[3][4]用來界說數組的維數和各維的年夜小,後者a[3][4]中的3和4是下標值,a[3][4]代表某一個元素。
二維數組的初始化

可以用上面的辦法對二維數組初始化:
1) 分行給二維數組賦初值。如

   int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};


這類賦初值辦法比擬直不雅,把第1個花括號內的數據賦給第1行的元素,第2個花括號內的數據賦給第2行的元素……即按行賦初值。

2) 可以將一切數據寫在一個花括號內,按數組分列的次序對各元素賦初值。如

  int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};


後果與前雷同。但以第1種辦法為好,一行對一行,界線清晰。用第2種辦法假如數據多,寫成一年夜片,輕易漏掉,也不容易檢討。

3) 可以對部門元素賦初值。如:

  int a[3][4]={{1},{5},{9}};


它的感化是只對各行第1列的元素賦初值,其他元素值主動置為0。賦初值後數組各元素為:

1 0 0 0
5 0 0 0
9 0 0 0


也能夠對各行中的某一元素賦初值:

  int a[3][4]={{1},{0,6},{0,0,11}};


初始化後的數組元素以下:

1 0 0 0
0 6 0 0
0 0 11 0


這類辦法對非0元素少時比擬便利,不用將一切的0都寫出來,只需輸出大批數據。也能夠只對某幾行元素賦初值:

  int a[3][4]={{1},{5,6}};


數組元素為:

1 0 0 0
5 6 0 0
0 0 0 0


第3行不賦初值。也能夠對第2行不賦初值:

  int a[3][4]={{1},{},{9}};

4) 假如對全體元素都賦初值(即供給全體初始數據),則界說數組時對第一維的長度可以不指定,但第二維的長度不克不及省。如:

  int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};


可以寫成

  int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};


體系會依據數據總個數分派存儲空間,一共12個數據,每行4列,固然可肯定為3行。

在界說時也能夠只對部門元素賦初值而省略第一維的長度,但應分行賦初值。如

  int a[][4]={{0,0,3},{},{0,10}};


如許的寫法,能告訴編譯體系: 數組共有3行。數組各元素為:

0 0 3 0
0 0 0 0
0 10 0 0

C++在界說數組和表現數組元素時采取a[][]這類兩個方括號的方法,對數組初始化時非常有效,它使概念清晰,應用便利,不容易失足。
二維數組法式舉例

【例】將一個二維數組行和列元素交換,存到另外一個二維數組中。例如:


法式以下:

#include <iostream>
using namespace std;
int main( )
{
  int a[2][3]={{1,2,3},{4,5,6}};
  int b[3][2],i,j;
  cout<<"array a:"<<endl;
  for (i=0;i<=1;i++)
  {
   for (j=0;j<=2;j++)
   {
     cout<<a[i][j]<<" ";
     b[j][i]=a[i][j];
   }
   cout<<endl;
  }
  cout<<"array b:"<<endl;
  for (i=0;i<=2;i++)
  {
   for(j=0;j<=1;j++)
     cout<<b[i][j]<<" ";
   cout<<endl;
  }
  return 0;
}

運轉成果以下:

array a:
 1 2 3
 4 5 6
array b:
 1 4
 2 5
 3 6

【例】有一個3×4的矩陣,請求編法式求出個中值最年夜的誰人元素的值,和其地點的行號和列號。

開端時把a[0][0]的值賦給變量max,然後讓下一個元素與它比擬,將兩者中值年夜者保留在max中,然後再讓下一個元素與新的max比,直到最初一個元素比完為止。max最初的值就是數組一切元素中的最年夜值。法式以下:

#include <iostream>
using namespace std;
int main( )
{
  int i,j,row=0,colum=0,max;
  int a[3][4]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}};
  max=a[0][0];//使max開端時取a[0][0]的值
  for (i=0;i<=2;i++)//從第0行~第2行
   for (j=0;j<=3;j++) //從第0列~第3列
     if (a[i][j]>max) //假如某元素年夜於max
     {
      max=a[i][j]; //max將取該元素的值
      row=i; //記下該元素的行號i
      colum=j;//記下該元素的列號j
     }
  cout<<"max="<<max<<",row="<<row<<",colum="<<colum<<endl;
  return 0;
}

輸入成果為

max=56,row=0,colum=3

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved