Печать календаря с заданного месяца / года

1

Я работаю над назначением Java и включает печать календаря после того, как пользователь указывает месяц и год. Я не могу использовать классы Calendar или GregorianCalendar. Моя проблема заключается в том, что календарь неправильно печатает месяцы с их первого дня в субботу. Я посмотрел на свой код примерно на час, и я не уверен, что пошло не так. Я использую Контент Селлера, чтобы найти первый день месяца, который представлен "h".

Например, календарь в марте 2008 года (неправильно) выглядит следующим образом:

     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);
    }    
}
Теги:
calendar

4 ответа

2
Лучший ответ

У вашего кода будет такая же проблема для каждого месяца, который начинается с субботы. Это означает, что проблема, вероятно, в этой строке -

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

Имея h как 7 вместо 0, здесь исправит это для вас. Вы можете либо исправить это здесь, либо вам может понадобиться запустить h от 1 до 7 вместо 0-6 и внести другие необходимые изменения, конечно.

  • 0
    Также это: case 0: dayName = "Saturday"; break;
  • 0
    Спасибо, я знаю, что делать отсюда.
Показать ещё 1 комментарий
1

Проблема в том, что ваши индексы перепутаны. Это означает, что вы начинаете месяцы и дни слабых от 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 и передайте его в свои функции. Тогда у вас также не будет такой пустой записи перед всеми вашими массивами (что, кстати, должно быть статическим финалом в верхней части класса).

1

Знаю, что ты получил ответ. Но вот быстрое решение (извините, его хакки), который вы можете включить, чтобы корректировать свои индексы в субботу, не внося много изменений в свой код.

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();
        }
  • 0
    Это работает очень хорошо и лучше, чем исправление, которое я имел в виду. Я бы +1, если бы мог, но я здесь новичок.
  • 0
    Да, хаки всегда лучше для быстрого исправления, но я предлагаю не идти по этому пути. Ответ @Swapnil очень правильный, и вы должны следовать его советам.
0

Это исправит проблему високосного года

if ((((i + h) % 7 == 0) || (i == numDays) && leap(year)))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню