Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Результат_2012_02_09.docx
Скачиваний:
6
Добавлен:
20.04.2015
Размер:
593.36 Кб
Скачать

Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой

  1. Следует отметить, что одной из главых подзадач в этой задаче является обработка строки. Если эта функция будет реализована, то можно воспользоваться тем, что файл – множество строк, и вызвав эту функцию в цикле, реализовать главную задачу.

  2. Для обработки строки необходима строка. Для улучшения характеристик программа, строка будет изменяться во время обработки. Сигнатура этой функции будет иметь следующий вид:

  3. Для того, что бы удалить слова, которые начинаются и заканчиваются одной и той же буквой, надо уметь находить слова. Для нахождения слова надо уметь находить начало и длину слова. Логика реализации этих функций почти полностью аналогичная реализации на языке C#. Единственное отличие состоит в проверке вхождения символа во множество разделителей. В С++ один из вариантов реализации этой задачи является функция strchr. Она принимает 2 параметра. Первый параматр является строкой, которая окончивается нулевым символов. Второй параметр – символ, который проверяется на вхождение в строку. Возвращаемый результат – NULL, если символ не входит в строку, и указатель на позицию вхождения символа в строку (т.е. не NULL). С учетом этого функции для работы со словом примут следующий вид:

bool isSeparator(char z) {

return strchr(" .,\\&!~/", z) != NULL;

}

bool isBeginOfWord(string &str, int index) {

if (isSeparator(str[index])) {

return false;

}

if (index == 0) {

return true;

}

return isSeparator(str[index - 1]);

}

int getWordLength(string &str, int startIndex) {

int res = 0;

for (int i = startIndex; i < str.size(); i++) {

if (isSeparator(str[i])) {

break;

}

res++;

}

return res;

}

  1. Обработка строки так же является почти полностью аналогичной обработке строки в C#, за исключением того, что для удаления подстроки из строки, которая представлена типом std::string, необходимо воспользоваться функцией erase.

  2. Приведем полный код решения:

#include <string.h>

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

bool isSeparator(char z) {

return strchr(" .,\\&!~/", z) != NULL;

}

bool isBeginOfWord(string &str, int index) {

if (isSeparator(str[index])) {

return false;

}

if (index == 0) {

return true;

}

return isSeparator(str[index - 1]);

}

int getWordLength(string &str, int startIndex) {

int res = 0;

for (int i = startIndex; i < str.size(); i++) {

if (isSeparator(str[i])) {

break;

}

res++;

}

return res;

}

void processLine(string &str) {

for (int i = 0; i < str.size(); i++) {

if (isBeginOfWord(str, i) == false) {

continue;

}

int len = getWordLength(str, i);

if (str[i] != str[i + len - 1]) {

i = i + len;

continue;

}

str.erase(str.begin() + i, str.begin() + i + len);

}

}

void processFile(string infileName, string outFileName) {

ifstream ifs(infileName.c_str());

if (ifs.is_open() == false) {

return;

}

ofstream ofs(outFileName.c_str());

if (ofs.is_open() == false) {

ifs.close();

return;

}

string curLine;

while (ifs.eof() == false) {

getline(ifs, curLine);

processLine(curLine);

ofs << curLine << "\n";

}

ifs.close();

ofs.close();

}

int main(int argc, char* argv[]) {

processFile("labin.txt", "labout.txt");

return 0;

}