- •Содержание Введение
- •Задача 1: Обнаружить учетку памяти
- •Задача 2. Составить тесты к программе
- •Задача 3: Напечатать все содержимое файла на экран.
- •Задача 3: Напечатать все содержимое файла на экран (оптимизация).
- •Задача 4. Удалить все нечетные элементы из массива
- •Задача4.Удалить все нечетные элементы из массива (оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (последующая оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (основа тестов)
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой (без использования потоков и std::string)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (без использования std::vector)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (c использованием std::vector)
- •Задача 7. Отсортировать содержимое словаря
- •Задача 8. Реализовать сохранение и загрузку пользовательских структур данных с использованием fstream
- •Заключение Глоссарий
- •Список рекомендуемой литературы
Задача 4. Удалить все нечетные элементы из массива (основа тестов)
Теперь составим тесты для данной задачи.
Для того, что бы легче было писать тесты, необходимима функция ввода, которая заполняет вектор числами, введенными с клавиатуры, а не случайными. Поэтому добавим функцию, которая выполняет эту задачу.
void handFillVector(vector<int> &data, int size) {
data.reserve(size);
for (int i = 0; i < size; i++) {
data.push_back(getCorrectValue());
}
}
Заменим вызов функции заполнения вектора случайными числами на «ручной» ввод и вынесем в отдельную функцию.
void makeLab() {
cout << "enter array size: ";
int size = getCorrectValue();
if (size < 0) {
cout << "array size can not be negative number";
_getch();
return;
}
vector<int> data;
handFillVector(data, size);
printVector("before process", data);
mainAction(data);
printVector("after process", data);
}
Следует отметить, что в С++ можно перенаправлять стандартный поток ввода на ввод из файла, а стандартный поток вывода – на вывод в файл. Поэтому добавим функцию, которая принимает имя входного и выходного файла и перенаправляет потоки в них. Отметим, что необходимо подключить модуль #include <fstream>.
void redirectStreams(string infileName, string outFileName) {
streambuf *oldInput = cin.rdbuf();
streambuf *oldOutput = cout.rdbuf();
ifstream ifs(infileName.c_str());
ofstream ofs(outFileName.c_str());
cin.rdbuf(ifs.rdbuf());
cout.rdbuf(ofs.rdbuf());
makeLab();
ifs.close();
ofs.close();
cin.rdbuf(oldInput);
cout.rdbuf(oldOutput);
}
Приведем полный код программы
#include <vector>
#include <time.h>
#include <conio.h>
#include <list>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <strstream>
using namespace std;
bool isOdd(int s) {
return s % 2 == 1;
}
void mainAction(vector<int> &data) {
vector<int>::iterator newEnd = remove_if(data.begin(),data.end(), isOdd);
data.erase(newEnd, data.end());
}
int getCorrectValue() {
while (true) {
int size;
if (!(cin >> size)) {
cin.clear();
while(std::cin.get()!= '\n');
continue;
}
return size;
}
}
void printVector(char *caption, vector<int> &data) {
cout << caption << ": ";
for (vector<int>::iterator i = data.begin(); i != data.end(); ++i) {
cout << *i << " ";
}
cout << "\n";
}
void handFillVector(vector<int> &data, int size) {
data.reserve(size);
for (int i = 0; i < size; i++) {
data.push_back(getCorrectValue());
}
}
void makeLab() {
cout << "enter array size: ";
int size = getCorrectValue();
if (size < 0) {
cout << "array size can not be negative number";
_getch();
return;
}
vector<int> data;
handFillVector(data, size);
printVector("before process", data);
mainAction(data);
printVector("after process", data);
}
void redirectStreams(string infileName, string outFileName) {
streambuf *oldInput = cin.rdbuf();
streambuf *oldOutput = cout.rdbuf();
ifstream ifs(infileName.c_str());
ofstream ofs(outFileName.c_str());
cin.rdbuf(ifs.rdbuf());
cout.rdbuf(ofs.rdbuf());
makeLab();
ifs.close();
ofs.close();
cin.rdbuf(oldInput);
cout.rdbuf(oldOutput);
}
int main(int argc, char* argv[]) {
redirectStreams("labin.txt", "labout.txt");
return 0;
}
Теперь необходимо вызвать эту функцию с передачей входного файла (содержимое которого для этой задачи может быть «5 1 2 3 4 5»), и сравнить содержимое выходного файла с эталонным выходным файлом. Задача для чтения всего содержимого файла уже рассматривалась. Задача составления тестов так же рассматривалась, поэтому не будем приводить здесь рассуждения.