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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 17:56     Описать класс "Матрица" #1
я как бэ в поиске нашел но мне бы хотелось узнать обязательно ли матрица должна быть динамической и можно написать метод для ввода и вывода матрицы?
а то я пытался сделать но чего-то работает неверно...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 17:58     Описать класс "Матрица" #2
Ну ё-моё, пытался-не пытался... Код покажите, будем ошибки искать.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 17:58     Описать класс "Матрица" #3
Цитата Сообщение от Artishok Посмотреть сообщение
узнать обязательно ли матрица должна быть динамической и можно написать метод для ввода и вывода матрицы?
Это надо узнавать у того, кто задавал задание.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 18:08  [ТС]     Описать класс "Матрица" #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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream.h>
#include <stdlib.h>
 
class matrix
{
     private:
     int rx, ry, matx[][];
     public:
     void matr();
     matrix(int x,int y);
     ~matrix();
     void sum();
     void prel();
};
 
matrix::matrix(int x,int y)
{
    rx=x;
    ry=y;
    for(int i=0;i<rx;i++)
     for(int j=0;j<ry;j++)
       cin>>matx[i][j];
}
 
void matrix::matr()
{
    for(int i=0;i<rx;i++)
    {
     for(int j=0;i<ry;j++)
      std::cout<<matx[i][j]<<" ";
     std::cout<<endl;
    }
}
 
void matrix::sum()
{
     int summ=0;
    for(int i=0;i<rx;i++)
     for(int j=0;j<ry;j++)
      summ+=matx[i][j];
     std::cout<<summ;
}
 
void matrix::prel()
{
    int prell=1;
    for(int i=0;i<rx;i++)
     for(int j=0;j<ry;j++)
      prell*=matx[i][j];
    std::cout<<prell;
}
 
matrix::~matrix(){};
       
main()
{
    matrix c(4,3);
    c.matr();
    c.sum();
    c.prel();
    return 0;
}
не надо сильно ругать.по книжке с классами знакомился
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 18:13     Описать класс "Матрица" #5
Artishok, в таком случае нужно либо делать двумерный массив статическим, либо выделять под него память динамически (что подразумевает объявление деструктора, который будет высвобождать выделенную память).
Я бы делал по-другому - описал бы класс столбца (или строки) и строил класс матрицы как массив столбцов (или строк)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:14     Описать класс "Матрица" #6
А я бы просто забабахал динамически и всё...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 18:19     Описать класс "Матрица" #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
А я бы просто забабахал динамически и всё...
одна из причин, по которой я бы сначал определил класс строки - это возможность определить операторы индексации так, чтобы доступ к элементу матрицы происходил так:
C++
1
std::cout << matrix[i][j];
- т.е. так же, как и к встроенным массивам. Ну и еще потому, что для класса строк можно определить вспомогательные функции, которые будет активно использовать класс матрицы - так удобнее, ИМХО.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:27     Описать класс "Матрица" #8
Логично.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 18:27     Описать класс "Матрица" #9
Artishok, какой-то скудный функционал у класса получается - сумма, произведение всех элементов матрицы. Реализуйте хотя бы сложение и умножение матриц, а в идеале - построение обратной матрицы и нахождение определителя.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:28     Описать класс "Матрица" #10
А это разве не лаба по ООП?
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 18:29  [ТС]     Описать класс "Матрица" #11
вообще-то я сам сидел на лекции по Си и решал.
лабы по ооп начнутся только на 3-м курсе а я на втором.
веселье начнется в след.семестре когда ассемблер начнем проходить....
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:30     Описать класс "Матрица" #12
Artishok,
А вас разве кто-то обвиняет в плагиате? Я просто предположил, что есть чёткое задание, в котором и оговаривается функционал класса.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 18:35     Описать класс "Матрица" #13
Artishok, а попробуй для начала описать класс числового массива, чтобы он поддерживал изменение размера, реализовывал сумму/разность массивов (одинаковых размеров, естественно), умножение/деление на число, скалярное произведение, индексацию с проверкой на выход за пределы массива, ну и всякие другие полезности. Будет тебе тренировка. А потом можно и к матрицам переходить.
P.S. А класс матрицы можно будет построить на основе класса-массива. Так что ты одним выстрелом убиваешь двух зайцев
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 18:36  [ТС]     Описать класс "Матрица" #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Artishok,
А вас разве кто-то обвиняет в плагиате? Я просто предположил, что есть чёткое задание, в котором и оговаривается функционал класса.
я про плагиат ничего не сказал
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:37     Описать класс "Матрица" #15
Меня смутила фраза "я сам сидел и решал..." Читая её, можно подумать, что решал это я и теперь застал вас врасплох... Но хватит оффтопа.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 18:55  [ТС]     Описать класс "Матрица" #16
ну вот типо класс массива одномерного.вводит и выводит.какие неточности здесь?(остальные методы я реализую попозже.)
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
#include <iostream.h>
#include <stdlib.h>
 
class array
{
    private:
    int razm,arr[];
    public:
     void vivod();
     void vvod();
     ~array();
     array(int x);
};
 
array::array(int x)
{
  razm=x;
};
 
void array::vvod()
{
    for(int i=0;i<razm;i++)
     cin>>arr[i];
};
 
void array::vivod()
{
    for(int i=0;i<razm;i++)
     cout<<arr[i]<<" ";
};
array::~array() {};
 
main()
{
    array b(5);
    b.vvod();
    b.vivod();
}
Добавлено через 3 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
. А класс матрицы можно будет построить на основе класса-массива. Так что ты одним выстрелом убиваешь двух зайцев
то есть сделать класс матрицы как производный от класса массива?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 18:58     Описать класс "Матрица" #17
Цитата Сообщение от Artishok Посмотреть сообщение
то есть сделать класс матрицы как производный от класса массива?
неа, класс матрицы будет хранить массив array
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 19:02  [ТС]     Описать класс "Матрица" #18
это как?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.09.2010, 19:16     Описать класс "Матрица" #19
Цитата Сообщение от Artishok Посмотреть сообщение
ну вот типо класс массива одномерного.вводит и выводит.какие неточности здесь?(остальные методы я реализую попозже.)
Совет про выделение/удаление памяти для массива ты, видимо, проигнорировал. Повторюсь, память для массива нужно динамически выделиять в конструкторе и освобождать в деструкторе. Вот примерный "каркас" класса:
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
#include <iostream>
#include <stdexcept>
 
class arr
{
    
public:
    
    arr(size_t cnt = 0);
    arr(const arr& rhs);
    arr(const int* iarr, size_t size);
    ~arr();
    
    const int* iarray() const;
    size_t size() const;
    int& operator [] (size_t index);
    const int& operator [] (size_t index) const;
    
private:
    
    size_t  m_nSize;
    int*    m_pArr;
};
 
arr::arr(size_t cnt)
    : m_nSize(cnt)
{
    m_pArr = new int[m_nSize];
    for(size_t i = 0; i < m_nSize; ++i)
        m_pArr[i] = 0;
}
 
arr::arr(const arr& rhs)
    : m_nSize(rhs.m_nSize)
{
    m_pArr = new int[m_nSize];
    for(size_t i = 0; i < m_nSize; ++i)
        m_pArr[i] = rhs.m_pArr[i];
}
 
arr::arr(const int* iarr, size_t size)
    : m_nSize(size)
{
    m_pArr = new int[m_nSize];
    for(size_t i = 0; i < m_nSize; ++i)
        m_pArr[i] = iarr[i];
}
 
arr::~arr()
{
    delete[] m_pArr;
}
 
const int* arr::iarray() const
{
    return m_pArr;
}
 
size_t arr::size() const
{
    return m_nSize;
}
 
int& arr::operator [] (size_t index)
{
    if(index >= m_nSize)
        throw std::out_of_range("The specified index is out of range");
    return m_pArr[index];
}
 
const int& arr::operator [] (size_t index) const
{
    if(index >= m_nSize)
        throw std::out_of_range("The specified index is out of range");
    return m_pArr[index];
}
 
int main()
{
    int iarray[] = {1, 2, 3, 4};
    arr a1(iarray, 4);
    std::cout << "size = " << a1.size() << std::endl;
    for(size_t i = 0; i < a1.size(); ++i)
        std::cout << i << ". " << a1[i] << std::endl;
    return 0;
}
Цитата Сообщение от Artishok Посмотреть сообщение
это как?
Допустим, у нас уже есть класс arr с необходимой функциональностью. Вот как мы будем его использовать для класса матрицы:
C++
1
2
3
4
5
6
7
class matrix
{
//...
private:
size_t m_nSize;
arr*   m_pMatrix;
};
P.S. И нужно сделать, чтобы класс массива хранил не int, а double
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2010, 19:46     Описать класс "Матрица"
Еще ссылки по теме:

C++ Описать класс, реализующий тип данных «вещественная матрица» и работу с ними
Описать класс «матрица». Добавить метод, вычисляющий определитель матрицы C++
C++ Определить базовый класс "Матрица" и класс-потомок "Треугольная матрица"

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

Или воспользуйтесь поиском по форуму:
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
22.09.2010, 19:46  [ТС]     Описать класс "Матрица" #20
понятно.
пойду корректировать свою прогу опираясь на вашу
Yandex
Объявления
22.09.2010, 19:46     Описать класс "Матрица"
Ответ Создать тему
Опции темы

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