Попросили решить, но я не знаю как :(
Спасибо тому, кто подскажет идею.
Есть main.cpp, нужно чтобы он работал:
#include "quadrature.h"
#include <cmath>
#include <iostream>
#include <memory>
#include <string>
int main() {
using F = decltype(cos);
std::string input;
std::cin >> input;
std::unique_ptr<IntegrationMethod<F>> method;
if (input == "rectangle")
method.reset(new RectangleRule<F>);
else
method.reset(new TrapezoidalRule<F>);
double x, y;
std::cin >> x >> y;
int n;
std::cin >> n;
std::cout << method->Integrate(cos, x, y, n) << "\n";
std::cout << method->Integrate(sin, x, y, n) << "\n";
}
Я не знаю как именно реализовать три недостающих класса. Вот мой вариант, я знаю что он не правильный и не компилируется:
#ifndef __QUADRATURE_H__
#define __QUADRATURE_H__
template <typename F>
class IntegrationMethod
{
public:
virtual double Integrate(F func, double x, double y, int n)
{
return 0;
}
protected:
};
template <typename F>
class RectangleRule : public IntegrationMethod<F>
{
public:
double Intergrate (F func, double x, double y, int n) override
{
double value = 0;
double step = (y - x)/n;
for (double i = x+step/2; i < y; i += step)
{
value += func(i);
}
value *= step;
return value;
}
};
template <typename F>
class TrapezoidalRule : public IntegrationMethod<F>
{
public:
double Intergrate (F func, double x, double y, int n) override
{
double value = 0;
double step = (y - x)/n;
for (double i = x; i < y; i += step)
{
value += func(i);
}
value *= step;
return value;
}
};
#endif