В тексте все слова заданной длины заменить указанной подстрокой, длина которой может не совпадать с длиной заменяемого слова - C#
Формулировка задачи:
В процессе изучения C# столкнулась с одной задачей. Все бы ничего, но из-за требований к ее решению не получается ничего нормального сделать.
Задание:
В тексте все слова заданной длины заменить указанной подстрокой, длина которой может не совпадать с длиной заменяемого слова.
Требования:
1) Должна создать и использовать классы Word и Sentence.
2) По возможности использовать принципы ООП.
3) Только консольное приложение.
Имею небольшое представление как это делать с одним классом, но как это на два распихать и использовать ООП - не могу понять.
Заранее спасибо)
Решение задачи: «В тексте все слова заданной длины заменить указанной подстрокой, длина которой может не совпадать с длиной заменяемого слова»
textual
Листинг программы
using System.Collections; using System.Collections.Generic; using System; using System.Linq; namespace ConsoleApplication1 { /// <summary> /// Слово /// </summary> public interface IWord : IComparable<IWord>, IComparable { /// <summary> ///[readonly] Свойство на чтение что бы получить слово /// </summary> String GetWord { get; } /// <summary> ///[readonly] Возвращает длину слова /// </summary> Int32 Lenght { get; } String ToString(); } public interface ISentence : IEnumerable<IWord> { /// <summary> ///[readonly] Возвращает разделитель слов /// </summary> Char Separator { get; } /// <summary> ///[readonly] Возвращает колличество слов /// </summary> Int32 Count { get; } String ToString(); /// <summary> /// Производит замену одного слова на другое /// </summary> /// <param name="what">Какое слово</param> /// <param name="then">Чем меняем</param> /// <returns>Новое предложение</returns> Sentence Replace(Word what, Word then); /// <summary> /// Производит замену слова по длине на другое /// </summary> /// <param name="wordLenght">Длинна меняемых слов</param> /// <param name="then">Чем меняем</param> /// <returns>Новое предложение</returns> Sentence Replace(Int32 wordLenght, IWord then); } /// <summary> /// Слово /// </summary> public class Word : IWord // IComparable<Word>,IComparable можно сравнивать компоратором один объект типа слова с другим { /// <summary> /// Слово, доступно только в нутри класса, и не изменяемое после инициализации объекта /// </summary> private readonly String _word; /// <summary> /// Длинна слова /// </summary> private readonly Int32 _lenght; /// <summary> ///[readonly] Свойство на чтение что бы получить слово /// </summary> public String GetWord { get { return _word; } } /// <summary> /// Конструктор принимающие слово /// </summary> /// <param name="word"></param> public Word(String word) { _word = word; _lenght = word.Length; } /// <summary> ///[readonly] Возвращает длину слова /// </summary> public Int32 Lenght { get { return _lenght; } } public override String ToString() { return _word; } #region Реализация IComparable<Word>, IComparable /// <summary> /// Компаратор /// </summary> /// <param name="other">Объект с которым сравниваем</param> /// <returns>-1 0 1</returns> public Int32 CompareTo(IWord other) { return _lenght == other.Lenght ? String.Compare(other.GetWord, _word, StringComparison.Ordinal) : other.Lenght.CompareTo(_lenght); } public Int32 CompareTo(object obj) { if (obj is Word) { return CompareTo(obj as Word); } throw new ArgumentException("Некорректный тип аргумента, сравнение недопустимо!"); } #endregion } /// <summary> /// Предложение /// </summary> public class Sentence : ISentence { /// <summary> /// Слова в предложении /// </summary> private readonly IList<IWord> _wordList; /// <summary> ///[readonly] Возвращает разделитель слов /// </summary> public Char Separator { get { return _separator; } } /// <summary> ///[readonly] Возвращает колличество слов /// </summary> public Int32 Count { get { return _wordList.Count; } } /// <summary> ///[readonly] разделитель слов в предложении /// </summary> private readonly Char _separator; /// <summary> /// Конструктор инициализируется строчкой слова разделяются указанным разделителем по умолчанию это пробел /// </summary> /// <param name="sentence">Строчка предложение</param> /// <param name="separator">Разделитель слов в предложении</param> public Sentence(String sentence, Char separator = ' ') { _wordList = new List<IWord>(); _separator = separator; foreach (var item in sentence.Split(separator)) _wordList.Add(new Word(item)); } /// <summary> /// Конструктор инициализируется любой коллекцией Слов (в том числе массивом) /// </summary> /// <param name="collection">Коллекция Слов</param> /// <param name="separator">Разделитель по умолчанию пробел</param> public Sentence(IEnumerable<IWord> collection, Char separator = ' ') { _wordList = new List<IWord>(); _separator = separator; foreach (var item in collection) _wordList.Add(item); } public override String ToString() { return _wordList.Aggregate("", (current, item) => current + item.GetWord + _separator); } /// <summary> /// Производит замену одного слова на другое /// </summary> /// <param name="what">Какое слово</param> /// <param name="then">Чем меняем</param> /// <returns>Новое предложение</returns> public Sentence Replace(Word what, Word then) { var temp = this.Select(item => what.CompareTo(item) == 0 ? then : item); return new Sentence(temp, _separator); } /// <summary> /// Производит замену слова по длине на другое /// </summary> /// <param name="wordLenght">Длинна меняемых слов</param> /// <param name="then">Чем меняем</param> /// <returns>Новое предложение</returns> public Sentence Replace(Int32 wordLenght, IWord then) { var temp = this.Select(item => wordLenght == item.Lenght ? then : item); return new Sentence(temp, _separator); } #region Реализация IEnumerable для поддержки foreach IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator<IWord> GetEnumerator() { return _wordList.GetEnumerator(); } #endregion } public class Program { private static void Main(string[] args) { Console.WriteLine("Input sentence, separator space: "); var inputText = Console.ReadLine(); Int32 length; do { Console.WriteLine("Input length: "); } while (!Int32.TryParse(Console.ReadLine(), out length)); Console.WriteLine("Input new world: "); IWord world = new Word(Console.ReadLine()); ISentence sentence = new Sentence(inputText); Console.WriteLine("The original text.: "); Console.WriteLine(sentence.ToString()); Console.WriteLine("The modificated text.: "); Console.WriteLine(sentence.Replace(length, world).ToString()); Console.ReadLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д