using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; namespace ez { class StringLine { /* Задание 9. Создать класс для работы сo строками.Разработать следующие члены класса: 1. Поле: • string line; 2. Конструктор, позволяющий создать строку на основе заданного строкового литерала. 3. Методы, позволяющие: • выводить на экран все символы строки, встречающиеся в ней ровно один раз; • вывести на экран самую длинную последовательность повторяющихся символов в строке; • подсчет количества букв, цифр и пробелов в строке. 4. Свойство, возвращающее общее количество символов в строке (доступное только для чтения); 5. Индексатор, позволяющий по индексу обращаться к соответствующему символу строки(доступный только для чтения). 6. Перегрузку: • операции унарного !: возвращает значение true, если строка не пустая, иначе false; • констант true и false: обращение к экземпляру класса дает значение true если строка является палиндромом, false – противном случае; • операции &: возвращает значение true, если строковые поля двух объектов посимвольно равны(без учета регистра), иначе false; • операции преобразования класса-строка в тип string (и наоборот). Продемонстрировать работу класса. */ private string line; public StringLine(string line)//конструктор { this.line = line; } public void Show(string line)//вывести StringLine { Console.WriteLine("Строка: " + line); } public void GetCharLength() { Console.WriteLine(string.Join(", ", line.GroupBy(c => c).Where(g => g.Count() == 1).Select(g => g.Key))); Console.WriteLine(Regex.Matches(line, @"(.)\1*").Cast().OrderByDescending(m => m.Length).First().Value); } public void GetLettersСount() { char[] ch = line.ToCharArray(); int figures = ch.Where((n) => n >= '0' && n <= '9').Count(); int space = ch.Where((n) => n >= ' ' && n <= ' ').Count(); Console.WriteLine($"Количество цифр: {figures}"); Console.WriteLine($"Количество пробелов в строке: {space}"); } public int Length { get { return line.Length; } } public char this[int i] { get { return line[i]; } } // Перегрузка бинарного оператора " ! ": возвращает значение true, если строка не пустая, иначе false public static bool operator !(StringLine zero) { if (zero.line.Length != 0) return true; return false; } // Перегрузка констант true public static bool operator true(StringLine line) { int min = 0; int max = line.Length - 1; while (true) { if (min > max) return true; char a = line[min]; char b = line[max]; if (char.ToLower(a) != char.ToLower(b)) return false; min++; max--; } } // Перегрузка констант false public static bool operator false(StringLine line) { int min = 0; int max = line.Length - 1; while (true) { if (min < max) return false; char a = line[min]; char b = line[max]; if (char.ToLower(a) == char.ToLower(b)) return true; min++; max--; } } // Перегрузка операции &: возвращает значение true, если строковые поля двух объектов public static bool operator &(StringLine A, StringLine B) { if (A.line.ToUpper() == B.line.ToUpper()) return true; else return false; } // Операции преобразования StringLine в тип string public static implicit operator string(StringLine line) { return line.line; } // Операции преобразования string в тип StringLine public static implicit operator StringLine(string line) { return new StringLine(line); } } } class Program { static void Main() { string str1 = Console.ReadLine(); StringLine s = new StringLine (str1); string str2 = Console.ReadLine(); StringLine s2 = new StringLine(str2); s.GetCharLength(); s.GetLettersСount(); Console.WriteLine("Количество символов={0}",s.Length); Console.WriteLine("[0]элемент строки={0}",s[0]); if (!s) { Console.WriteLine("Не пустая строка"); } else Console.WriteLine("Пустая строка"); Console.Write("Введите 2 строку ->"); if (s & s2) { Console.WriteLine("Два экземпляра равны"); } else Console.WriteLine("Не равны."); if (s) { Console.WriteLine("Строка является палиндромом"); } else Console.WriteLine("Не палиндром"); } }