2017-06-15 40 views
-1

這個問題有點問題: 編寫一個程序,並不斷要求用戶輸入一個數字或「ok」退出。計算所有以前輸入的數字的總和,並將其顯示在控制檯上。system.formatexception while(true)loop

這裏是我的代碼:

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

因爲你以後再'「確定」進行比較'你扔掉由用戶輸入的號碼? – zerkms

+2

您顯示的第二個解決方案將Console.ReadLine()返回的字符串保存到變量中,如果它不等於「ok」,它會將其轉換爲整數並將其與proplerly相加。 如果輸入與「ok」不匹配,那麼您的初始解決方案會消耗Console.ReadLine,如果輸入不匹配,那麼您將轉換爲整數由用戶重新輸入,因爲您再次調用Console.ReadLine() 。這就是爲什麼它不起作用。 – 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); 
    

如果有任何問題,在這裏請讓我知道。

0

試試這個:

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); 
} 

在這裏,我只是存儲用戶在一個變量輸入的輸入,並使用該變量在進一步的處理。

在你的第一個代碼中,你有兩次輸入,第一個是IF條件,第二個是解析,這可能會導致問題。

0

正確的做法是使用int.TryParsestring轉換爲數字。 TryParse嘗試將字符串轉換爲數字,但如果無法這樣做(例如,字符串不僅包含數字數字),它將優雅地失敗而不是引發異常。如果輸入了非以外的非數字,則到目前爲止的其他答案都將導致未處理的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#中處理這個問題的最簡潔的方法可能就像您的第二個代碼示例。在F#中,我能夠拿出以下例子(一個是循環,另一個使用序列,即IEnumerable<_> S),但是我發現沒有簡潔方式來獲得與C#和LINQ一樣...

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