Задать вопрос
@Gioo12x

Как исправить код?

Мне друг отправил код. В этом коде я нашол ошибку но не знаю как её исправить. Ошибка в том что в консоли 3 раза вызывается ввод матриц. Как исправить мне код чтоб водимыя матрицы (А и B) водились только один раз?
#include <iostream>
#include <random>
#include <ctime>
#include <iomanip>
using namespace std;
class Matrica
{
public:
    int n;
    double** a;
    Matrica()
    {
        cout << "Porydok matricy" << endl;
        cin >> n;
        a = new double* [n];
        cout << "Zapolnite matricy" << endl;
        for (int i = 0; i < 3; i++)
        {
            a[i] = new double[n];
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {

                cin >> a[i][j];
            }
        }
    }
    Matrica(const Matrica& ob)
    {
        n = ob.n;
        a = new double* [n];
        for (int i = 0; i < n; i++)
            a[i] = new double[n];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                a[i][j] = ob.a[i][j];

        cout << this << endl;
    }
    ~Matrica()
    {
        for (int i = 0; i < n; i++)
        {
            delete a[i];
        }
        delete[] a;
    }
    void Print()
    {
        cout << "Matrica:" << endl;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cout << a[i][j] << " ";
            }
           cout << endl;
        }
    }
    double Opredelitel()
    {
        return a[1][1] * a[2][2] * a[3][3] + a[1][2] * a[2][3] * a[3][1] + a[2][1] * a[3][2] * a[1][3] - a[1][1] * a[2][3] * a[3][2] - a[1][3] * a[2][2] * a[3][1] - a[3][3] * a[1][2] * a[2][1];
    }
    Matrica& operator=(const Matrica& ob)
    {
        if (n != ob.n)
        {
            // освобождение памяти в левом операнде
            for (int i = 0; i < n; i++)
                delete[] a[i];
            delete[] a;
            // выделение памяти в левом операнде
            n = ob.n;
            a = new double* [n];
            for (int i = 0; i < n; i++)
                a[i] = new double[n];
        }
        //Копирование данных правого операнда в левый
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                a[i][j] = ob.a[i][j];
        return *this;
    }
    Matrica operator-(const Matrica& ob)
    {
        Matrica result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                result.a[i][j] = a[i][j] - ob.a[i][j];
        return result;
    }

    //Перегрузка оператора смены знака
    Matrica operator-() const
    {
        Matrica result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                result.a[i][j] = -a[i][j];
        return result;
    }
    Matrica operator+(const Matrica& ob)
    {
        Matrica result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                result.a[i][j] = a[i][j] + ob.a[i][j];
        return result;
    }
    Matrica operator*(int p)
    {
        Matrica result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                result.a[i][j] = a[i][j] * p;
        return result;
    }
    Matrica operator* (const Matrica& ob)
    {
        Matrica result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < n; k++)
                    result.a[i][j] += a[i][k] * ob.a[k][j];
        return result;
    }
};
std::ostream& operator<<(std::ostream& os, const Matrica& ob)
{
    for (int i = 0; i < ob.n; ++i)
    {
        for (int j = 0; j < ob.n; ++j)
            os << setprecision(3) << ob.a[i][j] << "\t";
        os << "\n";
    }
    return os;
}


int main()
{
    Matrica A;
    A.Print();
    Matrica B;
    B.Print();
    //Matrica D;
    //D = A * B * 3 + (A - B) * A;
    //D.Print();
    cout << A * B * 3 + (A - B) * A;
    return 0;
}
  • Вопрос задан
  • 158 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
includedlibrary
@includedlibrary
Из-за того, что в конструкторе матрицы задан ввод (чего делать категорически не стоит), при умножении, сложении и вычитании матриц вызывается логика ввода:
Matrica operator+(const Matrica& ob)
    {
        Matrica result; // Вот здесь
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                result.a[i][j] = a[i][j] + ob.a[i][j];
        return result;
    }
    Matrica operator* (const Matrica& ob)
    {
        Matrica result; // и здесь
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < n; k++)
                    result.a[i][j] += a[i][k] * ob.a[k][j];
        return result;
    }
    Matrica operator-(const Matrica& ob)
    {
        Matrica result; // и здесь
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                result.a[i][j] = a[i][j] - ob.a[i][j];
        return result;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Эта программа считает определители 3 порядка. Теряется красота С++ и обобщение.

Математически можно считать определители 4 порядка через миноры матрицы понижая размерности до тех
пор пока мы не дойдем до 3 порядка рекурсивно. И тогда сработает формула с хардкодом

a[1][1] * a[2][2] * a[3][3] + a[1][2] * a[2][3] * a[3][1] + a[2][1] * a[3][2] * a[1][3] - a[1][1] * a[2][3] * a[3][2] - a[1][3] * a[2][2] * a[3][1] - a[3][3] * a[1][2] * a[2][1];


Так можно посчитать 5 и 6 порядок и выше.

Очень жаль что автор не фокусируется на сути, называя "код" просто "кодом". А ведь это метод расчета чего-то конкретного.

Представтье что музыкант любое произведение называл бы просто "нотами". Странно правда?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы