Проверить текст на соблюдение правила "жи-ши", "ча-ща" и исправить ошибки - 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);
}

Объяснение кода листинга программы

  1. Включаемые заголовочные файлы:
    • include - для работы с функциями ввода-вывода

    • include - для работы с функцией iswalpha, которая проверяет является ли символ буквой

    • include - для работы с широкими символами

    • include - для работы с функцией atoi, которая преобразует строку в целое число

    • include - для работы с указателем

    • include - для работы со строками

    • include - для установки локали

    • include - для работы с консолью

  2. Статические константы:
    • pat_start - указывает на последовательность символов, после которой нужно проверить следующие символы на соблюдение правила жи-ши, ча-ща
    • pat_letters - указывает на последовательность символов, которые нужно заменить на АУ
    • pat_replace - указывает на последовательность символов, которыми нужно заменять символы из pat_letters
  3. Массив строк, которые нужно игнорировать при проверке:
    • ignored_words - массив строк, которые нужно игнорировать при проверке. В данном случае это ЖЮРИ, БРОШЮР, ПАРАШЮТ.
  4. Функции:
    • find_next_word - ищет следующий символ, который является буквой или цифрой
    • find_end_of_word - ищет конец текущего слова
    • ignored - проверяет, содержится ли текущее слово в массиве строк, которые нужно игнорировать
    • correct_errors - исправляет ошибки в текущем слове
  5. Основная функция:
    • main - считывает текст из стандартного ввода, выводит сообщение Enter text to correct: и ожидает ввода текста
    • затем разбивает введенный текст на слова и передает каждое слово на обработку функции correct_errors
    • после обработки выводит сообщение Text after correction: и выводит исправленный текст
  6. В конце программы возвращается код EXIT_SUCCESS, что означает успешное выполнение программы.

ИИ поможет Вам:


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

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы