我有一个初学者的问题。从概念上讲,我无法坚持到底,在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
实际上只是做同样事情的一个数学技巧。