2016-11-08 15 views
0

を調整するので、このコードでは、私は、ユーザーがメッセージを表示する範囲外の値を入力するようにそれを作るしようとしている:は、コンソールapliacation(trycatchとwhileループ)

有効な入力を入力してください(1と2の間^ 53)

現時点では、文字を入力するとメッセージが表示されますが、0より小さい数字を入力すると、まるで何も起こらないかのように続きます。

//variables 
double length, width, totalarea, totallength; 
const double feet = 3.75; 

//questions 
Console.Title = "Double Glazing Window Calculator"; 
Console.WriteLine("Double Glazing Calculator\n"); 
bool InputFalse = false; 

do 
{ 
    try 
    { 
     do 
     { 
      Console.Write("Enter the height of the of the window in meteres ");   
      length = double.Parse(Console.ReadLine()); 
      Console.Write("Enter the width of the of the window in meteres "); 
      width = double.Parse(Console.ReadLine()); 
     } while (length < 1 || width < 1); 

     //maths 
     totalarea = length * width * 2; 
     totallength = (length * 2 + width * 2) * feet; 
     Console.WriteLine("The total area of the glass required in m^2 (to 2 decinmal places) is {0} ", totalarea.ToString("0.##")); 

     Console.WriteLine("the total length of the wood required in feet (to 2 decimal places) is {0}", totallength.ToString("0.##"));    
    } 
    catch 
    { 
     InputFalse = (true); 
     Console.WriteLine("Enter a valid input (between 1 and 2^53)"); 
    } 
} while (true); 

答えて

1

の代わりに、double.TryParseを使用する方が良いでしょうdouble.Parseから例外をキャッチ。少なくとも1の値だけが必要なので、解析が失敗したときにがoutパラメータを0に設定するという事実を利用することができます。

double length = 0, width = 0; 
const double feet = 3.75; 

//questions 
Console.Title = "Double Glazing Window Calculator"; 
Console.WriteLine("Double Glazing Calculator\n"); 

while (true) 
{ 
    Console.Write("Enter the height of the of the window in meteres "); 
    double.TryParse(Console.ReadLine(), out length); 
    Console.Write("Enter the width of the of the window in meteres "); 
    double.TryParse(Console.ReadLine(), out width); 

    if (length < 1 || width < 1) 
    { 
     Console.WriteLine("Enter a valid input (between 1 and 2^53)"); 
    } 
    else 
    { 
     break; 
    } 
} 

//maths 
var totalarea = length * width * 2; 
var totallength = (length * 2 + width * 2) * feet; 
Console.WriteLine("The total area of the glass required in m^2 (to 2 decinmal places) is {0} ", totalarea.ToString("0.##")); 

Console.WriteLine("the total length of the wood required in feet (to 2 decimal places) is {0}", totallength.ToString("0.##")); 

それは彼らが最初の有効な長さを入力するまで、それらの幅を入力することはできませんので、あなたも2つのwhileループにこれを分割できます。

0

入力のためにメソッドを使用することをお勧めします。これはコードを読みやすくし、ブロックの必要性を避けるために@juharr推奨使用TryParseのようにします。

例:

double length = 0, 
     width = 0, 
     totalarea, 
     totallength; 
const double feet = 3.75; 

//questions 
Console.Title = "Double Glazing Window Calculator"; 
Console.WriteLine("Double Glazing Calculator\n"); 
bool InputFalse = false; 

while(true){ 
    GetAndVerifyInput(out length, "Enter the length of the of the window in meteres: "); 
    GetAndVerifyInput(out width, "Enter the width of the of the window in meteres: "); 

    //maths 
    totalarea = length * width * 2; 
    totallength = (length * 2 + width * 2) * feet; 
    Console.WriteLine(); 
    Console.WriteLine("The total area of the glass required in m^2 (to 2 decimal places) is {0} ", totalarea.ToString("0.##")); 
    Console.WriteLine("the total length of the wood required in feet (to 2 decimal places) is {0}", totallength.ToString("0.##")); 
    Console.WriteLine(); 
    Console.WriteLine(); 
} 


private void GetAndVerifyInput(out double result, string instruction) { 
    while (true) 
    { 
     Console.Write(instruction); 
     if (double.TryParse(Console.ReadLine(), out result) && 
      result > 0 && 
      result < Math.Pow(2,53) + 1) 
      return; 
     Console.WriteLine("Enter a valid input (between 1 and 2^53)"); 
    } 
}