示例#1
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            var dict = new Dictionary <char, LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (stream.IsEof)
                {
                    continue;
                }

                if (IsRussianLetter(c))
                {
                    if (dict.ContainsKey(c))
                    {
                        var item = dict[c];
                        item.Count++;
                        dict[c] = item;
                    }
                    else
                    {
                        var newItem = new LetterStats {
                            Count = 1, Letter = c.ToString()
                        };
                        dict.Add(c, newItem);
                    }
                }
            }

            return(dict.Values.ToList());
        }
示例#2
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            List <LetterStats> rez = new List <LetterStats>();

            stream.ResetPositionToStart();
            char old = '\0';

            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();

                if (c.ToString().ToLower() == old.ToString().ToLower())
                {
                    var ls = new LetterStats()
                    {
                        Count  = 1,
                        Letter = old.ToString().ToLower() + c.ToString().ToLower(),
                    };
                    var item = rez.Find(x => x.Letter == ls.Letter);
                    if (item == null)
                    {
                        rez.Add(ls);
                    }
                    else
                    {
                        IncStatistic(item);
                    }
                }
                old = c;
            }
            return(rez);
        }
示例#3
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            List <LetterStats> rez = new List <LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char c  = stream.ReadNextChar();
                var  ls = new LetterStats()
                {
                    Letter = c.ToString(),
                    Count  = 1
                };
                var item = rez.Find(x => x.Letter == ls.Letter);
                if (item == null)
                {
                    rez.Add(ls);
                }
                else
                {
                    IncStatistic(item);
                }
            }
            return(rez);
        }
示例#4
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            var statsList = new List <LetterStats>();

            stream.ResetPositionToStart();

            string prev = stream.ReadNextChar().ToString().ToLower();

            while (!stream.IsEof)
            {
                string next = stream.ReadNextChar().ToString().ToLower();

                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - НЕ регистрозависимый.

                if (prev != next)
                {
                    prev = next;
                    continue;
                }

                string pair = string.Concat(next, prev);

                if (!statsList.Exists(item => item.Letter == pair))
                {
                    var stats = new LetterStats(pair);
                    statsList.Add(stats);
                }

                IncStatistic(statsList.Find(item => item.Letter == pair));
            }

            return(statsList);
        }
示例#5
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            IList <LetterStats> letterStateList = new List <LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (!Char.IsLetter(c))
                {
                    continue;
                }

                string letter = new String(c, 1);
                if (letter == " ")
                {
                    continue;
                }

                var letterState = letterStateList.FirstOrDefault(o => o.Letter == letter);
                if (letterState == null)
                {
                    letterState = new LetterStats(letter);

                    letterStateList.Add(letterState);
                }

                IncStatistic(letterState);
            }

            return(letterStateList);
        }
示例#6
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();
            List <LetterStats> stats = new List <LetterStats>();

            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (char.IsLetter(c))
                {
                    string letter = c.ToString();
                    var    index  = stats.FindIndex(x => string.Compare(x.Letter, letter) == 0);
                    if (index == -1)
                    {
                        var stat = new LetterStats
                        {
                            Letter = letter,
                            Count  = 1
                        };
                        stats.Add(stat);
                    }
                    else
                    {
                        var stat = stats[index];
                        IncStatistic(ref stat);
                        stats[index] = stat;
                    }
                }
            }

            return(stats);
        }
示例#7
0
        private static IList <LetterStats> FillLetterStatsDouble(ReadOnlyStream stream)
        {
            List <LetterStats> lstats = new List <LetterStats>();
            LetterStats        nx     = new LetterStats
            {
                Letter = "",
                Count  = 1
            };

            var sr = new StreamReader(stream.fstream);

            // stream.ResetPositionToStart();
            //StreamReader sr = new StreamReader(streamex._localStream);
            // while (!stream.IsEof)
            while (sr.Peek() > 0)
            {
                //   char c = stream.ReadNextChar();
                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый.
                var buff = ((char)sr.Read()).ToString();
                if ((buff == nx.Letter) && char.IsLetter(Convert.ToChar(buff)))
                {
                    lstats.Add(nx);
                }

                nx.Count  = 1;
                nx.Letter = buff;
                //Console.WriteLine(nx.Letter);
                //if (char.IsLetter(Convert.ToChar(buff)))
            }

            return(lstats);
        }
示例#8
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();
            IList <LetterStats> letterStats = new List <LetterStats>();

            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (char.IsLetter(c))
                {
                    var ls = new LetterStats {
                        Letter = c.ToString()
                    };
                    if (letterStats.Contains(ls))
                    {
                        IncStatistic(letterStats[letterStats.IndexOf(ls)]);
                    }
                    else
                    {
                        letterStats.Add(new LetterStats {
                            Letter = c.ToString(), Count = 1
                        });
                    }
                }
            }
            return(letterStats);
        }
示例#9
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            using (stream)
            {
                stream.ResetPositionToStart();

                List <LetterStats> result = new List <LetterStats>();

                while (!stream.IsEof)
                {
                    char c = stream.ReadNextChar();

                    // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый.
                    LetterStats stat = result.Find(x => x.Letter == c.ToString());

                    if (stat == null)
                    {
                        stat = new LetterStats(c.ToString());
                        result.Add(stat);
                    }

                    IncStatistic(stat);
                }

                return(result);
            }
        }
示例#10
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();
            IList <LetterStats> answer = new List <LetterStats>();

            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (!char.IsLetter(c))
                {
                    continue;
                }
                int i;
                for (i = 0; i < answer.Count; i++)
                {
                    if (answer[i].Letter[0] == c)
                    {
                        answer[i] = IncStatistic(answer[i]);
                        break;
                    }
                }

                if (i == answer.Count)
                {
                    var newStruct = new LetterStats();
                    newStruct.Letter = c.ToString();
                    newStruct.Count  = 1;
                    answer.Add(newStruct);
                }
            }

            return(answer);
        }
        protected sealed override void FillStatistics()
        {
            using (stream)
            {
                var prevChar = new char();
                while (!stream.IsEof)
                {
                    var c = stream.ReadNextChar();
                    if (char.ToUpperInvariant(c) == char.ToUpperInvariant(prevChar))
                    {
                        var letter = new string(new[] { c, prevChar });

                        if (statistics.Any(x =>
                                           string.Equals(x.Letter, letter, StringComparison.CurrentCultureIgnoreCase)))
                        {
                            var letterStats = statistics.FirstOrDefault(x =>
                                                                        string.Equals(x.Letter, letter, StringComparison.CurrentCultureIgnoreCase));
                            letterStats?.IncStatistic();
                        }
                        else
                        {
                            var letterStats = new LetterStats(letter);
                            statistics.Add(letterStats);
                        }
                    }

                    prevChar = c;
                }
            }
        }
示例#12
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            List <LetterStats> list = new List <LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (char.IsLetter(c))
                {
                    int index = list.FindIndex(x => x.Letter == c.ToString());
                    if (index == -1)
                    {
                        list.Add(new LetterStats {
                            Letter = c.ToString(), Count = 1
                        });
                    }
                    else
                    {
                        LetterStats stats = list[index];

                        // заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый.
                        IncStatistic(ref stats);
                        list[index] = stats;
                    }
                }
            }
            return(list);
        }
示例#13
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            IList <LetterStats> result = new List <LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char charCurrent = stream.ReadNextChar();

                //если символ не является буквой перейти к следующему
                if (!char.IsLetter(charCurrent))
                {
                    continue;
                }

                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый.
                LetterStats row = result.SingleOrDefault(item => item.Letter == charCurrent.ToString());

                if (row != null)
                {
                    IncStatistic(row);
                }
                else
                {
                    result.Add(new LetterStats {
                        Letter = charCurrent.ToString(), Count = 1
                    });
                }
            }

            return(result);
        }
示例#14
0
 public static CharType DetectType(LetterStats LetterStats)
 {
     if (Vowels.Contains(LetterStats.Letter.ToLower()))
     {
         return(CharType.Vowel);
     }
     else
     {
         return(CharType.Consonants);
     }
 }
示例#15
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            //Список букв
            IList <LetterStats> doubleLetters = new List <LetterStats>();

            stream.ResetPositionToStart();

            //Предыдущая буква
            char cBack = stream.ReadNextChar();

            while (!stream.IsEof)
            {
                //Перебор по символам
                char c = stream.ReadNextChar();

                //Буквы в верхнем регистре, предыдущая и текущая буквы
                char upperLetterC     = char.ToUpper(c);
                char upperLetterCBack = char.ToUpper(cBack);

                //Если входит в набор
                if (Regex.IsMatch(cBack.ToString(), "[а-яА-Я]") && Regex.IsMatch(c.ToString(), "[а-яА-Я]"))
                {
                    if (upperLetterCBack == upperLetterC)
                    {
                        int count = 0;
                        //Проходимся по списку, если имеется уже такая буква, то увеличиваем
                        //Если нет, то добавляем в список букву с количеством 1
                        foreach (LetterStats item in doubleLetters)
                        {
                            if (char.ToUpper(item.Letter[0]) == upperLetterCBack)
                            {
                                LetterStats copyLetter = doubleLetters[count];
                                IncStatistic(ref copyLetter);
                                doubleLetters[count] = copyLetter;
                                c = default;
                                break;
                            }
                            count++;
                        }
                        if (c != default)
                        {
                            doubleLetters.Add(new LetterStats()
                            {
                                Letter = upperLetterCBack + upperLetterC.ToString(), Count = 1
                            });
                        }
                    }
                }
                cBack = c;
                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - НЕ регистрозависимый.
            }
            return(doubleLetters);
            //throw new NotImplementedException();
        }
示例#16
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            List <LetterStats> stats = new List <LetterStats>();

            stream.ResetPositionToStart();
            char firstLetter       = '\0';
            bool firstLetterReaded = false;

            while (!stream.IsEof)
            {
                if (!firstLetterReaded)
                {
                    firstLetter = char.ToUpper(stream.ReadNextChar());
                }
                if (stream.IsEof)
                {
                    break;
                }
                char secondLetter = char.ToUpper(stream.ReadNextChar());
                if (char.IsLetter(firstLetter) && char.IsLetter(secondLetter) && firstLetter == secondLetter)
                {
                    firstLetterReaded = false;
                    var pair  = firstLetter.ToString() + secondLetter;
                    var index = stats.FindIndex(x => string.Compare(x.Letter, pair) == 0);
                    if (index == -1)
                    {
                        var stat = new LetterStats
                        {
                            Letter = pair,
                            Count  = 1
                        };
                        stats.Add(stat);
                    }
                    else
                    {
                        var stat = stats[index];
                        IncStatistic(ref stat);
                        stats[index] = stat;
                    }
                }
                else
                {
                    if (char.IsLetter(secondLetter))
                    {
                        firstLetterReaded = true;
                        firstLetter       = secondLetter;
                    }
                }
            }

            return(stats);
        }
示例#17
0
        /// <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);
        }
示例#18
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static LetterStats FillSingleLetterStats(IReadOnlyStream stream)
        {
            LetterStats letterStats = new LetterStats();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                if (char.IsLetter(c))
                {
                    letterStats.AddElement(c.ToString());
                }
            }
            return(letterStats);
        }
示例#19
0
        /// <summary>
        /// Программа принимает на входе 2 пути до файлов.
        /// Анализирует в первом файле кол-во вхождений каждой буквы (регистрозависимо). Например А, б, Б, Г и т.д.
        /// Анализирует во втором файле кол-во вхождений парных букв (не регистрозависимо). Например АА, Оо, еЕ, тт и т.д.
        /// По окончанию работы - выводит данную статистику на экран.
        /// </summary>
        /// <param name="args">Первый параметр - путь до первого файла.
        /// Второй параметр - путь до второго файла.</param>
        static void Main(string[] args)
        {
            IReadOnlyStream inputStream1 = GetInputStream(args[0]);
            IReadOnlyStream inputStream2 = GetInputStream(args[1]);

            LetterStats singleLetterStats = FillSingleLetterStats(inputStream1);
            LetterStats doubleLetterStats = FillDoubleLetterStats(inputStream2);

            singleLetterStats.RemoveCharStatsByType(CharType.Vowel);
            doubleLetterStats.RemoveCharStatsByType(CharType.Consonants);

            PrintStatistic(singleLetterStats);
            PrintStatistic(doubleLetterStats);

            Console.ReadKey();
        }
示例#20
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();
            var accumulator            = new List <char>();
            IList <LetterStats> answer = new List <LetterStats>();
            var accPosition            = 0;

            while (!stream.IsEof)
            {
                while (accPosition < 2)
                {
                    accumulator.Add(stream.ReadNextChar());
                    accPosition++;
                }

                var leftChar  = Char.ToLower(accumulator[0]);
                var rightChar = Char.ToLower(accumulator[1]);

                if (leftChar.Equals(rightChar))
                {
                    int i;
                    for (i = 0; i < answer.Count; i++)
                    {
                        if (answer[i].Letter == leftChar.ToString() + rightChar)
                        {
                            answer[i] = IncStatistic(answer[i]);
                            break;
                        }
                    }

                    if (i == answer.Count)
                    {
                        var newStruct = new LetterStats
                        {
                            Letter = leftChar.ToString() + rightChar, Count = 1
                        };
                        answer.Add(newStruct);
                    }
                }

                accumulator.RemoveAt(0);
                accPosition--;
            }

            return(answer);
        }
示例#21
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();

            //Список букв
            IList <LetterStats> singleLetters = new List <LetterStats>();

            while (!stream.IsEof)
            {
                //Перебор по символам
                char c = stream.ReadNextChar();

                //Если входит в набор
                if (Regex.IsMatch(c.ToString(), "[а-яА-Я]"))
                {
                    int count = 0;
                    //Проходимся по списку, если имеется уже такая буква, то увеличиваем
                    //Если нет, то добавляем в список букву с количеством 1
                    foreach (LetterStats item in singleLetters)
                    {
                        if (item.Letter == c.ToString())
                        {
                            LetterStats copyLetter = singleLetters[count];
                            IncStatistic(ref copyLetter);
                            singleLetters[count] = copyLetter;
                            c = default;
                            break;
                        }
                        count++;
                    }
                    if (c != default)
                    {
                        singleLetters.Add(new LetterStats()
                        {
                            Letter = c.ToString(), Count = 1
                        });
                    }
                }
                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый.
            }
            return(singleLetters);
            //throw new NotImplementedException();
        }
示例#22
0
        /// <summary>
        /// Ф-ция чтения следующего символа из потока.
        /// Если произведена попытка прочитать символ после достижения конца файла, метод
        /// должен бросать соответствующее исключение
        /// </summary>
        /// <returns>Считанный символ.</returns>
        public char ReadNextChar()
        {
            // TODO : Необходимо считать очередной символ из _localStream
            // throw new NotImplementedException();
            LetterStats nx = new LetterStats();
            // nx.Letter= this._localStream
            StreamReader sr = new StreamReader(_localStream);

            //  while (sr.Peek() >= 0)


            // nx.Letter = (string)sr.Read();

            // int        Console.Write((char)sr.Read()); f = sr.Read()
            //Console.Write((char)sr.Peek());
            Console.Write((char)sr.Peek());
            //Console.Write(555);


            //IsEof = true;
            return((char)sr.Peek());
        }
示例#23
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();
            IList <LetterStats> letterStats = new List <LetterStats>();
            char prevChar = '\0';

            while (!stream.IsEof)
            {
                char c = char.ToLower(stream.ReadNextChar());
                if (char.IsLetter(c))
                {
                    if (c == prevChar)
                    {
                        string doubleLetter = c.ToString() + c.ToString();
                        var    ls           = new LetterStats {
                            Letter = doubleLetter
                        };
                        if (letterStats.Contains(ls))
                        {
                            IncStatistic(letterStats[letterStats.IndexOf(ls)]);
                        }
                        else
                        {
                            letterStats.Add(new LetterStats {
                                Letter = doubleLetter, Count = 1
                            });
                        }
                        // Один и тот же символ не будем учитывать дважды (в условии не было оговорено)
                        // Если для строки "aaa" нужно получить { аа : 2 }, то закомментировать следующую строку
                        prevChar = '\0';
                    }
                    else
                    {
                        prevChar = c;
                    }
                }
            }
            return(letterStats);
        }
示例#24
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения каждой буквы.
        /// Статистика РЕГИСТРОЗАВИСИМАЯ!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
        {
            var statsList = new List <LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char c = stream.ReadNextChar();
                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - регистрозависимый.

                if (!statsList.Exists(item => item.Letter == c.ToString()))
                {
                    LetterStats letterStats = new LetterStats(c.ToString());

                    statsList.Add(letterStats);
                }

                IncStatistic(statsList.Find(item => item.Letter == c.ToString()));
            }

            return(statsList);
        }
示例#25
0
        /// <summary>
        /// Ф-ция перебирает все найденные буквы/парные буквы, содержащие в себе только гласные или согласные буквы.
        /// (Тип букв для перебора определяется параметром charType)
        /// Все найденные буквы/пары соответствующие параметру поиска - удаляются из переданной коллекции статистик.
        /// </summary>
        /// <param name="letters">Коллекция со статистиками вхождения букв/пар.</param>
        /// <param name="charType">Тип букв для анализа</param>
        private static IList <LetterStats> RemoveCharStatsByType(IList <LetterStats> letters, CharType charType)
        {
            List <LetterStats> PatStats          = new List <LetterStats>();
            LetterStats        LetterPatStats    = new LetterStats();
            string             PatternVowel      = "[АаЕеЁёИиОоУуЫыЭэЮюЯя]";
            string             patternConsonants = "[БбВвГгДдЖжЗзЙйКкЛлМмНнПпРрСсТтФфХхЦцЧчШшЩщ]";
            string             str = string.Empty;

            // TODO : Удалить статистику по запрошенному типу букв.
            switch (charType)
            {
            case CharType.Consonants:
                foreach (var item in letters.ToList().Distinct())
                {
                    str = Regex.Replace(item.Letter, patternConsonants, "");
                    if (str.Length > 0)
                    {
                        LetterPatStats.Letter = str;
                        LetterPatStats.Count  = item.Count;
                        PatStats.Add(LetterPatStats);
                    }
                }
                break;

            case CharType.Vowel:
                foreach (var item in letters.ToList().Distinct())
                {
                    str = Regex.Replace(item.Letter, PatternVowel, "");
                    if (str.Length > 0)
                    {
                        LetterPatStats.Letter = str;
                        LetterPatStats.Count  = item.Count;
                        PatStats.Add(LetterPatStats);
                    }
                }
                break;
            }
            return(PatStats);
        }
示例#26
0
        /// <summary>
        /// Ф-ция перебирает все найденные буквы/парные буквы, содержащие в себе только гласные или согласные буквы.
        /// (Тип букв для перебора определяется параметром charType)
        /// Все найденные буквы/пары соответствующие параметру поиска - удаляются из переданной коллекции статистик.
        /// </summary>
        /// <param name="letters">Коллекция со статистиками вхождения букв/пар</param>
        /// <param name="charType">Тип букв для анализа</param>
        private static IList <LetterStats> RemoveCharStatsByType(IList <LetterStats> letters, CharType charType)
        {
            IList <LetterStats> result = new List <LetterStats>();

            char[] gx = new char[55];


            IList <LetterStats> resultnot = letters;

            // TODO : Удалить статистику по запрошенному типу букв.
            switch (charType)
            {
            case CharType.Consonants:
                gx = "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz".ToCharArray();
                break;

            case CharType.Vowel:
                gx = "AEIOUYaeiou".ToCharArray();
                break;
            }

            var gg = gx.ToString();


            foreach (char bukva in gx)

            {
                LetterStats bb1 = resultnot.Where(t => t.Letter == bukva.ToString()).FirstOrDefault();

                if (resultnot.Contains(bb1))

                {
                    resultnot = resultnot.Where(t => t.Letter != bb1.Letter).ToList();
                }
            }

            return(resultnot);
        }
示例#27
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            stream.ResetPositionToStart();
            var    letterstats = new List <LetterStats>();
            string c;

            if (!stream.IsEof)
            {
                c = stream.ReadNextChar().ToString();
            }
            else
            {
                return(letterstats);
            }
            while (!stream.IsEof)
            {
                string cnext = stream.ReadNextChar().ToString();
                if (c.ToLower() == cnext.ToLower())
                {
                    Console.WriteLine($"{c} {cnext}");
                    LetterStats ls = letterstats.FirstOrDefault(x => x.Letter.ToLower() == (c + cnext).ToLower());
                    if (ls == null)
                    {
                        letterstats.Add(new LetterStats()
                        {
                            Letter = (c + cnext), Count = 1
                        });
                    }
                    else
                    {
                        IncStatistic(ls);
                    }
                }
                c = cnext;
                // TODO : DONE заполнять статистику с использованием метода IncStatistic. Учёт букв - НЕ регистрозависимый.
            }
            return(letterstats);
        }
示例#28
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            // по реализованной мною логике последовательность вида ААА - будет считаться за две пары
            var dict = new Dictionary <char, LetterStats>();

            stream.ResetPositionToStart();
            char?prevChar = null;

            while (!stream.IsEof)
            {
                char c = Char.ToUpper(stream.ReadNextChar());
                if (stream.IsEof)
                {
                    continue;
                }

                if (IsRussianLetter(c) && prevChar == c)
                {
                    if (dict.ContainsKey(c))
                    {
                        var item = dict[c];
                        item.Count++;
                        dict[c] = item;
                    }
                    else
                    {
                        var newItem = new LetterStats {
                            Count = 1, Letter = c.ToString()
                        };
                        dict.Add(c, newItem);
                    }
                }

                prevChar = c;
            }

            return(dict.Values.ToList());
        }
示例#29
0
        protected sealed override void FillStatistics()
        {
            using (stream)
            {
                while (!stream.IsEof)
                {
                    var c = stream.ReadNextChar();

                    var letter = c.ToString();

                    if (statistics.Any(x => x.Letter == letter))
                    {
                        var letterStats = statistics.FirstOrDefault(x => x.Letter == letter);
                        letterStats?.IncStatistic();
                    }
                    else
                    {
                        var letterStats = new LetterStats(letter);
                        statistics.Add(letterStats);
                    }
                }
            }
        }
示例#30
0
        /// <summary>
        /// Ф-ция считывающая из входящего потока все буквы, и возвращающая коллекцию статистик вхождения парных букв.
        /// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
        /// Статистика - НЕ регистрозависимая!
        /// </summary>
        /// <param name="stream">Стрим для считывания символов для последующего анализа</param>
        /// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
        private static IList <LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
        {
            IList <LetterStats> result = new List <LetterStats>();

            stream.ResetPositionToStart();
            while (!stream.IsEof)
            {
                char charCurrent = char.ToUpper(stream.ReadNextChar());

                // TODO : заполнять статистику с использованием метода IncStatistic. Учёт букв - НЕ регистрозависимый.
                char charNext = char.ToUpper(stream.GetNextChar());

                //если один из символов не является буквой перейти к следующему
                if (!(char.IsLetter(charCurrent) && char.IsLetter(charNext)))
                {
                    continue;
                }

                if (charCurrent == charNext)
                {
                    LetterStats row = result.SingleOrDefault(item => item.Letter == $"{charCurrent}{charNext}");

                    if (row != null)
                    {
                        IncStatistic(row);
                    }
                    else
                    {
                        result.Add(new LetterStats {
                            Letter = $"{charCurrent}{charNext}", Count = 1
                        });
                    }
                }
            }

            return(result);
        }