程序工作正常,但现在我无法发现错误

时间:2014-09-25 15:36:39

标签: java

我运行程序,它工作正常,我不知道我做了什么,但这是我在对话框中得到的。应该说4月5日不是错误5

Please enter a year to calculate Easter Sunday
>2015
error5

有人可以找出错误来自哪里吗?还有一个问题是我需要所有案例1-12和所有月份吗?或者我可以从四月开始,因为它是我用来计算复活节星期日的唯一一个月。

import java.util.Scanner;

public class Easter
{
    public static void main(String[] args)
    {
        System.out.print("Please enter a year to calculate Easter Sunday\n>");
        Scanner s = new Scanner(System.in);
        int inputted = getResult(s);
        while(inputted <= 0)
        {
            System.out.print("Expected a positive year. Please try again:\n>");
            inputted = getResult(s);
        }
        System.out.println(getEasterSundayDate(inputted));
    }

    private static int getResult(Scanner s)
    {
        while(!s.hasNextInt())
        {
            System.out.print("Expected a valid year. Please try again:\n>");
            s.nextLine();
        }
        return s.nextInt();
    }

    public static String getEasterSundayDate(int year)
    {
        int a = year % 19,
            b = year / 100,
            c = year % 100,
            d = b / 4,
            e = b % 4,
            g = (8 * b + 13) / 25,
            h = (19 * a + b - d - g + 15) % 30,
            j = c / 4,
            k = c % 4,
            m = (a + 11 * h) / 319,
            r = (2 * e + 2 * j - k - h + m + 32) % 7,
            n = (h - m + r + 90) / 25,
            p = (h - m + r + n + 19) % 32;

        String result;
        switch(n)
        {
        case 1:
                result = "April ";
                break;

            default:
                result = "error";
        }

        return result + p;
    }
}

1 个答案:

答案 0 :(得分:3)

这是一个简单的错字。

您的switch语句如下所示:

switch(n)
{
    case 1:
        result = "April ";
        break;

    default:
        result = "error";
}

请注意,该月份的数字为n,因此如果n为4,则表示找到的月份为4月。但是,在此代码中,您将4月案例视为n 1 ,而不是4.因此,因为您的程序是计算 {{1如果是{4},它不会被n覆盖,从而导致case 1:而不是error出现在输出中。将该switch语句更改为:

April

现在,请注意我正在使用switch(n) { case 4: result = "April "; break; default: result = "error"; } 代替case 4:来正确查找April案例。

但是,如果你只是使用这样的一个案例,最好只使用case 1:语句而不是if

switch

另一方面,当你像以前一样检查很多案件时,你应该使用if(n == 4) result = "April "; else result = "error";

但是,我仍然认为你还应该考虑其他几个月的案例,因为它没有在other question的原始作业问题中说明复活节星期日总是在四月。