【Java】使用两个双层For循环输出空心的菱形时参数的取值问题

【问】下面的实例代码中,两个双层For循环中的i、j的取值应该如何理解?【题】创建Diamond类,在该类的主方法中完成10行的空心菱形输出,实现方法是使用两个双层For... 【问】下面的实例代码中,两个双层For循环中的 i、j 的取值应该如何理解?
【题】创建Diamond类,在该类的主方法中完成10行的空心菱形输出,实现方法是使用两个双层For循环分别输出菱形的上半部分与下半部分,实例代码如下:

public class Diamond {
public static void main(String[] args) {
int size = 10;
if (size % 2 == 0) {
size++;// 计算菱形大小
}
for (int i = 0; i < size / 2 + 1; i++) {
for (int j = size / 2 + 1; j > i + 1; j--) {
System.out.print(" ");// 输出左上角位置的空白
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {
System.out.print("*");// 输出菱形上半部边缘
} else {
System.out.print(" ");// 输出菱形上半部空心
}
}
System.out.println("");
}
for (int i = size / 2 + 1; i < size; i++) {
for (int j = 0; j < i - size / 2; j++) {
System.out.print(" ");// 输出菱形左下角空白
}
for (int j = 0; j < 2 * size - 1 - 2 * i; j++) {
if (j == 0 || j == 2 * (size - i - 1)) {
System.out.print("*");// 输出菱形下半部边缘
} else {
System.out.print(" ");// 输出菱形下半部空心
}
}
System.out.println("");
}
}
}

实例运行结果如图

所示。
展开
 我来答
在仙宫湖滑旱冰的碧玉兰
推荐于2018-04-26 · TA获得超过315个赞
知道小有建树答主
回答量:163
采纳率:100%
帮助的人:142万
展开全部
public class Test2014111801 {
    public static void main(String[] args) {

        int size = 10;
        if (size % 2 == 0) {//用size除以2余数等于0,说明size是个偶数,但菱形长度都是奇数的,所以需要加1
            size++;
        }
        //整个循环都是从上到下,从左往右一个一个画的,只要符合条件就画一个对应的图标
        for (int i = 0; i < size / 2 + 1; i++) { //先循环上半部分,这是行
            for (int j = size / 2 + 1; j > i + 1; j--) {//循环列,画左上空白部分
                System.out.print("1");// 每行从左往右画“1”的个数是(size/2+1)-(i+1),比如第一行是(10/2+1)-(0+1)=5,所以第一行画5个“1",以此类推
            }
            for (int j = 0; j < 2 * i + 1; j++) {//则开始画边缘“*”和空白,开始地方是上面那个for循环画完之后的位置,这里的j和上面没有关系,这是重新从0开始计算的
                if (j == 0 || j == 2 * i) {//已知紧跟着的第一个就是“*”,所以j==0时画个“*”,
                    System.out.print("*");// 第二个“*”的位置离第一个“*”的位置与行数的关系2*行号,如第二行第二个“*”的位置离第一个“*”2*1=2位(行号从0算起)
                } else {
                    System.out.print("2");// 其他不是“*”的位置用“2”填充
                }
            }
            System.out.println("3");//最外面画个“3”,
        }
        //下半部分类似
        for (int i = size / 2 + 1; i < size; i++) {
            for (int j = 0; j < i - size / 2; j++) {
                System.out.print(" ");// 输出菱形左下角空白
            }
            for (int j = 0; j < 2 * size - 1 - 2 * i; j++) {
                if (j == 0 || j == 2 * (size - i - 1)) {
                    System.out.print("*");// 输出菱形下半部边缘
                } else {
                    System.out.print(" ");// 输出菱形下半部空心
                }
            }
            System.out.println("");
        }
    }
}
可以自己先理解理解,有问题可以追问
更多追问追答
追问

看了你的解释,我理解了大半,谢谢!但是我还是有一些疑惑:

如你所述得下图1:

如题所述得下表1:

把黄色部分与绿色部分所对应的 j 看成列的标号是可以理解的,只是它们的参考点不同而已。

对于红色部分,把左下角空白对应的 j 看成列的标号也是可以理解的,但如果把左上角空白对应的 j 看成列的标号我却无法理解。

【请问】我该如何理解左上角空白对应的 j,即我该把表1中左上角空白对应的 j 的取值看成什么?

追答
j是那一行空格的最大个数,然后每一行递减,因为行是从0开始的所以行那就+1,所以计算公式就是(10/2+1)-(行号+1)=该画空格的个数
laobaitu0322
2014-11-18 · TA获得超过744个赞
知道小有建树答主
回答量:900
采纳率:33%
帮助的人:645万
展开全部
你可以把i看成行号,j用来控制每一行中每个位置要打印空格还是星号,其位置与行号有关
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式