info
对应 GESP C++ 2 级知识块⑦:多层循环语句(综合应用)
字符图形是"循环嵌套"最经典的练手题,2 级编程题常出现打印图形、找规律输出。本章把第 15 章的循环嵌套落到具体题型。
第18章 字符图形
字符图形使用 *、#、空格等字符,依靠循环嵌套打印行列图案,是嵌套循环经典练习题。
18.1 核心设计思路
- 外层
for:控制一共多少行; - 内层循环 1:打印每行前置空格(控制缩进、对称);
- 内层循环 2:打印图形字符(
*); - 每行打印完毕执行换行
cout << endl;。
18.2 基础图形代码示例
18.2.1 实心矩形
每行字符数量相同
#include <iostream>
using namespace std;
int main()
{
int row = 4, col = 6;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
cout << "*";
cout << endl;
}
return 0;
}
18.2.2 右下直角三角形
第 i 行有 i 个星
int main()
{
int n = 5;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
cout << "*";
cout << endl;
}
return 0;
}
18.2.3 等腰三角形
每行先打印空格,再打印奇数个 *
int main()
{
int n = 5;
for (int i = 0; i < n; i++)
{
// 前置空格
for (int j = 0; j < n - 1 - i; j++)
cout << " ";
// 打印星号 2*i+1 个
for (int k = 0; k < 2 * i + 1; k++)
cout << "*";
cout << endl;
}
return 0;
}
18.2.4 菱形
上半部分递增等腰三角 + 下半部分递减等腰三角
int main()
{
int n = 5;
int half = (n + 1) / 2;
// 上半部分
for (int i = 1; i <= half; i++)
{
for (int j = 1; j <= half - i; j++) cout << " ";
for (int k = 1; k <= 2 * i - 1; k++) cout << "*";
cout << endl;
}
// 下半部分
for (int i = half - 1; i >= 1; i--)
{
for (int j = 1; j <= half - i; j++) cout << " ";
for (int k = 1; k <= 2 * i - 1; k++) cout << "*";
cout << endl;
}
return 0;
}
18.2.5 空心矩形
判断边界位置打印 #,内部打印空格
int main()
{
int r = 4, c = 6;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (i == 0 || i == r - 1 || j == 0 || j == c - 1)
cout << "#";
else
cout << " ";
}
cout << endl;
}
return 0;
}
tip
找规律的通用套路 拿到图形先手写前 3 行,列出"行号 i"和"空格数、星号数"的关系式,再用循环变量代入。菱形就拆成"上半 + 下半"两个三角形分别写。
18.3 绘图通用技巧
- 先手动写出前几行,找出空格、星号与行号的数学关系;
- 复杂图形拆分成上下两部分分别循环;
- 使用变量统一控制行数,方便修改大小;
- 空心图形依靠
if判断边框位置; - 严格每行结束换行,否则全部挤在同一行。
18.4 易错点
- 循环边界写错,多/少打印一行一列;
- 忘记打印前置空格,图形不对称;
- 内层、外层循环变量重名(都用 i)造成逻辑混乱;
- 空心图形判断条件漏写某一边框。
练习题(2 级单选风格)
- 用循环打印一个"右对齐"的直角三角形(第 i 行有 i 个星号,整体靠右),前置空格数应为?
- A. n
- B. i
- C. n - i
- D. n - i + 1
- 打印一个 n 行 n 列的实心正方形(每行 n 个星号),两层 for 循环各自应执行约?
- A. 外层 n 次、内层 n 次
- B. 外层 n 次、内层 i 次
- C. 外层 i 次、内层 n 次
- D. 各 n-1 次
- 打印"空心"正方形时,判断"某格在边框上"的常用条件是该格位于第 1 行、最后 1 行、第 1 列或最后一列,这种写法?
- A. 正确
- B. 错误
- 下列循环会"少打印一行"的是?
- A.
for (i = 1; i <= n; i++) - B.
for (i = 1; i < n; i++) - C.
for (i = 0; i < n; i++) - D.
for (i = 1; i <= n + 1; i++)
- A.
- 打印"倒三角"(第 1 行 n 个星、第 n 行 1 个星),行号 i 用正序循环
i = 1; i <= n时,第 i 行应打印星号数为?- A. n - i + 1
- B. i
- C. n
- D. 任意
参考答案(点击展开)
- C — 第 i 行星号靠右、共 i 个,则前面需补
n - i个空格使其右对齐。 - A — 实心正方形行列数相等,外层控制行(n 次)、内层每行打印 n 个星(n 次)。
- A — 位于四条边之一即为边框,打印星;否则打印空格,可得到空心效果,写法正确。
- B —
i < n只循环 1…n-1,共 n-1 次,比应有的 n 行少一行。 - A — 正序打印倒三角:第 1 行 n 个、第 n 行 1 个,即每行
n - i + 1个星号。