31C++二维数组
一、认识二维数组

如果涂上颜色的单元格用1表示,未涂上颜色的单元格用0表示,那么应该如何存储这30×30个单元格中的信息?
是定义900个不同的变量来存储?或者定义30个每个长度为30的一维数组来存储?还是······
最好的办法是定义一个30×30的二维数组来存所有单元格中的信息。
定义二维数组的一般格式如下。
类型标识符 数组名 [常量表达式1][量表达式2]
上图所有单元格的值只可能是0或1,因此可以定义一个bool型的二维数组,例如:
bool a[30][30];
此时,定义a为30×30(30行30列)的二维数组。二维数组可以视为一种特殊的一维数组,该数组的元素又是一个数组。如二维数组a[30][30]中包含a[0]~a[29]共30个一维数组,数组a[0]又有30个元素,分别是a[0][0],a[0][1],a[0][2],···,a[0][29]。为了便于同学们理解二维数组a,我们可以画一个二维表格,如图所示。

在程序中,可以通过双重循环对二维数组中的每一个元素进行赋值,也可以通过双重循环输出二维数组中的每一个元素。
#include <bits/stdc++.h>
using namespace std;
bool a[40][40]; // 数组定义得稍大一点
int main()
{
int i, j, year, cnt = 0;
scanf("%d", &year) ;
for(i = 1; i <= 30; i++)
for(j = 1; j <= 30; j++)
{
cnt++;
if(cnt <= year * 12)
a[i][j] = 1; //true
else
a[i][j] = 0; //false
}
for(i = 1; i <= 30; i++)
{
for(j = 1; j <= 30; j++)
printf("%d", a[i][j]);
printf("\n");
}
return 0;
}
对二维数组进行初始化时也可以使用“初始化列表”。例如:
int b[3][2]={{0,1},{2,3},{4,5}}; //分行初始化
或:
int b[3][2]= {0,1,2,3,4,5}; //不分行初始化
为了更加直观,我们可以画一个3行2列的二维表格,呈现数组的元素及赋值情况,如图所示。

如果把一个二维数组视作一个二维表格,那么一个r行c列的数组就可以想象成一个r行c列的二维表格。
数组a第i行的各个元素如表所示:
数组a第j列的各个元素如表所示:

练习——座位表
【问题描述】
迎着九月的朝阳,小动物们走进了学校,来到了风之巅小学,在这里他们学到了各种本领。这天,大家来到报告厅,用实际行动向老师和家长汇报一段时间以来的努力成果。为了让大家更方便地观看汇报活动,格莱尔按同学们的身高帮大家排了座位(每个位置上标注有学号),如图1.6所示。

注意:输出每位同学的学号时占6个字符,不足6个字符时前补空格。
【填空】
假设用数组a保存这张座位表,请你将下图中数组a各元素的下标填写完整。

【补充程序】

二、二维数组的应用
儿童节的“填数之旅”活动,其现则是:小朋友先从数字箱中抽一个种子数,然后拿出一张画有一个4×5表格的白纸,在第一行和第一列的所有单元格上填上种子数。当种子数为1时,填好后如图:
接着从空白单元格中,找到行号最小且列号最小的格子,将这个格子正上方的数与左侧的数相加求和,把这个和填人这个格子,如下图:

按此规则,从左向右,从上向下,将所有单元格填上相应的数,如图:

为了方便裁判校对答案,请编写一个程序,输入种子数,输出所有单元格中的数。

思路:
(1)定义一个二维数组。
(2)将数组第1行和第1列的所有元素赋值为种子数。
(3)将数组元素从第2行到第4行逐行遍历,每行从第2列到第5列逐个计算出每个元素的值。
(4)按行号由小到大、列号由小到大的顺序输出各个元素的值。


练习——有规律的图形
【问题描述】
观察图1.12并找出规律,输入一个正整数n,输出此图的前n行。


浙公网安备 33010602011771号