Добавлен: 21.10.2018
Просмотров: 879
Скачиваний: 23
Контрольная работа
Тема: Последовательные контейнеры STL и модульное тестирование
Цель: Сформировать практические навыки разработки абстракций данных на основе контейнеров STL и модульного тестирования средствами Visual Studio.
Задание
Реализовать обработку данных пользовательского типа (объектов класса) с помощью контейнера в соответствии с вариантом задания и со следующей спецификацией:
-
приложение заполняет контейнер данными, которые вводятся пользователем с консоли;
-
выводит содержимое контейнера на консоль для контроля ввода;
-
выполняет сортировку контейнера в порядке возрастания значений объектов с помощью алгоритма или метода контейнера;
-
выводит содержимое контейнера на консоль для контроля операции;
-
выполняет сортировку контейнера в порядке убывания значений объектов с помощью алгоритма или метода контейнера;
-
выводит содержимое контейнера на консоль для контроля операции;
-
вычисляет сумму значений объектов с помощью алгоритма и выводит значение на консоль.
Протестировать его, используя средства модульного тестирования Visual Studio. Тестовые наборы необходимо построить на основе критериев тестирования C0,C1,C2 в зависимости от варианта задания.
Выбора варианта:
Номер варианта контрольной работы соответствует двум последним цифрам вашего пароля, если эти две цифры образуют число меньшее или равное 18. Если это число больше 18, то номер вашего варианта вы получите вычитанием из него числа 18.
Например, две последние цифры пароля 08, тогда номер вашего варианта будет 8.
Например, две последние цифры пароля 24, тогда номер вашего варианта будет 24 – 18 = 6.
Варианты задания
Варианты заданий контрольной работы представлены в таблице ниже. Вариант определяет тип контейнера используемого для обработки данных, тип значений помещаемых в контейнер, критерии тестирования разработанного приложения (таблица 1).
Таблица 1 - Варианты заданий контрольной работы
№ Варианта |
Тип контейнера |
Класс объектов |
Критерий тестирования |
1 |
deque |
Простая дробь |
С0,C1 |
2 |
deque |
Комплексное число |
С0,C1 |
3 |
deque |
Р-ичное число |
С0,C1 |
4 |
deque |
Простая дробь |
C1,C2 |
5 |
deque |
Комплексное число |
C1,C2 |
6 |
deque |
Р-ичное число |
C1,C2 |
7 |
vector |
Простая дробь |
С0,C1 |
8 |
vector |
Комплексное число |
С0,C1 |
9 |
vector |
Р-ичное число |
С0,C1 |
10 |
vector |
Простая дробь |
C1,C2 |
11 |
vector |
Комплексное число |
C1,C2 |
12 |
vector |
Р-ичное число |
C1,C2 |
13 |
list |
Простая дробь |
С0,C1 |
14 |
list |
Комплексное число |
С0,C1 |
15 |
list |
Р-ичное число |
С0,C1 |
16 |
list |
Простая дробь |
C1,C2 |
17 |
list |
Комплексное число |
C1,C2 |
18 |
list |
Р-ичное число |
C1,C2 |
Рекомендации к выполнению
-
Заданную обработку данных реализуйте как консольное приложение, используя классы языка программирования и библиотеку шаблонов STL.
-
Добавьте в класс объектов (в соответствии с вариантом задания), помещаемых в контейнер перегруженные операторы < и > для выполнения сортировки. В контрольной работе используются классы, разработанные вами в лабораторных работах.
-
Выполняйте сортировку контейнера с помощью алгоритма sort или метода контейнера в зависимости от варианта.
-
Вычисление суммы значений объектов контейнера выполняйте с помощью алгоритма accumulate и функционального объекта plus<A>(), здесь А – класс ваших объектов;
-
Для выполнения описанных в задании операций по обработке данных, разработайте класс со следующим описанием:
class InOutDo
{
public:
static void Input(…)
{
//Вводим данные с клавиатуры и заносим в контейнер.
}
static void Output(…)
{
//Выводим содержимое контейнера на монитор.
}
static A Sum(…)
{
//Находим сумму
}
static void SortUp(…)
{
//Сортируем вектор по возрастанию
}
static void SortDown(…)
{
//Сортируем вектор по убыванию
}
};
Тогда функция main примет примерно такой вид:
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
//Описание вашего Контейнера с объектами вашего класса А.
//Контейнер<A> m;
InOutDo::Input(m);
InOutDo::Output(m);
InOutDo::SortUp(m);
InOutDo::Output(m);
InOutDo::SortDown(m);
InOutDo::Output(m);
cout << InOutDo::Sum(m).get() << endl;
system("PAUSE");
return 0;
}
-
Для тестирования разработанного класса используйте средства модульного тестирования Visual Studio.
-
Примеры программ обработки данных с помощью деки, вектора и списка приведены ниже.
Пример 1. Обработка данных с декой.
// ConsoleDeque.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <deque>
#include <algorithm>
#include <numeric>//Определяет шаблонны функций контейнера, которые выполняют алгоритмы числовой обработки.
#include <functional>
#include "windows.h"
using namespace std;
class A
{
int n, d;
public:
A(int n = 0, int d = 1) : n(n), d(d){};
A operator+(const A b)const
{
return A((n*b.d + b.n*d), d*b.d);
};
string get()
{
string a;
ostringstream os;
os << n << "/" << d;
return os.str();
};
bool operator>(const A b)const
{
return n*b.d > d*b.n;
};
bool operator<(const A b)const
{
return n*b.d < d*b.n;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
//Дека простых дробей
deque<A> m;
//Итератор для деки
deque<A>::iterator iter;
//Проталкиваем дроби в деку
m.push_back(A(2));
m.push_back(A(3));
m.push_back(A(1));
m.push_back(A(5));
m.push_back(A(9));
m.push_back(A(7));
//Сортируем деку по возрастанию
sort(m.begin(), m.end(), less<A>());
for (iter = m.begin(); iter != m.end(); iter++)
cout << iter->get() << " ";
cout << endl;
//Сортируем деку по убыванию
sort(m.begin(), m.end(), greater<A>());
for (int j = 0; j != m.size(); j++)
cout << m[j].get() << " ";
cout << endl;
//Находим сумму
A sum = accumulate(m.begin(), m.end(), A(), plus<A>());
cout << sum.get() << endl;
system("PAUSE");
return 0;
return 0;
}
Пример 2. Обработка данных с вектором.
// ConsoleVector.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <numeric>//Определяет шаблонны функций контейнера, которые выполняют алгоритмы числовой обработки.
#include <functional>
#include "windows.h"
using namespace std;
class A
{
int n, d;
public:
A(int n = 0, int d = 1) : n(n), d(d){};
A operator+(const A b)const
{
return A((n*b.d + b.n*d), d*b.d);
};
string get()
{
string a;
ostringstream os;
os << n << "/" << d;
return os.str();
};
bool operator>(const A b)const
{
return n*b.d > d*b.n;
};
bool operator<(const A b)const
{
return n*b.d < d*b.n;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
//Вектор простых дробей
vector<A> m;
//Итератор для вектора
vector<A>::iterator iter;
//Проталкиваем дроби в вектор
m.push_back(A(2));
m.push_back(A(3));
m.push_back(A(1));
m.push_back(A(5));
m.push_back(A(9));
m.push_back(A(7));
//Сортируем вектор по возрастанию
sort(m.begin(), m.end(), less<A>());
for (iter = m.begin(); iter != m.end(); iter++)
cout << iter->get() << " ";
cout << endl;
//Сортируем вектор по убыванию
sort(m.begin(), m.end(), greater<A>());
for (int j = 0; j != m.size(); j++)
cout << m[j].get() << " ";
cout << endl;
//Находим сумму
A sum = accumulate(m.begin(), m.end(), A(), plus<A>());
cout << sum.get() << endl;
system("PAUSE");
return 0;
}
Пример 3. Обработка данных со списком.
// ConsoleList.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <list>
#include <algorithm>
#include <numeric>//Определяет шаблонны функций контейнера, которые выполняют алгоритмы числовой обработки.
#include <functional>
#include "windows.h"
using namespace std;
class A
{
int n, d;
public:
A(int n = 0, int d = 1) : n(n), d(d){};
A operator+(const A b)const
{
return A((n*b.d + b.n*d), d*b.d);
};
string get()
{
string a;
ostringstream os;
os << n << "/" << d;
return os.str();
};
bool operator>(const A b)const
{
return n*b.d > d*b.n;
};
bool operator<(const A b)const
{
return n*b.d < d*b.n;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
//Список простых дробей
list<A> m;
//Итератор для списка
list<A>::iterator iter;
//Проталкиваем дроби в вектор
m.push_back(A(2));
m.push_back(A(3));
m.push_back(A(1));
m.push_back(A(5));
m.push_back(A(9));
m.push_back(A(7));
//Сортируем список по возрастанию
//sort(m.begin(), m.end(), );
m.sort(less<A>());
for (iter = m.begin(); iter != m.end(); iter++)
cout << iter->get() << " ";
cout << endl;
//Сортируем список по убыванию
//sort(m.begin(), m.end(), );
m.sort(greater<A>());
for (iter = m.begin(); iter != m.end(); iter++)
cout << iter->get() << " ";
cout << endl;
//Находим сумму
A sum = accumulate(m.begin(), m.end(), A(), plus<A>());
cout << sum.get() << endl;
system("PAUSE");
return 0;
return 0;
}
Пример модульного теста.
#include "stdafx.h"
#include "CppUnitTest.h"
#include "..\ConsoleDeque\A.h"
#include "..\ConsoleDeque\InOutDo.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
A d = A(0, 1);
deque<A> m;
InOutDo::Input(m);
d = InOutDo::Sum(m);
string s = "27/1";
Assert::AreEqual(s, d.get());
}
};
}
Порядок выполнения
Реализуйте заданную абстракцию данных в режиме консольного приложения:
-
Создайте консольное приложение и сохраните его под именем CJob_1.
-
Добавьте к исходному тексту консольного приложения описание вашего класса в соответствии с вариантом задания.
-
Добавьте в описание класса перегруженные операторы отношения (<,>) и, если необходимо, недостающие методы.
-
Добавьте к исходному тексту консольного приложения описание класса InOutDo в соответствии с заданием.
-
Разработайте тестовый набор данных для тестирования операций класса InOutDo и протестируйте их.
-
Разработайте тестовый набор данных для тестирования операций, заданных на множестве. Тестовый набор поместите в таблицу следующего вида:
Таблица 1 - Тестовый набор для тестирования шаблона классов «множество»
Тестовый набор для тестирования операции Сложить множества целых чисел |
|||||
Номер теста |
Исходные данные |
Ожидаемый результат |
|||
Вход |
контейнер |
Возвращаемое значение |
контейнер |
||
1 |
() |
() |
() |
() |
|
2 |
(0) |
() |
(0) |
() |
|
3 |
(1) |
(0) |
(1 0) |
(0) |
|
4 |
(1 0) |
(1 0) |
(1 0) |
(1 0) |
|
5 |
(1 2 3) |
(3 4 5) |
(1 2 3 4 5) |
(3 4 5) |
-
Протестируйте разработанную абстракцию данных с помощью средств модульного тестирования Visual Studio.
Контрольные вопросы
-
В чём состоит сущность критерия C0?
-
В чём состоит сущность критерия C1?
-
В чём состоит сущность критерия C2?
-
Что такое УПГ?
-
Что такое путь в УПГ?
-
Что такое ветвь УПГ?
-
В каком файле описан последовательный контейнер deque?
-
В каком файле описан последовательный контейнер vector?
-
В каком файле описан последовательный контейнер list?
-
Что означает имя iterator в области видимости последовательного контейнера?
-
Что такое функциональный объект?
-
Назначение и параметры алгоритма sort() для последовательных контейнеров?
-
Назначение и параметры алгоритма accumulate () для последовательных контейнеров?
-
Назначение метода size() последовательного контейнера?
-
В чём особенности статических методов?
-
В чём особенности последовательных контейнеров?
Содержание отчета
-
Задание.
-
Текст программы.
-
Скриншот.
Литература
-
Написание модульных тестов для C/C++ в Visual Studio [Электронный ресурс] URL: https://docs.microsoft.com/ru-ru/visualstudio/test/writing-unit-tests-for-c-cpp (дата обращения 21.03.18).
-
Руководство по программированию на C# [Электронный ресурс] URL: https://metanit.com/cpp/tutorial/1.1.php (дата обращения 20.03.18).