我是编程新手,目前正在将Java作为我的第一门入门课程。以下是我过去一周一直在努力的练习,但无法弄清楚如何去做。有人可以帮忙吗?感谢
您被要求编写一个程序,模仿邮递员在翻转邮箱时进行实验。
翻转意味着在邮箱关闭时打开邮箱,并在邮箱打开时关闭邮箱。
有100个编号为1到100的邮箱最初都已关闭。在第一步中,访问每个邮箱(即邮箱1,2,3,...,100),他将所有邮箱翻转。然后在第二步中,访问每个第二个邮箱(即邮箱2,4,6,...,100),他翻转它们。然后在第三步中,访问每个第三个邮箱(即邮箱3,6,9,...,99),他翻转它们。以这种方式,他按步骤4,5,...,10,...,50,最后是100,其中他直接进入第100个邮箱并翻转它。
在此过程结束时,哪些邮箱已打开?提示:设置一个布尔数组,所有布尔值都初始化为false,表示已关闭的邮箱。然后,以1,2,3,...,100的步长完成邮箱序列并切换它们。最后,打印出打开的邮箱号码(值为true)。
大家好, 万分感谢您的指导。以下是我能够做到的。不幸的是,我意识到如果我继续这样,我可能不得不重复这个过程到第99个索引。有没有更有效的方法呢?
public class Assignment {
public static void main(String[] args) {
int index;
boolean mailBoxes[] = new boolean[100];
//flip each mailbox
for(index=0; index<mailBoxes.length;index++){
mailBoxes[index] = !mailBoxes[index];
System.out.println(mailBoxes[index]);
}
for(index=1; index<mailBoxes.length;index+=2){
mailBoxes[index] = !mailBoxes[index];
System.out.println(mailBoxes[index]);
}
for(index=2; index<mailBoxes.length;index+=3){
mailBoxes[index] = !mailBoxes[index];
System.out.println(mailBoxes[index]);
}
答案 0 :(得分:1)
由于它是一项作业,我不会为您编写任何实际代码,但有些pseudo-code
。
我该怎么做:由于要求没有指定其他任何内容,而不是邮箱的开闭状态,boolean
(true
或false
)数组会很好。
然后你可以按照以下方式进行翻转:
for i=1 to 100 increment by 1
flip(mailboxes, i)
end
每一秒的翻转:
for i=2 to 100 increment by 2
flip(mailboxes, i)
end
所以你不妨做每一个,第二个,第三个...在另一个循环中翻转:
for j=1 to 4 increment by 1
for i=j to 100 increment by j
flip(mailboxes, i)
end
end
外部循环将来自1 to 4
,内部循环可以使用j
作为迭代的开始以及增量值。
flip
函数的职责是将输入布尔数组的值设置为相反的:
function flip(array, index)
array[index] = !array[index]
end
如果您喜欢这个想法,以下是可以帮助您实际实施的文档:
答案 1 :(得分:0)
您可以尝试使用两个列表来跟踪邮件状态。
List<MailId> read;
List<MailId> unread;
当用户翻阅邮件进行阅读时,将MailId从未读移动到阅读列表,反之亦然。
答案 2 :(得分:0)
要尝试让您入门,您需要一个代表邮箱的boolean
数组...... boolean
或true
(让我们说开放)或false
(让我们说关闭)。
boolean[] mailBoxes = new boolean[100];
关于这个的好处是,数组中的所有元素都自动设置为false
!
首先仔细查看the Arrays trail了解更多详情。
接下来,您需要某种方式访问每个邮箱,现在,您可以通过多种方式执行此操作,但为简单起见,您可以使用for-next-loop
for (int index = 0; index < mailBoxes.length; index++) {
//...
}
请查看The for Statement了解更多详情......
然后,您需要一些方法来更改每个邮箱的状态,即更改指定的值...再次,有多种方法可以执行此操作...
您可以使用if-else
声明
if (mailBoxes[index]) { // is true
mailBoxes[index] = false;
} else {
mailBoxes[index] = true;
}
或者,您可以更简单地使用!
(非)运算符翻转值...
mailBoxes[index] = !mailBoxes[index];
这只是说mailBoxes[index]
目前不是mailBoxes[index]
,这会将true
变为false
,反之亦然......
现在,复杂的部分是,您需要使用至少三个for-next
循环,所有循环都有不同的增量...这就是为什么我建议for-next-loop
例如,第二个循环可能看起来像......
for (int index = 0; index < mailBoxes.length; index += 2) {
这应该推动正确的方向......
另外,不要忘记使用大量System.out.println
语句来查看正在进行的操作;)
答案 3 :(得分:0)
如上所述,大部分解决方案已经暗示过了。
//You can use just an array of boolean (which by default inits to false):
boolean[] b = new boolean[100];
//then insert loop for steps (which are incremented from 1 to 50 as it seems)
for (int step=1;step<=50;step++){
//then loop over array elements using current step
for(int j=0;j<b.length;j+=step){
//flip mailbox using 'not' operator
b[j]=!b[j];
}
//you can also print results to System.out to debug
}
请注意,非标准步数= 100(仅翻转最后一次),您可以手动执行此操作。
如果您是java新手,请注意从零开始的索引,即第一个邮箱实际上是b [0](如果您将使用ArrayList,则为boxes.get(0))。 此外,以某种方式修改代码(超出任务要求)以更好地理解更精细的细节也是一件好事。