第十天:字符菱形
每日一道C++题:字符菱形
问题:给定一个字符,用它构造一个对角线长5个字符,倾斜放置的菱形。
要求:输入只有一行, 包含一个字符;输出该字符构成的菱形。
- 最基础的做法:
#include <iostream>
#include <iomanip>
using namespace std;int main() {char ch;cin >> ch;cout << " " << ch << endl;cout << " " << ch << ch << ch << endl;cout << ch << ch << ch << ch << ch << endl;cout << " " << ch << ch << ch << endl;cout << " " << ch << endl;return 0;
}
- 循环嵌套:
菱形规律:
- 菱形的行数为 5 行(因为对角线长 5 个字符 )。
- 每行的字符数量呈现先增加后减少的规律,且两边有空格填充。具体来说:
- 第 1 行:1 个字符,前面有 2 个空格。
- 第 2 行:3 个字符,前面有 1 个空格。
- 第 3 行:5 个字符,前面有 0 个空格。
- 第 4 行:3 个字符,前面有 1 个空格。
- 第 5 行:1 个字符,前面有 2 个空格。
#include <iostream>
using namespace std;int main() {char ch;cin >> ch; for (int i = 0; i < 5; i++) {int spaceCount;if (i < 2) {spaceCount = 2 - i;} else {spaceCount = i - 2;}for (int j = 0; j < spaceCount; j++) {cout << " ";}int charCount = 2 * (2 - abs(2 - i)) + 1;for (int k = 0; k < charCount; k++) {cout << ch;}cout << endl;}return 0;
}
- 外层循环控制行数:
for (int i = 0; i < 5; i++) :循环 5 次,对应菱形的 5 行。 i 表示当前行数,从 0 到 4 。 - 对于第 0 行和第 1 行( i < 2 ),空格数量 spaceCount = 2 - i 。例如,当 i = 0 时, spaceCount = 2 ;当 i = 1 时, spaceCount = 1 。
- 对于第 2 行、第 3 行、第 4 行( i >= 2 ),空格数量 spaceCount = i - 2 。例如,当 i = 2 时, spaceCount = 0 ;当 i = 3 时, spaceCount = 1 ;当 i = 4 时, spaceCount = 2 。
- 内层循环 for (int j = 0; j < spaceCount; j++) { cout << " "; } :根据计算得到的 spaceCount ,输出相应数量的空格。
- int charCount = 2 * (2 - abs(2 - i)) + 1; :
- abs(2 - i) 计算当前行与中间行(第 2 行, i = 2 )的距离。
- 2 - abs(2 - i) 得到一个系数,乘以 2 再加 1 ,得到当前行要输出的字符数量。例如:
当 i = 0 时, abs(2 - 0) = 2 , 2 - 2 = 0 , charCount = 2 * 0 + 1 = 1 。
当 i = 1 时, abs(2 - 1) = 1 , 2 - 1 = 1 , charCount = 2 * 1 + 1 = 3 。
当 i = 2 时, abs(2 - 2) = 0 , 2 - 0 = 2 , charCount = 2 * 2 + 1 = 5 。
当 i = 3 时, abs(2 - 3) = 1 , 2 - 1 = 1 , charCount = 2 * 1 + 1 = 3 。
当 i = 4 时, abs(2 - 4) = 2 , 2 - 2 = 0 , charCount = 2 * 0 + 1 = 1 。
知识扩展
- 菱形的一般规律:
- 对于对角线长度为 2n - 1 ( n 为正整数 )的菱形,行数为 2n - 1 行。本题中对角线长 5 个字符,即 2n - 1 = 5 ,解得 n = 3 。
- 每行的空格数量和字符数量都有对称的规律,可以通过数学公式推导得出。例如,对于一般的 n ,第 i 行(从 0 开始计数 )的空格数量为 abs(n - 1 - i) ,字符数量为 2 * (n - 1 - abs(n - 1 - i)) + 1 。
- 字符和字符串输出:
- 本题中只输出单个字符,所以使用 cout << ch; 。如果需要输出字符串,可以使用 cout << “string”; 或者结合字符数组等方式。
- 扩展到任意大小的菱形:
- 可以将代码中的 5 行改为由用户输入的变量,从而构造不同大小的菱形。例如,让用户输入菱形的对角线长度(必须是奇数 ),然后根据上述规律动态生成菱形。代码大致如下:
#include <iostream>
#include <cmath>
using namespace std;int main() {char ch;int n;cin >> ch >> n;int rows = 2 * n - 1;for (int i = 0; i < rows; i++) {int spaceCount = abs(n - 1 - i);for (int j = 0; j < spaceCount; j++) {cout << " ";}int charCount = 2 * (n - 1 - spaceCount) + 1;for (int k = 0; k < charCount; k++) {cout << ch;}cout << endl;}return 0;
}
- 这里 n 表示菱形的“半长”,对角线长度为 2n - 1 。用户输入字符 ch 和 n ,程序可以生成不同大小的菱形。