Базовые алгоритмы обработки строк

Методы, приведенные в параграфах 10.1, 10.2, познакомили нас с возможностями обработки строк и символов в Visual С#. При решении задач следует научиться использовать в совокупности простые приемы и методы обработки строк (назовем их базовыми алгоритмами), среди которых можно выделить следующие:

  • 1. Определение количества символов.
  • 2. Замена символов в строке.
  • 3. Удаление символа в строке.
  • 4. Вставка символа в строку.
  • 5. Анализ символа на принадлежность к группе.
  • 6. Поиск строки в блоке текста.
  • 7. Обращение строки.
  • 8. Алфавитная выборка.

Данные базовые алгоритмы могут найти свое применение не только для решения учебных задач, но и для разработки простых текстовых редакторов, программного обеспечения, предназначенного для верстки текста, и т.д.

Определение количества символов

Задача. Пользователь вводит исходную строку row и символ simv. Подсчитайте, сколько раз заданный символ встречается в исходной строке.

Комментарий: в цикле происходит сравнение текущего символа строки с искомым символом. Параметр цикла i будет изменяться в цикле от 0 (начало строки) до конца строки (за это отвечает свойство Length). Метод Parse преобразует строковое значение, которое считывается из текстового окна, в символ. Можно было бы попробовать описать переменную simv как строковую переменную, но тогда не будет выполняться оператор if (row[i] == simv), поскольку символ не может сравниваться со строковым значением. Подсчет количества найденных символов в строке обеспечивает оператор kol = kol + 1. В листинге 149 приведен код процедуры, отвечающий за решение задачи.

Листинг 149

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

int kol = 0;

string row = textBoxl.Text;

char simv = char.Parse(textBox2.Text);

for (int i = 0; i < row.Length; i++)

{

if (row[i] == simv) kol = kol + 1;

}

label3.Text = " Количество найденных символов в строке = "

+ kol.ToString();

}

}

}

Результат выполнения программы представлен на рис. 158.

Количество символов а в исходной строке равно 7

Рис. 158. Количество символов а в исходной строке равно 7

Замена символов в строке

Задача. Пользователь вводит исходную строку row и символ simv. Замените пробелы в исходной строке указанным символом.

Комментарий: в методе Replace, применяемом в отношении к исходной строке row, в качестве параметров используем пробел и подстроку, на которую заменяется подстрока, — simv. Цель применения операции логического отрицания очевидна, так как оператор row = row.Replace(" ", simv) будет выполняться тогда, когда логическое выражение будет иметь значение true. В листинге 150 приведен код процедуры, отвечающий за решение задачи.

Листинг 150

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

bool zamena=false; string row = textBoxl.Text; string simv= textBox2.Text; if (!zamena)

row = row.Replace(" ", simv);

else

row = row.Replace(simv, " "); zamena = !zamena;

label3.Text = "Результирующая строка: " + row;

}

}

Результат выполнения программы представлен на рисунке 159.

Пробелы в исходной строке заменяются символом «и»

Рис. 159. Пробелы в исходной строке заменяются символом «и»

Удаление символов в строке

Задача. Пользователь вводит исходную строку row и символ simv. Удалите в исходной строке указанный пользователем символ.

Комментарий: можно предложить два способа решения данной задачи. Первый (см. листинг 151) заключается в формировании вспомогательной строки vsp_str, которая будет содержать все символы строки row за исключением символа simv. После этого исходная строка row заменяется вспомогательной строкой vsp_str.

Второй способ (см. листинг 152) основан на применении метода Remove. Заранее определяем индекс первого вхождения заданной подстроки в строку row (метод IndexOf), а затем используем его в качестве параметра в методе Remove. Поскольку следует удалить один символ, то второй параметр равен 1.

Листинг 151

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e) {

string row = textBoxl.Text;

string vsp_str=" ";

char[] a = row.ToCharArray();

char simv = char.Parse(textBox2.Text);

for (int i = 0; i < row.Length; i++)

{

if (a[i] != simv)

vsp_str=vsp_str+a[i] ;

}

row= vsp_str ;

label3.Text = "Результирующая строка: " + row;

}

}

}

Листинг 152

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e) {

string row = textBoxl.Text; int n;

char simv = char.Parse(textBox2.Text); for (int і — 0; і < row.Length; i++) if (row[i] == simv)

{

n = row.IndexOf(simv); row = row.Remove(n, 1);

}

label3.Text = "Результирующая строка: " + row;

}

}

}

Результат выполнения программы представлен на рисунке 160.

Из исходной строки удаляется символ «а»

Рис. 160. Из исходной строки удаляется символ «а»

Вставка символа в строку

Задача. Пользователь вводит исходную строку row. В исходную строку необходимо добавить символ simv_vst после символа simv, который пользователь вводит с клавиатуры.

Комментарий: вставка подстроки в заданную позицию осуществляется с помощью оператора row = row.Insert(n + i, simv_vst), предварительно определяется индекс первого вхождения заданной подстроки в строку row с помощью метода IndexOf. Изменение параметра i в цикле с оператором for обеспечивает продвижение по строке. В листинге 153 приведен код процедуры, отвечающий за решение задачи.

Листинг 153

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string row = textBoxl.Text;

int n;

char simv = char.Parse(textBox2.Text); string simv_vst = textBox3.Text; for (int і — 0; і

{

n = row.IndexOf(simv);

row = row.Insert(n + i, simv_vst);

}

label4.Text = "Результирующая строка: " + row;

}

}

}

Результат выполнения программы представлен на рис. 161.

В исходную строку после заявленного символа «а» добавляется символ «я»

Рис. 161. В исходную строку после заявленного символа «а» добавляется символ «я».

Анализ символа на принадлежность к группе

Задача. Пользователь вводит исходную строку row. Определите, сколько в ней символов simv_l и simv_2, которые пользователь вводит с клавиатуры.

Комментарий: в данной программе используем метод Substring, который последовательно выделяет очередной символ строки и помещает его в ячейку tmp. Затем содержимое данной ячейки сравнивается со введенными пользователем символами, и если условие истинно, то счетчик увеличивается на единицу. В листинге 154 приведен код процедуры, отвечающий за решение задачи.

Листинг 154

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string row = textBoxl.Text; string tmp; int kol = 0;

string simv_l = textBox2.Text; string simv_2 = textBox3.Text; for (int i = 0; i < row.Length; i++)

tmp = row.Substring(i, if ((tmp == simv_l) kol = kol + 1;

  • 1) ;
  • (tmp == simv_2))

}

+

label4.Text = "Всего найденных символов: kol.ToString();

}

}

}

Результат выполнения программы представлен на рис. 162.

В исходной строке осуществлен подсчет символов «а» и «д»

Рис. 162. В исходной строке осуществлен подсчет символов «а» и «д»

Поиск строки в блоке текста

Задача. Пользователь вводит исходную строку row и подстроку pod. Определите местоположение подстроки с помощью ее выделения в исходной строке.

Комментарий: для успешной работы программы необходимо для текстового окна (textBoxl), расположенного на форме, выставить свойство HideSelection в положение False, свойство Tabindex = 0. Выяснив местоположение подстроки с помощью метода IndexOf, мы используем свойство текстового окна Selection Length. Длина выделенного фрагмента заранее выясняется с помощью оператора int k = row.Length. В листинге 155 приведен код процедуры, отвечающий за решение задачи.

Листинг 155

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e) {

string row=textBoxl.Text; int k = row.Length; string pod=textBox2.Text;

textBoxl.SelectionStart =row.IndexOf(pod); textBoxl.SelectionLength = k;

}

}

Результат выполнения программы представлен на рис. 163.

В исходной строке осуществляется поиск подстроки «бушка»

Рис. 163. В исходной строке осуществляется поиск подстроки «бушка»

Обращение строки

Задача. Пользователь вводит строку row. Переверните ее (т.е. запишите наоборот).

Комментарий: алгоритм работы основан на поочередной выборке символов из заданной строки и перемещении их в начало новой строки. Вспомогательная строка tmp изначально пуста. С помощью организации цикла просматриваем символы исходной строки от первого к последнему. Каждый из них присоединяется к началу уже накопленной строки оператором tmp = row[i] + tmp. В листинге 156 приведен код процедуры, отвечающий за решение задачи.

Листинг 156

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string row = textBoxl.Text; string tmp=" ";

for (int i = 0; i < row.Length; i + +) tmp = row [ i ] + tmp ;

labell.Text = "Обращенная строка: " + tmp;

}

}

}

Результат выполнения программы представлен на рис. 164.

Обращенная строка

Рис. 164. Обращенная строка

Алфавитная выборка

Задача. Пользователь вводит строку row и некую последовательность символов, которая представлена в определенном порядке, которую назовем алфавитом pod_str. Выберите из алфавита символы, используемые в строке row.

Комментарий: для решения задачи будем использовать пустую вспомогательную строку х. В ней будем накапливать результирующие символы в процессе просмотра алфавита, организованного с помощью цикла. Наличие очередного символа в исходной строке row определяем с помощью метода IndexOf. В случае наличия символ алфавита присоединяется к строке х. В листинге 157 приведен код процедуры, отвечающий за решение задачи.

Листинг 157

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string row = textBoxl.Text; string x="";

string pod_str = textBox2.Text; int k = pod_str.Length; for (int i = 0; i < k; i++)

if (row.IndexOf(pod_str[i]) > 0) x = x + pod_str[i] ;

label3.Text = "В 1 строке использованы следующие символы 2 строки: " + х;

}

}

}

Результат выполнения программы представлен на рис. 165.

Выполнена алфавитная выборка

Рис. 165. Выполнена алфавитная выборка

 
< Пред   СОДЕРЖАНИЕ     След >