我有一个初学者的问题。我不知道它的生命在概念上用if语句包围这段代码:5 * i + j> = 7
这是"日历计划的一部分"在Java的艺术和科学书籍中练习。我的主要问题是如何在工作日设置月份的第一个日期,从而将日历中的所有日期推到几天的日历中。
我查了解答案,但仍然没有得到它,解决方案是简单地在我的if语句中放入5 * i + j> = 7并且它有效,但是如何? 改变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++;
}
}
}
}
答案 0 :(得分:1)
条件应该是DAY_MONTH_STARTS * i + j >= 7
。
这基本上决定了是否在坐标 1 GLabel
上加(j, i)
。
让我们考虑DAY_MONTH_STARTS
等于5的情况。这意味着坐标(0, 1)
和(1, 1)
不应该有GLabel
,留下日历的第一行有5 GLabel
s,而中间的所有行都有7 GLabel
s。
通常,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
实际上只是一个做同样事情的数学技巧。