Шаг 103.
Язык программирования C#. Начала
Работа с текстом. Примеры использования
На этом шаге мы рассмотрим несколько примеров решения задач с использованием методов работы с текстом.
Здесь мы рассмотрим несколько программ, в которых используются ранее рассмотренные методы, предназначенные для обработки текстовой информации.
Задание 1. Напишите программу со статическим методом, который выполняет сравнение текстовых строк. Текстовые строки сравниваются следующим образом: для
каждого текстового значения определяется набор разных букв, входящих в текст (при этом количество вхождений буквы в текст значения не имеет). Текстовые строки считаются равными, если они
содержат одинаковые наборы букв.
Раскрыть/скрыть решение и комментарии.
Прежде всего приведем текст программы.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr103_1
{
// Описание класса:
class MyClass
{
// Метод:
static public bool Method1(String S1, String S2)
{
// Алгоритм.
// Проверяем, есть ли символ из строки S1
// в S2. Если нет - сразу же возвращаем false
// Потом аналогично поступаем для строки S2.
// После проверки возвращаем true
foreach (char s in S1)
{
// Ищем символ s в строке S2:
if ( S2.IndexOf(s) == -1 ) // если символа нет...
return false; //... строки не равны
}
foreach (char s in S2)
{
// Ищем символ s в строке S1:
if ( S1.IndexOf(s) == -1 ) // если символа нет...
return false; //... строки не равны
}
// Для каждого символа из строки S1 нашелся
// соответствующий символ в строке S2 и наоборот
return true; // Строки равны
}
}
class Program
{
static void Main()
{
String S1 = "ммааммммааа";
String S2 = "ма";
String S3 = "Abcd";
String S4 = "dcbaAA";
if ( MyClass.Method1(S1, S2) )
Console.WriteLine("Строки \"{0}\" и \"{1}\" равны", S1, S2);
else
Console.WriteLine("Строки \"{0}\" и \"{1}\" не равны", S1, S2);
if ( MyClass.Method1(S3, S4) )
Console.WriteLine("Строки \"{0}\" и \"{1}\" равны", S3, S4);
else
Console.WriteLine("Строки \"{0}\" и \"{1}\" не равны", S3, S4);
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Реализация метода достаточно проста. Сначала берем каждый символ строки S1 и ищем ему соответствующий в строке S2, после чего эту операцию повторяем для строки S2.
Если во всех случаях поиск удачный, то считаем строки равными (возвращаем true). Если хотя бы для одного символа строки не нашлось соответствующего в другой, то дальнуйшую проверку
прекращаем и возвращаем false.
Результат работы приложения изображен на рисунке 1.
Рис.1. Результат работы приложения
Задание 2. Напишите программу с классом, у которого есть текстовое поле. Значение текстовому нолю присваивается при создании объекта класса. Также в классе должен быть
метод, позволяющий вставить подстроку в текст из текстового ноля. Аргументами методу передается подстрока для вставки в текст, а также индекс позиции, начиная с которой выполняется вставка.
Переопределить в классе метод
ToString() так, чтобы он возвращал значением текст из текстового поля.
Раскрыть/скрыть решение и комментарии.
Вот программа, решающая указанную задачу:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr103_2
{
// Класс с переопределением метода ToString():
class MyClass
{
// Текстовое поле:
private String txt;
// Конструктор:
public MyClass(String t)
{
// Присваивание значения полю:
txt = t;
}
// Метод вставки:
public void MyInsert(String t, int index) {
// Начало и конец исходной строки
String start;
String end;
if (index > txt.Length || index < 0)
{
// Ошибочный индекс. Строку не меняем
return;
}
else
{
// Разделяем строку по заданному индексу на
// начало и конец
start = txt.Substring(0, index);
end = txt.Substring(index);
}
// Собираем строку
txt = start + t + end;
}
// Переопределение метода ToString():
public override String ToString()
{
// Возврат текстового поля:
return txt;
}
}
// Класс с главным методом программы:
class Program
{
static void Main()
{
// Вставка в конец строки
String st1 = "паровоз";
MyClass A = new MyClass(st1);
A.MyInsert("ик", st1.Length);
Console.WriteLine("Строка: \"{0}\", результат вставки
в конец строки: \"{1}\"", st1, A);
// Вставка в начало строки
String st2 = "ход";
MyClass B = new MyClass(st2);
B.MyInsert("Тепло", 0);
Console.WriteLine("Строка: \"{0}\", результат вставки
в начало строки: \"{1}\"", st2, B);
// Вставка в середину строки
String st3 = "теплостанция";
MyClass C = new MyClass(st3);
C.MyInsert("электро", 5);
Console.WriteLine("Строка: \"{0}\", результат вставки
в середину строки: \n\"{1}\"", st3, C);
// Ошибка. Индекс больше длины строки
String st4 = "дом";
MyClass D = new MyClass(st4);
D.MyInsert("ик", 15);
Console.WriteLine("Строка: \"{0}\", ошибочная позиция: 15,
результат работы метода: \"{1}\"", st4, D);
// Ошибка. Индекс отрицательный
String st5 = "дом";
MyClass E = new MyClass(st5);
D.MyInsert("ик", -5);
Console.WriteLine("Строка: \"{0}\", ошибочная позиция: -5,
результат работы метода: \"{1}\"", st5, E);
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
В классе MyClass мы определили закрытое текстовое поле txt, значение которому присваивается в конструкторе класса.
Метод MyInsert() принимает два параметра: строку, которую нужно вставить, и индекс, с которого осуществляется вставка. В его реализации стачала проверяем корректность индекса
(он должен иметь значение от 0 до длины строки). Если он некорректен, то строку txt не меняем. В противном случае разделяем исходную строку по значению индекса (переменные
start и end), после чего собираем строку снова, вставляя в нее переданную в метод строку.
Переопределение метода ToString() заключается в возврате значения поля txt.
Результат работы приложения изображен на рисунке 2.
Рис.2. Результат работы приложения
Задание 3. Напишите программу с классом, у которого есть поле, являющееся ссылкой на целочисленный массив. При создании объекта массив заполняется случайными
числами. Переопределите в классе метод
ToString() так, чтобы метод возвращал текстовую строку со значениями элементов массива. Также строка должна содержать информацию о
количестве элементов массива и среднем значении для элементов массива (сумма значений элементов, деленная на количество элементов).
Раскрыть/скрыть решение и комментарии.
Программа, решающая эту задачу, приведена ниже:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr103_3
{
// Класс с переопределением метода ToString():
class MyClass
{
// Ссылка на массив:
private int[] mas;
// Конструктор:
public MyClass()
{
// Объект для генерирования случайных чисел:
Random rnd = new Random();
// Размерность массива
// (случайное число от 1 до 20)
int size = 1 + rnd.Next(20);
// Создание массива
mas = new int [size];
// Заполнение массива случайными числами
for (int k = 0; k < mas.Length; k++)
{
// Значение элемента массива:
// Случайное число от -50 до 50
mas[k] = -50 + rnd.Next(101);
}
}
// Переопределение метода ToString():
public override String ToString()
{
// Строка с числами массива:
String txt = "";
// Сумма элементов массива:
int sum = 0;
for (int k = 0; k < mas.Length; k++)
{
sum += mas[k];
txt += (mas[k] + " ");
}
// Добавляем количество элементов и
// среднее значение
txt = txt + "\nКоличество элементов: " + mas.Length;
txt = txt + "\nСреднее значение: " + ((double)sum / mas.Length);
// Возврат текстового поля:
return txt;
}
}
// Класс с главным методом программы:
class Program
{
static void Main()
{
// Создание объекта
MyClass A = new MyClass();
Console.WriteLine("Объект A: {0}", A);
// Еще один объект
MyClass B = new MyClass();
Console.WriteLine("\nОбъект B: {0}", B);
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
В классе MyClass() определена ссылка на целочисленный массив mas.
Начнем с содержания конструктора класса MyClass(). Здесь создается объект rnd, который будем использовать для генерации случайных чисел. Однако сначала определим количество
элементов массива (натуральное число от 1 до 20), после чего выделяем место под элементы этого массива и заполняем его случайными целыми числами от -50 до 50. Таким образом, в результате
выполнения конструктора мы получили целочисленный массив, заполненный случайными числами.
В переопределенном методе ToString() определяем переменную txt, в которой будут располагаться числа массива, разделенные пробелами, и числовую переменную sum, которая
будет накапливать сумму элементов массива. Эти операции реализуются в цикле по переменной k. В заключение добавляем в строку txt количество элементов массива и среднее значение.
Обратите внимание, что при вычислении среднего в общем случае результат должен быть вещественным, поэтому, прежде чем делить вычисленную сумму (значение переменной sum), ее
нужно привести к вещественному типу, чтобы результат получился вещественным.
Результат работы приложения изображен на рисунке 3.
Рис.3. Результат работы приложения
Со следующего шага мы начнем рассматривать перегрузку операторов.
Предыдущий шаг
Содержание
Следующий шаг