当前位置: 首页 > 知识库问答 >
问题:

从给定的月份/年份打印日历

颛孙嘉玉
2023-03-14

我正在做一个Java作业,它涉及在用户指定月份和年份后打印日历。我不能使用日历或日历类。我的问题是日历不能正确地打印月份的第一天是星期六。我已经看了我的代码大约一个小时了,我不确定哪里出了问题。我用Zeller的同余来计算月的第一天,它由“h”表示。

例如,2008年3月的日历(错误)如下所示:

     March 2008
Su Mo Tu We Th Fr Sa
 1 
 2  3  4  5  6  7  8 
 9 10 11 12 13 14 15 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31 

这是我的代码:

package calendar;

import java.util.Scanner;

public class Calendar
{
    private static int numDays = 0;
    private static int h = 0;
    public static boolean leap(int year)
    {
        if(((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public static void firstDayOfYear(int year)
    {
        int month = 13;
        year--;
        h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7;
        String dayName = "";
        switch(h)
        {
            case 0: dayName = "Saturday"; break;
            case 1: dayName = "Sunday"; break;
            case 2: dayName = "Monday"; break;
            case 3: dayName = "Tuesday"; break;
            case 4: dayName = "Wednesday"; break;
            case 5: dayName = "Thursday"; break;
            default: dayName = "Friday"; break;
        }
        System.out.println("The first day of the year is " + dayName);
    }
    public static void firstDayOfMonth(int month, int year)
    {
        if(month == 1 || month == 2)
        {
            month += 12;
            year--;
        }
        h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7;
        String dayName = "";
        switch(h)
        {
            case 0: dayName = "Saturday"; break;
            case 1: dayName = "Sunday"; break;
            case 2: dayName = "Monday"; break;
            case 3: dayName = "Tuesday"; break;
            case 4: dayName = "Wednesday"; break;
            case 5: dayName = "Thursday"; break;
            default: dayName = "Friday"; break;
        }
        System.out.println("The first day of the month is " + dayName);
    }
    public static void numDaysInMonth(int month, int year)
    {
        int[] days = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        if (month == 2 && leap(year)) days[month] = 29;
        numDays = days[month];
        System.out.println("The number of days in the month is " + numDays);
    }
    public static void printCal(int month, int year)
    {
        String[] monthNames = {"","January","February","March","April","May","June","July","August","September","October","November","December"};

        System.out.println("    " + monthNames[month] + " " + year);
        System.out.println("Su Mo Tu We Th Fr Sa");
        for (int i = 0; i < h - 1; i++)
            System.out.print("   ");
        for (int i = 1; i <= numDays; i++)
        {
            System.out.printf("%2d ", i);
            if (((i + h - 1) % 7 == 0) || (i == numDays)) System.out.println();
        }
    }
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter month (1-12): ");
        int month = input.nextInt();
        if(month < 1 || month > 12)
        {
            System.out.println("Invalid month. Valids inputs are 1-12.");
            System.exit(0);
        }
        System.out.print("Enter year: ");
        int year = input.nextInt();
        if(year < 1753)
        {
            System.out.println("Invalid year. Valid inputs are 1753 and beyond.");
            System.exit(0);
        }
        if(leap(year))
        {
            System.out.println(year + " is a leap year.");
        }
        else
        {
            System.out.println(year + " is NOT a leap year.");
        }
        firstDayOfYear(year);
        firstDayOfMonth(month, year);
        numDaysInMonth(month, year);
        printCal(month, year);
    }    
}

共有3个答案

谷梁宏恺
2023-03-14

我知道你知道答案。但这里有一个快速修复(抱歉有点黑客),你可以合并它来修正周六的索引,而无需对代码做很多更改。

System.out.println("Su Mo Tu We Th Fr Sa");
        int xx = h == 0 ? 7 : h; // Correct the index for Saturday.
        for (int i = xx; i > 1; i--) // Reversing the loop condition
            System.out.print("   ");
        for (int i = 1; i <= numDays; i++) {
            System.out.printf("%2d ", i);
            if (((i + h - 1) % 7 == 0) || (i == numDays))
                System.out.println();
        }
翟俊名
2023-03-14

问题是你的指数搞砸了。这意味着你从1而不是0开始你的月份和日子都很虚弱。然而在这里

h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7

最后的%7使它从0开始!这会导致循环

for (int i = 0; i < h - 1; i++)
  System.out.print("   ");

成为

for (int i = 0; i < -1; i++)
  System.out.print("   ");

因为周六h是0。

要解决此问题,应以0开始函数中的所有索引。然后,当用户输入索引为1时,只需减去1并将其传递到函数中。这样,你就不会在所有数组前面出现空白条目(顺便说一句,它应该是位于类顶部的静态期末考试)。

郎伟兆
2023-03-14

从周六开始的每个月,你的代码都会有相同的问题。这意味着问题可能在这方面-

for (int i = 0; i < h - 1; i++)
  System.out.print("   ");

在这里将h设置为7而不是0将为您修复它。您可以在这里修复它,或者您可能需要从1到7而不是0到6开始h并当然进行其他必需的更改。

 类似资料:
  • 问题内容: 我正在处理Java作业,它涉及在用户指定月份和年份之后打印日历。我不能使用Calendar或GregorianCalendar类。我的问题是日历在星期六的第一天无法正确打印月份。我已经看了大约一个小时的代码,但不确定出什么问题。我正在使用Zeller的Congruence查找以“ h”表示的每月的第一天。 例如,2008年3月的日历(错误地)如下所示: 这是我的代码: 问题答案: 从星

  • 我正在尝试用C语言输出日历,我想我已经把格式弄下来了,但我遇到了麻烦: 正在验证用户输入(我已经注释掉了潜在的解决方案,但它还没有正确编译。它总是打印“所选的年/月无效”,并且break语句不起作用。) 在一周的正确日期开始日历日(2018年5月从周二开始,而不是周日) 我目前的输出: 我想要的输出: 这是我的程序:

  • 问题内容: 我在熊猫数据框中读取了一个包含150,000行的csv文件。该数据框有一个字段,日期格式为。我想从中提取月,日和年,然后分别复制到数据框的列中。对于几百条记录,以下两种方法都行得通,但是对于15万条记录,两种方法都需要花费很长的时间才能执行。是否有更快的方式来处理100,000多个记录? 第一种方法: 第二种方法: 谢谢。 问题答案: 在0.15.0中,您将可以使用新的.dt访问器在语

  • 问题内容: 我试图获取给定月份和年份的第一个日期和最后一个日期。我使用以下代码以yyyyMMdd格式获取最后日期。但是无法获得这种格式。另外,我希望开始日期采用相同的格式。我仍在努力。任何人都可以帮助我修复以下代码。 问题答案: 获取 开始日期 ( 注意 :在开始日期中, 日期 = 1) 对于格式化