0

私のコードの何が問題になっていますか?どういうわけか私は一日休みを取り続けていますか?たとえば、今日は2013年の26日で火曜日ですが、プログラムでは水曜日だと表示されます。ツェラーの公式アルゴリズムを使用しています。

import javax.swing.JOptionPane;
public class zeller {
    public static void main(String[] args) {
        String yearString = JOptionPane.showInputDialog("Enter the year:");

        int year = Integer.parseInt(yearString);

        String monthString = JOptionPane.showInputDialog("Enter the month (3-12)(January and Feburary are 13 and 14):");
        int month = Integer.parseInt(monthString);

        String dayString = JOptionPane.showInputDialog("Enter the day 1-31: ");  
        int day = Integer.parseInt(dayString);

        switch (month) {
            case 13:  monthString = "January";
                break;
            case 14:  monthString = "February";
                break;
            case 3:  monthString = "March";
                break;
            case 4:  monthString = "April";
                break;
            case 5:  monthString = "May";
                break;
            case 6:  monthString = "June";
                break;
            case 7:  monthString = "July";
                break;
            case 8:  monthString = "August";
                break;
            case 9:  monthString = "September";
                break;
            case 10: monthString = "October";
                break;
            case 11: monthString = "November";
                break;
            case 12: monthString = "December";
                break;
            default: monthString = "Invalid month";
                break;
        }

        int j = year / 100;
        int k = year % 100 ;
        double h = (day + ((26*(month + 1)) / 10) + k + (k / 4) +(j / 4) + (5 * j)) % 7;
        int h1 = (int)h;

        switch (h1) {
            case 0:  dayString = "Saturday";
                break;
            case 1:  dayString = "Sunday";
                break;
            case 2:  dayString = "Monday";
                break;
            case 3:  dayString = "Tuesday";
                break;
            case 4:  dayString = "Wednesday";
                break;
            case 5:  dayString = "Thursday";
                break;
            case 6:  dayString = "Friday";
                break;

            default: monthString = "Invalid month";
                break;
        }

        System.out.println("Day of the week is: " + dayString);
    }
}
4

3 に答える 3

2
  1. 1月と2月は、前年の13か月と14か月としてカウントされるため、ユーザーに1月または2月の実際の1か月または2か月を入力させる場合は、次のようなコードを追加できます。
if (month == 1 ){
    month = 13;
     year -=1;
 }
else if (month == 2) {
     month = 14;
     year -=1;
}
于 2013-09-29T01:09:53.780 に答える
1

1月または2月の場合は、年を変更する必要があります。ウィキペディアでの説明:

ある年に、3月1日(土曜日の場合は3月2日)が適切なテスト日であることがすぐにわかります。そして、与えられた世紀において、最良のテスト年は100の倍数である年です。Zellerは10進算術を使用し、年を表すのにJとKを使用すると便利であることがわかりました。ただし、コンピューターを使用する場合は、変更されたY年(1月と2月のY-1)を処理する方が簡単です。

次のようにコードを変更しましたが、機能します。

import javax.swing.JOptionPane;

public class zeller {
    public static void main(final String[] args) {

        String yearString = JOptionPane.showInputDialog("Enter the year:");

        int year = Integer.parseInt(yearString);

        String monthString =
            JOptionPane.showInputDialog("Enter the month (3-12)(January and Feburary are 13 and 14):");
        int month = Integer.parseInt(monthString);

        String dayString = JOptionPane.showInputDialog("Enter the day 1-31: ");
        int day = Integer.parseInt(dayString);

        switch (month) {
        case 14:
            year--;
            monthString = "January";
            break;
        case 13:
            year--;
            monthString = "February";
            break;
        case 3:
            monthString = "March";
            break;
        case 4:
            monthString = "April";
            break;
        case 5:
            monthString = "May";
            break;
        case 6:
            monthString = "June";
            break;
        case 7:
            monthString = "July";
            break;
        case 8:
            monthString = "August";
            break;
        case 9:
            monthString = "September";
            break;
        case 10:
            monthString = "October";
            break;
        case 11:
            monthString = "November";
            break;
        case 12:
            monthString = "December";
            break;
        default:
            monthString = "Invalid month";
            break;
        }
        int j = year / 100;
        int k = year % 100;
        double h = (day + ((13 * (month + 1) / 5)) + k + (k / 4) + (j / 4) + (5 * j)) % 7;
        int h1 = (int) h;
        switch (h1) {
        case 0:
            dayString = "Saturday";
            break;
        case 1:
            dayString = "Sunday";
            break;
        case 2:
            dayString = "Monday";
            break;
        case 3:
            dayString = "Tuesday";
            break;
        case 4:
            dayString = "Wednesday";
            break;
        case 5:
            dayString = "Thursday";
            break;
        case 6:
            dayString = "Friday";
            break;

        default:
            monthString = "Invalid month";
            break;
        }

        System.out.println("Day of the week is: " + dayString);

    }
}
于 2013-02-26T19:03:16.620 に答える
0

ウィキペディアから、

このアルゴリズムでは、1月と2月は前年の13か月と14か月としてカウントされます。たとえば、2010年2月2日の場合、アルゴリズムは日付を2009年の14か月目の2日目としてカウントします(DD / MM / YYYY形式の2009年2月14日)。

したがって、技術的にはコードに問題はありません。2013年2月26日(今日)を2013年の14か月目の26日として入力すると、実際には2014年2月26日の曜日が計算されます。

于 2013-02-26T19:13:11.253 に答える