如下图所示,输出 $N$ 行 $N$ 列的矩阵,对角线为 $1$,横线处应填入( )

int N = 0;
cout << "请输入行列数量:";
cin >> N;
for (int i = 1; i < N + 1; i++) {
for (int j = 1; j < N + 1; j++)
if (________) // 此处填写代码
cout << 1 << " ";
else
cout << 0 << " ";
cout << endl;
}这道题本质就是判断矩阵里哪个位置在对角线上。拿到题先看输出图:只有中间那条斜线是1,其余全是0。循环里i和j都是从1数到N,所以只要i和j相等,就正好踩在对角线上。把条件写成i==j,输出1,否则输出0,一行一行打出来就是那幅图了。
最容易掉进两个坑:一是把==看错成=,以为那是判断相等,其实那是赋值,整行全变1;二是看到循环变量下意识想数组下标,以为要写arr[i][j],但这题根本没定义数组,直接输出就行。还有同学会把条件写成i>=j,以为上三角也对,结果把半个矩阵都染红了。代入几个小N(比如N=3)手算一下,马上就能发现哪些选项是错的。
【考点】循环控制|条件表达式|数组索引逻辑
命题人把这道题塞进二级卷,不是为了考你语法,而是卡住"把数学规律翻译成代码条件"的短板。绝大多数考生看到矩阵对角线就下意识写 i==j,却忽略循环下标从 1 开始、for 语句里 i≤N 而条件里写成 i≤N+1 的边界陷阱,导致要么少输一行要么多输一行。
解题思维: 1. 观察矩阵:只有主对角线元素为 1,其余为 0。 2. 下标映射:题目给的循环 i 和 j 都是从 1 到 N,但 C++ 数组下标是 0 到 N-1。命题人故意没让你写数组,而是让你在 if 里直接判断 i 和 j 的关系,所以必须用 i==j。 3. 验证边界:当 i=N 时,j 也取到 N,i==j 为真,输出 1;当 j=1 时,i=1 才输出 1,其余 i>j 输出 0。这正是题目要求的对角线。 4. 通法:遇到"矩阵对角线/某条线"的问题,先确认循环下标起点(0 还是 1),再写条件 i==j(主对角线)或 i==j-1 / i==j+1(副对角线),最后用 if-else 控制输出。
陷阱拆解:
反命题思维: 如果题目改成"输出下三角矩阵",条件就该是 i >= j;改成"上三角"则是 i <= j。命题人经常把同一个条件换成≥或≤来考察你是否理解"对角线"的精确含义。刷到类似题,先问自己:要输出的是一条线还是半张图?条件里用的是==还是>=?循环下标起点是 0 还是 1?这三点定生死。
考频与趋势: 从题库数据看,"基础语法"类题目在 GESP 二级中占比很高,2023 年二级卷就考了 283 题,而"运算符与表达式"在二级中也有 70 题,"循环控制"二级考了 2 题。这说明命题人喜欢在循环里嵌套条件判断,考察学生对条件表达式的理解。未来几年,这类题目可能会继续出现在二级卷中,尤其是结合数组或矩阵输出的场景。
预测: 基于现有数据,未来 GESP 二级卷中仍会频繁出现此类题目,但可能会增加一些变体,例如副对角线、特定形状的矩阵等。学生需要熟练掌握条件表达式与循环的结合,才能在考试中游刃有余。