Помогите плес горит лаба

  1. Реализуйте модуль, подключение которого перегружает операции помещения в поток вывода и извлечение из потока ввода для класса, содержащего методы разложения функции ln(1+x) в ряд Тейлора. На экран должно выводиться n первых слагаемых формулы Тейлора. Значение n определяет пользователь.

  2. Реализуйте модуль, пишите программу, реализующую класс для работы с целыми числами, не превышающими 254. Для данного класса реализуйте перегрузку операции сложения так, чтобы результатом сложения было побитовое ИЛИ.


Ответы (1 шт):

Автор решения: Arty

Вопрос 1

Решил помочь вам, закодировал решение вашей задачи в том виде в каком я понял вашу задачу.

Сделал даже немного больше, кроме вывода ряда в консоль ещё сделал ввод значения любой точки X и вывод значения ряда в этой точке, сделал это только для того чтобы проверить корректность закодированной формулы.

Не забудьте что нужно вводить такие a и x, что -1 < a*x < 1, иначе ряд не сойдётся.

Также ещё реализовал вариант кода ниже, но ряда Тейлора для функции cos(ax).

Смотрите пример ввода/вывода в конце моего ответа после кода.

Попробовать код онлайн!

// https://en.wikipedia.org/wiki/Taylor_series#Natural_logarithm

#include <vector>
#include <iostream>
#include <cmath>

class TaylorLog {
public:
    // Конструктор. Вычисления ряда Тейлора для заданных n, a.
    TaylorLog(size_t n, double a) {
        double k = -1;
        for (size_t i = 0; i < n; ++i) {
            // Коэффициент каждого следующего элемента получается из предыдущего путём домножения на -a.
            k *= -a;
            s_.push_back(k / (i + 1));
        }
    }
    // Вывод в поток (например консоль).
    void Dump(std::ostream & sout) const {
        for (size_t i = 0; i < s_.size(); ++i) {
            // Выводим i-й коэффициент плюс x степени (i+1).
            sout << s_[i] << " * x^" << (i + 1);
            if (i + 1 < s_.size())
                sout << " + ";
        }
    }
    // Вычисление ряда Тейлора.
    double Compute(double x) {
        double r = 0, k = 1;
        for (size_t i = 0; i < s_.size(); ++i) {
            // Вычисляется степень x итеративно.
            k *= x;
            // Каждое следующее слагаемое равно коэффициенту домноженному на k (степень x).
            r += s_[i] * k;
        }
        return r;
    }
private:
    std::vector<double> s_;
};

// Перегрузка оператора вывода в поток.
inline std::ostream & operator << (std::ostream & sout, TaylorLog const & tlog) {
    tlog.Dump(sout);
    return sout;
}

int main() {
    std::cout << "Enter n and a: ";
    size_t n = 0;
    double a = 0;
    std::cin >> n >> a;
    // Конструируем объект класса ряда Тейлора.
    TaylorLog tlog(n, a);
    // Выводим ряд в поток.
    std::cout << "Taylor serie for ln(1 + ax): " << tlog << std::endl;
    double x = 0;
    std::cout << "Enter x: ";
    std::cin >> x;
    std::cout << "Taylor serie value at point " << x << ": " << tlog.Compute(x) << std::endl;
    // Вычисляем точное значение используя стандартную std::log(num) функцию.
    std::cout << "Correct value of ln(1 + ax) at point " << x << ": " << std::log(1 + a * x) << std::endl;
}

Вывод:

Enter n and a: 7 2.5
Taylor serie for ln(1 + ax): 2.5 * x^1 + -3.125 * x^2 + 5.20833 * x^3 + -9.76562 * x^4 + 19.5312 * x^5 + -40.6901 * x^6 + 87.1931 * x^7
Enter x: 0.15
Taylor serie value at point 0.15: 0.31849
Correct value of ln(1 + ax) at point 0.15: 0.318454

Вопрос 2

Попробовать код онлайн!

#include <cstdint>
#include <iostream>

typedef uint8_t u8;

class Num {
public:
    Num(u8 n) : n_(n) {}
    Num(Num const & b) : n_(b.n_) {}
    Num & operator = (Num const & b) {
        n_ = b.n_;
        return *this;
    }
    Num & operator = (u8 n) {
        n_ = n;
        return *this;
    }
    Num & operator += (Num const & b) {
        n_ |= b.n_;
        return *this;
    }
    Num operator + (Num const & b) const {
        Num a = *this;
        a += b;
        return a;
    }
private:
    friend std::ostream & operator << (std::ostream &, Num const &);
    u8 n_ = 0;
};

inline std::ostream & operator << (std::ostream & s, Num const & n) {
    return (s << size_t(n.n_));
}

int main() {
    std::cout << std::hex << "0x" << (Num(0xAA) + Num(0x33)) << std::endl;
}

Вывод:

0xbb
→ Ссылка