每日一道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? ,程序可以生成不同大小的菱形。