Подсчет гласных с помощью переключателя

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;             
    }
}

Другой вопрос: я попытался изменить цвет текста дисплея в 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 in the sentence");
    listBox1.Items.Add("There are " + counte.ToString().Trim() + " e in the sentence");
    listBox1.Items.Add("There are " + counti.ToString().Trim() + " i in the sentence");
    listBox1.Items.Add("There are " + counto.ToString().Trim() + " o in the sentence");
    listBox1.Items.Add("There are " + countu.ToString().Trim() + " u 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
    Я думаю, что предложение, данное Нолдорином, даст вам только значение вашей переменной j, а не countta, countte и т. Д.
  • 0
    Поскольку вы уже выбрали ответ, я бы создал новый вопрос, подробно описывающий специфику вашего вопроса о мероприятии. Если вы все еще пытаетесь создать разноцветные элементы списка, я бы тоже задал отдельный вопрос.
Теги:
switch-statement

6 ответов

5
Лучший ответ

Я думаю, вы неправильно поняли, как работает "switch/case". Просто измените их на это:

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

Для случая требуется постоянное значение, которое следует сравнить с текущим символом.

  • 0
    @Martin: это работает отлично. Спасибо за вклад :-)
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, вероятно, является хорошим способом изучения основ С#.


Так как вам все-таки любопытно в отношении оператора switch, следующий код использует правильный синтаксис:

foreach (var chr in sentence)
{
    switch (chr) 
    {
        case 'a':
            ...
            break;
        case 'e':
            ...
            break;
        case 'i':
            ...
            break;
        case 'o':
            ...
        case 'u':
            ...
            break;
     }
}
  • 0
    если я упросту это, как ваш пример, какой я все еще включу в свой код?
  • 1
    Первая часть в порядке, но даст только общее количество гласных (и, вероятно, не подходит для изучения языка). Вторая часть неверна: дело нуждается в константе.
Показать ещё 7 комментариев
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: В своем коде вы используете массив здесь?
  • 0
    Он использует словарь (он же карта, он же ассоциативный массив) - en.wikipedia.org/wiki/Associative_array
Показать ещё 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 для каждой из гласных.

Дав этот ответ, я лично сделал бы что-то совсем другое. Как пример 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: код Нолдорина, я не могу заставить его работать. Я думаю, что что-то упустил. Я не знаком с этим, но я хотел бы попробовать это.
  • 0
    @tintincute: убедитесь, что вы используете .NET Framework 3.5 и включите «using System.LINQ» в верхней части исходного файла, иначе предложение LINQ никогда не сработает.
Показать ещё 1 комментарий
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
    ужасный код .. честно говоря.
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
    извините, но я не понимаю эту кодировку. Это значит, что мне еще есть чему поучиться. но спасибо, что поделились в любом случае,
  • 0
    Этот код LINQ, который делает жизнь намного проще. Это в версии .NET Framework 3.5. (визуальная студия 2008). Он позволяет запрашивать произвольные коллекции объектов (а строка - это «коллекция» символов), либо xml, либо sql и т. Д.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню