2017-06-15 17 views
-1

件名には少し問題があります: プログラムを作成し、終了するには数字または "ok"を入力するようにユーザーに依頼してください。前に入力したすべての数値の合計を計算し、コンソールに表示します。私は[OK]をタップするとwhile(true)loop中のsystem.formatexception

var sum = 0; 
    while (true) 
    { 
     Console.WriteLine("Enter a number or ok to exit:"); 
     if (Console.ReadLine() == "ok") break; 
     sum += Convert.ToInt32(Console.ReadLine()); 
     Console.WriteLine(sum); 
    } 

、それが終了します。

は、ここに私のコードです。 数字をタップして入力すると、system.formatexceptionが表示されます。入力文字列の形式が正しくありません。 私は解決策の一つが

var sum = 0; 
    while (true) 
    { 
     Console.Write("Enter a number (or 'ok' to exit): "); 
     var input = Console.ReadLine(); 
     if (input.ToLower() == "ok") 
      break; 
     sum += Convert.ToInt32(input); 
    } 
    Console.WriteLine("Sum of all numbers is: " + sum); 

ある多分私のコードは少しweired見えますが、なぜ私のコードが間違っている知っていますか?

+4

をC#とLINQと同じを得るために何簡潔な方法を見つけていませんか? – zerkms

+2

表示する2番目のソリューションは、Console.ReadLine()によって返された文字列を変数に保存し、それが "ok"に等しくなければ、それを整数に変換して、それをプロプリエリに加算します。 初期のソリューションでは、入力が "ok"と一致しない場合はConsole.ReadLine()を呼び出しているため、新しい入力を整数に変換する場合、Console.ReadLineを "ok"との比較で消費します。 。それがうまくいかない理由です。 – TruthSeeker

+0

私はフィドルで最初のコードを試しました(https://dotnetfiddle.net/4UA4i2を参照)。数字を挿入した後、それは不思議なことに新しい番号をもう一度尋ねて、挿入された最後の数字だけが合計に割り当てられます。また、要求された番号挿入ごとに 'FormatException'を送出しません。 –

答えて

0

理由はinputは "ok"です。これを整数に変換することはできません。

  1. まず、最初の入力値を別の変数に格納する必要があります。
  2. 次に、その文字列を整数に変換して合計します。

    var sum = 0; 
    while (true) 
    { 
        Console.Write("Enter a number (or 'ok' to exit): "); 
        var input = Console.ReadLine(); 
        int newVariable = 0; 
        if (input.ToLower() != "ok") 
        { 
         newVariable = Convert.ToInt32(input); 
        } 
    
        input = Console.ReadLine(); 
        if (input.ToLower() == "ok"){ 
         break; 
        sum += newVariable; 
        } 
    } 
    Console.WriteLine("Sum of all numbers is: " + sum); 
    

ここでのいかなる問題は私に教えてくださいがいる場合。

var sum = 0; 
while (true) 
{ 
     Console.WriteLine("Enter a number or ok to exit:"); 
     String ans = Console.ReadLine(); 
     if (ans == "ok" || ans.ToLower() == "ok") break; 
     sum += Convert.ToInt32(ans); 
     Console.WriteLine(sum); 
} 

ここで私はただ一つの変数にユーザーが入力した入力を保存し、さらにプロセスでその変数を使用しました:

0

はこれを試してみてください。

最初のコードでは、入力を2回受け取ります。最初はIF条件であり、2番目は解析であり、問​​題が発生する可能性があります。

0

これを行う正しい方法は、stringから数値への変換にint.TryParseを使用することです。 TryParse文字列を数値に変換しようとしますが、文字列を数値に変換することはできません(たとえば、文字列に数値以外の文字が含まれている場合など)。これ以外の答えは、"ok"以外の数字が入力された場合には未処理のFormatExceptionが表示されます。 int.TryParseを使用すると、無効な場合と同様に有効な番号のケースを処理して、ユーザに警告することができます。ここにあなたのコードのコンテキスト内の例を示します。

// I prefer using concrete types for numbers like this, so if anyone else 
// reads it they know the exact type and numeric limits of that type. 
int sum = 0; 
int enteredNumber = 0; 
while (true) 
{ 
    Console.Write("Enter a number (or 'ok' to exit): "); 
    var consoleInput = Console.ReadLine(); 
    if (consoleInput.ToLower() == "ok") 
     break; 

    if(int.TryParse(consoleInput, out enteredNumber)) 
    { 
     sum += enteredNumber; 
    } 
    else 
    { 
     Console.WriteLine("You entered '" + consoleInput + "', which is not a number."); 
    } 
} 

Console.WriteLine("Sum of all numbers is: " + sum.ToString()); 

あなたはそれを自分で検証するよりも、他のユーザからの入力を制御することはできません知っているので、これは良いです、そしてそれが投機的に数値を変換すると警告する方が良いでしょう例外をトリガーすることなく、成功または失敗に変換できます。 try/catchブロックですべてをラップすることは適切な解決策ではありません。

0

最初のコード例は、コメント内で正しく指摘されているように、行を読み、「OK」をテストし、それを投げ捨て、別の行を読み込み、それを使って合計に加算しますあなたは欲しかった。

いくつかの簡単な調査の後で、私はC#でこれを処理する最も簡潔な方法はおそらく、2番目のコード例のようなものでしょう。 F#では、以下の例を考え出すことができました(1つはループであり、もう1つはシーケンスを使用します。IEnumerable<_> S)が、私はあなたが `あなたはユーザーによる番号入力を捨てる`「OK」とそれを比較するため、後...

let inputLoop() = 
    let rec aux sum = 
     match stdin.ReadLine() with 
     | "ok" -> sum 
     | s -> aux (sum + int s) 
    stdout.WriteLine (aux 0 |> string) 

let inputSeq() = 
    fun _ -> stdin.ReadLine() 
    |> Seq.initInfinite 
    |> Seq.takeWhile (fun s -> s <> "ok") 
    |> Seq.sumBy int 
    |> string 
    |> stdout.WriteLine