java - 工作日计算器逻辑错误 - Java

标签 java methods

我是一个初学者,一直在自学Java。我刚刚学会了如何从方法返回值。我尝试了这个练习,可以在这里找到 Weekday Calculator .

我有一些工作代码,花了我一段时间才写出来。 (#proudNOOB)

import java.util.Scanner;

public class WeekdayCalculator {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);

        int yearsSince1900, total, remainder;

        System.out.print("Enter your year of birth ~ ");
        int year = keyboard.nextInt();

        System.out.print("Enter the month you were born in " + year + " ~ ");
        int month = keyboard.nextInt();

        System.out.print("Enter the day you were born in " + monthName(month) + " ~ ");
        int day = keyboard.nextInt();

        yearsSince1900 = year - 1900;
        // System.out.println(yy);

        total = (yearsSince1900 / 4) + yearsSince1900 + day + monthOffset(month);
        if ((isLeap(year) == true) && month == 1 || month == 2) {
            total = total - 1;
        }
        // System.out.println(total);

        remainder = total % 7;
        // System.out.println(remainder);

        // Display (day of week, month, day, year)
        System.out.println("\nYou were born on " + weekdayName(remainder) + ", " + monthName(month) + " " + day + ", " + year + ".");
    }

    public static int monthOffset(int month) {
        int offset;

        if (month == 1) {
            offset = 1;
        } 
        else if (month == 2) {
            offset = 4;
        } 
        else if (month == 3) {
            offset = 4;
        } 
        else if (month == 4) {
            offset = 0;
        } 
        else if (month == 5) {
            offset = 2;
        } 
        else if (month == 6) {
            offset = 5;
        } 
        else if (month == 7) {
            offset = 0;
        } 
        else if (month == 8) {
            offset = 3;
        } 
        else if (month == 9) {
            offset = 6;
        } 
        else if (month == 10) {
            offset = 1;
        } 
        else if (month == 11) {
            offset = 4;
        } 
        else if (month == 12) {
            offset = 6;
        } 
        else {
            offset = -1;
        }

        return offset;
    }

    public static boolean isLeap(int year) {
        boolean leap;

        if (year % 400 == 0) {
            leap = true;
        } 
        else if (year % 100 == 0) {
            leap = false;
        } 
        else if (year % 4 == 0) {
            leap = true;
        } 
        else {
            leap = false;
        }

        return leap;
    }

    public static String weekdayName(int remainder) {
        String weekdayWord = "";

        if (remainder == 1) {
            weekdayWord = "Sunday";
        } 
        else if (remainder == 2) {
            weekdayWord = "Monday";
        } 
        else if (remainder == 3) {
            weekdayWord = "Tuesday";
        } 
        else if (remainder == 4) {
            weekdayWord = "Wednesday";
        } 
        else if (remainder == 5) {
            weekdayWord = "Thursday";
        } 
        else if (remainder == 6) {
            weekdayWord = "Friday";
        } 
        else if (remainder == 7) {
            weekdayWord = "Saturday";
        }

        return weekdayWord;
    }

    public static String monthName(int month) {
        String monthWord = "";

        if (month == 1) {
            monthWord = "January";
        } 
        else if (month == 2) {
            monthWord = "February";
        } 
        else if (month == 3) {
            monthWord = "March";
        } 
        else if (month == 4) {
            monthWord = "April";
        } 
        else if (month == 5) {
            monthWord = "May";
        } 
        else if (month == 6) {
            monthWord = "June";
        } 
        else if (month == 7) {
            monthWord = "July";
        } 
        else if (month == 8) {
            monthWord = "August";
        } 
        else if (month == 9) {
            monthWord = "September";
        } 
        else if (month == 10) {
            monthWord = "October";
        } 
        else if (month == 11) {
            monthWord = "November";
        } 
        else if (month == 12) {
            monthWord = "December";
        } 
        else {
            monthWord = "error";
        }

        return monthWord;
    }
}

我使用练习说明中的自动测试测试了我的程序。该程序适用于所有这些测试,除了 2 13 1977 之外,它给我输出“你出生于 , 1977 年 2 月 13 日”,它也适用于我的生日,以及其他随机日期。然而,我尝试了我父亲的生日(只是为了它),并且输出是错误的,就像测试用例一样(缺少工作日名称)。

输入:

输入您的出生年份 ~ 1962

输入您出生于1962年~12月

输入您出生的日期(12 月 ~ 29 日)

输出:

您出生于 ,1962 年 12 月 29 日。

据我了解,根据我的输入和程序逻辑,yearsSince1900 变量的值为 62。那么 Total 变量的值为 ((62/4) + 62 + 29 + 6),等于 112。然后 112 % 7 等于 16,意味着余数等于 0。因此,weekdayName 方法不返回 weekdayWord,因为不存在余数 == 0 的条件。最好的方法是什么修复这个混淆某些生日的逻辑错误。我希望这个程序也适用于我父亲的生日(以及 1900 年之后的任何生日),这样我就可以向他展示它。 :D 此外,任何关于自学编程以及在哪里可以找到像这样的简单游戏或练习的提示都将受到高度赞赏。谢谢!

最佳答案

看来可以通过将星期六余数更改为零来修复此错误,因为您的方法没有考虑模数 0。

else if (remainder == 0) {
    weekdayWord = "Saturday";
}

关于java - 工作日计算器逻辑错误 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36123342/

相关文章:

java - 在 Tomcat 7.0 上运行网站 : Windows 2008 R2

java - 使用NetLogo API获取海龟坐标

java - 如何使用从 Java 中的方法返回的数组

java - 当我 30 分钟后再次打开它时,我的 Android 应用程序中的持久数据丢失了

java - Java 基数排序

java - 是否可以在java中创建实例的同一行中调用方法

methods - 翘曲的根路径示例?

Java 方法之间的交互

python - 方法和函数之间的区别,在 Python 中与 C++ 相比

java - 使用 Guava 的转发装饰器创建特定集合