刚刚开始学习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");
}
答案 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();
}
<强>输出强>
如果你想一次输入一个,你可以做的另一件事就是要求用户在循环中新的一年,并在输入整数后给他们答案。这是一个例子,我还添加了另一个名为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;
}
<强>输出强>
答案 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();
}
}