【问题标题】:Weekday Calculator Logical Error - Java工作日计算器逻辑错误 - Java
【发布时间】:2016-03-21 04:49:20
【问题描述】:

我是一个自学 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。然后总变量保持 ((62 / 4) + 62 + 29 + 6) 等于 112。然后 112 % 7等于 16,意味着余数等于 0。因此,weekdayName 方法不返回 weekdayWord,因为没有余数 == 0 的条件。修复这个弄乱某些生日的逻辑错误的最佳方法是什么。我希望这个程序也适用于我父亲的生日(以及 1900 年以后的任何生日),以便我可以向他展示它。 :D 此外,任何关于自学编程的技巧以及在哪里可以找到像这样的简单游戏或练习都将受到高度赞赏。谢谢!

【问题讨论】:

  • 如果您需要更多信息,请告诉我。
  • 你也可以用return new SimpleDateFormat("EEEE, MMMM d, yyyy").format(new Date(yyyy - 1900, mm, dd));实现weekday

标签: java methods


【解决方案1】:

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

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

【讨论】:

  • 在这里使用remainder == 0 就足够了,因为表达式remainder = total % 7 的计算结果应该是0 到6 之间的数字。
  • 等等...现在我正在输入我的生日(年 = 1995,月 = 2,日 = 4)并且输出关闭了一天...应该是星期六,但它显示星期五。
  • @camelCoder apicellaj 所说的确实有道理。我认为你已经实现的逻辑有问题需要返工。
  • 我错了。现在有些情况下 1 天...不知道如何解决这个问题。
  • @camelCoder 您的代码中有一个单独的逻辑错误。由于星期几是使用值total 计算的,因此您可能需要查看那里。
【解决方案2】:

感谢指导我调试我的逻辑错误的每一个人。

首先,如果余数为 0,余数为 7,则 weekdayWord 应设置为“星期六”

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

其次,由于缺少括号,我的闰年检查条件存在缺陷,这将影响总数,最终影响工作日Word。正确的条件是:

if ((isLeap(year) == true) && (month == 1 || month == 2)) {
        total = total - 1;
    }

该程序现在成功地适用于我尝试过的所有情况。是时候向我爸爸炫耀一下了。 :P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多