корректор текста на c#

Программа корректор текста на C#

Сегодня я хотел бы рассмотреть с Вами процесс создания такой несложной программы как корректор текста. Писать программу мы будем на языке C#. Корректор текста будет выполнять следующие несложные задачи(мы конечно же не ставим перед ним таких задач как проверка орфографии, для этих целей можете использовать такие сайты как text.ru):

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

Вид программы

программа корректор текста

Для своей программы я выбрал довольно простой интерфейс. Тут нет ничего лишнего. В окне имеются два RichTextBox`а, в первый из которых мы будем вводит текст для корректировки. Этот же RichTextBox будет выводить исправленный, откорректированный текст. А вот второй RichTextBox будет выводить сообщения, в которых содержится количество различных исправлений.

Сразу рекомендую установить метод

[code language=»csharp»]RichTextBox.Update[/code]

на событие

[code language=»csharp»]richTextBox_TextChanged[/code]

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

Убираем дублированные(двойные) пробелы

Этот пункт лучше всего выполнить в первую очередь, так как у нас имеются другие пункты связанные с пробелами и выполняя их мы будем знать, что дублированных пробелов уже нет. К тому же этот пункт самый простой. Но чтобы решить его легко нужно немного по-другому сформулировать его тему. Например так: «Нам нужно заменить двойные пробелы на одинарные«. После такой фразы в голову сразу же лезет метод

[code language=»csharp»]string.Replace[/code]

который идеально подойдет для решения данной задачи. Имеем следующее:

[code language=»csharp»]int och = 0; //считываем количество ошибок
string bufer = richTextBox1.Text; //считываем текст для корректировки
while (bufer.IndexOf(" ") != -1) //пока в тексте имеются дублированные пробелы
{
bufer = bufer.Replace(" ", " "); // заменяем их на одинарные
och++;
}
richTextBox1.Text = bufer;
richTextBox2.Text = richTextBox2.Text + "Исправлено дублированных пробелов — " + Convert.ToString(och) + "\r\n";[/code]

Таким образом решается первый пункт задачи.

Предложения должны начинаться с большой буквы

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

[code language=»csharp»]int och1=0; //количество ошибок
string buf="";
bufer = richTextBox1.Text;
if (char.IsLetter(bufer[0]) && char.IsLower(bufer[0])) // если первый символ буквы, притом маленькая
{
buf = buf + char.ToUpper(bufer[0]); //увеличиваем его
och1++;
}
else
{
buf = buf + bufer[0];
}[/code]

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

[code language=»csharp»]for (int i = 1; i < bufer.Length; i++)
{
if (bufer[i] == ‘.’ || bufer[i] == ‘!’ || bufer[i] == ‘?’) // если точка, восклицательный или вопросительный знак
{
if (i + 1 < bufer.Length) //при этом это не конец текста
{
if (bufer[i + 1] == ‘ ‘) //после точки должен стоять пробел
{
buf = buf + bufer[i] + bufer[i + 1]; //переписываем и точку, и пробел
if (char.IsLetter(bufer[i + 2]) && i + 2 < bufer.Length && char.IsLower(bufer[i + 2])) //если после пробела буква и она маленькая
{
buf = buf + char.ToUpper(bufer[i + 2]); //делаем букву заглавной
och1++;
}
else //если после пробела буква и она заглавная
{
buf = buf + bufer[i + 2]; //тупо добавляем символ
}
i = i + 2; //i увеличиваем на 2, так как мы уже записали два символа в буфер
}
else //если после точки не пробел
{
buf = buf + bufer[i]; //добавляем саму точку
if (char.IsPunctuation(bufer[i + 1]) && i + 1 < bufer.Length) // если это знак препинания(многоточие)
{
buf = buf + bufer[i + 1]; //добавляем этот знак
}
else
{
buf = buf + ‘ ‘; //иначе добавляем пробел
if (char.IsLetter(bufer[i + 1]) && char.IsLower(bufer[i + 1])) //если после пробела буква и она маленькая
{
buf = buf + char.ToUpper(bufer[i + 1]); //делаем букву заглавной
och1++; //увеличиваем счетчик ошибок
}
else
{
buf = buf + bufer[i + 1]; //тупо добавляем символ
}
}
i = i + 1; //увеличиваем счетчик, так как мы уже вписали i+1 символ
}
}
else
{
buf = buf + bufer[i]; //если это конец предложения, то просто добавляем точку(воскл. или вопрос. знак) и не паримся по поводу пробела
}
}
else // если перед нами другие символы, отличающиеся от знаков конца предложения, то добавляем их как есть
{
buf = buf + bufer[i];
}
}[/code]

Вот такой довольно сложный, но действенный алгоритм не только проверит с какой буквы начинается предложение, но и сделает её заглавной при необходимости. Кроме этого данный метод разделит предложения друг от друга пробелом. Так же хочется уточнить, что переменную och1 Вы можете использовать для вывода сообщения об исправленных ошибках.

Удаляем пробелы перед знаками пунктуации

Знаки препинания, которые отставлены от слов на какое-то расстояние, смотрятся не слишком красиво. Именно поэтому эти пробелы мы сейчас уберем:

[code language=»csharp»]int och2 = 0;
string buf = "";
string bufer = richTextBox1.Text;
for (int i = 0; i < bufer.Length-1; i++) //мы сначала ищем пробелы, а когда находим, проверяем следующий символ. Поэтому, если обнаружиться что следующего символа нет, мы нарвемся на fatal error. А оно нам надо?
{
if (bufer[i] == ‘ ‘) //ищем пробел
{
if (char.IsPunctuation(bufer[i + 1])) //проверяем следующий символ
{
buf = buf + bufer[i + 1]; //если это наш клиент, то добавляем только знак пунктуации
och2++;
}
else
{
buf = buf + bufer[i] + bufer[i + 1]; //если это не наш клиент, добавляем все подряд
}
i = i + 1; //так мы добавили и символ i+1, увеличить счетчик — логичная операция
}
else
{
buf = buf + bufer[i]; // если это не пробел, добавляем без вопросов
}
}
buf = buf + bufer[bufer.Length — 1]; // так как мы не проверили последний символ, мы его просто добавляем
richTextBox1.Text = buf;
richTextBox2.Text = richTextBox2.Text + "Удалено пробелов перед знаками пунктуации — " + Convert.ToString(och2) + "\r\n";[/code]

Таким образом мы убираем все пробелы, которые находятся между символом и знаком препинания.

Вставляем пробел после знака препинания

Какую-то часть этой задачи мы уже решили, но только часть. Поэтому придется проверить текст еще раз. Итак:

[code language=»csharp»]int och3 = 0;
string buf = "";
bufer = richTextBox1.Text;
for (int i = 0; i < bufer.Length — 1; i++) // ситуация та же, что и выше. Мы сначала ищем знак препинания, потом проверяем следующий знак
{
if (char.IsPunctuation(bufer[i])) //находим знак пунктуации
{
if (bufer[i + 1] == ‘ ‘) //находим пробел после него
{
buf = buf+bufer[i] + bufer[i + 1]; //без вопросов добавляем как есть
}
else
{
buf = buf +bufer[i]+ ‘ ‘ + bufer[i + 1]; // если пробела нет, добавляем его сами
och3++;
}
i = i + 1; //увеличиваем счетчик по уже описанной причине
}
else
{
buf=buf+bufer[i]; //если не знак пунктуации
}
}
buf = buf + bufer[bufer.Length — 1]; //та же ситуация, что и выше
richTextBox1.Text = buf;
richTextBox2.Text = richTextBox2.Text + "Вставлено пробелов после знаков пунктуаций — " + Convert.ToString(och3) + "\r\n";
och3 = 0;[/code]

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