很多初學者面對打印菱形、三角形的嵌套循環代碼感到無從下手。本文以一個典型的星號菱形打印程序為例,逐行解析變量含義、循環邏輯、條件判斷,幫助建立「行列座標系」思維模型。
public class DiamondPrint {
public static void main(String[] args) {
int row = 7; // 總行數(建議奇數對稱)
int starCount; // 當前行星號數
int spaceCount; // 當前行前導空格數
String star = "*";
for (int i = 1; i <= row; i++) { // 外層循環:控制行號 1~7
String line = ""; // 當前行字符串構建器
// 核心邏輯:判斷上半部分還是下半部分
if (i * 2 - 1 > row) { // 超過中間行(第4行)
// 下半部分:星號遞減
starCount = (row - i) * 2 + 1;
spaceCount = (row - starCount) / 2;
} else {
// 上半部分:星號遞增
starCount = i * 2 - 1;
spaceCount = (row - starCount) / 2;
}
// 內層循環1:拼接前導空格
for (int j = 0; j < spaceCount; j++) {
line += " ";
}
// 內層循環2:拼接星號
for (int j = 0; j < starCount; j++) {
line += star;
}
System.out.println(line); // 輸出當前行並換行
}
}
}
row = 7:菱形總行數,決定菱形大小,建議奇數保證上下對稱starCount、spaceCount:行級變量,每行重新計算,存儲當前行屬性star = "*":字符常量,便於修改打印字符(如改為"#"、"@")for (int i = 1; i <= row; i++) // i 代表當前行號:1,2,3,4,5,6,7
每次迭代處理一行完整輸出,i是核心自變量,所有行屬性由i推導。
if (i * 2 - 1 > row) // 等價於 i > (row+1)/2,即 i > 4
1,3,5,7,公式2*i-15,3,1,公式(row-i)*2+1(row - starCount) / 2,利用總寬度固定推導// 空格循環:j從0到spaceCount-1
for (int j = 0; j < spaceCount; j++) line += " ";
// 星號循環:j從0到starCount-1
for (int j = 0; j < starCount; j++) line += star;
兩個循環順序不可顛倒:先空格後星號,才能形成左對齊的菱形視覺效果。
| 行號i | 判斷條件 | starCount | spaceCount | 輸出效果 |
|---|---|---|---|---|
| 1 | 1*2-1=1 ≤ 7 | 1 | 3 | ___* |
| 2 | 3 ≤ 7 | 3 | 2 | __*** |
| 3 | 5 ≤ 7 | 5 | 1 | _***** |
| 4 | 7 ≤ 7 | 7 | 0 | ******* |
| 5 | 9 > 7 | 5 | 1 | _***** |
| 6 | 11 > 7 | 3 | 2 | __*** |
| 7 | 13 > 7 | 1 | 3 | ___* |
line +=產生大量臨時對象calcStars(row, i)、calcSpaces(row, stars)int mid = (row+1)/2; int dist = Math.abs(i-mid); stars = 2*(mid-dist)-1;掌握「外層循環遍歷行、內層循環構建列、條件判斷控制行屬性」這一核心模式,配合紙上列表推導公式,所有幾何圖形打印問題都將迎刃而解。