以程式碼輸出幾何圖形是經典練習,能訓練迴圈控制、字串操作、數學思維。本文解析菱形列印邏輯,並展示使用 str_pad() 避免巢狀迴圈的高效寫法。
邊長 N,總行數 rows = 2N - 1。第 i 行 (0-index):
| 區段 | 行範圍 | 前導空格數 | 字符數/內容 |
|---|---|---|---|
| 上半部 | 0 ≤ i < N | N - i - 1 | 實心:2i + 1;空心:首尾字符,中間 2i - 1 空格 |
| 下半部 | N ≤ i < 2N-1 | i - N + 1 | 實心:2(2N-1-i) - 1;空心:首尾字符,中間 2(2N-1-i) - 3 空格 |
function solidDiamond(int $n = 5, string $char = '*'): string {
$rows = $n * 2 - 1;
$output = '';
for ($i = 0; $i < $rows; $i++) {
if ($i < $n) { // 上半部
$spaces = $n - $i - 1;
$chars = $i * 2 + 1;
} else { // 下半部
$spaces = $i - $n + 1;
$chars = ($rows - $i) * 2 - 1;
}
// str_pad(字串, 總長度, 填充字符, 填充類型)
// STR_PAD_LEFT: 左填充(前導空格) | STR_PAD_BOTH: 兩側填充
$line = str_pad('', $spaces, ' ', STR_PAD_LEFT)
. str_pad('', $chars, $char, STR_PAD_LEFT)
. "\n";
$output .= $line;
}
return $output;
}
echo '' . solidDiamond(5) . '
';
/*
*
***
*****
*******
*********
*******
*****
***
*
*/
function hollowDiamond(int $n = 5, string $char = '*'): string {
$rows = $n * 2 - 1;
$output = '';
for ($i = 0; $i < $rows; $i++) {
if ($i < $n) { // 上半部
$spaces = $n - $i - 1;
$total = $i * 2 + 1;
} else { // 下半部
$spaces = $i - $n + 1;
$total = ($rows - $i) * 2 - 1;
}
if ($total == 1) { // 頂點/底點
$line = str_pad('', $spaces, ' ', STR_PAD_LEFT) . $char;
} else {
// 先建立中空字串:兩側各1字符,中間空格
$inner = str_pad('', $total - 2, ' ', STR_PAD_BOTH);
// 再在兩側填充字符
$diamondLine = str_pad($inner, $total, $char, STR_PAD_BOTH);
$line = str_pad('', $spaces, ' ', STR_PAD_LEFT) . $diamondLine;
}
$output .= $line . "\n";
}
return $output;
}
echo '' . hollowDiamond(5) . '
';
/*
*
* *
* *
* *
* *
* *
* *
* *
*
*/
str_pad(string $input, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT): string
STR_PAD_RIGHT (預設):右側填充。STR_PAD_LEFT:左側填充(適合前導空格)。STR_PAD_BOTH:兩側填充,左側優先(適合置中、空心圖形)。for/while 逐字元拼接,str_pad 為 C 實現,速度更快。<pre> 輸出。2N-1,非 2N。total - 2 (扣除首尾兩字符),下半部同理。\n,網頁用 <br> 或包裹 <pre> 保留空格。掌握幾何規律並善用字串函式,能用最少程式碼實現複雜圖形輸出。此類邏輯常見於 CLI 進度條、表格美化、終端機遊戲渲染等場景。