Проверить текст на соблюдение правила "жи-ши", "ча-ща" и исправить ошибки - 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д