我有一个初学者的问题。从概念上讲,我无法坚持到底,在if语句中将这段代码缠住:5 * i + j> = 7

这是Java Art and Science一书中的“日历程序”练习的一部分。我的主要问题是如何在工作日中设置月份的第一个日期,从而将日历中该月的所有日期推迟几天。

我查找了答案,但仍然不明白,解决方案是将5 * i + j> = 7放入我的if语句中,它可以工作,但是如何?
更改i或j是我最初的想法,但我不知道添加它们如何将日历天数正确地向右移动而不移动整周。

我尝试分解问题以使其更简洁时,删除了实际日历正方形的代码。

import acm.program.*;
import acm.graphics.*;

public class RandomCodeTesting extends GraphicsProgram{

    private static final int DAYS_IN_MONTH = 31;
    private static final int DAY_MONTH_STARTS =5;

    public void run() {
        int d = 1;
        for (int i=1; i<6; i++) {
            for (int j=0; j<7; j++) {
                int x= j*45;
                int y= i*15;
                if (5*i+j>= 7 && d <= 31) {
                    add(new GLabel(""+d), x, y);
                    d++;
                }
            }
        }

    }

最佳答案

条件实际上应该是DAY_MONTH_STARTS * i + j >= 7

这基本上是确定是否在坐标1 GLabel上放置(j, i)

让我们考虑DAY_MONTH_STARTS等于5的情况。这意味着坐标(0, 1)(1, 1)不应具有GLabel,日历的第一行具有5个GLabel,而所有中间的行有7个GLabel

通常,任何x值小于(7 - DAY_MONTH_STARTS)且y值为1的坐标都不应具有GLabel

这意味着您可以这样重写条件:

if(!(j < (7 - DAY_MONTH_STARTS) && i == 1) && d <= DAYS_IN_MONTH) {
    add(new GLabel(""+d), x, y);
    d++;
}


DAY_MONTH_STARTS * i + j >= 7实际上只是做同样事情的一个数学技巧。

09-04 05:44