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

Составить класс для работы с целочисленной матрицей - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
06.01.2012, 00:02     Составить класс для работы с целочисленной матрицей #1
Составить класс для работы с целочисленной матрицей произвольного размера, который задается в конструкторе,где данная матрица создается динамически. Включить саму матрицу во внутреннюю часть класса.
Во внешней части задать и реализовать следующие функции-методы:
-функция автоматического (через функцию rand) заполнение матрицы значениями из диапазона от -N до N (данный параметр передаются в качестве аргумента функции);
-функция возврата размера матрицы;
-функцию вывода всех элементов матрицы на печать;
-функцию перемножения данной матрицы с матрицей того же размера;
В основной программе создать объект данного класса, организовать циклическое меню для работы с объектом, позволяющим проверить выполнение всех функций класса.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2012, 00:02     Составить класс для работы с целочисленной матрицей
Посмотрите здесь:

C++ Описать класс CFMATRIX1 для работы с матрицей вещественных чисел
C++ Описать класс для работы с матрицей вещественных чисел.
[C++] класс для работы с целочисленной матрицей произвольного размера C++
Создать класс для работы с прямоугольной матрицей размером 3х3 C++
C++ Составить класс для работы с целочисленной матрицей размера 3х3.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
06.01.2012, 01:00     Составить класс для работы с целочисленной матрицей #2
какие-нибудь наработки есть?

Добавлено через 33 минуты
.....ясно.

все седал кроме имплеменации умножения матриц. скажем так вам домашнее задание.
обратите внимание на строки 28 и 103,104;
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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
#include <iomanip>
using std::setw;
 
#include <cstdlib>
using std::rand;
using std::srand;
 
#include <ctime>
using std::time;
 
class MyMatrix {
public:
    //контсруктор создает матрицу. если рамеры не заданы то по дефолту 5х5
    MyMatrix(int = 5, int = 5);
    ~MyMatrix();
 
    int getColumns() const;
    int getRows() const;
    void setRandValues(const int, const int);
    void printMatrix() const;
 
    //вам осталось выполнить имплеменатацию перегрузки оператора умножения. :)
    MyMatrix &operator*(const MyMatrix &);
 
private:
    int rows;
    int columns;
    int **myMatrix;
};
 
MyMatrix::MyMatrix(int r, int c) :
        rows(r), columns(c) {
    myMatrix = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        myMatrix[i] = new int[columns];
    }
 
}
 
MyMatrix::~MyMatrix() {
    for (int i = 0; i < rows; ++i) {
        delete [] myMatrix[i];
    }
    delete [] myMatrix;
}
 
//print matrix
void MyMatrix::printMatrix() const {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j) {
            cout << setw(4) << myMatrix[i][j];
        }
        cout << endl;
    }
}
 
//fill matrix with random values
void MyMatrix::setRandValues(const int from, const int to) {
    srand(time(NULL));
    for (int i = 0; i < this->rows; ++i) {
        for (int j = 0; j < this->columns; ++j) {
            this->myMatrix[i][j] = (from + (rand() % (to-from)));
        }
    }
}
 
int MyMatrix::getColumns() const {
    return columns;
}
 
int MyMatrix::getRows() const {
    return rows;
}
 
int main() {
 
    //cоздаем матрицу
    MyMatrix matrix(6, 6);
    MyMatrix zatrix(6, 6);
 
        //получаем размеры
    cout << "MATRIX SIZE:: " << matrix.getRows() << "x" << matrix.getColumns() << endl;
    cout << "ZATRIX SIZE:: " << zatrix.getRows() << "x" << zatrix.getColumns() << endl;
 
    //заполняем случайными числами.
    matrix.setRandValues(1, 50);
    zatrix.setRandValues(30,99);
 
    //печатаем что получилось
    cout << "\nMATRIX ::\n";
    matrix.printMatrix();
 
    cout << "\nZATRIX ::\n";
    zatrix.printMatrix();
 
    //умножение
    //отклмментить после имплементации перегрузки оператора умножения
    // cout << "\nMATRIX * ZATRIX ::\n";
    //(matrix*zatrix).printMatrix();
 
    cin.get();
    return 0;
}
ВЫВОД
MATRIX SIZE:: 6x5
ZATRIX SIZE:: 6x5

MATRIX ::
10 20 18 26 25
45 8 37 6 11
6 27 5 48 29
21 34 28 15 38
9 25 41 48 33
25 1 18 7 42

ZATRIX ::
50 93 46 66 81
75 76 44 69 47
50 51 42 36 35
88 71 87 50 31
37 40 98 94 57
93 67 53 54 76
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
07.01.2012, 15:27  [ТС]     Составить класс для работы с целочисленной матрицей #3
мне не удается запустить программу жалуется на:
error C2039: 'rand' : is not a member of 'std'
error C2873: 'rand' : symbol cannot be used in a using-declaration
error C2039: 'srand' : is not a member of 'std'
error C2873: 'srand' : symbol cannot be used in a using-declaration
error C2039: 'time' : is not a member of 'std'
error C2873: 'time' : symbol cannot be used in a using-declaration
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
07.01.2012, 20:49     Составить класс для работы с целочисленной матрицей #4
Цитата Сообщение от wallhack Посмотреть сообщение
мне не удается запустить
чем компилируете ?
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.01.2012, 20:58     Составить класс для работы с целочисленной матрицей #5
Убери using для этих функций.
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
07.01.2012, 22:04  [ТС]     Составить класс для работы с целочисленной матрицей #6
Цитата Сообщение от greeezz Посмотреть сообщение
чем компилируете ?
visual c++ 6.0


Цитата Сообщение от NoMasters Посмотреть сообщение
Убери using для этих функций.
не помогло
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.01.2012, 22:12     Составить класс для работы с целочисленной матрицей #7
Что, даже вывод компилятора не изменился?
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
07.01.2012, 22:15  [ТС]     Составить класс для работы с целочисленной матрицей #8
Цитата Сообщение от NoMasters Посмотреть сообщение
Что, даже вывод компилятора не изменился?
после этого вообще 27 ошибок выдает и 2 варнинга
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.01.2012, 22:18     Составить класс для работы с целочисленной матрицей #9
Забавно. Итоговый код и ошибки в студию
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
07.01.2012, 22:24  [ТС]     Составить класс для работы с целочисленной матрицей #10
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
class MyMatrix {
public:
        //контсруктор создает матрицу. если рамеры не заданы то по дефолту 5х5
        MyMatrix(int = 5, int = 5);
        ~MyMatrix();
 
        int getColumns() const;
        int getRows() const;
        void setRandValues(const int, const int);
        void printMatrix() const;
 
        //вам осталось выполнить имплеменатацию перегрузки оператора умножения. :)
        MyMatrix &operator*(const MyMatrix &);
 
private:
        int rows;
        int columns;
        int **myMatrix;
};
 
MyMatrix::MyMatrix(int r, int c) :
                rows(r), columns(c) {
        myMatrix = new int*[rows];
        for (int i = 0; i < rows; ++i) {
                myMatrix[i] = new int[columns];
        }
 
}
 
MyMatrix::~MyMatrix() {
        for (int i = 0; i < rows; ++i) {
                delete [] myMatrix[i];
        }
        delete [] myMatrix;
}
 
//print matrix
void MyMatrix::printMatrix() const {
        for (int i = 0; i < rows; ++i) {
                for (int j = 0; j < columns; ++j) {
                        cout << setw(4) << myMatrix[i][j];
                }
                cout << endl;
        }
}
 
//fill matrix with random values
void MyMatrix::setRandValues(const int from, const int to) {
        srand(time(NULL));
        for (int i = 0; i < this->rows; ++i) {
                for (int j = 0; j < this->columns; ++j) {
                        this->myMatrix[i][j] = (from + (rand() % (to-from)));
                }
        }
}
 
int MyMatrix::getColumns() const {
        return columns;
}
 
int MyMatrix::getRows() const {
        return rows;
}
 
int main() {
 
        //cоздаем матрицу
        MyMatrix matrix(6, 6);
        MyMatrix zatrix(6, 6);
 
        //получаем размеры
        cout << "MATRIX SIZE:: " << matrix.getRows() << "x" << matrix.getColumns() << endl;
        cout << "ZATRIX SIZE:: " << zatrix.getRows() << "x" << zatrix.getColumns() << endl;
 
        //заполняем случайными числами.
        matrix.setRandValues(1, 50);
        zatrix.setRandValues(30,99);
 
        //печатаем что получилось
        cout << "\nMATRIX ::\n";
        matrix.printMatrix();
 
        cout << "\nZATRIX ::\n";
        zatrix.printMatrix();
 
        //умножение
        //отклмментить после имплементации перегрузки оператора умножения
        // cout << "\nMATRIX * ZATRIX ::\n";
        //(matrix*zatrix).printMatrix();
 
        cin.get();
        return 0;
}
: error C2065: 'cout' : undeclared identifier
: error C2065: 'setw' : undeclared identifier
: warning C4552: '<<' : operator has no effect; expected operator with side-effect
: error C2065: 'endl' : undeclared identifier
: warning C4552: '<<' : operator has no effect; expected operator with side-effect
: error C2297: '<<' : illegal, right operand has type 'char [15]'
: error C2297: '<<' : illegal, right operand has type 'char [15]'
error C2297: '<<' : illegal, right operand has type 'char [12]'
: error C2297: '<<' : illegal, right operand has type 'char [12]'
: error C2065: 'cin' : undeclared identifier
: error C2228: left of '.get' must have class/struct/union type
Error executing cl.exe.

5.exe - 9 error(s), 2 warning(s)
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.01.2012, 22:29     Составить класс для работы с целочисленной матрицей #11
Не для всех функций надо было убрать, а только для тех, на которые ругалось.
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
07.01.2012, 22:41  [ТС]     Составить класс для работы с целочисленной матрицей #12
Цитата Сообщение от NoMasters Посмотреть сообщение
Не для всех функций надо было убрать, а только для тех, на которые ругалось.
во помогло Благодарю)) все заработало
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
07.01.2012, 23:14     Составить класс для работы с целочисленной матрицей #13
Цитата Сообщение от wallhack Посмотреть сообщение
во помогло Благодарю)) все заработало
Вы когда домашнее задание выполните, дайте хоть взглянуть, чтобы было понятно что не зря старались
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
08.01.2012, 00:52  [ТС]     Составить класс для работы с целочисленной матрицей #14
Цитата Сообщение от greeezz Посмотреть сообщение
Вы когда домашнее задание выполните, дайте хоть взглянуть, чтобы было понятно что не зря старались
проверьте, я хоть в правильном направлении,
а то я чет запутался

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool MultiplyMatrix(double matrix, int Rows1, int Columns1
     double zatrix, int Rows2, int Columns2,
     int getRows(), int getRows())
{
Rows1=matrix.getRows();
Columns1=matrix.getColumns();
 Rows2=zatrix.getRows();
 
  for (int i = 0; i < Rows1; i++)
   for (int j = 0; j < Columns1; j++)
   {
    double prz = 0;
    for (int n = 0; n < Rows2; n++)
    {
     prz += matrix[i][n]*zatrix[n][j];
    }
    (matrix*zatrix)[i][j] = prz;
   }
  return 0;
 }
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
08.01.2012, 10:43     Составить класс для работы с целочисленной матрицей #15
Цитата Сообщение от wallhack Посмотреть сообщение
проверьте, я хоть в правильном направлении,
а то я чет запутался
Честно говоря тут не только вы запутались. Тут перегрузкой оператора умножения (для двух матриц) даже и не пахнет. Я с трудом понимаю что вы хотели сказать при помощи функции которую вы написали.

Добавлено через 2 часа 20 минут
хех.. ну ок.

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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
#include <iomanip>
using std::setw;
 
#include <cstdlib>
using std::rand;
using std::srand;
 
#include <ctime>
using std::time;
 
class MyMatrix {
public:
    //контсруктор создает матрицу. если рамеры не заданы то по дефолту 5х5
    MyMatrix(int = 5, int = 5);
    ~MyMatrix();
 
    int getColumns() const;
    int getRows() const;
    void setRandValues(const int, const int);
    void printMatrix() const;
 
    //перегрузка оператора умножения матрицы на матрицу
    MyMatrix operator*(const MyMatrix &);
 
private:
    int rows;
    int columns;
    int **myMatrix;
};
 
//перегузка оператора умножения матриц
MyMatrix MyMatrix::operator*(const MyMatrix &right) {
    MyMatrix temp(this->getRows(), right.getColumns());
    for (int i = 0; i < getRows(); ++i) {
        for (int j = 0; j < getColumns(); ++j) {
            for (int k = 0; k < getRows(); ++k) {
                temp.myMatrix[i][j] += (myMatrix[i][k] * right.myMatrix[k][j]);
            }
        }
    }
 
    return temp;
}
 
MyMatrix::MyMatrix(int r, int c) :
        rows(r), columns(c) {
    rows = (rows <= 0 ? 5 : rows);
    columns = (columns <= 0 ? 5 : columns);
    myMatrix = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        myMatrix[i] = new int[columns];
        for(int j = 0; j < columns; ++j){
            myMatrix[i][j] = 0; //set default values to matrix as ZERO
        }
    }
 
}
 
MyMatrix::~MyMatrix() {
    for (int i = 0; i < rows; ++i) {
        delete[] myMatrix[i];
    }
    delete[] myMatrix;
}
 
//print matrix
void MyMatrix::printMatrix() const {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j) {
            cout << setw(4) << myMatrix[i][j];
        }
        cout << endl;
    }
}
 
//fill matrix with random values
void MyMatrix::setRandValues(const int from, const int to) {
    srand(time(NULL));
    for (int i = 0; i < this->rows; ++i) {
        for (int j = 0; j < this->columns; ++j) {
            this->myMatrix[i][j] = (from + (rand() % (to - from)));
        }
    }
}
 
int MyMatrix::getColumns() const {
    return columns;
}
 
int MyMatrix::getRows() const {
    return rows;
}
 
int main() {
 
    //cоздаем матрицу
    MyMatrix matrix(5, 6);
    MyMatrix zatrix(6, 5);
 
    //получаем размеры
    cout << "MATRIX SIZE:: " << matrix.getRows() << "x" << matrix.getColumns() << endl;
    cout << "ZATRIX SIZE:: " << zatrix.getRows() << "x" << zatrix.getColumns() << endl;
 
    //заполняем случайными числами.
    matrix.setRandValues(1, 10); // например от 1 до 9
    zatrix.setRandValues(0, 2); //например от 0 до 1
 
    //печатаем что получилось
    cout << "\nMATRIX ::\n";
    matrix.printMatrix();
 
    cout << "\nZATRIX ::\n";
    zatrix.printMatrix();
 
    //умноженаем матрицу MATRIX на матрицу ZATRIX
    //и печатаем что получилось
    cout << "\nMATRIX * ZATRIX ::\n";
    (matrix * zatrix).printMatrix() ;
 
 
    cin.get();
    return 0;
}
ПРИМЕР РАБОТЫ ПРОГРАММЫ

MATRIX SIZE:: 5x6
ZATRIX SIZE:: 6x5

MATRIX ::
6 8 7 4 3 8
6 4 6 8 2 5
1 1 8 9 3 9
3 2 7 7 9 8
2 6 9 2 6 7

ZATRIX ::
1 1 1 1 1
0 1 0 0 1
0 1 0 1 1
0 0 0 0 1
0 0 0 0 1
0 1 0 1 0

MATRIX * ZATRIX ::
6 21 6 13 28
6 16 6 12 26
1 10 1 9 22
3 12 3 10 28
2 17 2 11 25
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
08.01.2012, 14:26  [ТС]     Составить класс для работы с целочисленной матрицей #16
компилятор чист, после запуска программы выскакивает ошибка: "DAMAGE after normal block (#84) at 0x001C14D0"

В результате такой вывод:
MATRIX SIZE:: 5x6
ZATRIX SIZE:: 6x5

MATRIX ::
2 7 4 7 3 4
7 1 1 5 4 4
1 4 8 1 1 2
1 5 7 3 7 6
4 3 2 8 1 4

ZATRIX ::
0 0 1 0 1
0 1 1 1 0
1 1 0 1 1
0 1 0 1 1
0 0 0 0 1
0 1 1 0 0

MATRIX * ZATRIX ::
Press any key to continue
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
08.01.2012, 15:23     Составить класс для работы с целочисленной матрицей #17
При компиляции нет ошибок, но при запуске выскакивает ошибка и результата перемножения матриц нет. Подскажите пожалуйста в чем ошибка. Заранее огромное спасибо.
Миниатюры
Составить класс для работы с целочисленной матрицей  
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
08.01.2012, 22:12     Составить класс для работы с целочисленной матрицей #18
wallhack,
isaak, я не знаю почему но проблема возникает из за реализации метода деструктора после компиляции в MSVS.
удалите из него все и оставьте его пустым. как минимум все будет работать.
т.е. вместо :
C++
1
2
3
4
5
6
MyMatrix::~MyMatrix() {
        for (int i = 0; i < rows; ++i) {
                delete[] myMatrix[i];
        }
        delete[] myMatrix;
}
сделайте
C++
1
2
MyMatrix::~MyMatrix() {
}
я еще подумаю что я такого страшного написал в этом методе. Если кто из знатовков укажет на ошибку - Большое спасибо
wallhack
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 10
08.01.2012, 23:32  [ТС]     Составить класс для работы с целочисленной матрицей #19
greeezz
Все заработало, Благодарю)

Слушай помоги доработать ещё одну программу

задание:
Составить текстовый файл, состоящий из нескольких строк следующего вида:<количество чисел в строке> <число 1><чиссло 2>...<число N>.
Написать функцию нахождения произведения элементов массива произвольного размера. В программе последовательно читать из файла строки чисел, создавать динамический массив,
размер которого соответствует числу чисел в строке файла, затем вычислять сумму числовой последовательности. Результат вывести на экран.

у меня не получается сделать чтобы программа прошла по всем строкам

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
#include <stdio.h>
#include <conio.h>
#include <math.h>
double proizv(float mas[100], int nn)
{
int l;
float pro=1;
for (l=0;l<nn;l++)
{
pro*=mas[l];
}
 
return pro;
}
void main(void)
{
float massiv[100], m;
int i,j=1,n;
clrscr();
FILE *inp;
inp = fopen ("C:\\BORLANDC\\tyt\\file\\9.txt","r");
if (inp==NULL)
printf ("Owibka pri otkritii faila.\n");
printf ("proizvedenie el. massiva v stroke %d :\n",j);
fscanf (inp,"%d",&n);
printf ("massiv dlinnoi - %d\n",n);
for (i=0;i<n;i++)
fscanf(inp,"%f",&massiv[i]);
for (i=0;i<n;i++)
printf ("%4.2f ",massiv[i]);
m=proizv(massiv,n);
printf ("\nproizvedeine elementov massiva - %4.2f\n\n",m);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 00:33     Составить класс для работы с целочисленной матрицей
Еще ссылки по теме:

Написать программу в С++ Ввести класс для работы с прямоугольной матрицей C++
создать класс для работы с матрицей C++
Составить описание класса для работы с квадратной целочисленной матрицей C++

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

Или воспользуйтесь поиском по форуму:
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
09.01.2012, 00:33     Составить класс для работы с целочисленной матрицей #20
greeezz спасибо
C++
1
2
MyMatrix::~MyMatrix() {
}
Помогло все заработало
Yandex
Объявления
09.01.2012, 00:33     Составить класс для работы с целочисленной матрицей
Ответ Создать тему
Опции темы

Текущее время: 11:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru