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

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

Восстановить пароль Регистрация
 
Kira-sempai
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 6
07.05.2011, 19:44     Сделать класс двухмерного динамического массива #1
Вот такая задачка:
"Написать программу работы с матрицами (матрица представляет собой двумерный массив). Матрица является объектом класса. Память под матрицу должна выделяться динамически (с помощью 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++ Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
C++ Создать класс динамического массива
C++ Объявление двухмерного динамического массива в функции
C++ Функция для ввода двухмерного динамического массива
Обращение к элементам двухмерного динамического массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 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
 Аватар для 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     Сделать класс двухмерного динамического массива
Ответ Создать тему
Опции темы

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