2012-06-18 5 views
0

Я учу себя C#, и один из текущих глав вызывает запрос пользователю указать строку, записать строку, подсчитать количество символов, экземпляры буквы e 'и, наконец, примеры всех гласных. Это дало подсказку использовать switch, но я не мог понять, как это сделать. Я сделал это, чтобы работать, делая это вручную, но я не думаю, что в этом дело. :) Как я могу использовать оператор switch, чтобы уменьшить количество типизированных строк?Сокращение строк кода с помощью оператора switch

Console.WriteLine("Please type a sentence and hit enter: "); 

string myString = Console.ReadLine(); 

int letterCount = myString.Split('e').Length - 1; 

Console.Clear(); 
Console.WriteLine("Thank you. The sentence you entered was: \n\"{0}\"", myString); 
Console.WriteLine("This sentence is {0} characters long.", myString.Length); 
Console.WriteLine("It contains {0} instances of the letter \'e\'.", letterCount); 

int vowelCount = 0; 
int letterALower = myString.Split('a').Length - 1; 
vowelCount += letterALower; 

int letterELower = myString.Split('e').Length - 1; 
vowelCount += letterELower; 

int letterILower = myString.Split('i').Length - 1; 
vowelCount += letterILower; 

int letterOLower = myString.Split('o').Length - 1; 
vowelCount += letterOLower; 

int letterULower = myString.Split('u').Length - 1; 
vowelCount += letterULower; 

int letterAUpper = myString.Split('A').Length - 1; 
vowelCount += letterAUpper; 

int letterEUpper = myString.Split('E').Length - 1; 
vowelCount += letterEUpper; 

int letterIUpper = myString.Split('I').Length - 1; 
vowelCount += letterIUpper; 

int letterOUpper = myString.Split('O').Length - 1; 
vowelCount += letterOUpper; 

int letterUUpper = myString.Split('U').Length - 1; 
vowelCount += letterUUpper; 

Console.WriteLine("There are {0} vowels used.", vowelCount); 
Console.ReadLine(); 
+0

[C# Switch - MSDN] (http://msdn.microsoft.com/en-us/library/06tc147t (v = vs.80) .aspx) все, что нужно знать для этой проблемы. Также посмотрите на [циклы] (http://msdn.microsoft.com/en-us/library/32dbftby) – mawburn

+0

Спасибо, но я просмотрел эту страницу, и это не имело смысла в связи с этой проблемой. http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.71).aspx – Trido

ответ

2

Вот простое решение:

string str = Console.ReadLine(); 
string low_str = str.ToLower(); 
Console.Clear(); 
Console.WriteLine("Thank you. The sentence you entered was: \n\"{0}\"", str); 
Console.WriteLine("This sentence is {0} characters long.", str.Length); 

int vowelCount = 0; 
int eCount = 0; 

for (int i = 0; i < low_str.Length; i++) 
{ 
    switch(low_str[i]) 
    { 
     case 'e': eCount ++; vowelCount++; break; 
     case 'a': vowelCount++; break; 
     case 'o': vowelCount++; break; 
     case 'i': vowelCount++; break; 
     case 'u': vowelCount++; break; 
     case 'y': vowelCount++; break; 
    } 
} 

Console.WriteLine("It contains {0} instances of the letter \'e\'.", eCount); 
Console.WriteLine("There are {0} vowels used.", vowelCount); 
Console.ReadLine(); 

Обратите внимание, что это может быть сделано в еще меньшем количестве линий, использующих этот метод (не самый лучший способ, но давайте не будем слишком глубоко в каркасных деталей:)):

int eCount = low_str.split(new char[]{'e'}) - 1; 
int vowelCount = low_str.split(new char[]{'a','e','o','i','u','y'}) - 1; 
+0

Почему вы увеличиваете eCount на всех письмах, а не только на e? –

+0

:) Ошибка копирования-вставки. Вы абсолютно правы. –

+0

О, ничего себе, в значительной степени переписал мой код из-за этого. Выглядит намного чище и, учитывая, что эта глава была посвящена манипулированию струнами, оказалась весьма полезной. Это было потрясающе, потому что я не думал о копировании строки в новую переменную, чтобы я мог преобразовать в нижний регистр, чтобы лучше было подсчитывать как гласные, так и верхние и нижние. Огромное спасибо. – Trido

1

Что-то вроде этого (псевдокод, не фактический C#)?

foreach (c in mySentence) 
{ 
    c = LowerCase(c); 
    switch (c) { 
    case 'a' : 
    case 'e' : 
    case 'i' : 
    case 'o' : 
    case 'u' : 
     nVowels ++; 
     break; 
    case ' ' : 
    case '\t' : 
     nBlanks++; 
     break; 
    default : 
     nChars++ 
     break; 
    } 

Вот немного больше информации:

1

лично я бы сделал это с Еогеасп и массивом или гласные. Таким образом, можно легко расширить, например:

Char[] vowels = {'e', 'a', 'o', 'i', 'u', 'y'}; 
string str = Console.ReadLine(); 
string low_str = str.ToLower(); 
Console.Clear(); 
Console.WriteLine("Thank you. The sentence you entered was: \n\"{0}\"", str); 
Console.WriteLine("This sentence is {0} characters long.", str.Length); 

int vowelCount = 0; 
int eCount = 0; 

foreach (char chara in low_str) 
{ 
    foreach (char vowel in vowels) 
    if (vowel == chara) 
     vowelCount++; 
    if (chara == 'e') 
     eCount++; 
} 

Console.WriteLine("It contains {0} instances of the letter \'e\'.", eCount); 
Console.WriteLine("There are {0} vowels used.", vowelCount); 
Console.ReadLine(); 
+0

Хотя это правильный ответ на подсчет гласных в строке, он не отвечает на вопрос о том, как использовать 'switch' в подсчете. – saluce

+0

Вы совершенно правы, но я чувствую, что важно также решать другие проблемы.Учитывая, что на вопрос уже был дан ответ, я просто хотел предложить альтернативное решение. –

4

Я знаю, что это не очень хороший ответ на этот вопрос, но я не мог сопротивляться один лайнер!

inputString.ToLower().Count(s=>"aeiou".Contains(s)); //count the vowels 
Смежные вопросы