如何检查“闰年”一年以上

时间:2017-06-07 00:00:24

标签: c#

刚刚开始学习C#并在课堂上做了'闰年'。我们提出了这个解决方案。但它只允许一次检查一年。有没有一种方法可以立即检查更多?假设我们需要检查10个不同的年份,如果他们是跳跃与否。我能想到的只是复制块并给出新的变量。

int a = int.Parse(Console.ReadLine());

bool div1 = a % 4 == 0;
bool div2 = a % 100 != 0; 
bool div3 = a % 400 == 0;

if ((div1 && div2) || div3)
{
    Console.WriteLine($"{a} is a leap year");
}
else
{
    Console.WriteLine($"{a} is not a leap year");
}

5 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是编写一个接受int的函数,如果int表示闰年,则返回true。例如,下面的方法使用您在上面编写的代码的简化单行版本:

public static bool IsLeapYear(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

然后,你可以从用户那里获得一堆年(在这个例子中我们使用逗号分隔的年份列表),将年份分成数组(在逗号字符上),并调用此方法每年都在循环中:

private static void Main()
{
    // Get a list of years from the user
    Console.Write("Enter some years separated by commas: ");
    var input = Console.ReadLine();

    // Split the user input on the comma character, creating an array of years
    var years = input.Split(',');

    foreach (var year in years)
    {
        bool isLeapYear = IsLeapYear(int.Parse(year));

        if (isLeapYear)
        {
            Console.WriteLine("{0} is a leap year", year);
        }
        else
        {
            Console.WriteLine("{0} is not a leap year", year);
        }

    }
    Console.WriteLine("\nDone!\nPress any key to exit...");
    Console.ReadKey();
}

<强>输出

enter image description here

如果你想一次输入一个,你可以做的另一件事就是要求用户在循环中新的一年,并在输入整数后给他们答案。这是一个例子,我还添加了另一个名为GetIntFromUser的函数,它强制它们输入一个有效的整数(它会一直询问,直到输入一个):

private static void Main()
{
    // In this loop, ask for a year and tell them the answer
    while (true)
    {
        int input = GetIntFromUser("Enter a year to check: ");
        string verb = IsLeapYear(input) ? "is" : "is not";
        Console.WriteLine($"{input} {verb} a leap year.\n");
    }
}

public static int GetIntFromUser(string prompt)
{
    int input;

    // Show the prompt and keep looping until the input is a valid integer
    do
    {
        Console.Write(prompt);
    } while (!int.TryParse(Console.ReadLine(), out input));

    return input;
}

public static bool IsLeapYear(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

<强>输出

enter image description here

答案 1 :(得分:1)

首先,您将现有代码放入函数中,因此可以重复使用:

public bool IsLeapYear(int year)
{
    bool div1 = year % 4 == 0;
    bool div2 = year % 100 != 0; 
    bool div3 = year % 400 == 0;
    return ((div1 && div2) || div3);
}

然后让我们说你有一个40年的阵列:

//don't worry about how this works right now.
// just know it gives you an array with 40 years starting in 1980
int[] years = Enumerable.Range(1980, 40).ToArray();

你可以像这样检查所有这些:

foreach (int year in years)
{
    if (IsLeapYear(year))
    {
        Console.WriteLine($"{year} is a leap year");
    }
    else
    {
        Console.WriteLine($"{year} is not a leap year");
    }
}

答案 2 :(得分:1)

您可以使用LINQ。

var years = new int[] { 1999, 2000, 2001, 2002 };  //etc...

Console.WriteLine(String.Join(Environment.NewLine, years
    .Select(y => $"{y} {(DateTime.IsLeapYear(y) ? "is" : "is not")} a leap year")
    .ToArray()));

答案 3 :(得分:0)

您可以读取一串年(例如:1991,1992,2001,2004),然后使用string.split(',')将字符串拆分为数组。循环遍历数组以检查闰年。

答案 4 :(得分:0)

首先,如果你使用int.Parse(),你应该在try-catch块中使用它。否则,每当用户输入废话时,您的程序就会崩溃。

其次,如果你想为学习目的实现自己的方法 - 没关系,但是你可以使用具有IsLeapYear()的DateTime结构:

    // Summary:
    //     Returns an indication whether the specified year is a leap year.
    //
    // Parameters:
    //   year:
    //     A 4-digit year.
    //
    // Returns:
    //     true if year is a leap year; otherwise, false.
    //
    // Exceptions:
    //   T:System.ArgumentOutOfRangeException:
    //     year is less than 1 or greater than 9999.

所以,实施是:

class LeapYear
{
    static void Main(string[] args)
    {
        for (int input = 0; input < 10;) // Ask user until he enters year 10 times correctly
        {

            Console.Write("Please enter a year: ");

            try
            {
                int year = int.Parse(Console.ReadLine());

                if (DateTime.IsLeapYear(year))
                {
                    Console.WriteLine($"{year} is leap");
                    input++;
                }
                else
                    Console.WriteLine($"{year} is not leap");
            }

            catch (ArgumentOutOfRangeException)
            {
                Console.WriteLine("Argument Out Of Range");
            }

            catch (FormatException)
            {
                Console.WriteLine("Bad Format");
            }

            catch (OverflowException)
            {
                Console.WriteLine("Overflow");
            }

        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();

    }
}