Для каждого слова заданного текста указать долю согласных. Определить слово, в котором доля согласных максимальна. При этом действия осуществлять только с массивами типа char.
Код класса:
class SentensesFromCharArray
{
char[] text;
public SentensesFromCharArray(char[] text)
{
this.text = text;
}
public SentensesFromCharArray()
{
Console.WriteLine("Введите текст");
this.text = Console.ReadLine().ToCharArray();
}
public char[][] GetWords()
{
var countWord = text.Count(x => IsMySeparator(x));
var words = new char[countWord][];
int start = 0, finish = 0, indexword = 0;
while (start < text.Length)
{
finish = Array.FindIndex(text, start, x => IsMySeparator(x));
if (finish > start + 1)
{
words[indexword] = new char[finish - start];
Array.Copy(text, start, words[indexword], 0, finish - start);
indexword++;
}
start = finish + 1;
}
Array.Resize(ref words, indexword);
return words;
}
public char[] MaxLengthWord()
{
var words = GetWords();
return words.Where(x => x.Length == words.Max(y => y.Length)).First();
}
private bool IsMySeparator(char x)
{
return char.IsWhiteSpace(x) || char.IsPunctuation(x);
}
}}
Код программы:
class Program
{
static void Main(string[] args)
{
SentensesFromCharArray sent = new SentensesFromCharArray("privet kak dela.".ToCharArray());
Console.WriteLine("Слова в тексте");
foreach (var item in sent.GetWords())
{
Console.WriteLine(item);
}
Console.WriteLine(sent.GetWords());
Console.WriteLine("Самое длинное слово");
Console.WriteLine(sent.MaxLengthWord());
Console.ReadKey();
}
}
}
Разбиваю предложение на слова и нахожу самое длинное слово, необходимо для каждого слова найти долю согласных. Определить слово, в котором доля согласных максимальна.
Сначала сплитишь предложение, чтобы разбить его на массив слов:
string[] words = text.Split(new char[] { ' ' });
Затем с помощью регулярных выражений находим в каждом слове согласные буквы и выводим долю и слово, содержащее самое большое количество согласных:
string searchWord = null;
double maxPercentage = 0.0;
Regex regex = new Regex(@"[^аяоуиыеёюэ]"); // для английских - [^aeiou]
foreach(string word in words)
{
int consonantCount = 0;
double percentage = 0.0;
MatchCollection matches = regex.Matches(word);
if (matches.Count > 0)
{
foreach (Match match in matches)
{
consonantCount++;
}
}
else
{
Console.WriteLine("Совпадений не найдено");
}
percentage = (double)consonantCount / word.Length;
Console.WriteLine("Доля согласных в слове: " + percentage);
if(maxPercentage < percentage)
{
maxPercentage = percentage;
searchWord = word;
}
}
Console.WriteLine("Самая большая доля согласных в слове: "+searchWord);
public static void ConsonantsCount (string text)
{
string[] words = text.Split(' ');
var searchWord = string.Empty;
var maxPercentage = 0.0f;
foreach(string word in words)
{
var matches = Regex.Matches(word, @"[^аяоуиыеёюэ]");
var percentage = (float)matches.Count / word.Length * 100;
Console.WriteLine($"Доля согласных в слове \"{word}\": {percentage}%");
if(maxPercentage < percentage)
{
maxPercentage = percentage;
searchWord = word;
}
}
Console.WriteLine($"Самая большая доля согласных в слове \"{searchWord}\" и в нем {maxPercentage}% согласных");
}
вызываем:
ConsonantsCount("Вася пил кефир в дворе у Марички.");
результат:
Доля согласных в слове "Вася": 50%
Доля согласных в слове "пил": 66.6666666666667%
Доля согласных в слове "кефир": 60%
Доля согласных в слове "в": 100%
Доля согласных в слове "дворе": 60%
Доля согласных в слове "у": 0%
Доля согласных в слове "Марички.": 62.5%
Самая большая доля согласных в слове "в" и в нем 100% согласных
Если хочется решение именно через массив чаров - можешь matches заджоинить в один стринг и потом сделать ToCharArray() но это беcсмысленно. потому что результат будет тем же, но сделаешь лишние действия. Так что я бы оставил как есть... А если спросят почему так - можно выкрутится что это лишнее) Или что там хоть и результат Matches стринговый, но при этом внутри каждого стринга только лишь 1 чар что и так делает его массивом чаров.... в какой-то мере :D
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно сделать так, чтобы щелчок по второй кнопке удалял надпись привет, и отображал новую другого цвета, например "Пока !"
Как правильно организовать аналог requestAnimationFrame (из js) в c# win forms? Как использовать больше ресурсов, чтобы ускорить отрисовку? Хотелось бы услышать...
Есть два одинаковых LINQ-запросаНепонятно, зачем в первом запросе прописывать q => q
при некоторых кликах - открывается новое окно с дефолтными настройками, а не такими как в родительском окне, так же непонятно как управлять...