На этом шаге мы рассмотрим использование трансцендентных функций.
Трансцендентные функции (тригонометрические и экспоненциальные) определяются по аналогии с математическими операторами. Соответствующая операция также выполняется со всеми элементами массива. Для бинарных операций один операнд может быть отдельным значением, а второй операнд - содержать все элементы массива значений.
Все эти операции определяются в виде глобальных функций (а не в виде функций класса). Это сделано для того, чтобы обеспечить автоматическое преобразование типов подмножеств элементов для обоих операндов.
Второй пример с массивами значений демонстрирует использование трансцендентных операций:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <valarray> #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } // Вывод массива значений template <class T> void printValarray (const valarray<T>& va) { for (int i=0; i<va.size(); i++) { cout << va[i] << ' '; } cout << endl; } int main (int argc, char* argv[]) { // Создание и инициализация массивов значений с девятью элементами valarray<double> va(9); for (int i=0; i<va.size(); i++) { va[i] = i * 1.1; } // Вывод массива значений cout << ToRus("Исходный массив:\n"); printValarray(va); // Удвоение элементов массива va *= 2.0; // Повторный вывод массива значений cout << ToRus("Вывод массива после удвоения элементов:\n"); printValarray(va); // Создание второго массива значений, инициализированного // элементами первого массива, увеличенными на 10 valarray<double> vb(va+10.0); // Вывод второго массива значений cout << ToRus("Второй массив:\n"); printValarray(vb); // Создание третьего массива значений и его инициализация // результатом выполнения операций с обоими существующими массивами. valarray<double> vc; vc = sqrt(va) + vb/2.0 - 1.0; // Вывод третьего массива значений cout << ToRus("Третий массив:\n"); printValarray(vc); getch(); return 0; } //---------------------------------------------------------------------------
Приведем текст этого приложения, созданного в среде Visual Studio 2005.
// pr431_1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <cmath> #include <valarray> #include <conio.h> //необходимо для getch() using namespace std; // Вывод массива значений template <class T> void printValarray (const valarray<T>& va) { for (int i=0; i < va.size(); i++) { cout << va[i] << ' '; } cout << endl; } int _tmain(int argc, _TCHAR* argv[]) { locale::global(locale("rus")); // Создание и инициализация массивов значений с девятью элементами valarray<double> va(9); for (int i=0; i < va.size(); i++) { va[i] = i * 1.1; } // Вывод массива значений cout << "Исходный массив:\n"; printValarray(va); // Удвоение элементов массива va *= 2.0; // Повторный вывод массива значений cout << "Вывод массива после удвоения элементов:\n"; printValarray(va); // Создание второго массива значений, инициализированного // элементами первого массива, увеличенными на 10 valarray<double> vb(va+10.0); // Вывод второго массива значений // cout << ToRus("Второй массив:\n"); printValarray(vb); // Создание третьего массива значений и его инициализация // результатом выполнения операций с обоими существующими массивами. valarray<double> vc; vc = sqrt(va) + vb/2.0 - 1.0; // Вывод третьего массива значений cout << "Третий массив:\n"; printValarray(vc); getch(); return 0; }
Результат выполнения программы выглядит так:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим подмножества элементов в массивах значений.