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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lokosios
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 27
#1

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

28.05.2012, 11:03. Просмотров 562. Ответов 9
Метки нет (Все метки)

В общем, не могу доделать доступ по индексу - не знаю, как избавиться от ошибки.
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
#include "iostream"
#include "ctime"
#include "stdlib.h"
#include <cstdlib>
 
 
using namespace std;
 
class Matrix
{
    int m; // количество строк
    int n; // количество столбцов
    double **Matr;
public:
    Matrix(int _n, int _m);
 
    void MatrixInit(int, int);
    void random_put();
 
    Matrix operator+(Matrix );
 
    Matrix operator+(int );
    Matrix operator+(double );
 
    void operator=(int );
    void operator=(double );
 
    double operator()(int, int);
 
    void Print();
 
};
 
Matrix::Matrix(int _n, int _m)
{
    n = _n;
    m = _m;
    Matr = new double*[m];
    for(int i=0; i<m; i++)
        Matr[i]=new double[n];
}
 
void Matrix::random_put()
{
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<n; j++)
        {
            cout<<"Vvedite ["<<i<<"]["<<j<<"] element: ";cin>>Matr[i][j];
        }
    }
}
 
Matrix Matrix::operator+(Matrix A)
{
    Matrix temp(A.n, A.m);
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            temp.Matr[i][j]=Matr[i][j] + A.Matr[i][j];
    return temp;
}
 
Matrix Matrix::operator+(int A)
{
    Matrix temp(n, m);
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            temp.Matr[i][j]=Matr[i][j] + A;
    return temp;
}
 
Matrix Matrix::operator+(double A)
{
    Matrix temp(n, m);
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            temp.Matr[i][j]=Matr[i][j] + A;
    return temp;
}
 
void Matrix::operator=(int A)
{
 
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            Matr[i][j]= A;
 
}
 
void Matrix::operator=(double A)
{
 
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            Matr[i][j]= A;
 
}
 
double Matrix::operator()(int index, int index2)
{
    if(index >= 0 && index2 >= 0)
        if( index <= n && index2 <= m)
            return Matr[index][index2];
        else
            cout << "error index";
    else
        cout << "error index";
}
 
void Matrix::Print()
{
    for(int i=0; i<m; i++)
    {
        cout << endl;
        for(int j=0; j<n; j++)
            cout << Matr[i][j] << " ";
    }
    cout <<endl;
}
 
int main()
{
   int i, j, t, index2, index;
    cout << "Vvedite razmer matrici, i = ";
    cin >> i;
    cout << "Vvedite razmer matrici, j = ";
    cin >> j;
    Matrix Q(i,j);
    Q.random_put();
    cout << "Pervaya matrica:";
    Q.Print();
 
    Matrix W(i,j);
    W.random_put();
    cout << "Vtoraya matrica:";
    W.Print();
 
    cout << "Rezultat slozhenia matric:";
    W = Q + W;
    W.Print();
    cout << "Vvedite chislo, t = ";
    cin >> t;
    W = Q + t;
    W.Print();
 
    cout << "Vvedite pervii indeks, i = ";
    cin >> index;
    cout << "Vvedite vtoroi indeks, j = ";
    cin >> index2;
{
       if(index >= 0 && index2 >= 0)
        if( index <= i && index2 <= j)
            return Matrix.Matr[index][index2];     expected primary-expression before '.' token
        else    cout << "error index";
    else    cout << "error index";
}
}
Добавлено через 50 минут
Неужели никто не знает?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 11:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно дореализовать доступ по индексу в матрице (C++):

std::vector доступ по индексу vs доступ по итератору - C++
std::vector&lt;int&gt; tmp; int i = 0; tmp.resize(1000000); std::vector&lt;int&gt;::iterator it = tmp.begin(); for (int m = 0;...

Доступ по индексу после передачи дека в функцию - C++
Здравствуйте. template&lt;class P&gt; void Input(deque&lt;P&gt; *MyD, P s) { int i = 0; int size = MyD-&gt;size(); for (P y = s;i &lt;...

Класс: Двухмерный массив ([]-доступ по индексу,+-сложение матриц,--транспонирование матрицы) - C++
помогите пожалуйста,создать программу,где реализован класс-матрица.требуется перегрузить -доступ по индексу,+-сложение...

Дореализовать класс Вектор - C++
Добрый день ! У меня есть класс Вектор, в котором вектор является одномерным динамическим массивом и есть класс Матрица, в которой...

[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу - C++
По заданию требуется: 1) Создать функцию void Insert(Person&amp; person, int index), помещающую переменную типа Person по указанному...

Нужно чтобы менялся столбец со строкой в матрице - C++
Вот номера 3)11 4)9 6)12 7)7 8)13 9) матрица, вводиться целочисленная матрица с клавиатуры,ввод 2 целых чисел(номер строки и столбца) нужно...

9
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
28.05.2012, 11:08 #2
C++
1
2
3
4
5
6
7
8
class Matrix {
    //...
    double** Matr;
public:
    //...
    double* operator[ ](int m) { return Matr[m]; }
    const double* operator[ ](int m) const { return Matr[m]; }
};
0
Lokosios
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 27
28.05.2012, 11:50  [ТС] #3
Не решило проблему, по-прежнему не компилится.
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
28.05.2012, 14:24 #4
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
#ifndef MATRIX_H
#define MATRIX_H
 
#   include <exception>
 
    class MatrixLine {
        friend class Matrix;
        const unsigned n;
        double* const data;
 
        MatrixLine(double*, unsigned);
        void operator=(const MatrixLine& m) { }
    public:
        double& operator[ ](unsigned) throw (std::exception);
        const double& operator[ ](unsigned) const throw (std::exception);
    };
 
    class Matrix {
        unsigned m, n;
        double* data;
    public:
        Matrix(unsigned = 1, unsigned = 1) throw (std::exception);
        Matrix(const Matrix&);
        ~Matrix();
 
        Matrix operator-() const;
        Matrix operator+(const Matrix&) const;
        Matrix operator+(const double&) const;
        Matrix operator-(const Matrix&) const;
        Matrix operator-(const double& d) const { return *this + -d; }
        Matrix operator*(const Matrix&) const;
        Matrix operator*(const double&) const;
        Matrix operator/(const Matrix&) const;
        Matrix operator/(const double& d) const { return *this * (1. / d); }
        Matrix& operator=(const Matrix&);
        Matrix& operator=(const double&);
 
        MatrixLine operator[ ](unsigned) throw (std::exception);
        const MatrixLine operator[ ](unsigned) const throw (std::exception);
    };
 
#endif
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
#include "Matrix.h"
 
using namespace std;
 
MatrixLine::MatrixLine(double* d, unsigned dim):
    data(d),
    n(dim)
{
}
 
double& MatrixLine::operator[ ](unsigned d2) throw (exception) {
    if (d2 < n)
        return data[d2];
    throw exception();
}
 
const double& MatrixLine::operator[ ](unsigned d2) const throw (exception) {
    if (d2 < n)
        return data[d2];
    throw exception();
}
 
 
Matrix::Matrix(unsigned d1, unsigned d2) throw (exception) {
    if (!d1 || !d2)
        throw exception();
    m = d1;
    n = d2;
    data = new double[m * n];
}
 
Matrix::Matrix(const Matrix& mx) {
    m = mx.m;
    n = mx.n;
    data = new double[m * n];
}
 
Matrix::~Matrix() {
    delete[ ] data;
}
 
Matrix Matrix::operator-() const {
    Matrix result(m, n);
    for (unsigned i = 0, j; i < m; i++)
        for (j = 0; j < n; j++)
            result.data[j * m + i] = -data[j * m + i];
    return result;
}
 
Matrix Matrix::operator+(const Matrix& mx) const {
    Matrix result(m, n);
    const unsigned m1 = (m < mx.m)? m: mx.m,
        n1 = (n < mx.n)? n: mx.n;
    for (unsigned i = 0, j; i < m1; i++)
        for (j = 0; j < n1; j++)
            result.data[j * m + i] = data[j * m + i] + mx.data[j * m + i];
    return result;
}
 
Matrix Matrix::operator+(const double& d) const {
    Matrix result(m, n);
    for (unsigned i = 0, j; i < m; i++)
        for (j = 0; j < n; j++)
            result.data[j * m + i] = data[j * m + i] + d;
    return result;
}
 
Matrix Matrix::operator-(const Matrix& mx) const {
    Matrix result(m, n);
    const unsigned m1 = (m < mx.m)? m: mx.m,
        n1 = (n < mx.n)? n: mx.n;
    for (unsigned i = 0, j; i < m1; i++)
        for (j = 0; j < n1; j++)
            result.data[j * m + i] = data[j * m + i] - mx.data[j * m + i];
    return result;
}
 
Matrix Matrix::operator*(const Matrix& mx) const {
    Matrix result(m, n);
    const unsigned m1 = (m < mx.m)? m: mx.m,
        n1 = (n < mx.n)? n: mx.n;
    for (unsigned i = 0, j; i < m1; i++)
        for (j = 0; j < n1; j++)
            result.data[j * m + i] = data[j * m + i] * mx.data[j * m + i];
    return result;
}
 
Matrix Matrix::operator*(const double& d) const {
    Matrix result(m, n);
    for (unsigned i = 0, j; i < m; i++)
        for (j = 0; j < n; j++)
            result.data[j * m + i] = data[j * m + i] * d;
    return result;
}
 
Matrix Matrix::operator/(const Matrix& mx) const {
    Matrix result(m, n);
    const unsigned m1 = (m < mx.m)? m: mx.m,
        n1 = (n < mx.n)? n: mx.n;
    for (unsigned i = 0, j; i < m1; i++)
        for (j = 0; j < n1; j++)
            result.data[j * m + i] = data[j * m + i] / mx.data[j * m + i];
    return result;
}
 
Matrix& Matrix::operator=(const Matrix& mx) {
    m = mx.m;
    n = mx.n;
    delete[ ] data;
    data = new double[m * n];
    for (unsigned i = 0, j; i < m; i++)
        for (j = 0; j < n; j++)
            data[j * m + i] = mx.data[j * m + i];
    return *this;
}
 
Matrix& Matrix::operator=(const double& d) {
    for (unsigned i = 0, j; i < m; i++)
        for (j = 0; j < n; j++)
            data[j * m + i] = d;
    return *this;
}
 
MatrixLine Matrix::operator[ ](unsigned d1) throw (exception) {
    if (d1 < m)
        return MatrixLine(data + d1 * n, n);
    throw exception();
}
 
const MatrixLine Matrix::operator[ ](unsigned d1) const throw (exception) {
    if (d1 < m)
        return MatrixLine(data + d1 * n, n);
    throw exception();
}
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
#include <conio.h>
#include <iostream>
#include "Matrix.h"
 
using namespace std;
 
void PrintMx(const Matrix& mx) {
    for (int i = 0, j; i < 2; i++) {
        for (j = 0; j < 3; j++)
            cout << mx[i][j] << ' ';
        cout << endl;
    }
}
 
void ScanMx(Matrix& mx) {
    for (int i = 0, j; i < 2; i++)
        for (j = 0; j < 3; j++)
            cin >> mx[i][j];
}
 
int main() {
    Matrix m(2, 3);
    ScanMx(m);
    PrintMx(m);
    cout << endl;
    m = 2;
    PrintMx(m);
    getch();
}
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
28.05.2012, 14:36 #5
C++
1
2
3
4
double Matrix::operator()(int index, int index2)
{
   return Matr[index][index2];
}
Проводить проверку на выход за границу нужно в отдельной функции, или непосредственно в месте обращения. Иначе при наличии выхода у Вас ничего не возвращается, а возвращаемый функцией тип указывает, что она должна вернуть значение типа double.
Цитата Сообщение от Lokosios Посмотреть сообщение
return Matrix.Matr[index][index2];
И что это за обращение в main()? Зачем тут имя класса, за которым следует имя скрытых элемент данных? Да и вообще весь этот блок, который был вырезан из определения функции к чему там? Позволю себе предположить, что весь код до этого блока не Ваш.
0
Lokosios
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 27
28.05.2012, 15:43  [ТС] #6
Не спорю, часть кода не моя. Но это не отменяет того, что я переделывал его?) И я хотел разобраться, в чем причина ошибки и как её решить) Причину мне указали, вестимо, а решения проблемы я так и не нашел
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
28.05.2012, 15:47 #7
Причина в том, что Вы пишете "Matrix.Matr" внутри класса, когда надо просто "Matr". Плюс еще отсутствует освобождение памяти, но на это компилятор не будет ругаться.
Стопроцентно рабочее решение я предложил в своем предыдущем сообщении.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
28.05.2012, 15:58 #8
Я не пойму, Вы хотите изменить данные? Правильно? То есть пользователь вводит номер строки, номер столбца, а затем меняет элемент по этому адресу? Тогда нужно просто возвращать ссылку на объект.

C++
1
2
3
4
double &Matrix::operator()(int index, int index2)
{
   return Matr[index][index2];
}
C++
1
2
3
4
5
6
7
    cout << "Vvedite pervii indeks, i = ";
    cin >> index;
    cout << "Vvedite vtoroi indeks, j = ";
    cin >> index2;
    
    cout << "Enter the value: ";
    cin >> W( index, index2 );
0
Lokosios
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 27
28.05.2012, 16:13  [ТС] #9
Нет, пользователь вводит номер строки, затем столбца и затем на экран выводится число из этой ячейки матрицы.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
28.05.2012, 16:17 #10
Тогда всего лишь нужно написать вот так.
C++
1
2
3
4
5
6
    cout << "Vvedite pervii indeks, i = ";
    cin >> index;
    cout << "Vvedite vtoroi indeks, j = ";
    cin >> index2;
    
    cout << "Value: " << W( index, index2 );
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 16:17
Привет! Вот еще темы с ответами:

Нужно ли синхронизировать доступ к переменной из двух потоков? - C++
Допустим есть два потока: основной и вторичный. 1. И допустим есть глобальная переменная bool b; Вопрос: является ли b...

Какую коллекцию предпочесть, если нужно использовать доступ по индексу? - Java SE
Друзья! Полностью вопрос звучит так: Необходимо, чтбы ответ был более или менее осознанным, поэтомeу я решил разобраться. ...

Доступ к индексу пиктограммы - C++ Builder
При создании файла или папки непосредственно в программе надо что бы пиктограмма файла отличалась от пиктограммы папки, подскажите...

Как сделать доступ к элементам массива по индексу и по литералу индекса? - Objective-C
Здравствуйте! Хотел уточнить как мне сделать доступ к элементам массива по индексу и по литералу индекса? По индексу понятно, реализую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
28.05.2012, 16:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru