第18章 字符图形
info

对应 GESP C++ 2 级知识块⑦:多层循环语句(综合应用)

字符图形是"循环嵌套"最经典的练手题,2 级编程题常出现打印图形、找规律输出。本章把第 15 章的循环嵌套落到具体题型。

第18章 字符图形

字符图形使用 *、#、空格等字符,依靠循环嵌套打印行列图案,是嵌套循环经典练习题。

18.1 核心设计思路

  1. 外层 for:控制一共多少行;
  2. 内层循环 1:打印每行前置空格(控制缩进、对称);
  3. 内层循环 2:打印图形字符(*);
  4. 每行打印完毕执行换行 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 绘图通用技巧

  1. 先手动写出前几行,找出空格、星号与行号的数学关系;
  2. 复杂图形拆分成上下两部分分别循环;
  3. 使用变量统一控制行数,方便修改大小;
  4. 空心图形依靠 if 判断边框位置;
  5. 严格每行结束换行,否则全部挤在同一行。

18.4 易错点

  1. 循环边界写错,多/少打印一行一列;
  2. 忘记打印前置空格,图形不对称;
  3. 内层、外层循环变量重名(都用 i)造成逻辑混乱;
  4. 空心图形判断条件漏写某一边框。

练习题(2 级单选风格)

  1. 用循环打印一个"右对齐"的直角三角形(第 i 行有 i 个星号,整体靠右),前置空格数应为?
    • A. n
    • B. i
    • C. n - i
    • D. n - i + 1
  2. 打印一个 n 行 n 列的实心正方形(每行 n 个星号),两层 for 循环各自应执行约?
    • A. 外层 n 次、内层 n 次
    • B. 外层 n 次、内层 i 次
    • C. 外层 i 次、内层 n 次
    • D. 各 n-1 次
  3. 打印"空心"正方形时,判断"某格在边框上"的常用条件是该格位于第 1 行、最后 1 行、第 1 列或最后一列,这种写法?
    • A. 正确
    • B. 错误
  4. 下列循环会"少打印一行"的是?
    • 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++)
  5. 打印"倒三角"(第 1 行 n 个星、第 n 行 1 个星),行号 i 用正序循环 i = 1; i <= n 时,第 i 行应打印星号数为?
    • A. n - i + 1
    • B. i
    • C. n
    • D. 任意
参考答案(点击展开)
  1. C — 第 i 行星号靠右、共 i 个,则前面需补 n - i 个空格使其右对齐。
  2. A — 实心正方形行列数相等,外层控制行(n 次)、内层每行打印 n 个星(n 次)。
  3. A — 位于四条边之一即为边框,打印星;否则打印空格,可得到空心效果,写法正确。
  4. B — i < n 只循环 1…n-1,共 n-1 次,比应有的 n 行少一行。
  5. A — 正序打印倒三角:第 1 行 n 个、第 n 行 1 个,即每行 n - i + 1 个星号。
SShowball OI知识手册