
本文详解如何使用嵌套循环和条件判断,在 java 中动态生成由指定边框字符和内部填充字符组成的矩形框,支持任意宽高及字符组合。
要实现一个“外框为一种字符、内部为另一种字符”的矩形(如 X 为边框、O 为填充),关键在于区分每一行和每一列的位置角色:首行、末行、首列、末列应打印边框字符;其余所有位置则打印内部填充字符。
原始代码中,内外统一使用 border 打印,因此整个框全是边框。修复的核心逻辑是:在双重循环中,通过 if-else 判断当前坐标 (j, i) 是否处于边界位置:
- 行索引 j == 0 → 第一行(上边框)
- 行索引 j == height - 1 → 最后一行(下边框)
- 列索引 i == 1 或 i == width → 当前行的首列或末列(左右边框)
- 其余情况 → 内部区域,输出 interior
注意:原代码中内层循环起始为 i = 1 且终止于 i
以下是修正后的完整可运行代码(含注释优化与健壮性提示):
立即学习“Java免费学习笔记(深入)”;
import java.util.Scanner;
public class Box {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
int width;
int height;
char border;
char interior;
System.out.print("Enter width : ");
width = scnr.nextInt();
System.out.print("Enter height : ");
height = scnr.nextInt();
System.out.print("Enter border : ");
border = scnr.next().charAt(0);
System.out.print("Enter interior : ");
interior = scnr.next().charAt(0);
// 边界校验:最小尺寸应为 2×2,否则无法形成“内部”
if (width < 2 || height < 2) {
System.out.println("Error: Width and height must be at least 2 to form a bordered box.");
return;
}
// 主绘图循环
for (int j = 0; j < height; j++) {
for (int i = 1; i <= width; i++) {
// 判断是否为边界位置:首行、末行、首列、末列
if (j == 0 || j == height - 1 || i == 1 || i == width) {
System.out.print(border);
} else {
System.out.print(interior);
}
}
System.out.println(); // 换行
}
}
}✅ 运行示例(输入 width=7, height=5, border='X', interior='O'):
XXXXXXX XOOOOOX XOOOOOX XOOOOOX XXXXXXX
⚠️ 注意事项:
- 若输入 width=1 或 height=1,将无法区分“边框”与“内部”,程序会输出全边框(逻辑上退化为线段)。建议添加最小尺寸校验(如上所示),提升鲁棒性。
- 使用三元运算符可进一步精简内层逻辑(如答案中提供的短版本),但初学者推荐显式 if-else 结构,更易调试与理解。
- scnr.next().charAt(0) 可安全读取单字符;若用户输入空格或多个字符,仅取首字符——这是本题合理假设,如需更严格输入控制,可配合 scnr.nextLine() 和字符串长度校验。
掌握此模式后,可轻松扩展为圆角框、阴影效果、甚至 ASCII 艺术图形——核心始终是:用坐标逻辑驱动字符选择。









