Ответить
11.05.2011, 01:35 #1
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Программа для обработки текстового файла
Привет о великие программеры.
Требуется приложение которое могло текст в файле .doc или .txt
изменять оставляя начальную букву и конечную на своих местах.
За исключением знаков препинания и цифр, игнорируя их.

Задача простая. Оплата не плохая.

Перемешивать по данному методу.
По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета,
не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве.
Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете.
Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке,
все-рвано ткест чтаитсея без побрелм. Пичрионй эгото
ялвятеся то, что мы не чиатем кдаужю бкуву по отдльенотси,
а все солво цликеом.


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

[ol]
Преобразование одного слова.
Получение слова из предложения и его преобразование.
Преобразование всех слов в предложении.
Запись слова в файл и чтение из файла.
Запись текста и чтение текста из файла.
[/ol]
Ну и под конец уже чтение всего файла, его преобразование и сохранение результата в новый файл.
Реклама
12.05.2011, 05:51 #2
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Программа для обработки текстового файла
Не тестируйте явно ASCII-код, как, например, if( ch ==65 ); вместо
этого используйте соответствующую символьную константу,
например, if( ch == 'A' ).


Это написано в учебнике. С чем это связано? С тем, что на разных компьютерах может быть разная кодировка и программа не будет работать? Или здесь что-то другое? Очень длинное условие проверки получается со всякими запятыми, кавычками, цифрами если каждый символ по одному прописывать. Я сделал проверку через числа, у меня работает, но может тут какая-нибудь "закавыка" типа оператора goto, он вроде есть, а использовать нельзя - "дурной тон".

Наверно стОит пояснить для чего мне это надо в данной задаче. Дело в том, что мы обычно при написании предложений прикрепляем знаки препинания, такие как "запятая", "точка", "кавычки" и т. д. к концу слова. И этих знаков может быть несколько, а нам надо добраться до предпоследней буквы в слове. Поэтому приходится проверять каждое слово - является ли последний символ буквой или нет. То же самое и впереди слова - там первым символом может оказаться "скобка", например. Просто хочется сделать запись покороче, а то если прописать проверку на каждый символ, получится строк пять-шесть.


#include <iostream>
#include <fstream>
#include <cstring>
#include <clocale>
#include <conio.h>
#include <ctime>

using namespace std;

int main()
{
srand(static_cast<unsigned int>(time(NULL)));
setlocale( LC_CTYPE,"Russian" );

char str[30];    // массив для хранения слова
int lenght;      // длина слова
char temp;       // переменная для перемешивания букв в слове
int j;       // переменная для индекса той буквы с которой меняем местами
int counter=1;   // счетчик для перехода на новую строку в создаваемом файле
int word_begin=0;    // для определения с какого символа от начала слова
                //начинаем перемешивание

cout<<"           Создайте текстовый файл с именем text_begin в той жеn";
cout<<"                     папке, где расположен exe-файлnn";
cout<<"           После этого нажмите любую клавишу и получите новый текстn";
cout<<"                              в файле text_endn";

_getch();


ifstream ofFile;
ofstream inFile;

ofFile.open("text_begin.txt");

inFile.open("text_end.txt");
if(ofFile)
{

while(1)
{
ofFile>>str; // извлекаем слово из файла

if(ofFile.eof()) // если слова закончились, выходим из цикла
break;

lenght=strlen(str); // определяем длину текущего слова


if(lenght<3) // если длина слова меньше, то перемешивать нечего
{
inFile<<str<<" ";
continue;
}

// задание исключений через значения кодировок ASC||, которые не надо перемешивать

do{
lenght=lenght-1;
}while((str[lenght]>32 && str[lenght]<65) || (str[lenght]>90 &&
                                                                str[lenght]<97));

do{
word_begin++;
}while((str[word_begin-1]>32 && str[word_begin-1]<65) ||
                                (str[word_begin-1]>90 && str[word_begin-1]<97));

if(lenght>=3)              // если количество "правильных" символов меньше 3,
                            // то перемешивать нечего
{
for(int i=word_begin; i<lenght; i++) // переставляем буквы
                                        //в слове кроме первой и последней
    {

// j при помощи этого выражения будет в диапазоне между первой и посл.
//буквой, исключая все знаки преп. и цифры

    j=rand()%(lenght-word_begin)+word_begin;

// если в слове есть дефис, то оставляем его на месте, так же как и буквы
//перед ним и после него
// i%3 означает, что меняем каждый третий символ в слове, если менять каждый,
//слова многие слова получаются трудночитаемыми

    if(i%3==0 && str[i]!='-' && str[j]!='-' && str[i+1]!='-'
                    && str[j+1]!='-' && str[i-1]!='-' && str[j-1]!='-' )
        {
        temp=str[i]; //меняем буквы случайным выбором
        str[i]=str[j];
        str[j]=temp;
        }
        } // конец for
} // конец внешнего if

inFile<<str<<" "; // помещаем измененное слово в новый файл

word_begin=0; // обнуляем переменную указывающую на символ с
                //которого начинаем перемешивание

if(counter%8==0) // переход на новую строку
inFile<<"n";

counter++; // инкременируем счетчик слов
}

ofFile.close();
inFile.close();
}
else
cout<<"Не удалось открыть исходный файлn";

return 0;
}
22.06.2011, 19:37 #3
Ветеран
Avatar
Регистрация: 10.02.2011
Сообщений: 445
Карма: 7
Re: Программа для обработки текстового файла
Пишу здесь, дабы не плодить новую тему. Программа переводит с русского в транслит или на оборот, выбирает пользователь в меню программы. Далее пользователь вводит текст, из произвольного числа символов. После перевода программа предлогает ввести имя файла, в который сохраняет результат.
23.06.2011, 02:16 #4
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Программа для обработки текстового файла
А в чем вопрос-то? Или это просто предложение всем желающим потренироваться?
23.06.2011, 18:28 #5
Ветеран
Avatar
Регистрация: 10.02.2011
Сообщений: 445
Карма: 7
Re: Программа для обработки текстового файла
Да для тренировки. Эту задачу просил решить один студент, правда её ктото уже решил.
23.06.2011, 18:49 #6
Ветеран
Avatar
Регистрация: 10.02.2011
Сообщений: 445
Карма: 7
Re: Программа для обработки текстового файла
Начнем с перевода с русского в транслит, это проще. Я думаю, надо создать два массива в первый будем вводить текст во втором сохранять результат. Каждой букве русского алфавита соответствует буква или сочетание букв. Например: и-i, я-ya. С помощью цикла и условия проверяем каждую ячейку массива. Я думаю это просто и понятно.
Вот с обратным переводом сложнее. Тут по одной ячейки проверять не получится. Например ya-я, это две ячейки.:ohmy:
Ответить