2009-07-27 38 views
2

我試圖設計一個計算一個句子中元音的程序。使用開關計數元音

在我的代碼中,我使用了foreach語句和if/else if語句。我想使用switch聲明 轉換這些代碼行,但我不確定要去哪裏。我需要添加一個新的方法嗎?我很感謝你的幫助。

這是我到目前爲止所嘗試的:我檢查了這一個是非常錯誤的。例如case 1需要有一個常數。我不確定在這裏使用什麼常數。

foreach (char v in yourSentence) 
{ 
    switch (v) 
    { 
    case 1: 
     (v==ch1); 
     counta++; 
     j++; 
     break; 

    case 2: 
     (v==ch2); 
     counte++; 
     j++; 
     break; 
    case 3: 
     (v==ch3); 
     counti++; 
     j++; 
     break; 
    case 4: 
     (v==ch4); 
     counto++; 
     j++; 
     break; 
    case 5: 
     (v==ch3); 
     counti++; 
     j++; 
     break;    
    } 
} 

另一個問題:我試圖改變列表框中顯示文本的顏色。有可能有不同的顏色嗎?我在這裏也嘗試過的第一個5(listBox1.Items.Add)是紫羅蘭色的。 (listBox1.Items.Add)的總和是藍色的。但它似乎沒有改變。我在這裏錯過了什麼嗎?

private void btnCount_Click(object sender, EventArgs e) 
{ 
    string yourSentence; 
    yourSentence = textBoxVowels.Text.ToLower().Trim(); 

    char ch1 = 'a'; 
    char ch2 = 'e'; 
    char ch3 = 'i'; 
    char ch4 = 'o'; 
    char ch5 = 'u'; 

    int counta = 0; 
    int counte = 0; 
    int counti = 0; 
    int counto = 0; 
    int countu = 0; 

    int j = counta + counte + counti + counto + countu; 



    foreach (char v in yourSentence) 
    { 
     if (v == ch1) { counta++; j++; } 

     else if (v == ch2) { counte++; j++; } 

     else if (v == ch3) { counti++; j++; } 

     else if (v == ch4) { counto++; j++; } 

     else if (v == ch5) { countu++; j++; } 
    } 

    listBox1.Items.Add("There are " + counta.ToString().Trim() + " a's in the sentence"); 
    listBox1.Items.Add("There are " + counte.ToString().Trim() + " e's in the sentence"); 
    listBox1.Items.Add("There are " + counti.ToString().Trim() + " i's in the sentence"); 
    listBox1.Items.Add("There are " + counto.ToString().Trim() + " o's in the sentence"); 
    listBox1.Items.Add("There are " + countu.ToString().Trim() + " u's in the sentence"); 
    listBox1.Font = new Font("Arial", 12, FontStyle.Bold); 
    listBox1.ForeColor = Color.Violet; 

    listBox1.Items.Add("There are " + j.ToString().Trim() + " vowels in the sentence"); 
    listBox1.ForeColor = Color.Blue; 
} 


private void btnClear_Click(object sender, EventArgs e) 
{ 
    textBoxVowels.Text = null; 
    listBox1.Items.Clear(); 
} 
+0

我認爲Noldorin給出的建議只會給你j變量中的值,不是counta,counte等 – peSHIr 2009-07-27 13:10:21

+0

正如你已經選擇了答案,我會創建一個新的問題,詳細說明你的事件問題的具體細節。如果你仍然試圖製作多種顏色的列表項目,我也會爲此提出一個單獨的問題。 – dahlbyk 2009-07-28 15:34:36

回答

5

我想你誤會了「開關/案」是如何工作的。只需將它們更改爲:

case 'a': 
    counta++; 
    j++; 
    break; 

案例需要一個常數值,該值應與當前字符進行比較。

+0

@Martin:這工作正常。感謝您的輸入:-) – tintincutes 2009-07-27 13:22:15

9

或者只是使用一點LINQ來簡化整個問題。 :)

public static int CountVowels(this string value) 
{ 
    const string vowels = "aeiou"; 
    return value.Count(chr => vowels.Contains(char.ToLower(chr))); 
} 

Count擴展方法特別適合此任務。另外,請注意使用所有元音字符串來檢查每個字符 - 比switch語句簡單得多。

注:似乎我錯過了你想要單獨計算每個元音的事實。在這種情況下,LINQ變得有點複雜了(至少如果你想有效地做到這一點),但我將把它作爲一個練習。無論如何,switch語句可能是學習C#基礎知識的好方法。


因爲你可能好奇反正switch語句,下面的代碼使用了正確的語法:

foreach (var chr in sentence) 
{ 
    switch (chr) 
    { 
     case 'a': 
      ... 
      break; 
     case 'e': 
      ... 
      break; 
     case 'i': 
      ... 
      break; 
     case 'o': 
      ... 
     case 'u': 
      ... 
      break; 
    } 
} 
+0

如果我簡化它就像你給出的例子,我仍然在我的代碼中包括哪一個? – tintincutes 2009-07-27 12:10:24

+1

第一部分是確定的,但只會給出元音的總數(並且可能不適合學習該語言)。第二部分是錯誤的:案件需要一個常數。 – M4N 2009-07-27 12:15:29

+0

@Martin:你的意思是哪一部分?你是說我的代碼在上面?或者使用LINQ的那個? – tintincutes 2009-07-27 12:29:30

2

另請查看其他問題的答案以獲得許多有用的提示。我只是重寫你的第一件的示例代碼從你的問題可能讓它做你的意思是:

foreach (char v in yourSentence) 
{ 
    switch (v) 
    { 
     case 'a': counta++; j++; break; 
     case 'e': counte++; j++; break; 
     case 'i': counti++; j++; break; 
     case 'o': counto++; j++; break; 
     case 'u': countu++; j++; break; 
    } 
} 

你似乎想要增加使用交換機的五個具體元音{ counta, counte, counti, counto, countu }變量(對嗎?)並且增加每個元音的變量j

已經給出了這個答案,我會親自做一些不同的事情。就像Noldorin給出的LINQ示例一樣。或這樣的事情,因爲也許cherryalpha建議:

// create dictionary 
var counts = new Dictionary<char,int>(); 

// initialize it for the vowels 
foreach (char v in "aeiuo") 
{ 
    counts.Add(v, 0); 
} 

// count all characters in sentence 
foreach (char v in yourSentence) { 
    if (counts.ContainsKey(v)) { 
     // increase count for known characters 
     counts[v]++;       
    } else { 
     // add new count for characters not seen previously 
     counts.Add(v,1); 
    } 
} 

// calculate your total number of vowels 
j = counts['a'] + counts['e'] + counts['i'] + counts['o'] + counts['u']; 

快速預警,以防萬一:你需要一個using System.Collection.Generic在源文件中包含此代碼,以確保通用詞典被稱爲頂部它的簡稱。

(並意識到,這個代碼將不會只給你元音計數,但對於計數yourSentence所有其他人物也。)

+0

@peSHIr:Noldorin的代碼我無法使用它。我想我錯過了什麼。我對這個不熟悉,但我很想嘗試一下。 – tintincutes 2009-07-27 13:20:12

+0

@tintincute:確保您使用.NET Framework 3.5並在源文件的頂部包含「using System.LINQ」,否則LINQ建議將無法工作。 – peSHIr 2009-07-27 13:23:35

+0

@peSHIr:是的我正在使用它:我可以在我的源文件頂部看到: using System.Collections.Generic; using System.Drawing;使用System.Linq的 ; – tintincutes 2009-07-27 13:43:48

4

這裏有一個更先進的解決方案:

public static Dictionary<char, int> CountLetters(string value, string letters) 
{ 
    var counts = letters.ToDictionary(c => c.ToString(), c => 0, StringComparer.OrdinalIgnoreCase); 

    var groups = from c in value 
       let s = c.ToString() 
       where counts.ContainsKey(s) 
       group s by s; 

    foreach(var g in groups) 
     counts[g.Key] = g.Count(); 

    return counts; 
} 

哪你可以使用這樣的:

var letterCounts = CountLetters(yourSentence, "aeiou"); 

int countA = letterCounts["a"]; 
int countE = letterCounts["e"]; 
int countI = letterCounts["i"]; 
int countO = letterCounts["o"]; 
int countU = letterCounts["u"]; 

int total = countA + countE + countI + countO + countU; 

更新:剛剛意識到一個StringComparer將不適用於char鍵。切換到string鍵 - 效率不如char,但比編寫不區分大小寫的char比較器更容易。我更喜歡使用比較器的方法來對所有與字典相關的東西做一些ToLower/ToUpper。

+0

@dahlbyk:在你的代碼中你使用了一個數組嗎? – tintincutes 2009-07-28 07:28:19

+0

他使用的字典(又名地圖,又名關聯數組) - http://en.wikipedia.org/wiki/Associative_array – 2009-07-28 08:08:11

+0

@Pavel Minaev:你認爲我也可以在我的代碼中使用數組嗎?感謝您的鏈接 – tintincutes 2009-07-28 08:16:43

1
const string VOWELS = "aeiou"; 
var str = "Lorem ipsum dolor sit amet"; 
var q = from ch in str 
     where VOWELS.Contains(ch) 
     group ch by ch into g 
     select g; 
var dict = q.ToDictionary(_ => _.Key, _ => _.Count()); 
+0

我很抱歉,但我不明白這個編碼。這意味着我仍然有很多東西需要學習。但感謝分享, – tintincutes 2009-07-27 15:17:27

+0

這個代碼是LINQ,它使生活變得更加簡單。它在.NET Framework 3.5版本中。 (visual studio 2008)。它允許你查詢對象的任意集合(並且字符串是字符的'集合'),或者xml或sql等。 – Colin 2009-07-28 08:00:03

+0

@Colin:我認爲它是。但相當明白還沒有學到數據類型「var」 - (變量)。不太確定它是如何工作的,但我很樂意在稍後參考它。 – tintincutes 2009-07-28 08:08:52

1

我在面試中遇到了類似的問題。但我必須表現出的水平控制,而不是列表框控件我的結果,所以,我解決了這個問題是這樣的:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    string EnterString; 
    EnterString = TextBox1.Text; 
    char ch1 = 'a'; 
    char ch2 = 'e'; 
    char ch3 = 'i'; 
    char ch4 = 'o'; 
    char ch5 = 'u'; 

    int counta = 0; 
    int counte = 0; 
    int counti = 0; 
    int counto = 0; 
    int countu = 0; 
    char ch6 = 'A'; 
    char ch7 = 'E'; 
    char ch8 = 'I'; 
    char ch9 = 'O'; 
    char ch10 = 'U'; 

    int countA = 0; 
    int countE = 0; 
    int countI = 0; 
    int countO = 0; 
    int countU = 0; 


    int j = counta + counte + counti + counto + countu + countA + countE + countI + countO + countU; 

    foreach (char v in EnterString) 
    { 
     if (v == ch1) { counta++; j++; } 

     else if (v == ch2) { counte++; j++; } 

     else if (v == ch3) { counti++; j++; } 

     else if (v == ch4) { counto++; j++; } 

     else if (v == ch5) { countu++; j++; } 
    } 
    foreach (char v in EnterString) 
    { 
     if (v == ch6) { countA++; j++; } 

     else if (v == ch7) { countE++; j++; } 

     else if (v == ch8) { countI++; j++; } 

     else if (v == ch9) { countO++; j++; } 

     else if (v == ch10) { countU++; j++; } 
    } 

    Label1.Text = j.ToString(); 
} 
+2

可怕的代碼..老實說。 – caesay 2011-06-13 19:45:12