c語言基礎語法三——陣列
謝謝某個障智,帶教材回去了,把這陣列這章的教材內容拍給我了,不能還真不知道怎麼寫這篇部落格,還是高估自己了啊,還是不能根據自己獨立把陣列說清道明白啊,依然得依靠教材。
進入主題;
1,引入陣列;
教室座位大家應該不陌生吧,畢竟都是過來人,都知道座位是幾行幾列的,還記得有時候老師點人回答問題就是第幾行第幾列來回答問題吧。
下面陣列的介紹會時不時的用教室位子來比喻介紹;
2;官方陣列的概念;
陣列就存放一組相同資料的集合;
陣列名就是這個集合的名字;
陣列元素就是這個集合中的元素;
陣列下標就是我們用來區分各個元素的編號,
例項介紹;
int a[5]={1,2,3,4,5};
則這個是存放int型別的集合;
a就是陣列名也就是集合名;
1,2,3,4,5,就是表示陣列的元素
從0到4就是代表下標;注意這就要區分教室座位了,不是從1開始,而是從0開始,記得在程式語言中幾乎都是從0開始的,而不是1;
通過下標表示陣列元素;
1——用a[0]表示;//a是陣列名,加[]裡面是下標;
2——a[1];
3——a[2];
4——a[3];
5——a[4];
當然這裡是int型別;也可以定義char型別,double…….等等;
這裡是一維的,就是相當於教室裡面的一小組,上面那個a[5]就相當於這組有5個位置,
如果是二維,例如a[2][3];
3;陣列的分類;
——3.1;看資料型別可以分為int char等基礎型別,還可以為指標結構體型別;
int a[4];a為int型別的陣列;
double b[4][4];b表示double型別的陣列;
——3.2;根據存放的順序位置分,可分為一維,二維…..
int a[4];a為一維陣列;
double b[4][4];b表示二維陣列;
至於什麼是int陣列,什麼是一維二維陣列,在上面也已經介紹了。
4;一維陣列;
定義的一般表示式;
資料型別 陣列名[數值表示式];
例如 int a[5];———-定義一個數據型別為int型的一維陣列,最多存放5個元素;
4.1;對於陣列的初始化問題;
初始化就是在定義的時候也給予賦值;並且在之前也有講過要使用一個變數,那麼必須先賦值再使用,否則這個變數將沒有意義(垃圾值),但是陣列有一點點小區別,陣列是多個變數的集合,只有其中有一部分被初始化了,那麼其餘的變數也會存在一個預設值進行初始化的,看程式;
#include<stdio.h>
#define N 10
int main()
{
int i;
int a[N];
int b[N]={3,4};
printf("未任何元素初始化陣列a\t");
for(i = 0; i < N; i++){
printf("%d ",a[i]);
}
printf("\n有部分元素初始化陣列b\t");
for(i = 0; i < N; i++){
printf("%d ",b[i]);
}
return 0;
}
這就是陣列中初始化要注意的問題;
4.2;在陣列中的&取地址符的使用;使用與對陣列元素的賦值;
&取地址符;
a[i];表示第i+1個元素的值;
&a[i];表示第i+1個元素的地址;
scanf(”%d”,&a[i]);//輸入一個值賦值給a[i];就是將一個值放到第i+1個元素的地址中去,
看程式;
#include<stdio.h>
#define N 5
int main()
{
int a[N],i;
printf("輸入%d個數組元素的值 ",N);
for(i = 0; i < N; i++){
scanf("%d",&a[i]);
}
printf("\n輸出陣列元素的值");
for(i = 0; i < N; i++){
printf("%d ",a[i]);
}
return 0;
}
4.3;陣列名的介紹;陣列名首先是一個識別符號,是這個陣列的名字,同時又是一個指標,指向的是這個陣列首地址。
既然是指向首地址的指標,因此就有了第二種表示陣列元素的方法,使用陣列名;
a;代表指向陣列首地址的指標。則就是指向a[0]的地址,則與&a[0]等效;
a+i;則表示指向陣列的第i+1個元素。則與&a[i]等效;
*;是取值符。與&恰好相反;
a就相當於a[0],而*(a+i)就表示a[i];//記得*(a+i)要打括號,優先順序問題,如果沒打則表示的是a【0】+i的值;
看程式;
#include<stdio.h>
int main()
{
int a[5],i;
for(i = 0; i < 5; i++){
scanf("%d",a+i);//等效於 scanf("%d",a[i]);
}
for(i = 0; i < 5; i++){
printf("%d ",*(a+i));//等效於 printf("%d ",a[i]);
}
return 0;
}
注意我們然而經常使用的是上面那種使用取地址符的而不是陣列名的方法;
4.4;一維陣列的一些小程式;
1;計算平均數;
/*
程式目的;先輸入n代表有n個數,接下來輸入n個數,
然後輸出這n個數的平均數並且原樣輸出這n個數
注意;計算平均數,先累加再除;
累加時一定要記得將sum進行初始化為0;(累加初始化為0累乘初始化為1)
進行除法的時候要注意其資料型別,如果都是整形時則要先乘1.0;是除法式子中有實數型別
*/
#include<stdio.h>
int main()
{
int i, n;
double sum, avg;
double a[100];//定義一個數組,來存放數
sum = 0;//計算這些數的和,進行累加,因此要將其初始化為0;
//將sum初始化為0;特別注意這點;
//累加將sum初始化為0,累乘就要將其初始化為1;
scanf("%d",&n);//輸入數n
for(i = 0; i < n; i++){//接收n個數,並進行累加求出n個數的和
scanf("%lf",&a[i]);
sum += a[i];
}
avg = sum/n;//計算平均數;注意除法的規則;
printf("%lf\n",avg);
for(i = 0; i < n; i++){
printf("%g ",a[i]);//%g輸出實數的時候會自動輸出擷取0
}
return 0;
}
2;計算最大最小值
/*
程式; 輸出最大值最小值;
先輸入一個數n代表有幾個數,
接下來輸入n個數,
再輸出這n個數中的最大最小值並且在下一行輸出這n個數;
一般的步驟就是;先對max,min進行賦值,將a[0]賦值,再對陣列進行遍歷比較
*/
#include<stdio.h>
int main()
{
int i, n, min, max;
int a[100];
scanf("%d",&n);
for(i = 0; i < n; i++){//接收陣列的值
scanf("%d",&a[i]);
}
min = max = a[0];//對max,min兩個變數進行初始化
for(i = 1; i < n; i++){//max,min對陣列進行遍歷
if(min > a[i]){
min = a[i];
}
if(max < a[i]){
max = a[i];
}
}
printf("max = %d\nmin = %d \n",max,min);
for(i = 0; i < n; i++){//輸出陣列元素;
printf("%d ",a[i]);
}
return 0;
}
3;正序逆序輸出
/*
程式;輸入n,表示要接收n個奇數進行,將這n個奇數進行正序逆序輸出;
*/
#include<stdio.h>
int main()
{
int n,l,i;
int a[100];
scanf("%d",&n);//表示要有n個奇數
l = 0;//標記陣列的下標 當l==n時就表示有n個元素了
for(i = 0; l!=n; i++){
if(i%2 == 1){//判斷是奇數的時候才進入進行賦值
a[l++] = i;//l的後增
}
}
printf("陣列元素正序輸出");
for(i = 0; i < l; i++){
printf("%d ",a[i]);
}
printf("\n陣列元素逆序輸出");
for(i = l-1; i >= 0; i--){
printf("%d ",a[i]);
}
return 0;
}
4,氣泡排序(上升)
/*
程式;對陣列進行一下排列;氣泡排序;
氣泡排序中每次迴圈的目的使得這組迴圈中陣列元素的最後一個元素為最大值,每次迴圈最後一個元素將不參加下次迴圈了。
(程式碼未進行簡化)
關鍵再於;陣列與迴圈的結合;
兩重迴圈達到排序的目的;
*/
#include<stdio.h>
#define N 10
int main()
{
int i,j,temp,k;
int a[N]={1,0,4,6,5,9,2,3,8,7};
//兩重迴圈的作用;外迴圈N-1次;每次外迴圈內部都從a[0]遍歷到a[N-1-i]並且交換
//使得最後的a[N-1-i]是最大的。
//因此迴圈N-1次之後,陣列就按從小到大的順序排列好了;
//每一次外迴圈就是找到一個最大值放到陣列的最後元素,
for(i = 0; i < N-1; i++){//迴圈N-1次;
for(j = 0; j < N-1-i; j++){//每次外迴圈裡面還內部迴圈N-1-I次;
if(a[j] > a[j+1]){//進行比較交換
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
printf("第%d次迴圈後 ",i+1);
for(k = 0; k < N; k++){//只是進行輸出的
printf("%d ",a[k]);
}
printf("\n");
}
for(i = 0; i < N; i++){
printf("%d ",a[i]);
}
return 0;
}
5;選擇排序(上升)
/*
程式;選擇排序;
每次迴圈的目的在於找到最小值的下標與這組迴圈的第一個元素交換
這樣達到,每次迴圈都找到一個最小值放到前面,再從下個元素又開始下次迴圈;
*/
#include<stdio.h>
#define N 10
int main()
{
int i,j,temp,k,min;
int a[N]={1,0,4,6,5,9,2,3,8,7};
for(i = 0; i < N-1; i++){
min = i;//將這組迴圈中元素的最小值的下標賦值為min
for(j = i+1; j < N; j++){//從i+1遍歷到N-1;
if(a[min] > a[j]){//找到這組迴圈的最小值的下標賦值給min;
min = j;
}
}
//用剛標記下的最小值與第i個元素標誌;
temp = a[min];
a[min] = a[i];
a[i] = temp;
//這樣就達到;每次迴圈都是這次迴圈的首元素變為其中的最小值
printf("第%d次排序的結果; ");
for(k = 0; k < N; k++){
printf("%d ",a[k]);
}
printf("\n");
}
return 0;
}
5;二維陣列;
5.1;二維陣列的定義
二維陣列定義的一般形式是:
型別說明符 陣列名[常量表達式1][常量表達式2]
其中常量表達式1表示第一維下標的長度,常量表達式2 表示第二維下標的長度。
一維可省略二維不能省略例如可以這樣定義int a[][3];也是可以通過編譯的,
例如:
int a[3][4];
說明了一個三行四列的陣列,陣列名為a,其下標變數的型別為整型。該陣列的下標變數共有3×4個,即:
a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]
在C語言中,二維陣列是按行排列的。即,先存放a[0]行,再存放a[1]行,最後存放a[2]行。每行中有四個元素也是依次存放。由於陣列a說明為int型別,該型別佔兩個位元組的記憶體空間,所以每個元素均佔有兩個位元組。
5.2;二維陣列元素的引用
二維陣列的元素也稱為雙下標變數,其表示的形式為:
陣列名[下標][下標]
其中下標應為整型常量或整型表示式。例如:
a[3][4]
表示a陣列三行四列的元素。
5.3;二維陣列的初始化
二維陣列初始化也是在型別說明時給各下標變數賦以初值。二維陣列可按行分段賦值,也可按行連續賦值。
例如對陣列a[5][3]:
按行分段賦值可寫為:
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行連續賦值可寫為:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
這兩種賦初值的結果是完全相同的。
但是我們一般採用的是分段的,形象點,不宜出錯;
關於初始化與一維陣列一樣,同樣存在部分初始化。
int a [3][3]={{0,1},{0,0,2},{3}};
賦值後的元素值為:
0 1 0
0 0 2
3 0 0
5.4;二維陣列可以看作是由一維陣列的巢狀而構成的
如二維陣列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]不能當作下標變數使用,它們是陣列名,不是一個單純的下標變數。
這個一般在國二選擇題中出現;a[i]表示的是a[i]【0】的地址,是表示指向a[i]【0】的指標。
看程式,可以看出a[i]的操作;
5.5;二維陣列陣列名的介紹;
關於陣列名介紹,看我之前寫的部落格,其中有詳細介紹;
連結;
http://blog.csdn.net/zw1996/article/details/53613195
5.6;一些關於二維陣列的小程式;
1,找最大最小值及其位置
/*
程式;找到二維陣列的最大最小值以及其二維陣列的具體位置
並且將該二維陣列輸出;
*/
#include<stdio.h>
int main()
{
int min,minx,miny,max,maxx,maxy,i,j;
int a[4][4]={{1,2,3,4},{5,6,7,8},{9,0,1,2}};//初始化
min = max = a[0][0];//先假設最大最小值為第一個元素
minx = miny = maxx = maxy = 0;//其下標假設為第一個元素的下標
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){//兩重for迴圈進行遍歷二維陣列;
printf("%d ",a[i][j]);//輸出
if(min > a[i][j]){//進行判斷賦值
min = a[i][j];
minx = i;
miny = j;
}
if(max < a[i][j]){
max = a[i][j];
maxx = i;
maxy = j;
}
}
printf("\n");
}
printf("該二維陣列的最大值為%d,其陣列位置為,第%d行第%d列\n",max,maxx+1,maxy+1);
printf("該二維陣列的最小值為%d,其陣列位置為,第%d行第%d列\n",min,minx+1,miny+1);
return 0;
}
2,
/*
程式; 求二維陣列的總和和平均值,每行每列的和
*/
#include<stdio.h>
int main()
{
int sum1,sum2,sum3,i,j;
int a[2][2]={{1,2},{3,4}};
sum1 = 0;
for(i = 0; i < 2; i++){
for(j = 0; j < 2; j++){
sum1 += a[i][j];
}
}
printf("整個二維陣列的和為%d\n",sum1);
for(i = 0; i < 2; i++){
sum2 = 0;
for(j = 0; j < 2; j++){
sum2 += a[i][j];
}
printf("二維陣列的第%d行的和為%d\n",i+1,sum2);
}
for(i = 0; i < 2; i++){
sum3 = 0;
for(j = 0; j < 2; j++){
sum3 += a[j][i];
}
printf("二維陣列的第%d列的和為%d\n",j+1,sum3);
}
return 0;
}
3;求該二維陣列的對角線之和
/*
程式;求該陣列的對角線之和
左對角線之和判斷條件是:行列加和絕對等於當前陣列的最大長度減一;
右對角線之和判斷條件是:行列都相等;
*/
#include <stdio.h>
int main()
{
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int s1=0,s2=0;
int i,j;
printf("輸出的標準格式如下:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(i+j==2){
s1=s1+a[i][j];
}
}
}
//左對角線之和判斷條件是:行列加和絕對等於當前陣列的最大長度減一;
printf("該陣列的左對角線和是:= %d\n",s1);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(i==j){
s2=s2+a[i][j];
}
}
}
//右對角線之和判斷條件是:行列都相等;
printf("該陣列的右對角線和是:= %d\n",s2);
}
4;將矩陣倒置;
/*
程式;將陣列進行行列互換【矩陣互換】
必須要申請一個數組,要求長度不變,行列是互換的;
在遍歷原陣列的時候,只要保證行列的迴圈變數顛倒位置即可
*/
#include <stdio.h>
int main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int b[3][3];
int i,j;
printf("輸出的標準格式如下:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
b[i][j]=a[j][i];//行列的迴圈變數顛倒位置即可
}
}
printf("\n行列互換後:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
}
陣列差不多就介紹到這裡了。