home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 February / Chip_2002-02_cd1.bin / chplus / funktor / f20_skladani_funkci.cpp < prev    next >
C/C++ Source or Header  |  2002-01-02  |  3KB  |  87 lines

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <functional>
  7. #include <cmath>
  8.  
  9. //---------------------------------------------------------------------------
  10. //  soubor:    f20_skladani_funkci.cpp
  11. //  autor:     Jaroslav Franek
  12. //  vytvoreno: 20011124
  13. //  copyright: (c) 2001 Jaroslav Franek
  14. //  umisteni:  Chip CD, rubrika Chip Plus, 02/02
  15. //  reference: Jak se na funktor vola... II. dil, Chip 02/02
  16. //  testovano v : Borland C++ Builder 5.0
  17. //                Microsoft Visual C++ .NET 7.0 (beta2)
  18. //
  19. //  komentar:  piseme vlastni adapter - skladani klasickych funkci
  20. //---------------------------------------------------------------------------
  21.  
  22. //---------------------------------------------------------------------------
  23. //
  24. //  adapter cSkladani
  25. //  umi slozit dve klasicke unarni funkce oboje typu 'double (*)(double)'
  26. //  (splnuje pozadavky Assignable, rozmyslete si sami, proc)
  27. //
  28. //---------------------------------------------------------------------------
  29.  
  30. typedef double (* FUNC)(double);
  31.  
  32. class cSkladani
  33. {
  34. public:
  35.    cSkladani(FUNC prvni, FUNC druha)
  36.       : prvni_(prvni),
  37.         druha_(druha)
  38.       {
  39.       }
  40.    double operator ()(double x)
  41.       {
  42.          return druha_(prvni_(x));  // zretezeni
  43.       }
  44. private:
  45.    FUNC prvni_;
  46.    FUNC druha_;
  47. };
  48.  
  49. //---------------------------------------------------------------------------
  50. //
  51. //  ukazka, jak to funguje v praxi
  52. //
  53. //---------------------------------------------------------------------------
  54.  
  55. int main()
  56. {
  57.    // nejdrive si pripravime pole
  58.    const int N = 9;
  59.    int pole[] = { -1, -2, 3, -4, 0, -6, 0, -8, 9 };
  60.  
  61.    // a ted STL kontejner
  62.    std::vector<double> cisla(pole, pole + N);   // N prvku, pole[i]
  63.    std::vector<double> odmocniny(N);            // N prvku
  64.  
  65. //*******************************************************************
  66.    // kdybychom pouzili druhou odmocninu, neproslo by to,
  67.    // protoze tam mame zaporna cisla, takze nejdriv zavolame
  68.    // absolutni hodnotu a pak teprve druhou odmocninu
  69.    // vysledky ulozime do vektoru 'odmocniny'
  70.    std::transform(cisla.begin(), cisla.end(), odmocniny.begin(),
  71.                   cSkladani(std::fabs, std::sqrt));
  72. //*******************************************************************
  73.  
  74.    // vypiseme si to
  75.    std::cout << "cisla     : ";
  76.    std::copy(cisla.begin(), cisla.end(), std::ostream_iterator<double>(std::cout, "  "));
  77.    std::cout << "\n"
  78.                 "sqrt(abs(cisla1)) : ";
  79.    std::copy(odmocniny.begin(), odmocniny.end(), std::ostream_iterator<double>(std::cout, "  "));
  80.    std::cout << std::endl;
  81.  
  82.    // spravnost vysledku jiste dokazete overit sami
  83.  
  84.    return 0;
  85. }
  86. //---------------------------------------------------------------------------
  87.