Для каждого слова заданного текста указать долю согласных. Определить слово, в котором доля согласных максимальна

140
23 сентября 2021, 04:00

Для каждого слова заданного текста указать долю согласных. Определить слово, в котором доля согласных максимальна. При этом действия осуществлять только с массивами типа 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();
    }
}

}

Разбиваю предложение на слова и нахожу самое длинное слово, необходимо для каждого слова найти долю согласных. Определить слово, в котором доля согласных максимальна.

Answer 1

Сначала сплитишь предложение, чтобы разбить его на массив слов:

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);
Answer 2
    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

READ ALSO
Изменение надписи по нажатию на кнопкe

Изменение надписи по нажатию на кнопкe

Нужно сделать так, чтобы щелчок по второй кнопке удалял надпись привет, и отображал новую другого цвета, например "Пока !"

117
C# graphics рисование на picturebox

C# graphics рисование на picturebox

Как правильно организовать аналог requestAnimationFrame (из js) в c# win forms? Как использовать больше ресурсов, чтобы ускорить отрисовку? Хотелось бы услышать...

129
Зачем в LINQ нужна лишняя запись?

Зачем в LINQ нужна лишняя запись?

Есть два одинаковых LINQ-запросаНепонятно, зачем в первом запросе прописывать q => q

105
Как запретить открывать страницу в новом окне DotNetBrowser?

Как запретить открывать страницу в новом окне DotNetBrowser?

при некоторых кликах - открывается новое окно с дефолтными настройками, а не такими как в родительском окне, так же непонятно как управлять...

141