使用开关计数元音

时间:2009-07-27 12:02:09

标签: c# switch-statement

我试图设计一个程序来计算句子中的元音。

在我的代码中,我使用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;             
    }
}

另一个问题:我试图改变listBox中显示文本的颜色。这可能有不同的颜色吗?我在这里尝试的是前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();
}

6 个答案:

答案 0 :(得分: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;
     }
}

答案 1 :(得分:5)

我认为你误解了'开关/案例'是如何运作的。只需将它们更改为:

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

大小写需要一个应与当前字符进行比较的常量值。

答案 2 :(得分: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;

更新:刚才意识到StringComparerchar密钥不起作用。切换到string密钥 - 效率不如char,但比编写不区分大小写的char比较器更容易。我更喜欢比较器方法在与字典相关的所有内容上做某种ToLower / ToUpper。

答案 3 :(得分: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中所有其他字符的数量。)

答案 4 :(得分: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());

答案 5 :(得分: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();
}