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

класс "Матрица" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Alinochka
 Аватар для Alinochka
3 / 3 / 1
Регистрация: 06.12.2009
Сообщений: 46
08.06.2010, 12:47     класс "Матрица" #1
Добрый день, с классами никак не могу разобраться, задали задачу
Написать класс «Матрица», где поля класса (данные-члены класса) – элементы матрицы,
операции с матрицами – методы класса (функции-члены класса).
Реализовать следующие операции с матрицами:
· Сложение, вычитание,
· умножение на число и матрицу,
· транспонирование,
· нахождение определителя матрицы,
· сравнение на равенство,
· методы, реализующие проверку типа матрицы (квадратная, диагональная,
нулевая, единичная, верхняя треугольная, нижняя треугольная),
· вывод матрицы на экран.
Написать программу, демонстрирующую работу с этим классом.
Варианты: размеры матрицы фиксированы, размер матрицы определяются во время
выполнения программы.
Кому не сложно помогите разобраться, хотябы с первыми действиями с матрицей "Сложение и вычитание" а там я по аналогии попробую дальше сама.
Заранее спасибо!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
*HellRaiser*
 Аватар для *HellRaiser*
28 / 28 / 2
Регистрация: 08.06.2010
Сообщений: 146
08.06.2010, 18:20     класс "Матрица" #2
Тут всё дело в циклах и твоём умении работать с матрицами. Ну сложение например:
К каждому а(i,j) нужно прибавить b(i,j) такого же номера.
Реализуется двумя циклами for
C++
1
2
3
4
5
6
7
for (int row=1; row<(количество строк); row++)
{
  for (int col=1; col<(количество столбцов); col++)
   {
     z [i] [j]=a[i] [j] + b [i] [j];
    }
}
Тоесть перебираем матрицу а и к каждому её элементу прибавляем элемент такого же номера из матрицы b. Результат заполняется в некую матрицу z. Думаю ход мысли ясен...
Alinochka
 Аватар для Alinochka
3 / 3 / 1
Регистрация: 06.12.2009
Сообщений: 46
08.06.2010, 20:01  [ТС]     класс "Матрица" #3
Да дело то не в циклах, с ними то я как раз умею работать, все дело в классе, я незнаю как его писать и как там че реализовывать
*HellRaiser*
 Аватар для *HellRaiser*
28 / 28 / 2
Регистрация: 08.06.2010
Сообщений: 146
09.06.2010, 15:15     класс "Матрица" #4
Мда, немножечко не доглядел. Но просто всё равно не пойму, что тебе не ясно, если решение ты сама написала. Разжёвываю...
Написать класс «Матрица», где поля класса (данные-члены класса) – элементы матрицы
Отсюда следует, что создаём некий matrisca.cpp, где задаём переменные, наши матрицы (в ходе решения может потребуется ещё какая-нибуть переменная)
C++
1
2
3
4
public:
   a [] [];
   b [] [];
   c [] [];
А затем создаёшь конструктор, где инициализируешь каждый элемент матрицы. Чем не знаю, ты не оговорилась, может матрица у тебя дана, а может с клавиатуры. Если второе то в конструкторе можно просто обнулить наши переменные.
Смотрим далее:
операции с матрицами – методы класса (функции-члены класса)
Тоесть для каждого действия с матрицами ты создаёшь некие функции void с переменными i и j (это как стандарт), где с помощью циклов (а ты с ними работать умеешь) выполняешь нужное действие. Пример выше был.
Я насчитал у тебя 10 функций. Десятая это размер матрицы определяются во время
выполнения программы
. Она не обязательно должны быть в классе.

Добавлено через 13 минут
Забыл добавить...если будут проблемы с
Написать программу, демонстрирующую работу с этим классом.
Можешь обращаться, есть идеи...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.06.2010, 17:18     класс "Матрица" #5
Alinochka, вот Вам для затравки класс с кучей конструкторов и оператором сложения, а дальше сами как-нибудь
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
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <stdexcept>
#include <cstdlib>
 
template <typename T>
class Matrix {
    int _rows;
    int _columns;
    T ** _ptr;
    int _width; // ширина выводимого поля
public:
    Matrix() : _rows(0), _columns(0), _ptr(0), _width(3) {}
 
    Matrix(int r, int c) : _rows(r), _columns(c), _width(3) {
        _ptr = new T* [ _rows ];
        for ( int i = 0; i < _rows; ++i )
            _ptr[i] = new T [ _columns ];
    }
 
    Matrix(int r, int c, const T & val) : _rows(r), _columns(c), _width(3) {
        _ptr = new T* [ _rows ];
        for ( int i = 0; i < _rows; ++i ){
            _ptr[i] = new T [ _columns ];
            std::fill_n(_ptr[i], _columns, val);
        }
    }
 
    Matrix(const Matrix & m) {
        *this = m;
    }
 
    ~Matrix() {
        if ( ! empty() ){
            for ( int i = 0; i < _rows; ++i )
                delete [] _ptr[i];
            delete [] _ptr;
        }
    }
 
    const Matrix & operator = (const Matrix & m) {
        if ( &m != this ){
            if ( ! empty() ){
                for ( int i = 0; i < _rows; ++i )
                    delete [] _ptr[i];
                delete [] _ptr;
            }
            _rows = m._rows;
            _columns = m._columns;
            _ptr = new T* [ _rows ];
            for ( int i = 0; i < _rows; ++i ){
                _ptr[i] = new T [ _columns ];
                std::copy(m._ptr[i], m._ptr[i] + _columns, _ptr[i]);
            }
            _width = m._width;
        }
        return *this;
    }
 
    const Matrix operator + (const Matrix & m) {
        if ( _rows != m._rows || _columns != m._columns ){
            //std::trow std::runtime_error("Different sizes!"); я не умею этим пользоваться :(
            std::cerr << "Different sizes!" << std::endl;
            exit(EXIT_FAILURE);
        }
        Matrix res(_rows, _columns);
        for ( int i = 0; i < _rows; ++i )
            for ( int j = 0; j < _columns; ++j )
                res._ptr[i][j] = _ptr[i][j] + m._ptr[i][j];
        return res;
    }
 
    bool empty() const {
        return _ptr == 0;
    }
 
    int width() const { return _width; }
 
    void width(int w) { _width = w; }
 
    friend std::ostream & operator << (std::ostream & ost, const Matrix & m) {
        for ( int i = 0; i < m._rows; ++i ) {
            for ( int j = 0; j < m._columns; ++j )
                ost << std::setw(m._width) << m._ptr[i][j];
            ost << std::endl;
        }
        return ost;
    }
 
    friend std::istream & operator >> (std::istream & ist, Matrix & m) {
        for ( int i = 0; i < m._rows; ++i )
            for ( int j = 0; j < m._columns; ++j )
                ist >> m._ptr[i][j];
        return ist;
    }
};
 
int main(){
    Matrix<int> a(3, 4, 1);
    Matrix<int> b(a);
    Matrix<int> c = a + b;
    std::cout << "A:\n" << a << "\nB:\n" << b << "\nA + B:\n" << c << std::endl;
 
    std::cout << "New values for A:" << std::endl;
    std::cin >> a;
 
    c = a + b;
    std::cout << "A:\n" << a << "\nB:\n" << b << "\nA + B:\n" << c << std::endl;
 
    return 0;
}
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 716
09.06.2010, 17:21     класс "Матрица" #6
easybudda, что же вы наделали.. и шаблоны и перегрузка.. девушку возьмут преподавать теперь из - за этого кода))
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.06.2010, 17:46     класс "Матрица" #7
Цитата Сообщение от easybudda Посмотреть сообщение
for ( int i = 0; i < _rows; ++i )
а почиму ++i? а не i++?
так быстрее работает?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.06.2010, 18:09     класс "Матрица" #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
а почиму ++i? а не i++?
так быстрее работает?
Ну как бы да, быстрее... Постфиксный оператор сначала копию переменной создаёт, а префиксный - не...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2010, 00:00     класс "Матрица"
Еще ссылки по теме:

Шаблоны С++. Класс "Квадратная матрица" C++
C++ Класс "Матрица" с шаблоном
C++ Класс "Матрица": ввод/вывод, умножение, сложение/вычитание, транспонирование, сдвиг

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

Или воспользуйтесь поиском по форуму:
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
10.06.2010, 00:00     класс "Матрица" #9
я тоже решил написать этот клас..
Цитата Сообщение от Alinochka Посмотреть сообщение
· методы, реализующие проверку типа матрицы (квадратная, диагональная,
нулевая, единичная, верхняя треугольная, нижняя треугольная),

а как это лучше организовать? Сделать то я могу сам, а вот как лучше..
можно сделать метод например type, который будет возвращать значение типа, но что возвращать? строку с названиям типа матрицы("kvadratnaya","nylevaya"..) или коды(0,1,2....)?
а если матрица одновременно и нулевая и квадратная?
вообщем может кто подскажет как лучше сделать это (как возвращать тип матрицы)?
Yandex
Объявления
10.06.2010, 00:00     класс "Матрица"
Ответ Создать тему
Опции темы

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