2017-06-07 4 views
-1

ちょうど最近C#の学習を開始し、クラスで「うるう年」を実行しました。私たちはこの解決策を思いつきました。しかし、一度に一年だけチェックすることができます。一度にもっと確認する良い方法はありますか?彼らが飛躍しているかどうかを確認する必要があるとしましょう。私が考えることができるのは、ブロックをコピーして新しい変数を与えることだけです。「うるう年」で複数年をチェックする方法

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

'for'ループは何ですか? – dan04

+1

私はこれをクラスの演習で書いたことを理解していますが、現実世界では、「DateTime.IsLeapYear」組み込み関数を使用することが期待されます。手作りの閏年チェックを使ったコードレビューは私に渡されません。 –

+0

まだありません。私は少し先を走っているかもしれない。しかし、別のランダムな年をチェックしたい場合は、最初からすべてを実行するのは少し不快です。したがって、疑問。 – Katerina

答えて

0

あなたは年間の文字列(例えば:1991,1992,2001,2004)を読み取ることができ、その後、string.split(',')で文字列を配列に分割します。うるう年を確認するために配列をループします。

1

これを行う1つの方法は、intをとる関数を書くことで、intがうるう年を表す場合はtrueを返します。例えば、以下の方法はあなたが上に書いたコードの単純化され、1ラインバージョンを使用しています。

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


もう1つのことは、一度に1つずつ入力したい場合は、ユーザーにループ内の新しい年を尋ねて、整数を入力した後に回答を与えます。ここで私はまた別の機能が有効な整数を入力するためにそれらを強制する、GetIntFromUserと呼ばれる追加の例は、(それは1が入力されるまで尋ね続けて)です:

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

まず、既存のコードを関数に入れて再利用できるようにします。

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"); 
    } 
} 
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())); 
+0

これは機能します...しかし、質問された質問の文脈では非常に有用な答えではありません。 –

0

まず、int.Parse()を使用している場合は、try-catchブロックで使用する必要があります。それ以外の場合は、ユーザーがナンセンスを入力するたびにプログラムがクラッシュします。

第二に、あなたが目的を研究するための独自のメソッドを実装したい場合は - 大丈夫、それは `s、しかし、あなたは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(); 

    } 
} 
関連する問題