在Java编程练习中,打印星形图案是巩固循环嵌套逻辑的经典场景,其中蝴蝶形状的星形图案因为需要满足上下对称、左右对称的结构要求,能很好地锻炼开发者对行列规律的拆解能力。要实现精确打印,核心是先把完整的蝴蝶图案拆成上下两部分,再分别分析每部分的行列对应关系。

蝴蝶图案的结构拆分
我们先明确一个规模为n的蝴蝶图案(n为上半部分的行数)的整体结构:上半部分有n行,每行先打印递增的星号,再打印递减的空格,最后再打印递增的星号,整体呈现上宽下窄的形状;下半部分同样有n行,结构和上半部分对称,每行先打印递减的星号,再打印递增的空格,最后再打印递减的星号,整体呈现上窄下宽的形状,上下两部分组合后就是完整的蝴蝶图案。
上半部分打印逻辑
上半部分第i行(i从1到n)的规律为:左侧星号数量为i个,中间空格数量为2*(n-i)个,右侧星号数量为i个。我们可以通过外层循环控制行数,内层两个循环分别控制星号和空格的打印。
public class ButterflyPattern {
public static void printUpperPart(int n) {
// 外层循环控制上半部分的行数,共n行
for (int i = 1; i <= n; i++) {
// 打印左侧星号,数量为i个
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
// 打印中间空格,数量为2*(n-i)个
for (int j = 1; j <= 2 * (n - i); j++) {
System.out.print(" ");
}
// 打印右侧星号,数量为i个
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
// 每行打印完成后换行
System.out.println();
}
}
}下半部分打印逻辑
下半部分第i行(i从1到n)的规律为:左侧星号数量为n-i+1个,中间空格数量为2*(i-1)个,右侧星号数量为n-i+1个。逻辑和上半部分类似,只是行列的数量对应关系发生了反转。
public class ButterflyPattern {
public static void printLowerPart(int n) {
// 外层循环控制下半部分的行数,共n行
for (int i = 1; i <= n; i++) {
// 打印左侧星号,数量为n-i+1个
for (int j = 1; j <= n - i + 1; j++) {
System.out.print("*");
}
// 打印中间空格,数量为2*(i-1)个
for (int j = 1; j <= 2 * (i - 1); j++) {
System.out.print(" ");
}
// 打印右侧星号,数量为n-i+1个
for (int j = 1; j <= n - i + 1; j++) {
System.out.print("*");
}
// 每行打印完成后换行
System.out.println();
}
}
}完整可运行代码
把上下两部分的逻辑组合起来,再加上主函数接收用户输入的n值,就能得到通用的蝴蝶图案打印程序,用户可以通过修改n的值调整蝴蝶的大小。
import java.util.Scanner;
public class ButterflyPattern {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入蝴蝶图案上半部分的行数:");
int n = scanner.nextInt();
// 打印上半部分
printUpperPart(n);
// 打印下半部分
printLowerPart(n);
scanner.close();
}
public static void printUpperPart(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
for (int j = 1; j <= 2 * (n - i); j++) {
System.out.print(" ");
}
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
public static void printLowerPart(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i + 1; j++) {
System.out.print("*");
}
for (int j = 1; j <= 2 * (i - 1); j++) {
System.out.print(" ");
}
for (int j = 1; j <= n - i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}注意事项
- 打印星号和空格时不要多余换行,只有每行所有内容打印完成后再调用println方法换行。
- 如果n的值过大,控制台可能会出现换行显示的问题,建议测试时先使用较小的n值比如3、4验证逻辑正确性。
- 如果需要打印其他对称图案,可以参考这个拆分结构的思路,先拆分整体结构,再分析每部分的行列规律,最后用循环实现即可。