/* * highorder.cpp * * Created on: 21.01.2014 * Author: trifon */ #include #include using namespace std; double sum(int n, double(*f)(double), int(*next)(int)) { double s = 0; for(int i = 1; i <= n; i = next(i)) s += f(i); return s; } double product(int a, int b) { double p = 1; for(int i = a; i <= b; i++) p *= i*i; return p; } int plus1(int i) { return i + 1; } int mult2(int i) { return i * 2; } typedef int (*next_function)(int); typedef double (*term_function)(double); typedef double (*operation)(double,double); double accumulate (operation op, double base_value, double a, double b, term_function f, next_function next) { double s = base_value; for(int i = a; i <= b; i = next(i)) s = op(s, f(i)); return s; } double mult(double x, double y) { return x * y; } double pl(double x, double y) { return x + y; } double square(double x) { return x * x; } double X; double const_fun(double i) { return X; } double power(double x, int n) { X = x; return accumulate(mult, 1, 1, n, const_fun, plus1); } double id(double x) { return x; } double fact(int n) { return accumulate(mult, 1, 1, n, id, plus1); } double exp_term(double i) { return power(X, i) / fact(i); } double my_exp(double x, int n) { X = x; return accumulate(pl, 0, 0, n, exp_term, plus1); } // цяло число //int choose_function; // функция, която връща цяло число //int choose_function(int n); // указател към функция //double (*choose_function)(double); // функция, която връща указател към функция //double (*choose_function)(double)(int n) { // ужас!!! //} // по-добре term_function choose_function(int n) { switch(n) { case 1: return sin; case 2: return cos; case 3: return exp; case 4: return log; } } term_function F; double derive_result(double x) { const double DELTA = 1E-5; return (F(x + DELTA) - F(x)) / DELTA; } term_function derive(term_function f) { F = f; return derive_result; } void choosetest() { cout << "Изберете функция: "; int n; cin >> n; term_function f = choose_function(n); cout << "Въведете число: "; double x; cin >> x; cout << "f(x) = " << f(x) << endl; } int main() { cout << sum(4, sin, plus1) << endl; cout << accumulate(pl, 0, 1, 4, sin, plus1) << endl; cout << sum(4, cos, mult2) << endl; cout << accumulate(pl, 0, 1, 4, cos, mult2) << endl; cout << product(5, 7) << endl; cout << accumulate(mult, 1, 5, 7, square, plus1) << endl; cout << power(2, 5) << endl; cout << fact(5) << endl; cout << my_exp(1, 10) << endl; //choosetest(); term_function fp = derive(square); cout << fp(5) << endl; cout << derive(square)(5) << endl; cout << derive(sin)(5) << ' ' << cos(5) << endl; return 0; }