第八章数组第三节二维数组概述定义以及熟悉例题、从键盘输入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;
}

在这里插入图片描述在这里插入图片描述

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