在 JSP 頁面中利用巢狀迴圈輸出幾何圖案是基礎程式設計訓練的經典題目。本文以「倒置金字塔」(上寬下窄的等腰三角形再加上倒置部分組成菱形/沙漏形)為例,詳細拆解行數、空格、星號的數學關係,提供完整可部署的 JSP 程式碼。
目標輸出共 9 行(5 行正向 + 4 行倒向),形成對稱沙漏狀:
* 第 1 行:4 空格 + 1 星號
*** 第 2 行:3 空格 + 3 星號
***** 第 3 行:2 空格 + 5 星號
******* 第 4 行:1 空格 + 7 星號
********* 第 5 行:0 空格 + 9 星號
******* 第 6 行:1 空格 + 7 星號
***** 第 7 行:2 空格 + 5 星號
*** 第 8 行:3 空格 + 3 星號
* 第 9 行:4 空格 + 1 星號
total = 5i 行(1-based):空格數 = total - i,星號數 = 2*i - 1total - 1 到第 1 行k 行(1-based,k=1..4):空格數 = k,星號數 = 2*(total - k) - 1<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>倒置金字塔輸出</title>
<style>
pre { font-family: 'Courier New', monospace; font-size: 16px; line-height: 1.2; }
</style>
</head>
<body>
<h3>倒置金字塔 (菱形/沙漏) 輸出</h3>
<pre>
<%
int totalRows = 5; // 上半部行數(含中間最寬行)
StringBuilder sb = new StringBuilder();
// === 上半部:正向金字塔 ===
for (int i = 1; i <= totalRows; i++) {
// 輸出前導空格
for (int j = 0; j < totalRows - i; j++) {
sb.append(' ');
}
// 輸出星號
for (int j = 0; j < 2 * i - 1; j++) {
sb.append('*');
}
sb.append("<br>");
}
// === 下半部:倒向金字塔 ===
for (int k = 1; k < totalRows; k++) {
// 輸出前導空格
for (int j = 0; j < k; j++) {
sb.append(' ');
}
// 輸出星號
for (int j = 0; j < 2 * (totalRows - k) - 1; j++) {
sb.append('*');
}
sb.append("<br>");
}
%>
<%= sb.toString() %>
</pre>
</body>
</html>
str +=。<pre> 標籤中輸出,或將空格替換為 。範例採用 <pre> 保持等寬字體對齊。<br>,而非 \n。public class DiamondPrinter {
public static String generate(int maxRadius) {
StringBuilder sb = new StringBuilder();
// 上半部含中間行
for (int i = 1; i <= maxRadius; i++) {
sb.append(" ".repeat(maxRadius - i));
sb.append("*".repeat(2 * i - 1));
sb.append("\n");
}
// 下半部
for (int i = maxRadius - 1; i >= 1; i--) {
sb.append(" ".repeat(maxRadius - i));
sb.append("*".repeat(2 * i - 1));
sb.append("\n");
}
return sb.toString();
}
}
// JSP 中調用:<%= DiamondPrinter.generate(5).replace("\n", "
").replace(" ", " ") %>
Java 11+ 可使用 String.repeat() 進一步簡化迴圈;若需在 HTML 直接顯示,記得將空格轉 、換行轉 <br>。