理解菱形的基本结构
在用Java打印菱形之前,首先要明确菱形的构成规律,菱形可以看作由两部分组成:上半部分(包括中间行)是一个递增的三角形,下半部分是一个递减的三角形,以奇数行菱形为例,假设菱形共有n行(n为奇数),则上半部分有(n+1)/2行,下半部分有(n-1)/2行,每一行的内容由空格和星号(*)组成,其中空格的数量和星号的数量随着行数的变化而变化。

一个5行的菱形结构如下:
可以看到,第1行有2个空格和1个星号,第2行有1个空格和3个星号,第3行没有空格和5个星号,第4行和第5行与第2行和第1行对称,理解这种对称性和规律性是编写代码的基础。
确定菱形的大小和行数
菱形的大小通常由其总行数决定,为了简化问题,我们假设菱形的行数为奇数(如果是偶数,菱形会不够对称,处理起来稍复杂),可以通过用户输入或固定值来确定行数,这里以固定值为例,假设行数为size,且size为奇数。size = 5时,菱形如上所示;size = 7时,菱形会有更多行,结构类似。
打印上半部分(包括中间行)
上半部分包括从第1行到中间行的所有行,对于第i行(i从1开始计数),空格的数量为(size - 1) / 2 - (i - 1),星号的数量为2 * i - 1,以size = 5为例:
- 第1行:空格数 = (5-1)/2 – 0 = 2,星号数 = 21 – 1 = 1 → ” “
- 第2行:空格数 = (5-1)/2 – 1 = 1,星号数 = 2*2 – 1 = 3 → ” ***”
- 第3行:空格数 = (5-1)/2 – 2 = 0,星号数 = 2*3 – 1 = 5 → “*****”
在Java中,可以使用循环来实现,外层循环控制行数,内层循环分别打印空格和星号,以下是上半部分的代码框架:
int size = 5;
int half = size / 2;
for (int i = 0; i <= half; i++) {
// 打印空格
for (int j = 0; j < half - i; j++) {
System.out.print(" ");
}
// 打印星号
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
注意:这里的i从0开始计数,因此空格数和星号数的计算需要相应调整,如果i从1开始,公式需要调整为half - (i - 1)和2 * i - 1。

打印下半部分(对称部分)
下半部分是从中间行之后到最后一行的所有行,其结构与上半部分对称,对于第i行(i从half + 1到size - 1),空格的数量为i - half - 1,星号的数量为2 * (size - i) - 1,以size = 5为例:
- 第4行(i=4):空格数 = 4 – 2 – 1 = 1,星号数 = 2*(5-4) – 1 = 1 → ” ***”
- 第5行(i=5):空格数 = 5 – 2 – 1 = 2,星号数 = 2*(5-5) – 1 = -1(需要调整)
下半部分的行数可以表示为half - 1行,从i = 1到i = half - 1,空格数为i,星号数为2 * (half - i) + 1,以size = 5(half=2)为例:
- 第4行(i=1):空格数 = 1,星号数 = 2*(2-1) + 1 = 3 → ” ***”
- 第5行(i=2):空格数 = 2,星号数 = 2(2-2) + 1 = 1 → ” “
以下是下半部分的代码框架:
for (int i = 1; i < half; i++) {
// 打印空格
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
// 打印星号
for (int j = 0; j < 2 * (half - i) + 1; j++) {
System.out.print("*");
}
System.out.println();
}
完整代码实现
将上半部分和下半部分的代码组合起来,并确保size为奇数,以下是完整的Java代码:
public class Diamond {
public static void main(String[] args) {
int size = 5; // 菱形的行数,必须是奇数
int half = size / 2;
// 打印上半部分(包括中间行)
for (int i = 0; i <= half; i++) {
// 打印空格
for (int j = 0; j < half - i; j++) {
System.out.print(" ");
}
// 打印星号
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
// 打印下半部分
for (int i = 1; i < half; i++) {
// 打印空格
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
// 打印星号
for (int j = 0; j < 2 * (half - i) + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
代码优化和扩展
用户输入行数
可以通过Scanner类让用户输入行数,并确保输入为奇数:
import java.util.Scanner;
public class Diamond {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入菱形的行数(奇数):");
int size = scanner.nextInt();
if (size % 2 == 0) {
System.out.println("行数必须是奇数!");
return;
}
// 后续代码...
}
}
使用方法封装
将打印菱形的逻辑封装到方法中,提高代码复用性:

public static void printDiamond(int size) {
int half = size / 2;
// 上半部分
for (int i = 0; i <= half; i++) {
for (int j = 0; j < half - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
// 下半部分
for (int i = 1; i < half; i++) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * (half - i) + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
打印字符菱形
可以将星号替换为其他字符,如字母或数字:
char symbol = '#'; // 替换为其他字符
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print(symbol);
}
常见问题及解决方法
菱形不对称
可能是行数设置为偶数,或空格和星号的数量计算错误,确保size为奇数,并检查循环条件。
输出格式混乱
可能是循环嵌套错误或换行符使用不当,确保每个星号和空格的循环正确,并在每行结束后调用System.out.println()。
代码冗余
可以通过优化循环条件或使用方法减少重复代码,将上半部分和下半部分的循环合并,但会增加代码复杂度。
用Java打印菱形的核心在于理解其对称结构和空格、星号的分布规律,通过分步实现上半部分和下半部分,并结合循环控制,可以高效地完成代码编写,通过用户输入、方法封装等方式可以增强代码的灵活性和可读性,掌握这种结构化思维对于解决类似的图形打印问题非常有帮助。




















