В чем ошибка ?Помогите, пожалуйста

192
24 марта 2018, 16:42
#include <iostream>
#include <cmath> 
using namespace std;
template<typename T>
class Matrix
{
public:
class wrong_size {};
class wrong_mult {};
void get_size(int h, int w)//размер массива
{
    height = h;
    width = w;
}
int give_h()//высот массива
{
    return height;
}
int give_w()//выдать массив
{
    return width;
}
void creation()//создать массив
{
    a = new T*[height];
    for (int i = 0; i < height; i++)
        a[i] = new T[width];
}
void get_val(int i, int j, T val)//присвоение эл-ту массива значениe
{
    a[i][j] = val;
}
friend istream& operator>>(istream& os, Matrix& z)
{
    for (int i = 0; i < z.height; i++)
        for (int j = 0; j < z.width; j++)
            os >> z.a[i][j];
    return os;
}
friend ostream& operator<<(ostream& os, Matrix& z)
{
    for (int i = 0; i < z.height; i++)
    {
        for (int j = 0; j < z.width; j++)
            os << z[i][j] << " ";
        os << endl;
    }
    return os;
}
T* operator[](int i)
{
    return a[i];
}
Matrix operator+(Matrix sl)
{
    if (height == sl.height && width == sl.width)
    {
        Matrix i;
        i.get_size(height, width);
        i.creation();
        for (int k = 0; k < height; k++)
            for (int j = 0; j < width; j++)
                i.get_val(k, j, (a[k][j] + sl[k][j]));
        return i;
    }
    else throw wrong_size();
}
Matrix  operator-(Matrix  sl)
{
    Matrix  i;
    if (height == sl.height && width == sl.width)
    {
        i.get_size(height, width);
        i.creation();
        for (int k = 0; k < height; k++)
            for (int j = 0; j < width; j++)
                i.get_val(k, j, (a[k][j] - sl[k][j]));
        return i;
    }
    else throw wrong_size();
}
Matrix operator*(Matrix sl)
{
    Matrix i;
    T sum = 0;
    if (sl.height == width)
    {
        i.get_size(height, sl.width);
        i.creation();
        for (int k = 0; k < height; k++)
            for (int j = 0; j < sl.width; j++)
            {
                for (int z = 0; z < height; z++)
                    sum += a[k][z] * sl[j][z];[![введите сюда описание изображения][1]][1]
                i.get_val(k, j, sum);
                sum = 0;
            }
        return i;
    }
    else throw wrong_mult();
}
private:
T **a;
int width, height;
};
template <typename T>
void LOG(Matrix<T> &c)//функция заменяющая все эл-ты массива на их 
абсолютные величины
{
for (int i = 0; i < c.give_h(); i++)
    for (int j = 0; j < c.give_w(); j++)
        if (c[i][j] > 0)
        {
            c.get_val(i, j, log(c[i][j]));
            cout << c[i][j];
            cout << endl;
        };
}
template<typename T>
void Min(Matrix<T>&d)
{
T min = d[0][0];
for (int i = 0; i < d.give_h(); i++)
    for (int j = 0; j < d.give_w(); j++)
        if (d[i][j] <= min)
            min = d[i][j];
 cout << min<<endl;
}
template<typename T>
void main()
{
try
{
    Matrix<int> a1, b1, c;
    int h, w;
    cout << "Enter m";
    cin >> h;
    cout << "Enter n";
    cin >> w;
    a1.get_size(h, w);
    a1.creation();
    cout << "Mas1:" << endl;
    cin >> a1;
    cout << "Enter k";
    cin >> h;
    cout << "Enter l";
    cin >> w;
    b1.get_size(h, w);
    b1.creation();
    cout << "Mas2:" << endl;
    cin >> b1;
    c = a1 + b1;
    cout << "Sum " << endl;
    cout << c << endl;
    c = a1 - b1;
    cout << "Dif " << endl;
    cout << c << endl;
    c = a1 * b1;
    cout << "Prod " << endl;
    cout << c;
    cout << "\n=====================\nLog:\n";
    LOG(a1);
    cout << "======================\nMin mas1:\n";
    Min(a1);
    cout << "======================\nMin mas2:\n";
Min(b1);
    cout << "======================\n";
}
catch (Matrix<T>::wrong_mult)
{
    cout << "ERROR" << endl;
}
catch (Matrix<T>::wrong_size)
{
    cout << "The matrix does not fit in size" << endl;
}
system("pause");

} }

Answer 1

Во-первых, необходимо оформить вопрос как положено.

А так, на первый взгляд, в

int give_w()//выдать массив
{
    return width;
}

вы выдаете не массив, а переменную width. И еще, вы правда считаете, что void get_val(int i, int j, T val)//присвоение эл-ту массива значениe - действительно удачное название для функции, которая присваивает значение? Названия должны быть осмысленными, а так вы себя сами путаете.

READ ALSO
QModbusDataUnit + float

QModbusDataUnit + float

Добрый день! Подскажие как получить float значения? Код для чтения регистров

216
Неочевидная утечка памяти

Неочевидная утечка памяти

Есть два сервера с идентичным ПО, железом и рабочим окружениемОС старый добрый 6 дебиан

178
Как найти следующее четное число?

Как найти следующее четное число?

на вход дается положительное целое число, нужно найти последующее четное число, причем программа должна быть БЕЗ использования условного...

286