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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
#1

матрица. клас - C++

12.02.2012, 17:08. Просмотров 1512. Ответов 24
Метки нет (Все метки)

Решил создать класс квадратных матриц. Вот что получилось. Все работает, но хотелось бы услышать
Ваше мнение и любые(ВСЕ) замечания

matrix.hpp
объявление
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
#ifndef _MATRIX_
#define _MATRIX_
 
#include <vector>
#include <iostream>
 
typedef std::vector<int>      T_vector;
typedef std::vector<T_vector> T_matrix;
 
class matrix
{
public:
    matrix();
    matrix(int size);
    //----------------------------------------
    const matrix operator-();
    
    bool   operator== (const matrix& m);
    bool   operator!= (const matrix& m);
    
    matrix operator=  (const matrix& matr); 
    matrix operator+  (const matrix& matr);
    matrix operator-  (const matrix& matr);
    
    friend std::ostream& operator<<(std::ostream& stream, const matrix& matr);
    friend std::istream& operator>>(std::istream& stream,       matrix& matr);      
    
    int  size() const  { return _matrix.size();             } 
    void resize(int n) { _matrix.resize(n, T_vector(n, 0)); }
    
private:
    T_matrix _matrix;
};
 
#endif


matrix.cpp
реализация
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
#include "matrix.hpp"
 
matrix::matrix() {}
 
matrix::matrix(int size)
{
    _matrix.resize(size, T_vector(size, 0));
}
 
const matrix matrix::operator-() 
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] = -_matrix[i][j];
    return *this;
}
 
std::ostream& operator<<(std::ostream& stream, const matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
    {
        for(int j = 0; j < sz; j++)
            stream << matr._matrix[i][j] << " ";
        stream << std::endl;
    }
    return stream;
}
 
std::istream& operator>>(std::istream& stream, matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            stream >> matr._matrix[i][j];
    return stream;
}
 
matrix matrix::operator=(const matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++) 
            _matrix[i][j] = matr._matrix[i][j];
    return *this;
}
 
matrix matrix::operator+(const matrix& matr)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] += matr._matrix[i][j];
    return *this;
}
 
matrix matrix::operator-(const matrix& matr)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] += matr._matrix[i][j];
    return *this;
}
 
bool matrix::operator==(const matrix& m)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            if(m._matrix[i][j] != this->_matrix[i][j])
                return false;
    return true;
}
 
bool matrix::operator!=(const matrix& m)
{
    return !(*this == m);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос матрица. клас (C++):

матрица. клас. 2 - C++
в продолжение этой темы вот заголовочный файл: #pragma once #include &lt;vector&gt; #include &lt;iostream&gt; typedef...

клас Letter, клас Person - C++
Створити клас Letter, що мiстить наступнi елементи: - поле «вiдправник» Person*Sender; - поле «одержувач» Person*Receiver; - поле...

клас обработчик - C++
Написать класс обработчик исключительных ситуаций. Программа ловит ошибкуделения на нуль и выводитсообщение,вв какой части программы...

клас птиц - C++
Ребята помогите!!!!! 1)Создать консольный проект, в котором используется приведенный класс Student. Создать экземпляры этого класса и...

Векторы+клас - C++
Добрый вечер! Помогите пожалуйста кто-нибуть в написании или обьяснении создания програмы: Создать клас vector3D, какой задаеться троицей...

клас myDate - C++
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью механизма перегрузки операторов, определите...

24
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 22:22 #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.

Добавлено через 23 секунды

Не по теме:

Опаздываю



Добавлено через 56 секунд
retmas, насколько мне известно, для квадратных матриц определена операция возведения в степень.
silent_1991, я утрировал. на мой взгляд вводить подобные операции лишнее.
вы же не писали, я надеюсь, изучая мат. дисциплины, подобные конструкции для матриц А и В:
А / В.
есть четко определенные операции: + и *.
не стоит вводить новые не принятые(!) операции только от того, что они могли бы казаться кому-то разумными. думаю, если математик увидит А / В для матриц - он ошалеет и почему он должен догадываться, что это может значить А * В^(-1)
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 22:31  [ТС] #17
Цитата Сообщение от lemegeton Посмотреть сообщение
В-третьих, результат оператора "-" константный. Получается, нельзя сделать
нужно сделать не константным или есть другое решение?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:33 #18
Toshkarik, пардон, не понял о чем речь

кстати очень плохо, что не происходит проверки соответствия размерности матриц
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 22:36  [ТС] #19
Цитата Сообщение от lemegeton Посмотреть сообщение
2. Напишите explicit перед конструктором с параметром.
не совсем понял...

Добавлено через 50 секунд
Цитата Сообщение от alex_x_x Посмотреть сообщение
кстати очень плохо, что не происходит проверки соответствия размерности матриц
а если не совпадают, что возвращать? или бросать исключение?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:39 #20
Цитата Сообщение от Mayonez Посмотреть сообщение
а если не совпадают, что возвращать? или бросать исключение?
да, какойнибудь std::range_error будет хорошим вариантом
ибо в матричных операциях недопустимо участие матриц несовместимых размерностей
1
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 22:43  [ТС] #21
silent_1991,
Цитата Сообщение от silent_1991 Посмотреть сообщение
Mayonez, осли определён унарный оператор -.
Код
error: passing 'const matrix {aka const matrix}' as 'this' argument of 'const matrix matrix::operator-()'
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 22:52 #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
кстати очень плохо, что не происходит проверки соответствия размерности матриц
я бы не рекомендовал. матрицы все-таки могут применяться для достаточно долгих и интенсивных вычислений. и проектировать подобные классы лучше исходя из этого. если нужны проверки, можно создать отдельные ф-ии.
з.ы. даже в стандартном vector доступ к элементу (используя []) проверка не производится, возможность проверки диапазона реализована в специальной ф-ии at
з.з.ы. valarray спроектирован и оптимизирован специально для мат. вычислений и вообще не подразумевает проверок
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:56 #23
retmas, если долгие и интенсивные вычисления - то одна проверка погоды не сделает
в том же самом фортране контроль размерностей встроен по дефолту (он уж точно предназначен для долгих и интенсивных вычислений)
первоначальный вариант ТС при несовпадении размеров вообще грозил бы крэшем программы
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 23:15 #24
alex_x_x, на счет одной проверки - сомнительно, что одной редко используемой.
тут вопрос скорее, что хочет автор от класса и какова главная цель: гибкость и универсальность или эффективность.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
12.02.2012, 23:57 #25
Цитата Сообщение от Mayonez Посмотреть сообщение
нужно сделать не константным или есть другое решение?
Да, было бы неплохо возвращать новый объект по значению.
Цитата Сообщение от Mayonez Посмотреть сообщение
Сообщение от lemegeton
2. Напишите explicit перед конструктором с параметром.
не совсем понял...
Если не стоит explicit перед конструктором с одним параметром, такой конструктор может использоваться для приведения типа.
Например, станут возможными следующие не очевидные конструкции.
C++
1
2
matrix a = 2; // значение матрицы равно двум?! Будет приведено к matrix a(2).
matrix b = a + 2; // приведется к a + matrix(2), что может быть довольно неожиданно
2
12.02.2012, 23:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2012, 23:57
Привет! Вот еще темы с ответами:

переделать клас - C++
Всем привет! Надо немножко доработать етот код #include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; const int count = 5; ...

Клас многочлен наследствие - C++
Помогите пожалуйсто. Нужно унаследствовать клас многочлен. Что можна унаследствовать (какой клас можно сделать потомком)?

создать клас HugeInt - C++
Описать класс, реализующий указанный ниже тип данных. Класс должен содержать множество конструкторов для создания объектов определенного...

Клас колода карт - C++
Класс CardDeck (колода карт). Класс сохраняет массив из 32 карт (cards), а также текущую карту (currentCard). Надо написать функцию для...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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