Корректирование текста.

Текст не содержит собственных имён и сокращений, набран с использованием прописных и строчных русских букв. Проверить то, что все фразы (и только они) начинаются с прописной буквы; при необходимости откорректировать текст.



Скачать архив программы

Код программы.

Исходный текст в файле "input.txt"

Отредактированный текст в файле "output.txt"

Описание программы на языке СИ.
В программе используется функция int replace(int s, bool q) от двух аргументов целого и логического типа, выдающая значения целого типа.
Если значение параметра q = true, то эта функция получая на вход код прописной буквы в кодировке windows-1251, возвращает на выходе код той же строчной буквы, прибавляя к нему число 32, если код символа не соответствует букве Ё, и заменяя символ с кодом 168, на символ с кодом 184.
Если значение параметра q = false, то эта функция получая на вход код строчной буквы в кодировке windows-1251, возвращает на выходе код той же прописной буквы, вычитая от него число 32, если код символа не соответствует букве ё, и заменяя символ с кодом 184, на символ с кодом 168.
При q = true функция производит замену кода символа только в том случае, если на вход её подан символ, соответствующий коду прописной русской буквы, и ничего не делает в противном случае.
При q = false функция производит замену кода символа только в том случае, если на вход её подан символ, соответствующий коду строчной русской буквы, и ничего не делает в противном случае.

Основная процедура редактирования текста void editor() открывает текстовый файл "input.txt" для чтения данных и открывает текстовый файл "output.txt" для записи данных. Эти файлы должны располагаться в той же самой папке, в которой находится файл исполняемой программы editor.exe (Папка Output\MingW ).
Поскольку переменная s имеет тип unsigned char , коды всех русских букв располагаются в соответствии с таблицей символов в кодировке Windows=1251.

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

После этого первый символ в тексте, если он является буквой, заменяется на прописную букву. Переменная логического типа k0=true тогда и только тогда, когда указатель находится в начале файла "input.txt" , и с того времени, как файл "input.txt" был открыт, не встретилось ни одного символа, отличного от пробела. В самом начале k0=true. Сразу же, как только встретится первый отличный от пробела символ (k0=true), переменной k0 будет присвоено значение k0=false, и строчная буква заменяется на прописную букву. После этого значение k0=false не будет меняться до самого конца алгоритма.

После каждой точки и, возможно, нескольких пробелов после этой точки, нужно изменить первую строчную букву на прописную. Переменная логического типа point=false до тех пор, пока в тексте не встретилась точка с кодом 46. Как только точка встретится в тексте, переменной point будет присвоено значение point=true. Если значение point=true, а символ не является ни пробелом (символом с кодом 32), ни точкой (символом с кодом 46), ни символом перенса на новую строку (сивмолом с кодом 10), и если он является строчной буквой, то он будет заменён на прописную букву, и после этого значению переменной point снова будет присвоено значение point=false. Значение переменной point будет оставаться point=false до тех пор, пока в тексте не встретится следующая точка (символ с кодом 46).

Алгоритм завершит работу, когда будет достигнут конец файла "input.txt". Файлы "input.txt", "output.txt" будут закрыты. Отредактированный текст можно будет просмотреть в файле "output.txt" .

Тест





 
#include <cstdlib>
#include <iostream>

using namespace std;

int replace(int s, bool q) 
{
   if ((q)&&(s>=192)&&(s<=223)) s=s+32;
   if ((q)&&(s==168)) s=184;
   if ((!q)&&(s>=224)&&(s<=255)) s=s-32;
   if ((!q)&&(s==184)) s=168;
   return s;
}

void editor()
{
    FILE *f;
    FILE *g;
    f=fopen("input.txt", "r");
    g=fopen("output.txt", "w");
    unsigned char s; unsigned char w; bool k0=true; bool point=false;  bool z;
    w=255;
    while(!feof(f))
    {
        fscanf(f,"%c", &s);
        s=replace(s, true);
        if ((s!=32)&&(k0))  
          {
              s=replace(s, false);
              k0=false;
         }
        if ((s==46)) {point=true; }
        if ((s!=32)&&(s!=46)&&(s!=10)&&(point==true)) 
           {s=replace(s, false); point=false;}
        fprintf(g,"%c", s);
    }
    fclose(f);
    fclose(g);
    
}

int main(int argc, char *argv[])
{
    FILE *f;
    f=fopen("input.txt", "r");
    if (f == NULL) 
    {
        printf("There is no file input.txt\n"); 
        f=fopen("input.txt", "w");   
        fclose(f);
    }
    else  {fclose(f); editor(); }  
    system("PAUSE");
    return EXIT_SUCCESS;
}



Примечание.

Таблица символов в кодировке cp866 (DOS)

Таблица символов в кодировке windows-1251

На главную страницу.