Форум программистов, компьютерный форум CyberForum.ru

непонятное явление при перегрузке умножения в классе матриц - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Три задачки по двумерным массивам http://www.cyberforum.ru/cpp-beginners/thread411491.html
Дана матрица В(4;4): 1) Найти произведение положительных элементов среди элементов расположенных выше побочной диагонали матрицы В. (!) Я в ужасе... 2) Найти минимальный элемент во 2-м столбце матрицы В 3) Поменять местами найденный минимальный элемент и элемент находящийся в 4 строке, 3 столбце. Прошу прощения за наглость - но надо-бы код целиком :) 2 и 3 я думаю сделаю, а вот от 1 просто...
C++ проблема - при выводе переменных, их значения изменяются Проблема в элементарном коде, после присваивания переменной `result1` значения `n+++m--`, значения `n` и `m`, тоже изменяются, что за ерунда?? Допустим вводим `n=2` и `m=3`, после присваивания `result1=n+++m--`, `n=3`, а `m=2`. Это лабораторная по C++, в основном пишу на С#, таких проблем не было. float m, n, x, result, result1, result2; cout << "Введите n: "; cin >> n; // ввод m ... http://www.cyberforum.ru/cpp-beginners/thread411485.html
Вывод всех n-значных чисел C++
Вывод всех Х значных (х<=10) десятичных чисел, сумма цифр крирпых равна данному целому цислу P<90. Число X и P вводится с клавиатуры.
Программа банк C++
Сумма S рублей положена в сбербанк, при этом ежегодный прирост составляет P% и считается непрерывным. Определить, через сколько лет первоначальная сумма увеличится в N раз. Числа S<=1kk; P<=100; N<=10. Ввод с клавиатуры.
C++ Найти, каких символов больше точек или запятых на С++ http://www.cyberforum.ru/cpp-beginners/thread411439.html
Дана последовательность из н символов найти каких символов больше точек или запятых Создавайте темы с осмысленными и понятными названиями - это серьезно повышает шансы, что на ваш вопрос ответят. Запрещено создавать темы с бессмысленными названиями вроде "Помогите!", "Вопрос" и т.п.
C++ mingw ./configure --prefix Добрый день. Собираю gstreamer под винду. Где посмотреть толковое объяснение значения опции prefix? Или может, кому-то не лень на месте объяснить. Вопрос в таком плане: что это ещё такое, кроме того, что это в итоге путь к корню для установки для make install? Можно ли его изменять при make install, или только при .configure? И можно ли сделать так, чтобы ./configure искал... подробнее

Показать сообщение отдельно
Yakoot
15 / 15 / 2
Регистрация: 13.11.2011
Сообщений: 65
26.11.2012, 15:25  [ТС]     непонятное явление при перегрузке умножения в классе матриц
сейчас гляну, может осталось)

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//matrix.h
#pragma once
 
#include <iostream>
 
class matrix
{
private:
    int n, m;
    double *p;
public:
    matrix();   
    explicit matrix(int, double [] = NULL);
    matrix(int, int, double [] = NULL);
    matrix(const matrix &);
    ~matrix();
    bool check_plus(const matrix &) const;
    bool check_mult(const matrix &) const;
    double max() const;
    double min() const;
    friend std::ostream &operator <<(std::ostream &, const matrix&);
    const double *operator [](int) const;
    double *operator [](int);
    matrix &operator =(const matrix &);
    friend matrix &operator +=(matrix &, const matrix &);
    matrix &operator -=(const matrix &);
    matrix &operator *=(const matrix &);
    matrix &operator *=(double);
    matrix operator +(const matrix &) const;
};
 
//matrix operator +(const matrix &, const matrix &);
matrix operator -(const matrix &, const matrix &);
matrix operator *(const matrix &, const matrix &);
matrix operator *(const matrix &, double);
matrix operator *(double, const matrix &);
matrix &operator +=(matrix &, const matrix &);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
//matrix.cpp
 
#include <stdafx.h>
#include "matrix.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
matrix::matrix()
{
    p = NULL;
    n = m = 0;
    cout << "Defaul constructor " << this << endl;
}
matrix::matrix(int a, double arr[])
{
    if (a <= 0 || arr == NULL)
    {
        p = NULL;
        n = m = 0;
        cout << "Wrong arguments, defaul constructor " << this << endl;
    }
    else
    {
        n = a;
        m = a;        
        p = new double[n*m];
        for (int i = 0; i < n*n; i++)
            p[i] = arr ? arr[i] : 0.0;
        cout << "Constructor of square matrix " << n << "x" << m <<" " << this << endl;
    }
}
matrix::matrix(int a, int b, double arr[])
{
    if (a <= 0 || b <= 0 || arr == NULL)
    {
        p = NULL;
        n = m = 0;
        cout << "Wrong arguments, defaul constructor " << this << endl;
    }
    else
    {
        n = a;
        m = b;
        p = new double[n*m];
        for (int i = 0; i < n*m; i++)
            p[i] = arr != NULL ? arr[i] : 0.0;
        cout << "Constructor of rectangular matrix " << n << "x" << m <<" " << this << endl;
    }
}
matrix::matrix(const matrix &a)
{
    if (a.p != NULL)
    {
        n = a.n;
        m = a.m;
        p = new double[n*m];
        for (int i = 0; i < n*m; i++)
            p[i] = a.p[i];
    }
    else
    {
        p = NULL;
        n = m = 0;
    }
    cout << "Copy constructor " << this << endl;
}
 
matrix::~matrix()
{
    if(p != NULL) delete [] p;
    cout << "Default destructor " << this << endl;
}
bool matrix::check_plus(const matrix &a) const
{   
        return a.n == n && a.m == m;
}
bool matrix::check_mult(const matrix &a) const
{
    return a.m == n;
}
double matrix::max() const
{
    if (p != NULL)
    {
        double max = p[0];
        for (int i = 0; i < n*m; i++)
        {
            if (p[i] > max)
                max = p[i];
        }
        return max;
    }
    else
        throw "Matrix is empty";    
}
double matrix::min() const
{
    if (p != NULL)
    {
        double min = p[0];
        for (int i = 0; i < n*m; i++)
        {
            if (p[i] < min)
                min = p[i];
        }
        return min;
    }
    else
        throw "Matrix is empty";
}
std::ostream &operator <<(std::ostream& out, const matrix &c)
{
    for (int i = 0; i < c.n; i++)
    {
        for (int j = 0; j < c.m; j++) {
            out << setw(4) << c[i][j];
        }
        out << endl;
    }
    return out;
}
 
const double *matrix::operator [](int a) const
{
    if (a < 0 || a >= n)
        throw "Error: wrong string number";
    else
        return &p[a*m];
}
double *matrix::operator [](int a)
{
    if (a < 0 || a >= n)
        throw "Error: wrong string number";
    else
        return &p[a*m];
}
 
matrix &matrix::operator =(const matrix &a)
{
    if (this == &a) return *this;
    if (a.n*a.m != n*m)
    {
        if(p != NULL) delete [] p;
        p = a.m*a.n == 0 ? NULL : new double[a.m*a.n];
    }
    m = a.m;
    n = a.n;
    for (int i = 0; i < n*m; i++)
        p[i] = a.p[i];        
    return *this;
}
matrix &operator +=(matrix &a, const matrix &b)
{
    if(a.check_plus(b))
    {
        for (int i = 0; i < (a.m*a.n); i++)
                a.p[i] += b.p[i];
        return a;
    }
    else
        throw "Error: wrong sizes";
}
 
matrix &matrix::operator -=(const matrix &a)
{
    if(this->check_plus(a))
    {
        for (int i = 0; i < (m*n); i++)
            p[i] -= a.p[i];
        return *this;
    }
    else
        throw "Error: wrong sizes";
}
 
 
matrix &matrix::operator *=(const matrix &a)
{
    if (this->check_mult(a))
    {
        double *tmp;
        tmp = new double[n*a.m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < a.m; j++)
            {
                tmp[a.m*i+j] = 0;
                for (int k = 0; k < m; k++)
                    tmp[a.m*i+j] += p[i*n+k]*a.p[k*a.m+j];
            }
        for (int i = 0; i < n*a.m; i++)
            p[i] = tmp[i];
        m = a.m;
        return *this;
    }
    else
        throw "Error: wrong sizes";
}
 
 
matrix &matrix::operator *=(double k)
{
    for (int i = 0; i < n*m; i++)
        p[i] *= k;
    return *this;
}
 
matrix matrix::operator +(const matrix &b) const
{
    matrix tmp(b);
    tmp += *this;
    return tmp;
}
matrix operator -(const matrix &a, const matrix &b)
{
    matrix tmp(a);
    tmp -= b;
    return tmp;
}
matrix operator *(const matrix &a, const matrix &b)
{
    matrix tmp(a);
    tmp *= b;
    return tmp;
}
 
matrix operator *(const matrix &a, double k)
{
    matrix tmp(a);
    tmp *= k;
    return tmp;
}
 
matrix operator *(double k, const matrix &a)
{
    matrix tmp(a);
    tmp *= k;
    return tmp;
}
Добавлено через 51 секунду
это уже с какими-то его дополнительными заданиями, не оригинал, там вон перегрузка сложения закомменчена, не помню зачем)
 
Текущее время: 11:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru