2009-07-27 3 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;    
    } 
} 

Другой вопрос: Я попытался изменить цвет текста дисплея в спискеBox. Возможно ли иметь разные цвета? То, что я также пробовал здесь, это первые 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

Я думаю, что предложение дается нолдорин только даст вам значение переменной J, а не counta, counte и т. д. – peSHIr

+0

Как вы уже выбрали ответ, я бы создал новый вопрос, подробно описывающий специфику вашего вопроса. Если вы все еще пытаетесь сделать многоцветные элементы списка, я бы тоже задал отдельный вопрос. – dahlbyk

ответ

5

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

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

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

+0

@Martin: это работает отлично. Спасибо за вход :-) – tintincutes

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#.


Поскольку вы, вероятно, интересно распределительном заявление в любом случае, следующий код использует правильный синтаксис:

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

, если я упрощу его, как ваш пример, который я все еще включаю в свой код? – tintincutes

+1

Первая часть в порядке, но даст только общее количество гласных (и, вероятно, не подходит для изучения языка). Вторая часть неверна: для случая нужна константа. – M4N

+0

@Martin: какая часть вы имеете в виду? Вы имеете в виду мой код выше? Или тот, который использует LINQ? – tintincutes

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: код Нолдорина У меня не получится. Кажется, я что-то упустил. Я не знаком с этим, но мне бы хотелось попробовать. – tintincutes

+0

@tintincute: убедитесь, что вы используете .NET Framework 3.5 и включаете «using System.LINQ» в верхней части исходного файла, или предложение LINQ никогда не будет работать. – peSHIr

+0

@peSHIr: yes Я использую его: я могу видеть в верхней части исходного файла: using System.Collections.Generic; с использованием System.Drawing; с использованием System.Linq; – tintincutes

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; 

Update: Просто понял, что в StringComparer не работает для char ключей. Переключение на string ключ - не так эффективен, как char, но проще, чем писать без учета регистра char. Я предпочитаю подход сравнения к тому, чтобы делать какой-то ToLower/ToUpper во всех словарях.

+0

@dahlbyk: В вашем коде вы используете массив здесь? – tintincutes

+0

Он использует словарь (aka map, aka ассоциативный массив) - http://en.wikipedia.org/wiki/Associative_array –

+0

@Pavel Minaev: Как вы думаете, я могу также использовать массив здесь, в моем коде? Спасибо за ссылку – tintincutes

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

+0

Этот код LINQ, что делает жизнь намного проще. Он находится в выпуске .NET Framework 3.5. (визуальная студия 2008). Он позволяет запрашивать произвольные коллекции объектов (а строка - это «коллекция» символов) или xml или sql и т. Д. – Colin

+0

@Colin: Я думаю, что это так. Но вполне понятно, что еще не выучили тип данных «var» - (переменная). не совсем уверен, как это работает, но я бы хотел посмотреть на него ссылку позже. – tintincutes

1

Я столкнулся с подобной проблемой в интервью. Но я должен был показать свой результат в контроле уровня вместо управления ListBox ... поэтому я решил эту проблему так:

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

Смежные вопросы