c語言的陣列學習
c語言陣列初識
在前面我們定義變數通常使用一個或者幾個字母,當所涉及的變數較多時我們便使用a1 a2 a3 的形式來進行變數的定義,那麼就有人發現瞭如果定義的變數較多如何是好?且不說定義時所面對的困擾,關鍵還有在輸入輸出時的困擾。那麼如何解決這一問題,就是我們今天要說的。
(首先我在此說明本人初識陣列,以下內容只是個人對陣列的一點見解。)
一維陣列:
語法:
型別識別符號(如:int char float double ) 陣列名(使用合法的識別符號儘量英文字母) [整型常量表達式];
示例:
#include <stdio.h> int main() { int a[10]={0},i;/*這裡a[10]={0}是指將陣列的值全部初始化為0。*/ for(i=0;i<10;i++) { printf("%d",a[i]); } return 0; }
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
這裡我用了表格來描述這個陣列的賦值情況,而且需要注意a[10]是從a[0]開始的並且在a[9]結束,而並不是從1~10。順便說一下陣列的初始化。
一維陣列的初始化:
直接對一維陣列進行賦值。
形式:
int a[10]={0,1,2,3,4,5,6,7,8,9};
這裡我逐個將陣列的變數進行賦值,那麼可能有人就說那前面的{}中就只有一個0就將所有的值賦值為0了,是不是隻賦值一個就只寫一個啊?當然不是啦!原因是對陣列賦值規定有:
- 區域性初始化如:
int a[10]={0};
這樣做會將第一個即a[0]=0,而剩下了沒有進行賦值預設為0。
- 全域性初始化如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
- 最後需要注意你所在{}內輸入的值的數量不能超過[]內的常量的數值!
最後我在提及一下這種形式:
#include <stdio.h>
int main()
{
int i,a[]={1,2,3};/*當採用這樣的形式時[]內的常數是可以省略的。*/
for(i=0;i<3;i++)
{
printf("%d",a[i]);
}
return 0;
}
一維陣列的常見應用:
(說了這麼多,現在就讓我們來體驗一下陣列的魅力。)
提示一下使用一維陣列時要結合一下迴圈,我這裡使用for迴圈來演示。
int i,max;
max=a[0];
for(i=1;i<n;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
/*找到陣列中的最大值a[i]*/
int i,min;
min=a[0];
for(i=1;i<n;i++)
{
if(a[i]<min)
{
min=a[i]
}
}
/*找到陣列中的最小值a[i]*/
while(m)
{
i=m%10;
a[i]++;
m=m/10;
}
/*記錄m這個輸入數中出現0~9的每一個出現次數*/
#include <stdio.h>/*簡單的陣列輸入輸出*/
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)/*改為for(i=9;i>=0;i--)則為數字的逆序輸出*/
{
printf("%d",a[i]);
}
return 0;
}
等等都是一維陣列的一些應用,顯然從中我們可以發現數組的魅力。
接下來我們便來看看二維陣列。(本人初學,課程緊理解不周到,求大腿)
二維陣列:
語法:
型別識別符號 陣列名 [整型常量表達式1] [整型常量表達式2]
示例:
#include <stdio.h> //一個簡單的二維陣列定義與輸入輸出。
int main()
{
int a[2][3];
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}
可以看到的是這裡我結合了for的鑲嵌迴圈,其實二維陣列與for的二層鑲嵌迴圈十分類似。
二維陣列賦值:
一:
#include <stdio.h>
int main()
{
int i,j;
int a[3][4]={1,2,3,0,4,5,6,0,7,8,9,0};
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}
輸出結果與此表對應:
行/列 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
0 | 1 | 2 | 3 | 0 |
1 | 4 | 5 | 6 | 0 |
2 | 7 | 8 | 9 | 0 |
顯然這個賦值方式是由一行一行的讀取的,讀取完每行列數後再讀取下一行。
二:
#include <stdio.h>
int main()
{
int i,j;
int a[3][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}
而這一種便更為直觀了直接將每一列都用{}括起來。
與一維陣列相同的地方就是二維陣列也是{}裡的數不能超過[]與[]之間的值相乘的數,可以小於,不足的依然補0。
與之不同之處就是二維陣列在{}內的值輸入後可以忽略行數及:
int a[][3]={1,2,3,4,5,6,7,8,9}
注意[]與[]中的數最好與for( ; <“數 ” ; )中的”數“一致當然也可以去嘗試不同時會發生什麼這裡我就不做說明了。
最後在說一下兩個例題:
例題一:
#include <stdio.h>//二維陣列矩陣求和
#define N 3
int main()
{
int i,j;
int num=0;
int a[N][N];
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&a[i][j]);
if(i==j||i+j==2)
{
num=num+a[i][j];
}
}
}
printf("%d ",num);
return 0;
}
本題是將三行三列的二維陣列中的對角和求出。
例題二:
#include <stdio.h>//二維陣列轉換
int main()
{
int i,j;
int a[2][3]={{1,2,4},{3,6,9}};
int b[3][2];
printf("a陣列:\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("b陣列:\n");
for(j=0;j<3;j++)
{
for(i=0;i<2;i++)
{
printf("%d",b[j][i]);
}
printf("\n");
}
return 0;
}
本題是將二維陣列a二行三列中的值依次存入二維陣列b三行二列中。