Главная » Язык программирования C#

Работа со строками в C#

c# строки

Работа со строками на языке C#

В данной статье мы рассмотрим некоторые манипуляциями с текстом на языке программирования C#. Мы рассмотрим программу, которая будет выполнять три действия:

  1. Найдем и поменяем местами самое длинное и самое короткое слово в предложении.
  2. Пропишем каждое слово в предложении задом наперед.
  3. Заменим каждую букву в предложении символом # с указанием количества вхождения данной буквы в предложении.

Вот такие не сложные, но довольно интересные моменты мы сейчас рассмотрим.

Меняем местами самое длинное и самое короткое слово в предложении

Задание довольно простое для понимания, но я уточню некоторые моменты.

  • Если слов с самой большой длинной несколько, то мы берем первое встречающееся слово. Аналогично для самого короткого слова.
  • Самое короткое слово может состоять из одной буквы, то есть это может быть предлог.
  • Программа представленная на данной странице предназначена для работы только с отдельным предложением. При работе сразу с несколькими предложениями возможны ошибки.

Первым делом рассмотрим процесс нахождения самого длинного слова. Алгоритм поиска такого слова весьма и весьма прост. Для этого нам необходимо пройтись по каждому символу тестируемого предложения и проверять, является ли символ буквой. Если да, то мы увеличиваем счетчик длины. Сразу же после этого мы проверяем, превысила ли данная длина максимальную длину. Если да, то данное значение становится максимальным. Если нет, продолжаем дальше. Как только следующий символ оказывается не буквой, мы обнуляем счетчик.

А вот собственно и код:

bufer = richTextBox1.Text;   //считываем предложение
int dlin = 0;                // длина самого длинного слова
int dlinind = 0;             //индекс начала самого длинного слова
for (int i = 0; i < bufer.Length; i++)
{
if (char.IsLetter(bufer[i]))       //если буква
{
a++;        //увеличиваем счетчик
if (a > dlin)       //проверка
{
dlin = a;
dlinind = i - (a - 1);     //получаем индекс начала слова
}
}
else        //если не буква
{
a = 0;       //Обнуляем счетчик
}
}

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

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

for (int i = 0; i < bufer.Length-1; i++) //мы проверяем этот и следующий символ. Поэтому нужно убедится в том, что мы не выходим за грань.
{
if (char.IsLetter(bufer[i]))    //если символ буква
{
a++;                 //увеличиваем счетчик
if (!(char.IsLetter(bufer[i + 1])))    //если это конец слова
{
if (a < korot)       //сравниваем с минимальным значением
{
korot = a;           //получаем длину самого короткого слова
korotind = i - (a - 1);  //и его индекс
}
}
if (i + 1 == bufer.Length-1 && char.IsLetter(bufer[i+1]))  //дополнительная проверка на случай, если мы рассматриваем предпоследний символ. Разберитесь в смысле последующих строк
{
a++;
korot = a;
korotind = (i+1)-(a-1);
}
}
else
{
a = 0;
}

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

Перед тем как перейти к следующему пункту я бы хотел уточнить еще два момента:

  • В начале программы мы можем задать переменной хранящей длину самого длинного слова значение равное 0. Надеюсь, понятно почему. Ведь если мы зададим, например, 5, то может оказаться, что в предложении все слова в длину не превышают это значение.
  • Первым делом мы получаем длину самого длинного слова. Перед поиском самого короткого слова мы можем приравнять переменной, хранящей это значение, значение равное длине самого длинного слова. Либо приравнять её, например, к 999999999999. Чтобы наверняка.

А теперь перейдем к пункту, где мы вытащим из предложения эти самые слова:

string d = "";
for (int i = dlinind; i < dlinind+dlin; i++)
{
d = d + bufer[i];
}
string c = "";
for (int i = korotind; i < korotind + korot; i++)
{
c = c + bufer[i];
}

В этом пункте все предельно ясно, поэтому я не буду дополнительно разглагольствоваться. Следующим и самым последним пунктом остается замена этих слов друг на друга. Но тут тоже есть подводные камни. Если мы без задней мысли заменить одно на другое, а потом попробуем заменить второе на первое, то может оказаться, что мы проверили круговорот обменов и не получили желаемого результата. Именно поэтому я рекомендую на время заменить одно из этих слов на любую белеберду, которая не должна встретиться в предложении:

string e = "123456789";
bufer = bufer.Replace(d, e);
bufer = bufer.Replace(c, d);
bufer = bufer.Replace(e, c);

Вот так вот. Надеюсь с пунктом по замене самого длинного слова на самое короткое мы разобрались. Идем дальше.

Переписываем все слова в предложении наоборот

Для решения данной задачи можно выполнить следующие действия.

  • Создаем два массива для хранения слов.
  • В один из(а можно и в оба сразу) размещаем все слова из предложения.
  • Обычным перебором каждой ячейки массива переписываем каждое слово в перевернутом виде в другой массив.
  • В тестируемом предложении заменяем слова из первого массива на слова из второго массива.

А если в коде, то это будет выглядеть так:

bufer = richTextBox1.Text;
string[] a = bufer.Split(' ', ',', '.', '!', '?');   //записываем в массив все слова из предложения
string[] b = bufer.Split(' ', ',', '.', '!', '?');  //были проблемы с заданием размера второго массива, поэтому, чтобы не сильно себя беспокоить, я продублировал его. Он все равно будет перезаписан, так что это не страшно
for (int i=0;i<a.Length;i++)
{
b[i] = "";    //уже перезаписали
for (int j = a[i].Length-1; j >= 0; j--)
{
b[i] = b[i] + a[i][j];   //записываем во второй массив перевернутые слова
}
}
for (int i = 0; i < a.Length; i++)
{
bufer = bufer.Replace(a[i], b[i]);   //замена в предложении обычных слов, перевернутыми
}

Вот такой довольно нехитрый код делаем все, что нам нужно. Стоит так же отметить, метод Split в представленном виде записывает в массив не только слова, но и знаки препинания и прочую ересь. Но это не страшно, так как строки из одного символа даже перевернутые не изменят ничего.

Каждую букву в предложении заменяем символом # и указанием количества вхождения в предложение

Я сразу приведу код, который в точности выполняет эту задачу, но не буду объяснять что и как оно делает. Это наслаждение я оставлю для Вас:

bufer = richTextBox1.Text;
int a = 0;
string c="";
for (int i = 0; i < bufer.Length; i++)
{
if (char.IsLetter(bufer[i]))
{
c="";
c=c+bufer[i];
a = 0;
for (int j = i; j < bufer.Length; j++)
{
if (bufer[j] == bufer[i])
{
a++;
}
}
while (bufer.IndexOf(c) != -1)
{
bufer = bufer.Replace(c, "#" + a);
}
}
}

Вот такими несложными действиями мы можем провести некоторые манипуляции с предложениями. Если есть вопросы, задавайте.

Добавить комментарий

Ваш комментарий появится после модерации.