Проверить текст на соблюдение правила "жи-ши", "ча-ща" и исправить ошибки - C (СИ)
Формулировка задачи:
В русском языке, после букв Ж, Ч, Ш,Щ пишется И, А, У, а не Ы, Я, Ю. Проверить заданный текст на соблюдение этого правила и исправить ошибки (с учетом исключений: ЖЮРИ, БРОШЮРА, ПАРАШЮТ).
Решение задачи: «Проверить текст на соблюдение правила "жи-ши", "ча-ща" и исправить ошибки»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#include <wchar.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <locale.h>
#include <windows.h>
/* В русском языке, после букв Ж, Ч, Ш,Щ пишется И, А, У, а не Ы, Я, Ю. Проверить */
/* заданный текст на соблюдение этого правила и исправить ошибки (с учетом */
/* исключений: ЖЮРИ, БРОШЮРА, ПАРАШЮТ)
*/
static const wchar_t *pat_start = L"ЖЧШЩ";
static const wchar_t *pat_letters = L"ЫЯЮ";
static const wchar_t *pat_replace = L"ИАУ";
static const wchar_t *ignored_words[] = {
L"ЖЮРИ", L"БРОШЮР", L"ПАРАШЮТ", NULL
};
wchar_t *find_next_word(const wchar_t *text)
{
while(*text != L'\0' && !iswalpha(*text))
++text; /* Skip non-alphabetic letters */
return (wchar_t *) (*text == L'\0' ? NULL : text);
}
wchar_t *find_end_of_word(const wchar_t *text)
{
while(*text != L'\0' && iswalpha(*text))
++text; /* Ignore current word */
return (wchar_t *) text;
}
int ignored(const wchar_t *word)
{
size_t i;
for(i = 0; ignored_words[i] != NULL; ++i)
if(wcsstr(word, ignored_words[i]) != NULL)
return 1;
return 0;
}
wchar_t *correct_errors(wchar_t *word)
{
wchar_t *pch = word;
wchar_t *pend;
wchar_t end_char;
if(word == NULL)
return NULL;
pend = find_end_of_word(word);
end_char = *pend;
*pend = L'\0';
/* Search all errors: */
while(*pch != L'\0')
{
wchar_t *found;
/* Find the beginning of a pattern */
pch = wcspbrk(pch, pat_start);
if(pch == NULL)
break;
/* Determine if there is an error */
if((found = wcschr(pat_letters, pch[1])) != NULL)
{
ptrdiff_t offset = found - pat_letters;
++pch;
/* Skip ignored words */
if(!ignored(word))
*pch = pat_replace[offset];
}
++pch;
}
*pend = end_char;
return *pend == L'\0' ? NULL : pend;
}
int main(void)
{
wchar_t *word, buf[BUFSIZ];
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "");
fputws(L"Enter text to correct:\n", stdout);
fgetws(buf, BUFSIZ, stdin);
for(word = find_next_word(buf);
word != NULL;
word = correct_errors(find_next_word(word)))
{
/* No-op */
}
fputws(L"Text after correction:\n", stdout);
fputws(buf, stdout);
exit(EXIT_SUCCESS);
}
Объяснение кода листинга программы
- Включаемые заголовочные файлы:
-
include
- для работы с функциями ввода-вывода -
include
- для работы с функцией iswalpha, которая проверяет является ли символ буквой -
include
- для работы с широкими символами -
include
- для работы с функцией atoi, которая преобразует строку в целое число -
include
- для работы с указателем -
include
- для работы со строками -
include
- для установки локали -
include
- для работы с консолью
-
- Статические константы:
- pat_start - указывает на последовательность символов, после которой нужно проверить следующие символы на соблюдение правила
жи-ши,ча-ща - pat_letters - указывает на последовательность символов, которые нужно заменить на
АУ - pat_replace - указывает на последовательность символов, которыми нужно заменять символы из pat_letters
- pat_start - указывает на последовательность символов, после которой нужно проверить следующие символы на соблюдение правила
- Массив строк, которые нужно игнорировать при проверке:
- ignored_words - массив строк, которые нужно игнорировать при проверке. В данном случае это
ЖЮРИ,БРОШЮР,ПАРАШЮТ.
- ignored_words - массив строк, которые нужно игнорировать при проверке. В данном случае это
- Функции:
- find_next_word - ищет следующий символ, который является буквой или цифрой
- find_end_of_word - ищет конец текущего слова
- ignored - проверяет, содержится ли текущее слово в массиве строк, которые нужно игнорировать
- correct_errors - исправляет ошибки в текущем слове
- Основная функция:
- main - считывает текст из стандартного ввода, выводит сообщение
Enter text to correct:и ожидает ввода текста - затем разбивает введенный текст на слова и передает каждое слово на обработку функции correct_errors
- после обработки выводит сообщение
Text after correction:и выводит исправленный текст
- main - считывает текст из стандартного ввода, выводит сообщение
- В конце программы возвращается код EXIT_SUCCESS, что означает успешное выполнение программы.