使用嵌套for循环创建空心图形(Java):如何修改程序以支持任意合法输入
解决空心图形打印的输入限制问题
你的代码目前只能支持输入≤6的情况,核心原因是硬编码了所有边界行和列的判断条件——你把每个空心框的边界位置都直接写在了if语句里,当输入超过6时,没有对应的判断逻辑,自然无法正确打印更多的空心图形。
要支持任意≥1的合法输入,我们需要找到这些边界位置的数学规律,用动态计算代替硬编码的条件。
修改后的代码
package tester; import java.util.Scanner; public class Tester { public static void main(String[] args) { Scanner input = new Scanner(System.in); int ui, sideL; System.out.println("(Note: The number should be greater than or equal to 1: "); System.out.println("Enter a number: "); ui = input.nextInt(); // 先处理非法输入 if (ui < 1) { System.out.println("Invalid input!"); input.close(); return; } sideL = (ui * (ui - 1)) + 1; for (int a = 1; a <= sideL; a++) { for (int b = 1; b <= sideL; b++) { boolean printStar = false; if (ui == 1) { // 输入1时,只需要打印一个* printStar = true; } else { int interval = ui - 1; // 判断当前行或列是否属于空心框的边界 // 边界位置满足:(位置-1) 能被间隔值整除 if ((a - 1) % interval == 0 || (b - 1) % interval == 0) { printStar = true; } } System.out.print(printStar ? "* " : " "); } System.out.println(); } input.close(); } }
修改思路说明
- 移除硬编码条件:原来的
if语句里罗列了所有边界位置(比如a == ui、a == ui + (ui - 1)等),这是不可扩展的。我们通过数学规律来判断边界:- 对于输入
ui,空心框之间的间隔是ui - 1 - 所有边界行/列的位置满足:
(位置值 - 1) % (ui - 1) == 0,比如输入3时,间隔是2,边界位置就是1、3、5、7((1-1)%2=0,(3-1)%2=0,以此类推)
- 对于输入
- 单独处理输入1的情况:当
ui=1时,间隔为0,取模运算会报错,所以直接判断打印单个* - 优化输入校验:把非法输入的判断提前,逻辑更清晰,同时关闭
Scanner避免资源泄漏
这样修改后,无论输入多大的合法值(≥1),程序都能根据规律动态计算边界位置,正确打印对应的空心图形。
内容的提问来源于stack exchange,提问作者ArkBlue
相关产品推荐
相关产品推荐

