Программирование >>  Разработка устойчивых систем 

1 ... 80 81 82 [ 83 ] 84 85 86 ... 196


#include Generators.h #include PrintSequence.h using namespace std:

tempiate<typename Contain, typename UnaryFunc> void testUnary(Contain& source. Contains, dest. UnaryFunc f) {

transformCsource.beginO. source.endO. dest.beginO. f);

tempiate<typename Containl. typename Conta1n2.

typename BinaryFunc> void testBinary(Containl& srcl, Containl& src2.

Contain2& dest. BinaryFunc f) {

transform(srcl.begin(). srcl.end(). src2.begin(). dest.beginO. f):

Макрос выполняет выражение, a затем выводит его

в строковом виде при помощи print

#define T(EXPR) EXPR: print(r.begin(). r.endO. \

After #EXPR): Для логических проверок:

#define B(EXPR) EXPR; print(br.begin(), br.endO. \ After #EXPR):

Генератор случйных логических величин: struct BRand { bool operatorOO { return randO X 2 == 0: }

int mainO { const int SZ = 10: const int MAX = 50: vector<int> x(SZ). y(SZ). r(SZ): Генератор целых случайных чисел: URandGen urg(max):

srand(time(0)): Раскрутка генератора

generate n(x.begin(). SZ. urg):

generate n(y.beginO. SZ. urg):

Прибавление единицы предотвращает деление на ноль:

transformCy.beginO. y.endO. y.beginO.

bind2nd(plus<int>(). D): Гарантированное совпадение одной пары элементов: х[0] = у[0]:

print(x.beginO. x.endO. х ):

pr1nt(y.beginO. y.endO. у ):

Выполнение операции с каждой парой элементов х и у

с сохранением результата в г:

T(testBinary(x. у. г. plus<1nt>())):

T(testBinary(x. у. г. minus<int>())):

T(testBinary(x. у. г. multiplies<int>())):

T(testBinary(x. у. г. divides<int>())):

T(testBinary(x. у. г. modulus<1nt>())):

T(testUnary(x, г, negate<int>())):

vector<bool> br(SZ): Для логических результатов

B(testBinary(x. у. br, equal to<int>0)):

B(testBinary(x. у. br. not equal to<int>())):

B(testBinary(x. y, br. greater<int>0));



B(testBinary(x. у. Ьг. less<1nt>())): B(testBinary(x. у. Ьг. greater equal<int>())): B(testBinary(x. у, Ьг. less equal<int>())): B(testBinary(x. у, Ьг, not2(greater equal<int>()))): В(testBi nary(X.у.Ьг,not2(1ess equal<i nt>()))): vector<bool> bl(SZ). b2(SZ): generate n(bl.beg1n(). SZ, BRandO): generate n(b2.begin(). SZ. BRandO): printCbl.beginO. bl.endO. bl ): print(b2.beginO. b2.end(). b2 ): B(testBinary(bl. b2. br. logical and<int>())): B(testBinary(bl. b2. br. logical or<int>())); B(testUnary(bl, br. logical not<int>())): B(testUnary(bl. br. notl(logical not<int>()))): } III:-

В этом примере используется удобный шаблон функции print(), предназначенный для вывода произвольного интервала с необязательным сообщением. Он определяется в заголовочном файле PrintSequences.h, описанном далее в этой главе.

Две шаблонные функции автоматизируют процесс тестирования различных шаблонов объектов функций. Две - потому что объекты функций могут быть унарными или бинарными. Функция testUnaryQ получает исходный вектор, приемный вектор и объект унарной функции, который применяется к исходному вектору для получения приемного вектора. В testBinary() два исходных вектора передаются бинарной функции для получения приемного вектора. В обоих случаях шаблонные функции просто вызывают алгоритм transform(), который применяет унарную функцию или объект функции (четвертый параметр) к каждому элементу интервала. Результат записывается в интервал, определяемый третьим параметром; в данном случае он совпадает с исходным.

Для каждого теста выводится строка с кратким описанием и результаты. Препроцессор помогает автоматизировать процесс вывода; макросы Т() и В() получают выполняемое выражение. После вычисления интервал передается функции print(). При построении сообщения выражение преобразуется в строку средствами препроцессора. Это позволяет видеть код выражения, за которым следует полученный вектор.

Последний вспомогательный инструмент BRand представляет собой объект-генератор, выдающий случайные логические (bool) значения. Для этого он генерирует случайное число функцией rand() и проверяет, больше ли оно (RANDMAX + 1)/2. При равномерном распределении случайных чисел это условие выполняется в половине случаев.

В функции main() создаются три вектора типа int: х и у для исходных значений и г для результатов. Для инициализации х и у случайными значениями, не превышающими 50, используется генератор типа URandGen из Generators.h. Стандартный алгоритм generate n() заполняет интервал, заданный первым аргументом, вызывая свой третий аргумент (который должен быть генератором) заданное количество раз (определяется вторым аргументом). Поскольку в одной из операций элементы х делятся на элементы у, необходимо позаботиться о том, чтобы в у не было нулевых элементов. Задача также решается при помощи алгоритма transform(); исходные данные берутся из у, увеличиваются на 1, а результат снова записывается в у. Объект функции для выполнения этой операции выглядит так:

bind2nd(plus<int>(). 1)



В этом выражении объект функции plus используется для увеличения первого аргумента на 1. Как и прежде, мы используем адаптер для превращения бинарной функции в унарную, чтобы ее можно было применить к целому интервалу одним вызовом transform().

При другой проверке в программе элементы двух векторов сравниваются на равенство. Чтобы результат был более содержательным, по крайней мере одна пара элементов заведомо должна совпадать; в нащем примере выбирается элемент 0.

После вывода двух векторов все объекты функций, выдающие числовые значения, тестируются макросом Т(), а все объекты функций с логическими значениями тестируются макросом В(). Результат помещается в vector<bool>. При выводе этого вектора вместо элементов true выводятся единицы, а вместо false - нули. Ниже приводится результат выполнения программы FunctionObjects.cpp:

4 8 18 36 22 6 29 19 25 47

4 14 23 9 11 32 13 15 44 30

After testB1nary(x. у. г, plus<int>()):

В 22 41 45 33 38 42 34 69 77

After testB1nary(x. у. г. m1nus<int>()):

О -6 -5 27 11 -26 16 4 -19 17

After testB1nary(x, у, г. multiplies<int>()):

16 112 414 324 242 192 377 285 1100 1410

After testBinary(x. у, г. divides<int>()):

10 0 4 2 0 2 10 1

After testBinary(x. у. г, limit<1nt>()):

0 8 18 О О 6 3 4 25 17

After testUnary(x. г. negate<int>()):

-4 -8 -18 -36 -22 -6 -29 -19 -25 -47

After testBinary(x. у, br, equal to<int>()):

1 0 0 0 0 0 0 0 0 0

After testBinaryCx. y. br. not equal to<int>()): 0 111111111

After testBinaryCx. y. br, greater<int>()): 0 0 0 1 1 0 1 1 0 1

After testBinaryCx, y, br, less<int>()):

0 1 1 0 0 1 0 0 1 0

After testBinaryCx, y. br, greater equal<int>C)): 10 0 110 110 1

After testBinaryCx. y, br, less equal<int>C)):

1 1 1 0 0 1 0 0 1 0

After testBinaryCx, y, br. not2Cgreater equal<int>C))): 0 1 1 0 0 1 0 0 1 0

After testBi naryС X,у,br.not2C1ess equa 1 <i nt>С))):

0 0 0 1 1 0 1 1 0 1

0 1 1 0 0 0 1 0 1 1 b2:

0 1 1 0 0 0 1 0 1 1

After testBinaryCbl, b2, br, logical and<int>C)): 0 1 1 0 0 0 1 0 1 1

After testBinaryCbl. b2. br. logical or<int>C)): 0 1 1 0 0 0 1 0 1 1

After testUnaryCbl, br, logical not<int>C)): 10 0 1110 10 0

After testUnaryCbl, br, notlClogical not<int>C))): 0 1 1 0 0 0 1 0 1 1



1 ... 80 81 82 [ 83 ] 84 85 86 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика