第八章數組第三節二維數組概述定義以及熟悉例題、從鍵盤輸入5個學生4門課程的成績,然後求出每門課程的平均分並輸出、編程序打印出楊輝三角的前6行

一、二維數組

1.二維數組概述

二維數組中的所有元素分爲若干行若干列。
就是一維數組是一行,一條線
二維數組就是一個表格,一個面
二維數組的每個元素需要兩個序號(下標)一行號與列號。

2.二維數組定義

一般形式:
類型說明符 數組名[行數][列數];

int a[2][3]; 
//2行3列

跟一維數組一個樣
C89只是能夠定義定長二維數組(行數列數都是正整數或整形常量表達式)
C99允許定義變長二維數組(就是可以用整型變量了x,y這種)

int a[2][3];
//定義了一個2行3列的
//二維數組a
包含6int型的數組元素:
a[0][0]
a[0][1] 
a[0][2]
a[1][0] 
a[1][1]
a[1][2]
每個數組元素有兩個序號
(下標)——行號與列號。

內存單元是連續編址的
也就是說內存單元
是按照一維線性排列

內存單元是連續編址的,也就是說內存單元是按照一維線性排列的
就是說內存單元是一條線
二維數組的元素在內存中是按行優先順序存儲的。
即先存第0行,再存第1行, 依次類推。
每行中的元素是按照列號排列的。
也就是說其實二維數組並不一個表的樣子,而是一行,只不過把這一行分成了好幾大段,這好幾大段就是列,每段裏面的就是行內的元素

3.對二維數組進行操作

在程序中,一般不能將二維數組作爲一個整體進行輸入、輸出和運算;
只能針對二維數組的元素進行操作。
比如

int a[2][3];
a[1][2]=10;
對於a[2][3]這個數組來說
a[1][2]就是最後的元素了
所以說 
a[2][3]=10就不對了
因爲a[2][3]並不在數組裏面
這就是常見的下標越界
就是沒有記清楚數組下標是從0開始的

在程序中引用數組元素時,數組元素的下標可以用變量表示。
例如:

i=1;
j=2;
a[i][i]=100;
等價於
a[1][2]=100;

在定義二維數組的同時,給數組元素賦值,稱爲數組的初始化。

有以下幾種形式:
不分行初始化
例如:
int a[2][3]={1,2,3,4,5,6};
分行初始化
例如:
int a[2][3]={{1,2,3},{4,5,6};
可以只給部分元素賦初值,其餘自動取0。
例如: int d[3][4]={{1},{2},{3}};
初始化時,可以不指定二維數組的行數
但是必須指定列數
例如: int a[][3]={1,2,3,4,5,6};
系統編譯時
能根據初值的個數自動確定數組的行數。
6/3=2行
不過,inta[][3];
這種形式是錯誤的,因爲無法確定數組的行數。
int a[][]={1,2,3,4,5,6};也是錯誤的,因爲
無法確定數組的行數和列數。

4.例題

已知一個3行4列的二維數組inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}, 要求分行輸出該二維數組的所有元素值。

編程思路:
要麼一個一個的輸出
要麼找辦法
找規律就是
他們的排列都是線性遞增的
所以就找到了—循環解決的辦法

可以歸納爲如下的單重循環:0for(j=0;j<=3;j++)
printf("%6d",a[0][j]);
這裏的6是爲了限定長度
輸出的時候整齊一些
想要其他行
在上一個循環限定行數就OK了

for(i=0;i<=2;i++) 
//外循環控制行號
{
for(j=0;j<=3;j++) 
//內循環控制列號
printf("%6d",a[i][j]);
//指定寬度便於對齊
printf("\n");
}

在處理二維數組的元素時,通常可以採用雙重循環。
若是按照行優先順序處理二維數組的元素,則用外循環控制行號,用內循環控制列號;
若是按照列優先順序處理二維數組的元素,則用外循環控制列號,用內循環控制行號。

二、二維數組應用舉例

1.從鍵盤輸入5個學生4門課程的成績,然後求出每門課程的平均分並輸出。

問題分析:
首先,將5個學生4門課程的成績存入一個5行4列的二維數組中;
求每門課程的平均分就是求該數組中每一列元素的平均值。
編程思路:
定義三個數組g[5][4]、s[4]和a[4],分別用於存放課程成績、課程總分與課程平均分。
輸入5個學生4門課程的成績,並存入二維數組g中。
累加求得每門課程的總分,並存入數組s中。
求得每門課程的平均分,並存入數組a中。
輸出數組a中所有元素值。
看着很複雜,分解一下就好了
比如呢先想辦法把一科的搞出來,有了一科的,那麼剩下三科跟他類似,既然類似,就想辦法套一雙重循環

j=0;
//j爲列號
s[j]=0;
//s[j]是第j列元素之和
for(i=0;i<5;i++)
s[j]=s[j]+g[i][j];
 //累加所有第j列元素求和
a[j]=s[j]/5; 
//a[j]是第j列的平均值
printf("%.2f\n",a[j]);


for(j=0;j<4;j++)
{
s[j]=0; 
//s[j]是第j列元素之和
for(i=0;i<5;i++)
s[j]=s[j]+g[i][j];
a[j]=s[j]/5; 
//a[j]是第j列元素的平均值
printf("%.2f\n",a[j]);
}

這道題目的源代碼

#include <stdio.h>
int main(void)
{
float g[5][4],s[4],a[4];
int i,j;
printf("請輸入5名學生4門課程的成績: \n");
for(i=0;i<5;i++)
{for(j=0;j<4;j++)
scanf("%f",&g[i][j]);
}
printf("4門課程的平均分: \n");
for(j=0;j<4;j++)
{
s[j]=0;
for(i=0;i<5;i++)
s[j]=s[j]+g[i][j];
a[j]=s[j]/5;
printf("%.2f\n",a[j]);
}
return 0;
}

在這裏插入圖片描述

2.編程序打印出楊輝三角的前6行。

在這裏插入圖片描述問題分析:
楊輝三角兩腰上的元素均爲1。
其它元素的值等於上一行相鄰兩個元素值之和。

算法設計:
定義一個二維數組y[6][6],用於存儲楊輝三角。
首先將每一行的第0列和每一行主對角線元素的值置1。
按照楊輝三角的規律,求出其它元素的值。

#include <stdio.h>
#define N 6
int main(void)
{int y[N][N],i,j;
for(i=0;i<N;i++)
{y[i][0]=1; 
/* 第0列元素置1*/
y[i][i]=1;
/*主對角線元素置1*/
}
for(i=2;i<=N-1;i++)
/*外循環控制行號*/
for(j=1;j<=i-1;j++) 
/*內循環控制列號*/
y[i][j]=y[i-1][j-1]+y[i-1][j];
for(i=0;i<=N-1;i++)
{
for(j=0;j<=i;j++)
printf("%6d",y[i][j]);
printf("\n");
}
return 0;
}

在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章