上一篇
如何用Java编写菱形图案?
- 后端开发
- 2025-06-13
- 3630
使用Java输出菱形需分为上下两部分:上半部分每行空格递减、星号递增(奇数个);下半部分空格递增、星号递减,通过嵌套循环控制行数、空格数和星号数,利用数学关系计算每行字符数量,确保对称性即可实现标准菱形图案。
在Java中输出菱形图案是一个常见的编程练习,通过控制循环和条件判断实现图形的对称性,以下详细说明实现原理、代码示例和优化技巧,帮助您快速掌握。
实现原理
菱形由空格和星号(*)组成,分为对称的上半部分和下半部分:
- 上半部分:行数递增,空格递减,星号递增(1, 3, 5…奇数序列)
- 下半部分:行数递减,空格递增,星号递减
- 关键公式:
- 每行星号数 =
2 * 当前行索引 + 1
- 每行空格数 =
总行数/2 - 当前行索引
(取绝对值保证对称)
- 每行星号数 =
完整代码示例
import java.util.Scanner; public class DiamondPattern { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入菱形的半高(大于0的整数): "); int halfHeight = scanner.nextInt(); // 计算总行数(奇数) int totalRows = 2 * halfHeight - 1; // 打印上半部分(包括中间行) for (int i = 0; i < halfHeight; i++) { // 打印空格 for (int j = 0; j < halfHeight - i - 1; j++) { System.out.print(" "); } // 打印星号 for (int k = 0; k < 2 * i + 1; k++) { System.out.print("*"); } System.out.println(); } // 打印下半部分 for (int i = halfHeight - 2; i >= 0; i--) { // 打印空格 for (int j = 0; j < halfHeight - i - 1; j++) { System.out.print(" "); } // 打印星号 for (int k = 0; k < 2 * i + 1; k++) { System.out.print("*"); } System.out.println(); } } }
代码解析
-
输入处理:
- 使用
Scanner
获取用户输入的半高值(如输入3,则菱形总高度为5行) halfHeight
控制菱形大小
- 使用
-
上半部分逻辑:
- 外层循环控制行数(0到
halfHeight-1
) - 空格数 =
halfHeight - i - 1
(随行数增加而减少) - 星号数 =
2*i + 1
(生成奇数序列:1,3,5…)
- 外层循环控制行数(0到
-
下半部分逻辑:
- 外层循环反向进行(
halfHeight-2
到0) - 空格和星号计算方式与上半部分相同
- 通过倒序循环实现对称
- 外层循环反向进行(
-
输出示例(输入3):
高级优化技巧
-
单循环实现(减少代码量):
int size = 2 * halfHeight - 1; for (int i = 0; i < size; i++) { int spaces = Math.abs(halfHeight - i - 1); int stars = size - 2 * spaces; System.out.println(" ".repeat(spaces) + "*".repeat(stars)); }
-
空心菱形(仅输出边框):
// 修改星号打印部分 if (k == 0 || k == 2 * i) { // 只输出首尾星号 System.out.print("*"); } else { System.out.print(" "); }
-
动态字符:
- 将星号替换为变量(如
char symbol = '#';
) - 实现自定义字符菱形
- 将星号替换为变量(如
常见问题解决
-
菱形不对称:
- 检查半高计算:总行数必须是奇数(
2*halfHeight-1
) - 验证空格公式:上半部分空格应为
halfHeight - i - 1
- 检查半高计算:总行数必须是奇数(
-
输入值验证:
if (halfHeight < 1) { System.out.println("输入值必须大于0!"); return; }
-
控制台对齐问题:
- 使用
System.out.printf
格式化输出 - 或采用
StringBuilder
构建每行字符串
- 使用
引用说明:本文代码基于Java 11语法编写,
String.repeat()
方法需JDK 11+,低版本可使用循环替代,算法设计参考《Java编程思想》循环结构应用范例,结合ACM图形输出最佳实践优化。