2013-07-20 67 views
0

嗨我正在創建一個控制檯應用程序,用戶輸入一個月的數字,應用程序計算出它的月份並顯示答案並顯示當月的天數。當switch語句在Main方法中時,我使用它,但是現在它顯示錯誤的月份。我有以下代碼:在Enum C中使用Switch語句#

namespace ConsoleCA2{ 

public enum Months 
{ 
    January = 31, 
    February = 28, 
    March = 31, 
    April = 30, 
    May = 31, 
    June = 30, 
    July = 31, 
    August = 31, 
    September = 30, 
    October = 31, 
    November = 30, 
    December = 31 
}; 

public class Program 
{ 
    public const string NEWLINE = "\n";  //constant for new line 


    static void Main(string[] args) 
    { 
     try 
     { 

      //prompt user for month number. 
      Console.Write("Enter a Number to find out what Month it is: "); 

      //convert users answer to integer 
      int userInput = Convert.ToInt16(Console.ReadLine()); 

      //declare and initalise 
      int daysInMonth = 0; 
      string answer = String.Empty; 

      //call relevent calculation methods 
      answer = DetermineMonth(userInput); 
      daysInMonth = DetermineDaysInMonth(userInput); 

      //Write users answer to screen 
      Console.WriteLine(answer); 

      //Prompt user, whether they want to know number of days in the 
      //month 
      Console.Write("Would you like to know the number of days in" + 
       " {0}: ", answer); 

      //assign users answer to variable 
      string userAnswer = Console.ReadLine(); 

       //Output answer if needed. 
       if (userAnswer == "yes".Trim().ToLower()) 
       { 
        Console.WriteLine("The number of days in {0} is: {1}", 
         answer, daysInMonth.ToString()); 
       } 
       else if (userAnswer == "no".Trim().ToLower()) 
       { 
        Console.WriteLine(NEWLINE); 
        Console.WriteLine("You answered No, Have a good day!"); 
       } 
       else 
       { 
        Console.WriteLine("Please answer yes or no."); 
       } 

      Console.Read(); //Pauses screen for user 
     } 
      //catch any errors. 
     catch (Exception err) 
     { 
      Console.WriteLine("Error" + err.Message); 
     } 

    } 


    /// <summary> 
    /// Determines What month the use enters and returns string value 
    /// </summary> 
    /// <param name="userInput"></param> 
    /// <returns>returns the month as string</returns> 
    public static String DetermineMonth(int userInput) 
    { 
     switch (userInput) 
     { 
      case 1: 
       return Months.January.ToString(); 
      case 2: 
       return Months.February.ToString(); 
      case 3: 
       return Months.March.ToString(); 
      case 4: 
       return Months.April.ToString(); 
      case 5: 
       return Months.May.ToString(); 
      case 6: 
       return Months.June.ToString(); 
      case 7: 
       return Months.July.ToString(); 
      case 8: 
       return Months.August.ToString(); 
      case 9: 
       return Months.September.ToString(); 
      case 10: 
       return Months.October.ToString(); 
      case 11: 
       return Months.November.ToString(); 
      case 12: 
       return Months.December.ToString(); 
      default: 
       return "Error"; 
     } 



    } 

    /// <summary> 
    /// Determines how many days is in selected month as integer 
    /// </summary> 
    /// <param name="userInput"></param> 
    /// <returns>returns how many days in month</returns> 
    public static int DetermineDaysInMonth(int userInput) 
    { 
     switch (userInput) 
     { 
      case 1: 
       return Convert.ToInt16(Months.January); 
      case 2: 
       return Convert.ToInt16(Months.February); 
      case 3: 
       return Convert.ToInt16(Months.March); 
      case 4: 
       return Convert.ToInt16(Months.April); 
      case 5: 
       return Convert.ToInt16(Months.May); 
      case 6: 
       return Convert.ToInt16(Months.June); 
      case 7: 
       return Convert.ToInt16(Months.July); 
      case 8: 
       return Convert.ToInt16(Months.August); 
      case 9: 
       return Convert.ToInt16(Months.September); 
      case 10: 
       return Convert.ToInt16(Months.October); 
      case 11: 
       return Convert.ToInt16(Months.November); 
      case 12: 
       return Convert.ToInt16(Months.December); 
      default: 
       return 0; 
     } 
    } 

老switch語句是這樣的:

 switch (userInput) 
     { 
     case 1: 
      answer = Months.January.ToString(); 
      daysInMonth = Convert.ToInt16(Months.January); 
      break; 
     case 2: 
      answer = Months.February.ToString(); 
      daysInMonth = Convert.ToInt16(Months.February); 
      break; 
     case 3: 
      answer = Months.March.ToString(); 
      daysInMonth = Convert.ToInt16(Months.March); 
      break; 
     case 4: 
      answer = Months.April.ToString(); 
      daysInMonth = Convert.ToInt16(Months.April); 
      break; 
     case 5: 
      answer = Months.May.ToString(); 
      daysInMonth = Convert.ToInt16(Months.May); 
      break; 
     case 6: 
      answer = Months.June.ToString(); 
      daysInMonth = Convert.ToInt16(Months.June); 
      break; 
     case 7: 
      answer = Months.July.ToString(); 
      daysInMonth = Convert.ToInt16(Months.July); 
      break; 
     case 8: 
      answer = Months.August.ToString(); 
      daysInMonth = Convert.ToInt16(Months.August); 
      break; 
     case 9: 
      answer = Months.September.ToString(); 
      daysInMonth = Convert.ToInt16(Months.September); 
      break; 
     case 10: 
      answer = Months.October.ToString(); 
      daysInMonth = Convert.ToInt16(Months.October); 
      break; 
     case 11: 
      answer = Months.November.ToString(); 
      daysInMonth = Convert.ToInt16(Months.November); 
      break; 
     case 12: 
      answer = Months.December.ToString(); 
      daysInMonth = Convert.ToInt16(Months.December); 
      break; 
     default: 
      answer = "Error"; 
      break; 
    } 

哪些工作,直到我換到不同的方法,然後它去下坡從那裏。現在,即使我把它放回去,它仍然會讓幾個月混在一起?

如此混亂:S

預先感謝您的幫助......如果你能理解亂碼:對

+4

看來你使用枚舉有點創意。除此之外,第二個月的長度不能存儲。看看DateTime,它會給你更多的可能性來做月份長度和日期時間的計算。 – Peter

+0

基本上@佩爾說的。更具體地說,看看[DateTime.DaysInMonth](http://msdn.microsoft.com/library/system.datetime.daysinmonth.aspx)。如果您(出於某種原因)不喜歡使用內置功能,請查看卓越的[noda-time](https://code.google.com/p/noda-time/)。截至目前,您二月的價值是錯誤的(取決於年份)。 – Corak

+0

你爲什麼不使用字典?代碼將會更短,更簡單和更直接 –

回答

5

NET框架包含了大量的代碼量。有時只是很難找到需要的,但是已經存在的可能性很高。而且,雖然它需要時間來搜索,這是一個值得花時間,因爲你給自己有用的知識,爲您今後的工作

CultureInfo.CurrentCulture.DayFormatInfo.MonthNames
DateTime.DaysInMonth

using System.Globalization; 
static void Main(string[] args) 
{ 
    Console.Write("Enter a Number to find out what Month it is: "); 

    int userInput = Convert.ToInt16(Console.ReadLine()); 
    if(userInput > 0 && userInput < 13) 
    {    
     string monthName = CultureInfo.CurrentCulture.DayTimeFormat.MonthNames[userInput-1]; 
     int daysInMonth = DateTime.DaysInMonth(2013, userInput); 
     ...... 

    } 
} 

如果你也需要考慮閏年你應該得到一年的輸入,但它是非常簡單的

+1

年度輸入僅用於檢查閏年。 –

+0

+1,這是唯一真正的答案。 –

+0

謝謝你的所有輸入。似乎我讓自己變得非常困難:) –

1

那是因爲你的枚舉擁有這一切混合起來。

有31重複值和30

這裏是一個工作示例(但也有優化它。更喜歡的方式使用DateTime類)

public enum Months : int 
{ 
    None = 0, 
    January = 1, 
    February = 2, 
    March = 3, 
    April = 4, 
    May = 5, 
    June = 6, 
    July = 7, 
    August = 8, 
    September = 9, 
    October = 10, 
    November = 11, 
    December = 12 
}; 

public class Program 
{ 
    public const string NEWLINE = "\n";  //constant for new line 

    static void Main(string[] args) 
    { 
     try 
     { 
      //prompt user for month number. 
      Console.Write("Enter a Number to find out what Month it is: "); 

      //convert users answer to integer 
      int userInput = Convert.ToInt16(Console.ReadLine()); 

      //declare and initalise 
      int daysInMonth = 0; 
      Months answer; 

      //call relevent calculation methods 
      answer = DetermineMonth(userInput); 

      if (answer == Months.None) 
      { 
       Console.WriteLine("Please enter a value between 1 and 12"); 
       return; 
      } 

      daysInMonth = DetermineDaysInMonth(answer); 

      //Write users answer to screen 
      Console.WriteLine(answer); 

      //Prompt user, whether they want to know number of days in the 
      //month 
      Console.Write("Would you like to know the number of days in {0}: ", answer); 

      //assign users answer to variable 
      string userAnswer = Console.ReadLine(); 

      //Output answer if needed. 
      if (userAnswer == "yes".Trim().ToLower()) 
      { 
       Console.WriteLine("The number of days in {0} is: {1}", answer, daysInMonth.ToString()); 
      } 
      else if (userAnswer == "no".Trim().ToLower()) 
      { 
       Console.WriteLine(NEWLINE); 
       Console.WriteLine("You answered No, Have a good day!"); 
      } 
      else 
       Console.WriteLine("Please answer yes or no."); 

      Console.ReadLine(); //Pauses screen for user 
     } 
     //catch any errors. 
     catch (Exception err) 
     { 
      Console.WriteLine("Error" + err.Message); 
     } 
    } 

    /// <summary> 
    /// Determines What month the use enters and returns string value 
    /// </summary> 
    /// <param name="userInput"></param> 
    /// <returns>returns the month as string</returns> 
    public static Months DetermineMonth(int userInput) 
    { 
     switch (userInput) 
     { 
      case 1: 
       return Months.January; 
      case 2: 
       return Months.February; 
      case 3: 
       return Months.March; 
      case 4: 
       return Months.April; 
      case 5: 
       return Months.May; 
      case 6: 
       return Months.June; 
      case 7: 
       return Months.July; 
      case 8: 
       return Months.August; 
      case 9: 
       return Months.September; 
      case 10: 
       return Months.October; 
      case 11: 
       return Months.November; 
      case 12: 
       return Months.December; 
     } 
     return Months.None; 
    } 

    /// <summary> 
    /// Determines how many days is in selected month as integer 
    /// </summary> 
    /// <param name="userInput"></param> 
    /// <returns>returns how many days in month</returns> 
    public static int DetermineDaysInMonth(Months userInput) 
    { 
     switch (Convert.ToInt32(userInput)) 
     { 
      case 1: 
      case 3: 
      case 5: 
      case 7: 
      case 8: 
      case 10: 
      case 12: 
       return 31; 
      case 2: 
       return 28; 
      case 4: 
      case 6: 
      case 9: 
      case 11: 
       return 30; 
     } 
     return 0; 
    } 
} 
+0

此外,你可以避免這個'公共常量字符串NEWLINE =「\ n」;'。有'Environment.NewLine'。 –

+0

這更有意義。 –

1

您使用enum創建常量的符號名稱。這不是你想要的。

我想你想要的是一個查找表,給定值A,返回一個值B.在你的情況,你可以用一對數組:

string[] monthNames = new string[] 
{ 
    "January", "February", "March", "April", "May", "June", 
    "July", "August", "September", "November", "December" 
}; 
int[] monthDays = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 

然後你就可以得到一個月份名稱和天與查找數:

int userInput = Convert.ToInt16(Console.ReadLine()); 
if (userInput < 1 || userInput > 12) 
    Console.WriteLine("Error: invalid month."); 
else 
{ 
    answer = monthNames[userInput-1]; 
    daysInMonth = monthDays[userInput-1]; 
} 

還有其他的方法可以做到這一點,包括使用結構或類的月份和日期,但這些都是稍微高級的主題。

此外,.NET有DateTime structure,它具有所有這些功能以及更多用於處理日期和時間的功能。在生產程序中,你會使用它而不是自己滾動。

0

您可能想要考慮簡化這一點,並使您的枚舉數與月份數匹配。然後在其他地方存儲那個月的日子。

然後你可以做(​​Months)userInput獲取枚舉並至少消除一個switch語句。

只要枚舉爲每個值存儲一個唯一的int,就可以使用Dictionary或其他方式在每個月中存儲日期。

0

這不是你如何使用枚舉。

它們不僅僅是靜態鍵值對:如果它們是,你可以使用的不僅僅是整型類型。不,它們不僅僅是整體類型的類型安全包裝。

與你的問題是這樣的:

public enum Months 
{ 
    January = 31, 
    February = 28, 
    March = 31, 
    April = 30, 
    May = 31, 
    June = 30, 
    July = 31, 
    August = 31, 
    September = 30, 
    October = 31, 
    November = 30, 
    December = 31 
}; 

這意味着,只要CLR知道,一月,三月,五月,七月,八月,十月和十二月是一模一樣。與四月,六月,九月和十一月相同。

正確的方式做,這會是這樣的:

public enum Months 
{ 
    None = -1, 
    January = 1, 
    February = 2, 
    March = 3, 
    April = 4, 
    May = 5, 
    June = 6, 
    July = 7, 
    August = 8, 
    September = 9, 
    October = 10, 
    November = 11, 
    December = 12 
}; 

然後你DetermineMonth方法只會是這樣的:

public static Months DetermineMonth(int userInput) 
{ 
    Months temp = (Months)userInput; 
    return Enum.IsDefined(typeof(Months), temp) ? temp : Months.None; 
} 

然後是DetermineDaysInMonth會是這樣:

public static int DetermineDaysInMonth(int userInput) 
{ 
    if (!((Months[])Enum.GetValues(typeof(Months))).Contains((Months)userInput) 
     return 0; 
    else return DateTime.DaysInMonth(DateTime.Today.Year, userInput); 
} 
0

你可以有Extension method你的enum返回的天數 -

public enum Months 
{ 
    January, 
    February, 
    March, 
    April, 
    May, 
    June, 
    July, 
    August, 
    September, 
    October, 
    November, 
    December 
} 

public static class MonthsExtensions 
{ 
    public static int DaysInMonths(this Months month) 
    { 
     switch (month) 
     { 
      case Months.January: 
      case Months.March: 
      case Months.May: 
      case Months.July: 
      case Months.August: 
      case Months.October: 
      case Months.December: 
       return 31; 

      case Months.April: 
      case Months.June: 
      case Months.September: 
      case Months.November: 
       return 30; 

      case Months.February: 
       return 28; 
     } 
     return 0; 
    } 

然後,您可以得到的天數是這樣 -

int daysInMonths = Months.January.DaysInMonths(); 
+0

二月取決於閏年...只是說':) –