2016-11-05 7 views
0

ロブ・マイルズのC#Programming Yellow Bookと彼のウェブサイトからの関連するラボ演習を使用してC#の学習を始めました。私はそれらの1つを行い、動作する解決策を作りました...(提供されていません)。ユーザーが無意味な答えや整数に変換できない文字列を入力した場合、私はクラッシュしないようにしたいと考えていました(私はこれをGoogledし、TryParseメソッドを見つけました。ユーザインタフェースにとって有用である、すなわち、悪い入力の後にプログラムを続行させる)。私はまた、これらのケースの1つで、代替メッセージを送信するように設定しました。私はやや長いコードで終了しました... do/do中/ whileとwhile/do/whileはしばらくしています。これを合理化するためのヒントがあれば、私は多くの義務があります。 C#:入力コンソールによるエラー防止の最適化

ベスト

、 エリオット

using System; 
using System.IO; 

static class Cinema 
{ 
    static void Main() 
    { 
    int[] selection = new int[] //array for the age requirements of each film 
     { 
     15, 15, 12, 18, 0 
     }; 
    string filmNumberText; //console input for the film number 
    int filmNumber; //input string parsed as integer 
    string ageText; //console input for age 
    int age; //parsed age string 
    int ageLimit; //age requirement for selected film 

    Console.Write("Welcome to our Multiplex.\n\n"); 
    Console.WriteLine(@"We are presently showing: 
    1. Rush (15) 
    2. How I Live Now (15) 
    3. Thor: The Dark World (12A) 
    4. Filth (18) 
    5. Planes (U)"); 
    do //loops as long as input is not between 1 and 5 
    { 
     do //loops as long as the input is not an integer 
     { 
      Console.Write("\nEnter the number of the film you wish to see: "); 
      filmNumberText = Console.ReadLine(); 
     } 
     while (int.TryParse(filmNumberText, out filmNumber) == false); 
    } while (filmNumber < 1 || filmNumber > 5); 

    filmNumber = filmNumber - 1; //changes input from 1-5 to 0-4 
    ageLimit = selection[filmNumber]; //selects age requirement from array 

    //loops as long as input is not an integer 

     do 
     { 
      Console.Write("\nEnter your age: "); 
     ageText = Console.ReadLine(); 
     } while (int.TryParse(ageText, out age) == false); // repeats if input is not an integer 



    while (age < 0 || age > 125) //if integer is is too small or too large... 
    { 
     do 
     { 
      Console.Write("\nInvalid age. Please enter an age between 0 and 125: "); 
      ageText = Console.ReadLine(); 
     } while (int.TryParse(ageText, out age) == false); //check again if input is an integer 
    } 
    if (age < ageLimit) //if too young for the given film 
     { 
      Console.WriteLine("\nAccess denied - you are too young"); 
     } 
    else 
     { 
      Console.WriteLine("\nPlease call our office at 888-999-2928 to reserve tickets."); 
     } 

     } 
} 
+0

の作業コード://codereview.stackexchange.comですが、入力が無効な場合は、メッセージを追加します。また、コードをメソッドに分割して、必要に応じてよりきれいにすることもできます。 –

+0

これは実際にはかなり良いです。多くの反復コードがあるので、私が行う改善は、再利用できる別の方法にその一部を移動することです。これは彼の答えで@ user3598756がしたことです。そうすれば、コードが短くなり、間違いを起こす可能性の少ない場所(バグ)になります。 –

答えて

0

は、私はいくつかは、あなたのコードからdo-while文削除しようとしています。これはあなたが探しているものですか?

public static void Main() 
{ 
    int[] selection = new int[] //array for the age requirements of each film 
    { 
    15, 15, 12, 18, 0 
    }; 
    string filmNumberText; //console input for the film number 
    int filmNumber; //input string parsed as integer 
    string ageText; //console input for age 
    int age; //parsed age string 
    int ageLimit; //age requirement for selected film 

    Console.Write("Welcome to our Multiplex.\n\n"); 
    Console.WriteLine(@"We are presently showing: 
1. Rush (15) 
2. How I Live Now (15) 
3. Thor: The Dark World (12A) 
4. Filth (18) 
5. Planes (U)"); 
    do //loops as long as input is not between 1 and 5 
    { 

     Console.Write("\nEnter the number of the film you wish to see: "); 
     filmNumberText = Console.ReadLine(); 
    } while (int.TryParse(filmNumberText, out filmNumber) == false || (filmNumber < 1 || filmNumber > 5)); 

    filmNumber = filmNumber - 1; //changes input from 1-5 to 0-4 
    ageLimit = selection[filmNumber]; //selects age requirement from array 

    //loops as long as input is not an integer 

    do 
    { 
     Console.Write("\nPlease enter an age between 0 and 125:"); 
     ageText = Console.ReadLine(); 
    } while (int.TryParse(ageText, out age) == false || (age < 0 || age > 125)); //check again if input is an integer 

    if (age < ageLimit) //if too young for the given film 
    { 
     Console.WriteLine("\nAccess denied - you are too young"); 
    } 
    else 
    { 
     Console.WriteLine("\nPlease call our office at 888-999-2928 to reserve tickets."); 
    } 

    Console.Read(); 

} 
+0

あなたの返信ありがとう!特定のエラーに対処する代替メッセージを排除すれば、確かに効率的です。 –

+0

はい、私はあなたのロジックに似たプログラムを理解して書くことに最善を尽くしました。それが本当にあなたを助けてくれたら受け入れてください。 –

0

次のリファクタリングを考慮することができる:GetInNumber()方法のためオルタナティブ1にをスローする

static class Cinema 
    { 
     static void Main() 
     { 
      string[] titles = new string[] {"Rush", "How I Live Now", "Thor: The Dark World", "Filth", "Planes" };//array for the age requirements of each film 
      int[] selection = new int[] { 15, 15, 12, 18, 0 };//array for the age requirements of each film 
      int filmNumber; //parsed film number string 
      int age; //parsed age string 

      Console.WriteLine("Welcome to our Multiplex.\n\nWe are presently showing:"); 
      for (int i = 0; i < titles.Length; i++) 
      { 
       Console.WriteLine("{0}. {1} ({2})",i+1, titles[i],selection[i]); 
      } 


      filmNumber = GetIntNumber(1, 5, "\nEnter the number of the film you wish to see: ", "\nPlease enter a number between 1 and 5: "); 

      //loops as long as input is not an integer 

      age = GetIntNumber(0, 125, "\nEnter your age: ", "\nPlease enter an age between 0 and 125: ") - 1; 
      if (age < selection[filmNumber-1]) //if too young for the given film 
      { 
       Console.WriteLine("\nAccess denied - you are too young"); 
      } 
      else 
      { 
       Console.WriteLine("\nPlease call our office at 888-999-2928 to reserve tickets."); 
      } 
      Console.ReadLine(); 

     } 

     static int GetIntNumber(int min, int max, string prompt, string inputPrompt) 
     { 
      int number; 

      Console.Write(prompt); 
      do //loops as long as input is not between 1 and 5 
      { 
       Console.Write(inputPrompt); 
       while (!int.TryParse(Console.ReadLine(), out number)) //loops as long as the input is not an integer 
       { 
        Console.Write("\nYou must enter an integer number!"); 
       } 
      } while (number < min || number >max); 
      return number; 
     } 

編集処理を要求されます:あなたは批評は、HTTPに属したい

static int GetInNumber(int min, int max, string prompt, string inputPrompt) 
    { 
     int number; 

     Console.Write(prompt); 
     do //loops as long as input is not between 1 and 5 
     { 
      while (!int.TryParse(Console.ReadLine(), out number)) //loops as long as the input is not an integer 
      { 
       Console.Write("\nYou must enter an integer number!: "); 
      } 
      if (number < min || number > max) Console.Write(inputPrompt); //<--| write input prompt if number out of range 
     } while (number < min || number > max); 

     return number; 
    } 
+0

ねえ、ありがとうございます。プロンプトとinputPromptの両方を印刷するのは、ユーザーが最初にプロンプ​​トを表示したときにはあまりにも多すぎるようです。私は最初にプロンプ​​トを使用する方法、入力値が範囲外であるときの入力プロンプト、「整数値を入力する必要があります!」という方法を見つけようとしています。入力値が整数ではないのに問題があります。何か案は? –

+0

ようこそ。さて、私は最初の "ダブル"プロンプトを選択して、ユーザーを騙さず、答えを正しく入力する方法についての手がかりを与えました。いずれにしても、最初の二重のプロンプトを避ける必要がある場合は、編集された回答で_alternative 1_を参照してください。ただし、解決方法「優雅さ」は低下します。最後に、私の答えを受け入れたとマークすることをお勧めします。ありがとうございます! – user3598756

+0

はい、私が学びたいと思うように、私はちょうどそれができる方法を知りたがっていました。あなたの助けをもう一度ありがとう! –