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

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

Войти
Регистрация
Восстановить пароль
 
Kira-sempai
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 6
#1

Сделать класс двухмерного динамического массива - C++

07.05.2011, 19:44. Просмотров 1036. Ответов 4
Метки нет (Все метки)

Вот такая задачка:
"Написать программу работы с матрицами (матрица представляет собой двумерный массив). Матрица является объектом класса. Память под матрицу должна выделяться динамически (с помощью new). Должны быть определены деструктор и следующие конструкторы:

· Конструктор по умолчанию создает матрицу с размером по умолчанию;

· Копирующий конструктор.

Необходимо перегрузить операцию деления (операция должна выполняться поэлементно с элементами каждой матрицы) и операцию присваивания."

Я написал ее решение изрядно покопав инет, поэтому в программе разные куски возможно вообще не делают то, что должны, но я постарался сделать так, чтобы хоть синтаксис был правильный. Получилось нечто следующее:
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
#include "StdAfx.h"
#include <stdio.h>
#include <assert.h>
#include <iostream>
 
using namespace std;
 
class matrix
{
public:
      matrix(int d1 = 10, int d2 = 10);
     ~matrix();
      int ub1() const{return(s1-1);}
      int ub2() const{return(s2-1);}; 
      int & element(int i, int j);
        
      int getNum() const;
 
      matrix operator/ (const matrix &);
      matrix & operator= (const matrix &);
 
private:
    int s1,s2;
    int** p;
    int k,l;
    int num;
 
 
};
 
int matrix::getNum() const
{
    return num;
}
 
matrix matrix::operator/ (const matrix & rhs)  //как делить матрицу
{
    
    for (int i = 0; i < s1; ++i)
        for (int j = 0; j < s2; ++j)
            p[i][j] /=  rhs.getNum();
    
    return matrix();
}    
 
 
matrix & matrix::operator=(const matrix & rhs) //как матрицы присваивать
{
    if (this == &rhs)
        return *this;
 
    for (int i = 0; i < s1; ++i)
        for (int j = 0; j < s2; ++j)
            p[i][j] = rhs.p[i][j];
 
}
 
matrix::matrix(int d1, int d2): s1(d1), s2(d2) //конструктор
 
{
 
assert(d1 > 0 && d2 > 0);
 
p = new int*[s1];
 
assert(p!=0);
 
 
for ( k = 0, k<s1; ++k;)
{
  p[k] = new int[s2];
 
  assert(p[k] != 0);
 
}   
 
}
 
matrix::~matrix() //деструктор
 
{
for ( k = 0, k < s1; ++k;)
  delete p[k];
delete []p;
}
 
int & matrix::element(int i,int j) //выбор элемента матрицы
{
    assert(i>=0 && i <= ub1() && j >= 0 && j <= ub2());
    return p[i][j];
}
 
void main()
{
    matrix m(10,15);
    matrix n(10,15);
    int sd;
    for (int i = 0;i<10;++i)
        for (int j = 0; j < 15; ++j)
            m.element(i,j) = i + j;  //заполняю ячейки матрицы чем попало
 
    n = m/2;
 
    cout << "Матрица m, 3я строка 4й столбец" << m.element(3,4) << "/n";
    cout << "Матрица n, 3я строка 4й столбец" << n.element(3,4) << "/n";
    cin >> sd;
}
в конце проги просто хотел проверить, работает ли она. Но вижуал студио после запуска проги ругается и не запускает( какие ошибки есть в этой программе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2011, 19:44     Сделать класс двухмерного динамического массива
Посмотрите здесь:

Сортировка двухмерного динамического массива - C++
Доброго времени суток. Столкнулся с проблемой при сортировке двухмерного динамического массива, а именно: первые y-1 элементы (у - число...

Обращение к элементам двухмерного динамического массива - C++
Строки в двумерном динамическом массиве расположены не вплотную друг к другу. Тогда почему чтобы получить значение из массива оператор ar...

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

Объявление двухмерного динамического массива в функции - C++
Подскажите, как объявить динамический массив размерности n*n. Допустим есть функция void F1(..., int n) { … } Что написать в...

Функция для ввода двухмерного динамического массива - C++
Поправьте, что не так! void input (int **a = new int, int n) { for(int i=0;i&lt;n; i++) for(int j=0; j&lt;n;...

Создать класс динамического массива - C++
Задание заключается в следущем: Создать динамический класс для выполнения операций над динамическими массивами чисел действительного...

Класс для двумерного динамического массива - C++
Вот написал код для двумерного динамического массива с перегруженым оператором= и +. Собственно код работает в MS VS 2010, но меня...

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

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

Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?) - C++
Привет, народ, есть такое задание: 2. написать класс для динамического массива с проверкой границ( аналог std::vector ) +должны...

класс динамического объекта - C++
Создаю класс динамического массива и заполняю его : (ошибки в bcc32 Error] File1.cpp(23): E2158 Operand of 'delete' must be non-const...

Абстрактный класс динамического списка - C++
Как создать из класса динамического списка - абстрактный? Ну ясно что абстрактный класс - это класс с чистой виртуальной функцией. ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
07.05.2011, 19:48     Сделать класс двухмерного динамического массива #2
Цитата Сообщение от Kira-sempai Посмотреть сообщение
Но вижуал студио после запуска проги ругается и не запускает( какие ошибки есть в этой программе?
тебе visual studio как раз и пишет твои ошибки, посмотри их и сделай вывод что неправильно
Kira-sempai
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 6
07.05.2011, 21:48  [ТС]     Сделать класс двухмерного динамического массива #3
эм...

""Kontrolnaja.exe": Загружено: "C:\Users\Ирина-Кирина\Documents\Visual Studio 2010\Projects\Kontrolnaja\Debug\Kontrolnaja.exe", Символы загружены.
"Kontrolnaja.exe": Загружено: "C:\Windows\System32\ntdll.dll", Невозможно найти или открыть файл PDB
"Kontrolnaja.exe": Загружено: "C:\Windows\System32\kernel32.dll", Невозможно найти или открыть файл PDB
"Kontrolnaja.exe": Загружено: "C:\Windows\System32\KernelBase.dll", Невозможно найти или открыть файл PDB
"Kontrolnaja.exe": Загружено: "C:\Windows\System32\msvcp100d.dll", Символы загружены.
"Kontrolnaja.exe": Загружено: "C:\Windows\System32\msvcr100d.dll", Символы загружены.
Первый этап обработки исключения в "0x00bb1859" в "Kontrolnaja.exe": 0xC0000005: Нарушение прав доступа при записи "0x002b0000".
Необработанное исключение в "0x00bb1859" в "Kontrolnaja.exe": 0xC0000005: Нарушение прав доступа при записи "0x002b0000"."

непонятна(

Добавлено через 1 час 27 минут
нашел один косяк:

C++
1
2
3
4
5
6
7
for ( k = 0, k<s1; ++k;)
{
  p[k] = new int[s2];
 
  assert(p[k] != 0);
 
}
вместо ; поставил , и получил зацикливание.

и вообще исправил просто вот так:

C++
1
2
3
4
5
6
7
for (int i = 0; i < s1; ++i;)
{
  p[i] = new int[s2];
 
  assert(p[i] != 0);
 
}
Научился более-менее пользоваться дебагером вижуала. В общем он вылетает на моменте присвоения значения одной матрицы другой:

C++
1
n = m/2;
точнее, когда все элементы матрицы m уже поделены, и надо вернуть её значение. Или когда происходит ее присвоение матрице n. Точно не уверен.
ZloyVolkey
27 / 27 / 6
Регистрация: 01.05.2011
Сообщений: 85
07.05.2011, 21:53     Сделать класс двухмерного динамического массива #4
return matrix();
А что возвращает этот ретурн на 43 строке?
Kira-sempai
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 6
08.05.2011, 03:14  [ТС]     Сделать класс двухмерного динамического массива #5
вот, скорее всего, в этом то и проблема, что что-то не то. Я точно не знаю, как сказать возвращать поделенную матрицу. Так что написал это скорее наобум и компилятор проглотил. Сейчас вот ковыряюсь, пытаюсь придумать, чем это заменить.

Добавлено через 5 часов 3 минуты
еще немного поковырялся (смотрит на часы - 3 часа ночи....). Получил следующий код. Вроде работает, но не делит((
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
129
130
131
132
// Kontrolnaja.cpp: определяет точку входа для консольного приложения.
//
 
#include "StdAfx.h"
#include <stdio.h>
#include <assert.h>
#include <iostream>
 
using namespace std;
 
class matrix
{
public:
      matrix(int d1 = 10, int d2 = 10);
     ~matrix();
      int ub1() const{return(s1-1);}
      int ub2() const{return(s2-1);}; 
      int & element(int i, int j);
        
      int getNum() const;
 
      matrix operator/ (const matrix &);
      matrix & operator= (const matrix &);
      matrix & operator/= (const matrix &);
 
private:
    int s1,s2;
    int** p;
    int num;
 
 
};
 
int matrix::getNum() const
{
    return num;
}
 
matrix matrix::operator/ (const matrix & rhs)
{
    int e;
    for (int i = 0; i < s1; ++i)
        for (int j = 0; j < s2; ++j)
        {
            e = p[i][j]; 
            e /= rhs.getNum();
            p[i][j] = e;
        }
    
    return matrix(); //чего же нада возвращать-то чтобы вернулась поделеная матрица?
}    
 
 
 
 
matrix & matrix::operator=(const matrix & rhs)
{
    if (this == &rhs)
        return *this;
 
    assert (s1 == rhs.s1 && s2 == rhs.s2);
    for (int i = 0; i < s1; ++i)
        for (int j = 0; j < s2; ++j)
            p[i][j] = rhs.p[i][j];
 
}
 
matrix & matrix::operator/=(const matrix & rhs)
{
    
 
    for (int i = 0; i < s1; ++i)
        for (int j = 0; j < s2; ++j)
            p[i][j] = p[i][j]/rhs.getNum();
    
    return *this; //аналогично предыдущему вопросу...
 
}
 
matrix::matrix(int d1, int d2): s1(d1), s2(d2) //конструктор - без понятия как это работает
 
{
 
assert(d1 > 0 && d2 > 0);
 
p = new int*[s1];
 
assert(p!=0);
 
 
for ( int i = 0; i < s1; ++i)
{
  p[i] = new int[s2];
 
  assert(p[i] != 0);
 
}   
 
}
 
matrix::~matrix() //деструктор - вроде удаляет
 
{
for ( int i = 0; i < s1; ++i)
  delete p[i];
delete []p;
}
 
int & matrix::element(int i,int j) //типа обращение к элементу.. может можно как-нить по-проще обратиться к нему?
{
    assert(i>=0 && i <= ub1() && j >= 0 && j <= ub2());
    return p[i][j];
}
 
void main()
{
    int c = 6;
    int r = 5;
    matrix m(r,c);
    matrix n(r,c);
    int sd;
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            m.element(i,j) = i + j;
 
    n = m;
//  n = m/2; //если раскоментить - вааще жопа
    cout << "m[3,3] = " << m.element(3,3) << "\n";
    m/=2; //это прокатывает, но результат деления почему-то ноль
    cout << "m[3,3] / 2 = " << m.element(3,3) << "\n";
    cin >> sd;
}
как его заставить работать? или можно сделать это безобразие проще и по-другому?
Yandex
Объявления
08.05.2011, 03:14     Сделать класс двухмерного динамического массива
Ответ Создать тему
Опции темы

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