- •Содержание Введение
- •Задача 1: Обнаружить учетку памяти
- •Задача 2. Составить тесты к программе
- •Задача 3: Напечатать все содержимое файла на экран.
- •Задача 3: Напечатать все содержимое файла на экран (оптимизация).
- •Задача 4. Удалить все нечетные элементы из массива
- •Задача4.Удалить все нечетные элементы из массива (оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (последующая оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (основа тестов)
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой (без использования потоков и std::string)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (без использования std::vector)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (c использованием std::vector)
- •Задача 7. Отсортировать содержимое словаря
- •Задача 8. Реализовать сохранение и загрузку пользовательских структур данных с использованием fstream
- •Заключение Глоссарий
- •Список рекомендуемой литературы
Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой
Следует отметить, что одной из главых подзадач в этой задаче является обработка строки. Если эта функция будет реализована, то можно воспользоваться тем, что файл – множество строк, и вызвав эту функцию в цикле, реализовать главную задачу.
Для обработки строки необходима строка. Для улучшения характеристик программа, строка будет изменяться во время обработки. Сигнатура этой функции будет иметь следующий вид:
Для того, что бы удалить слова, которые начинаются и заканчиваются одной и той же буквой, надо уметь находить слова. Для нахождения слова надо уметь находить начало и длину слова. Логика реализации этих функций почти полностью аналогичная реализации на языке 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;
}
Обработка строки так же является почти полностью аналогичной обработке строки в C#, за исключением того, что для удаления подстроки из строки, которая представлена типом std::string, необходимо воспользоваться функцией erase.
Приведем полный код решения:
#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;
}