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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Alinochka
3 / 3 / 1
Регистрация: 06.12.2009
Сообщений: 46
#1

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

08.06.2010, 12:47. Просмотров 1719. Ответов 8
Метки нет (Все метки)

Добрый день, с классами никак не могу разобраться, задали задачу
Написать класс «Матрица», где поля класса (данные-члены класса) – элементы матрицы,
операции с матрицами – методы класса (функции-члены класса).
Реализовать следующие операции с матрицами:
· Сложение, вычитание,
· умножение на число и матрицу,
· транспонирование,
· нахождение определителя матрицы,
· сравнение на равенство,
· методы, реализующие проверку типа матрицы (квадратная, диагональная,
нулевая, единичная, верхняя треугольная, нижняя треугольная),
· вывод матрицы на экран.
Написать программу, демонстрирующую работу с этим классом.
Варианты: размеры матрицы фиксированы, размер матрицы определяются во время
выполнения программы.
Кому не сложно помогите разобраться, хотябы с первыми действиями с матрицей "Сложение и вычитание" а там я по аналогии попробую дальше сама.
Заранее спасибо!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2010, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос класс "Матрица" (C++):

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

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

Класс "Матрица". Перегрузка оператора "минус" - C++
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс матрицы, используя двухмерный динамический...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

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

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
*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
3 / 3 / 1
Регистрация: 06.12.2009
Сообщений: 46
08.06.2010, 20:01  [ТС] #3
Да дело то не в циклах, с ними то я как раз умею работать, все дело в классе, я незнаю как его писать и как там че реализовывать
*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
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
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;
}
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
09.06.2010, 17:21 #6
easybudda, что же вы наделали.. и шаблоны и перегрузка.. девушку возьмут преподавать теперь из - за этого кода))
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.06.2010, 17:46 #7
Цитата Сообщение от easybudda Посмотреть сообщение
for ( int i = 0; i < _rows; ++i )
а почиму ++i? а не i++?
так быстрее работает?
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
09.06.2010, 18:09 #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
а почиму ++i? а не i++?
так быстрее работает?
Ну как бы да, быстрее... Постфиксный оператор сначала копию переменной создаёт, а префиксный - не...
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
10.06.2010, 00:00 #9
я тоже решил написать этот клас..
Цитата Сообщение от Alinochka Посмотреть сообщение
· методы, реализующие проверку типа матрицы (квадратная, диагональная,
нулевая, единичная, верхняя треугольная, нижняя треугольная),

а как это лучше организовать? Сделать то я могу сам, а вот как лучше..
можно сделать метод например type, который будет возвращать значение типа, но что возвращать? строку с названиям типа матрицы("kvadratnaya","nylevaya"..) или коды(0,1,2....)?
а если матрица одновременно и нулевая и квадратная?
вообщем может кто подскажет как лучше сделать это (как возвращать тип матрицы)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2010, 00:00
Привет! Вот еще темы с ответами:

Класс "Матрица". "Правило трёх" - C++
Проблема в том, что я не могу вернуть тип данных &quot;Матрица&quot;.Что я делаю не так понял в ООП? // matrica.cpp : Defines the entry point for...

Класс "Матрица", перегрузка оператора "+" - C++
Здравствуйте. Создаю класс матрица, в нём перегружаю оператор &quot;+&quot;. На этапе компиляции всё замечательно, но при запуске программа вылетает....

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Создать класс комплексных чисел и ввести операции: "+", "-", "*", "/". - C++
пожалуйста-помогите написатьпрограмму!!! сижу на экзамене!!! вот само задание: создать класс комплексных чисел и ввести операции: &quot;+&quot;,...


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

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

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