2016-11-21 120 views
2

我是第一年的學生,我們被要求做assigment,我不知道是否有任何其他方式來檢查用戶輸入,所以我不會做所有的,如果公司和其他各輸入後的或者是有什麼辦法可以循環並保存6個不同的答案或類似的東西.....C#如何使這個代碼更緊湊(如果,否則如果,否則)

static void Main(string[] args) 
    { 
     //var 
     string s0, s1, s2, s3, s4, s5; //subejects 
     string g0, g1, g2, g3, g4, g5;//grades 

     //input grades/subject 
     Console.Write("Enter Subject 1 : "); 
     s0 = Console.ReadLine(); 
     Console.Write("Enter Grade 1 : "); 
     g0 = Console.ReadLine(); 
     g0 = g0.ToUpperInvariant(); 
     if (g0 == "H1") 
      g0 = "100"; 
     else if (g0 == "H2") 
      g0 = "88"; 
     else if (g0 == "H3") 
      g0 = "77"; 
     else if (g0 == "H4") 
      g0 = "66"; 
     else if (g0 == "H5" || g0 == "O1") 
      g0 = "56"; 
     else if (g0 == "H6" || g0 == "O2") 
      g0 = "46"; 
     else if (g0 == "H7" || g0 == "O3") 
      g0 = "37"; 
     else if (g0 == "H8") 
      g0 = "0"; 
     else if (g0 == "O4") 
      g0 = "28"; 
     else if (g0 == "O5") 
      g0 = "20"; 
     else if (g0 == "O6") 
      g0 = "12"; 
     else if (g0 == "O7" || g0 == "O8") 
      g0 = "0"; 
     else 
      Console.WriteLine("Wrong Grade Format!"); 

     Console.Write("\nEnter Subject 2 : "); 
     s1 = Console.ReadLine(); 
     Console.Write("Enter Grade 2 : "); 
     g1 = Console.ReadLine(); 
     g1 = g1.ToUpperInvariant(); 

     Console.Write("\nEnter Subject 3 : "); 
     s2 = Console.ReadLine(); 
     Console.Write("Enter Grade 3 : "); 
     g2 = Console.ReadLine(); 
     g2 = g2.ToUpperInvariant(); 

     Console.Write("\nEnter Subject 4 : "); 
     s3 = Console.ReadLine(); 
     Console.Write("Enter Grade 4 : "); 
     g3 = Console.ReadLine(); 
     g3 = g3.ToUpperInvariant(); 

     Console.Write("\nEnter Subject 5 : "); 
     s4 = Console.ReadLine(); 
     Console.Write("Enter Grade 5 : "); 
     g4 = Console.ReadLine(); 
     g4 = g4.ToUpperInvariant(); 

     Console.Write("\nEnter Subject 6 : "); 
     s5 = Console.ReadLine(); 
     Console.Write("Enter Grade 6 : "); 
     g5 = Console.ReadLine(); 
     g5 = g5.ToUpperInvariant(); 

     Console.Clear(); 

     //collect information into array 
     for (int i = 0; i <= 5; i++) 
     { 
      string[] subjects = { s0, s1, s2, s3, s4, s5 }; 
      string[] grades = { g0, g1, g2, g3, g4, g5 }; 

      Console.WriteLine("{0,15}:{1,-15}", subjects[i],grades[i]);//output 
     } 
    } 
} 

請別生氣,如果IM問愚蠢的問題很簡單但我可以在網上找到的是更先進的方法....謝謝。

+1

您可以使用'Dictionary '將輸入字符串映射到輸出字符串。那麼你只需要在一個地方初始化字典。 –

+0

也可以使用'GetSubjectAndGrade(int num)'返回一個'元組'或類似的東西 – Jonesopolis

+0

您好, 我建議你把你的字符串放入一個枚舉中...... g0 ==「H1 「如果你需要改變它,真的很糟糕。然後我將這個代碼包裝到一個函數中。您的Console.Write()調用您可以在循環中執行 - 將值分配給數組g []。最好的關注和良好的外觀與你的研究 – TripleEEE

回答

7

我建議初始化一個字典做查詢,像這樣:

var lookup = new Dictionary<string, string> 
{ 
    ["H1"] = "100", 
    ["H2"] = "88", 
    ["H3"] = "77" 
    // Etc. 
}; 

然後查找字符串如下:

g0 = g0.ToUpperInvariant(); 

if (!lookup.TryGetValue(g0, out g0)) 
    Console.WriteLine("Wrong Grade Format!"); 
+1

如果他是一年級的學生,將很難知道字典是什麼以及如何使用它。 – driconmax

+0

@driconmax相比於第一年CS學生傾向於學習的Quicksort算法,他們並沒有那麼難使用。 –

+1

你學習任何CS學位的第一年的字典,通常非常早的第一年也... – FakeCaleb

0

您可以使用switch

switch(g0){ 
    case "H1": 
     g0 = 100; 
     break; 
    case "H2": 
     g0 = 88; 
     break; 
    case "H3": 
     g0 = 73; 
     break; 
    default: 
     Console.WriteLine("Wrong Grade Format!"); 
     break; 
} 

開關是喜歡你的的if-else代碼在內部。在參數中,你把var檢查,然後你檢查每個案例與值case "H3"是與if(g0 == "H3")相同。在:之前和break;之前,如果條件爲true,則放置要執行的代碼。如果的條件是true開關default:並執行該代碼。

+0

這種方法沒有任何好處。 – mybirthname

+0

更少的代碼....檢查問題_我想知道是否有任何其他方式來檢查用戶輸入,所以我不會做每個輸入後的所有if和else?_而這個_我是第一年學生_他只是要求另一種方法。 – driconmax

+0

因此,這將產生更多的代碼 – mybirthname

0

從您的問題來看,你有點尋找模式根據您的意見縮短您的條件。如果是這樣,那可能有點粗糙,因爲你真的需要解釋用戶可能輸入和輸入的每一個輸入,而且無論多長時間。

儘管如此,我試圖通過使用我根據代碼段和用戶輸入分析的模式來縮短條件。

這是據我可以給你的代碼片段:

var totalGrade0 = 100; 
if (g0.Contains("H")) { 
    var gradeVal = Convert.ToInt32(g0.Replace("H", "")); 
    var initDeductionSet = 12; 
    g0 = totalGrade0.ToString(); 
    if (gradeVal == 2) { 
     g0 = (totalGrade0 - initDeductionSet).ToString(); 
    } 
    if (gradeVal >= 4 && gradeVal <= 6) { 
     g0 = (totalGrade0 - (10 * (gradeVal - 2)) + initDeductionSet).ToString(); 
    } 
    if (gradeVal == 7) { 
     g0 = (totalGrade0 - 63).ToString(); 
    } 

} 

我注意到,輸入使用H1,H2,H3定義級代碼,並給從代碼基於各自檔次。而且,等級被扣除了更高的代碼(例如H7。儘管我沒有在代碼片段中包含O1,O2,但只是給你一個想法)。使用等級代碼中的整數值對我有利,我能夠看到一個模式並使用它來稍微自動執行演繹過程,從而有效地減少了條件。這種模式在H4-H6中十分明顯,他們將等級減去10.除此之外,我沒有看到任何可能進一步減少情況的東西。也許如果你能看到一些在分級代碼系統中更明顯的模式,你可能會減少一些缺口。

這裏的關鍵是解析用戶輸入的等級代碼(H1,H2等)並提取代碼中的整數值。

如果你正在尋找的如果其他條件更簡潔的方法,你可以嘗試使用

詞典/哈希表

的switch-case

其中你還沒有en反駁,但我相信。但要知道這些方法不會縮短你的條件。但他們會進一步使您的代碼可讀。