Java实现指定奇数高度与字符的字母菱形打印逻辑优化咨询
核心问题与修改方案
你现有代码的问题主要集中在4处:
- 外层循环次数不足:h高度的菱形需要输出h行,你现在的循环仅执行h-2次,缺了首行和下半段所有行
- 直接修改了用户输入的原始字符变量
c,导致每行的起始字符不断偏移,输出字符不符合预期 - 没有按中间行拆分上下半段的增减逻辑,菱形的上下半段空格、字符数的变化趋势是相反的
- 空格计算逻辑错误,导致所有输出行整体偏右
修改后的可运行代码
import java.util.Scanner; public class DiamondPrint { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("h: "); int h = in.nextInt(); System.out.print("c: "); char c = in.next().charAt(0); if(h%2==0){ System.out.println("Invalid number!"); return; } int mid = h / 2; // 计算中间行的索引 char originalC = c; // 保存原始输入的字符,不要修改这个值 for (int i = 0; i < h; i++) { // 计算当前行前面的空格数 int spaceNum = Math.abs(mid - i); for (int spc = 0; spc < spaceNum; spc++) { System.out.print(" "); } // 计算当前行的字符总数 int charCount = h - 2 * spaceNum; // 打印字符 for (int j = 0; j < charCount; j++) { // 直接计算当前位置应该输出的字符,不需要修改原始字符 char currentChar = (char) (originalC - Math.abs(j - (charCount / 2))); System.out.print(currentChar); } System.out.println(); } in.close(); } }
逻辑说明
- 用
mid存菱形中间行的索引,上下半段的空格、字符数都通过当前行索引和mid的差值计算,不需要额外的递增/递减变量维护 - 提前保存用户输入的原始字符,每行的每个位置字符都通过偏移量直接计算,不会出现字符偏移的问题
- 外层循环执行h次,刚好覆盖菱形的所有行,输出和你的预期完全一致
内容的提问来源于stack exchange,提问作者user4964096
相关产品推荐
相关产品推荐

