Шаг 431.
Библиотека STL.
Числовые типы. Трансцендентные функции

    На этом шаге мы рассмотрим использование трансцендентных функций.

    Трансцендентные функции (тригонометрические и экспоненциальные) определяются по аналогии с математическими операторами. Соответствующая операция также выполняется со всеми элементами массива. Для бинарных операций один операнд может быть отдельным значением, а второй операнд - содержать все элементы массива значений.

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

    Второй пример с массивами значений демонстрирует использование трансцендентных операций:

//---------------------------------------------------------------------------

#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;
}

//---------------------------------------------------------------------------


   Замечание. К сожалению, эту программу не удалось выполнить в среде Borland C++ Builder 6.0 из-за отсутствия реализации функции _STLP_DO_SQRT. Все примеры в последующих шагах этой темы выполнены в среде Visual Studio 2005.

    Приведем текст этого приложения, созданного в среде 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. Результат работы приложения

    На следующем шаге мы рассмотрим подмножества элементов в массивах значений.




Предыдущий шаг Содержание Следующий шаг