/// <summary> /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв. /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д. /// Статистика - НЕ регистрозависимая! /// </summary> /// <param name="stream">Стрим для считывания символов для последующего анализа</param> /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns> private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream) { List <LetterStats> stats = new List <LetterStats>(); LetterStats ReadChar = new LetterStats(); foreach (string item in (stream as ReadOnlyStream).FindPairLetter()) { ReadChar.Letter = item; ReadChar.Count = (stream as ReadOnlyStream).NumberOfOccurrences(item); stats.Add(ReadChar); } stream.Dispose(); return(stats); }
/// <summary> /// Программа принимает на входе 2 пути до файлов. /// Анализирует в первом файле кол-во вхождений каждой буквы (регистрозависимо). Например А, б, Б, Г и т.д. /// Анализирует во втором файле кол-во вхождений парных букв (не регистрозависимо). Например АА, Оо, еЕ, тт и т.д. /// По окончанию работы - выводит данную статистику на экран. /// </summary> /// <param name="args">Первый параметр - путь до первого файла. /// Второй параметр - путь до второго файла.</param> static void Main(string[] args) { try { if (!File.Exists(args[0]) | !File.Exists(args[1])) { Console.WriteLine("Одного или более файлов не существует"); Console.ReadKey(); return; } IReadOnlyStream inputStream1 = GetInputStream(args[0]); IReadOnlyStream inputStream2 = GetInputStream(args[1]); Console.WriteLine("Собираем статистику из загруженных файлов..."); IList <LetterStats> singleLetterStats = FillSingleLetterStats(inputStream1); IList <LetterStats> doubleLetterStats = FillDoubleLetterStats(inputStream2); RemoveCharStatsByType(singleLetterStats, CharType.Consonants); RemoveCharStatsByType(doubleLetterStats, CharType.Vowel); Console.WriteLine("\nСтатистика частоты вхождения буквенных символов с учётом регистра:"); PrintStatistic(singleLetterStats); Console.WriteLine("\nСтатистика частоты вхождения удвоенных букв без учёта регистра:"); PrintStatistic(doubleLetterStats); inputStream1.Dispose(); inputStream2.Dispose(); Console.ReadKey(); } catch (IndexOutOfRangeException e) { Console.WriteLine($"Неверно введены аргументы командной строки.\n{e.Message}"); Console.ReadKey(); } }
/// <summary> /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы. /// Статистика РЕГИСТРОЗАВИСИМАЯ! /// </summary> /// <param name="stream">Стрим для считывания символов для последующего анализа</param> /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns> private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream) { List <LetterStats> stats = new List <LetterStats>(); LetterStats ReadChar = new LetterStats(); while (!stream.IsEof) { char c = stream.ReadNextChar(); if (char.IsLetter(c)) { ReadChar.Letter = c.ToString(); ReadChar.Count = (stream as ReadOnlyStream).NumberOfOccurrences(c); /* TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый. * - IncStatistic - не задействовал. Логика подсчета инкапсулирована в классе ReadOnlyStream. * - Коды символов отличаются в зависимости от регистра, доп. действий не требуется. */ stats.Add(ReadChar); } } (stream as ReadOnlyStream).FindPairLetter(); // закрываем входящий поток. stream.Dispose(); return(stats); }