home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 February
/
Chip_2002-02_cd1.bin
/
chplus
/
funktor
/
f20_skladani_funkci.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2002-01-02
|
3KB
|
87 lines
//---------------------------------------------------------------------------
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cmath>
//---------------------------------------------------------------------------
// soubor: f20_skladani_funkci.cpp
// autor: Jaroslav Franek
// vytvoreno: 20011124
// copyright: (c) 2001 Jaroslav Franek
// umisteni: Chip CD, rubrika Chip Plus, 02/02
// reference: Jak se na funktor vola... II. dil, Chip 02/02
// testovano v : Borland C++ Builder 5.0
// Microsoft Visual C++ .NET 7.0 (beta2)
//
// komentar: piseme vlastni adapter - skladani klasickych funkci
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// adapter cSkladani
// umi slozit dve klasicke unarni funkce oboje typu 'double (*)(double)'
// (splnuje pozadavky Assignable, rozmyslete si sami, proc)
//
//---------------------------------------------------------------------------
typedef double (* FUNC)(double);
class cSkladani
{
public:
cSkladani(FUNC prvni, FUNC druha)
: prvni_(prvni),
druha_(druha)
{
}
double operator ()(double x)
{
return druha_(prvni_(x)); // zretezeni
}
private:
FUNC prvni_;
FUNC druha_;
};
//---------------------------------------------------------------------------
//
// ukazka, jak to funguje v praxi
//
//---------------------------------------------------------------------------
int main()
{
// nejdrive si pripravime pole
const int N = 9;
int pole[] = { -1, -2, 3, -4, 0, -6, 0, -8, 9 };
// a ted STL kontejner
std::vector<double> cisla(pole, pole + N); // N prvku, pole[i]
std::vector<double> odmocniny(N); // N prvku
//*******************************************************************
// kdybychom pouzili druhou odmocninu, neproslo by to,
// protoze tam mame zaporna cisla, takze nejdriv zavolame
// absolutni hodnotu a pak teprve druhou odmocninu
// vysledky ulozime do vektoru 'odmocniny'
std::transform(cisla.begin(), cisla.end(), odmocniny.begin(),
cSkladani(std::fabs, std::sqrt));
//*******************************************************************
// vypiseme si to
std::cout << "cisla : ";
std::copy(cisla.begin(), cisla.end(), std::ostream_iterator<double>(std::cout, " "));
std::cout << "\n"
"sqrt(abs(cisla1)) : ";
std::copy(odmocniny.begin(), odmocniny.end(), std::ostream_iterator<double>(std::cout, " "));
std::cout << std::endl;
// spravnost vysledku jiste dokazete overit sami
return 0;
}
//---------------------------------------------------------------------------