Java如何打印空心菱形?

使用Java打印空心菱形需将图形分为上下两部分:上半部分由递增的空格和星号组成,下半部分递减,关键逻辑是每行仅首尾输出星号,中间填充空格,通过循环控制空格数和星号位置实现空心效果。

以下是用Java打印空心菱形的详细方法,包含代码实现、逻辑解释和优化建议,适合不同基础的访客理解:

Java如何打印空心菱形?

核心思路

空心菱形由对称的上下三角形组成,关键点在于:

  1. 空格控制:定位每行起始位置
  2. 星号规则:首尾位置打印星号,中间用空格填充
  3. 对称分割:分上半部分(递增)和下半部分(递减)

完整代码实现

import java.util.Scanner;
public class HollowDiamond {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入菱形高度(奇数): ");
        int n = scanner.nextInt();
        // 确保输入为奇数
        if (n % 2 == 0) {
            System.out.println("输入应为奇数,自动转换为 " + (n + 1));
            n += 1;
        }
        int mid = n / 2;  // 中间行索引
        // 打印上半部分(含中间行)
        for (int i = 0; i <= mid; i++) {
            printLine(mid, i, n);
        }
        // 打印下半部分
        for (int i = mid - 1; i >= 0; i--) {
            printLine(mid, i, n);
        }
    }
    private static void printLine(int mid, int i, int total) {
        // 1. 打印前导空格
        for (int j = 0; j < Math.abs(mid - i); j++) {
            System.out.print(" ");
        }
        // 2. 打印第一个星号
        System.out.print("*");
        // 3. 计算中间空格数
        int innerSpace = total - 2 * Math.abs(mid - i) - 2;
        // 4. 打印中间空格和尾星号(非首行)
        if (innerSpace > 0) {
            for (int j = 0; j < innerSpace; j++) {
                System.out.print(" ");
            }
            System.out.print("*");
        }
        // 5. 换行
        System.out.println();
    }
}

关键逻辑说明

  1. 输入处理

    • 要求输入奇数高度(偶数自动+1)
    • 示例:输入5生成标准菱形
  2. 行数计算

    Java如何打印空心菱形?

    int mid = n / 2;  // 示例:n=5时 mid=2(0起索引)
  3. 空格规律
    | 行号(i) | 前导空格数 | 中间空格数 | 输出示例 |
    |———|————|————|———-|
    | 0 | 2 | -1 | |
    | 1 | 1 | 1 | |
    | 2 | 0 | 3 | |

  4. 核心公式

    • 前导空格:Math.abs(mid - i)
    • 中间空格:总宽度 - 2*前导空格 - 2
    • 尾星号条件:中间空格数 > 0

运行示例

输入高度5时输出:

Java如何打印空心菱形?

优化建议

  1. 动态构建:改用StringBuilder减少IO操作
    StringBuilder sb = new StringBuilder();
    // ... 在方法内追加字符
    System.out.print(sb.toString());
  2. 异常处理:添加输入验证
    if (n <= 0) {
        System.out.println("高度必须为正整数");
        return;
    }
  3. 扩展性:封装打印方法,支持不同字符
    void printDiamond(int n, char symbol) { ... }

常见问题解决

  • 菱形不对称:确保总行数为奇数
  • 多行合并:检查换行符println()是否遗漏
  • 首尾行异常:验证innerSpace>0的条件判断

引用说明:本文代码逻辑基于空间几何对称性原则实现,参考《Java编程思想》中循环控制结构的最佳实践,算法通过数学关系式动态计算空格位置,避免硬编码提升可扩展性。

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/27838.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月17日 08:20
下一篇 2025年6月11日 21:57

相关推荐

  • Java快速掌握数据库插入技巧

    在Java中插入数据库数据通过JDBC实现:加载驱动、建立连接、创建PreparedStatement对象,使用参数化SQL语句设置值,调用executeUpdate()执行插入,最后关闭连接资源,关键代码示例:,“java,String sql = “INSERT INTO users(name,email) VALUES(?,?)”;,try (Connection conn = DriverManager.getConnection(url,user,pass);, PreparedStatement pstmt = conn.prepareStatement(sql)) {, pstmt.setString(1, “张三”);, pstmt.setString(2, “zhangsan@example.com”);, pstmt.executeUpdate();,},“

    2025年5月30日
    200
  • Java如何选中文本框?

    在Java中,通过调用文本框的selectAll()方法可实现全选文本,例如使用textField.selectAll(),通常在获得焦点时触发(如添加FocusListener),确保用户交互时自动选中内容。

    2025年6月10日
    100
  • Java IO如何追加文件内容?

    使用Java IO追加文件内容,可通过FileWriter或FileOutputStream构造时设置append参数为true实现,FileWriter fw = new FileWriter(“file.txt”, true); 结合BufferedWriter写入数据,或使用Files.write()方法(Java7+)指定StandardOpenOption.APPEND选项,确保及时关闭流以释放资源。

    2025年6月16日
    100
  • Java如何构造结构体?

    Java中没有结构体类型,但可通过类或记录类(record)模拟,定义包含公共字段的类(无封装),或使用Java 14+的record声明不可变数据结构,两者均可实现类似C语言结构体的数据聚合功能。

    2025年6月9日
    200
  • Java如何查询数据库行数?

    在Java中获取数据库表行数,通常通过执行SQL的COUNT(*)聚合查询实现,使用JDBC连接数据库后,创建Statement执行”SELECT COUNT(*) FROM table_name”语句,从ResultSet中获取第一列的整数值即为总行数,需注意异常处理并关闭连接资源。

    2025年6月1日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN