2

我有这个月底到期的任务,我已经完成了一半。我们必须使用 Zeller 的同余性来计算 1st 登陆的星期几。从那时起(并考虑闰年),您必须使用循环打印出相应年份的日历。老师说这应该是一个非常短的程序,我们不应该尝试暴力破解程序的逻辑(基本上不要每个月使用一堆 if else 和循环)。我已经有了数学计算和闰年部分,但由于多种原因,我无法理解如何使这个 for 循环工作:

  • 我将如何考虑每个月的空格?就像我实际需要多少个嵌套循环一样?
  • 我是否需要为闰年、31 天的月份和 30 天的月份等编写不同的循环,还是可以用 1 个巨大的嵌套循环来处理所有这些?

例如,我刚开始编写一个 for 循环,只是想看看我是否可以打印出没有任何特殊格式(空格、月份名称、日期等)的典型 31 天日历。这是我使用 for 循环的第一个测试:

    for(int i = 1; i < 31; i++)
    {
        for(int j = 0; j < 7; j++)
        {


            System.out.print(i + "\t");
            i++;
            if(j == 6){
                i--;}

            if(i > 31)
            {
                break;
            }

        }
        System.out.print("\n");
    }

使用它多个月和空格的逻辑是什么。我欢迎所有帮助,但请不要给我源代码。我希望用我编写的代码完成这项工作,就像我说的,这也是一项任务,我不会真正从复制和粘贴代码中学习。就我需要使用的逻辑向我说一下吧。对于特殊情况,我可以处理所有其他条件。多谢你们。

4

2 回答 2

1

我会写一个函数来显示一个月的参数:dayOfWeek, numberOfDays, [name, firstDayOfWeek]

  • dayOfWeek - 星期几是该月的第一天
  • numberOfDays - 本月的天数

可选参数如果你喜欢你可以实现

  • name - 月份的名称
  • firstDayOfWeek - 一些日历使用星期日其他使用星期一作为第一天,如果您喜欢这种灵活性,您也可以实现这一点。

并且逻辑很简单您只需一个循环来迭代 numberOfDays+dayOfWeek-1 次即可。内部您只需要检查周结束以创建新行并在第一周显示空格 dayOfWeek-1 次。

于 2013-07-05T01:12:38.097 回答
1

好的,您需要管理在一组固定值之间变化的东西,因此您基本上需要一种从循环内访问这些可变数据的方法。

解决这个问题的最佳工具可能是数组

如果您存储在数组中,例如月份的持续时间,您将能够以直接的方式(通过索引)访问它们,这样您就不需要任何条件链,您只需要当前的索引月,例如monthDurations[i] == 31

如果您想更好地构建所有内容,您可以定义自己的Month类或Day类或任何您需要跟踪打印问题(例如空格或名称)的内容,以便所有内容都可以轻松封装和维护。

于 2013-07-05T01:07:12.810 回答