1. 程式人生 > 其它 >c語言的陣列學習

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三行二列中。