2014-03-05 73 views
0

這裏只是一個初學者,我有一個控制檯應用程序,用於計算停車場運行良好的應付費用,至少直到您輸入一個正數的值。當一個方法從if語句返回一個值時,else語句中應該包含哪些內容?

我們剛開始使用多種方法,我的問題是我傳遞的'小時'值使用If else語句來獲得電荷值,但作爲方法傳遞迴雙倍的方法我對於其他什麼是最佳實踐有點困惑。

理想情況下,我希望能夠爲「小時」輸入無效值(負整數),並且程序將返回錯誤消息並再次跳回到程序的開始位置。

爲了得到這種效果,現在我設置else的返回值,將傳回的值更改回0,然後在main方法中使用if語句來處理'hours'= 0的情況。然後,我現在用goto來做,但我不確定這是最佳做法。如果是,那很好,但如果有更好的方法,我寧願不要依賴一些更混亂的東西。

歡呼任何和所有的幫助。

class Program 
{   

    static void Main(string[] args) 
    { 
     double charge = 0; 
     double hours = 0; 
     string reg; 

     start: 

     while (hours != -999) 
     { 
      Console.Write("\nEnter hours : "); 
      hours = Convert.ToDouble(Console.ReadLine()); 

      charge = CalcCharge(hours);  

      if (charge == 0) 
      { 
       Console.Write("Invalid hour value. Please try again.\n"); 
       goto start; 
      } 

      Console.Write("\nEnter reg : "); 
      reg = Console.ReadLine(); 

      if (reg == "Sligo") 
       charge = charge - ((charge/100) * 10); 

      if (charge > 100) 
       charge = 100; 

      Console.Write("\nThe charge is ${0:f2}.", charge); 

      Console.ReadLine(); 
     } 

    } 

    static double CalcCharge(double hours) 
    { 
     double result; 

     if (hours > 0 && hours < 7) 
     { 
      result = hours * 2; 
      return result; 
     } 

     if (hours >= 7 && hours <= 10) 
     { 
      result = hours * 3; 
      return result; 

     } 

     if (hours >= 11 && hours <= 15) 
     { 
      result = hours * 4; 
      return result; 

     } 

     if (hours > 15) 
     { 
      result = hours * 3; 
      return result; 

     } 

     else 
     { 
      return 0; 
     } 
    } 
} 

回答

1

您可能不應該使用else,而是會拋出異常。在這裏使用ArgumentException可能是正確的。捕獲異常而不是檢查返回值:

public static void Main(string[] args) 
{ 
    //your code 
    try 
    { 
     charge = CalcCharge(hours); 
    } 
    catch(ArgumentException) 
    { 
     Console.Write("Invalid hour value. Please try again.\n"); 
     continue; 
    } 

... 

static double CalcCharge(double hours) 
{ 
    //Your code 
    throw new ArgumentException("hours"); 
} 

此外,應避免使用goto,因爲它是不好的做法,並可能導致非常混亂,意大利麪條總代碼。如果你看看這個例子,我使用了一個continue,它基本上說「回到循環的開始」。

0

我可能會改變你的功能,這一點:

static double CalcCharge(double hours) 
{ 
    double result = 0; 

    if (hours > 0 && hours < 7) 
    { 
     result = hours * 2;   
    } 
    else if ((hours >= 7 && hours <= 10) || hours > 15) 
    { 
     result = hours * 3; 
    } 
    else if (hours >= 11 && hours <= 15) 
    { 
     result = hours * 4; 
    } 
    else 
    { 
     throw new ArgumentOutOfRangeException("there was a problem!"); 
    } 
    return result; 

} 

這是一個小更簡潔,它可以讓你趕上在父功能異常,如果出現錯誤。

+0

'當我嘗試使用try/catch時,在'Sem2Assign1ExampleREAL.exe'中發生'System.ArgumentOutOfRangeException'類型的未處理異常,當我輸入小時的負值並吐出上述內容時,程序會掛起。 投擲新是完全按照你的建議,但嘗試/捕獲是.. 嘗試 { charge = CalcCharge(hours); } catch(ArgumentOutOfRangeException) Console.Write(「Invalid hour value。Please try again」); 繼續; } – StolenSheep

+0

如果它運行了幾個小時,那麼條件:'小時!= -999'永遠不會被滿足。 「catch」中的信息是否被打印出來? –