Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 6

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

07.05.2011, 19:44. Показов 1980. Ответов 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;
}
в конце проги просто хотел проверить, работает ли она. Но вижуал студио после запуска проги ругается и не запускает( какие ошибки есть в этой программе?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2011, 19:44
Ответы с готовыми решениями:

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

Объявление двухмерного динамического массива
Всем привет! Заранее извиняюсь за свое незнание языка и слабую теоритическую базу. Значит, я хочу выделить память под динамический...

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

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

""Kontrolnaja.exe": Загружено: "C:\Users\Ирина-Кирина\Documents\Visual Studio 2010\Projects\Kontrolnaja\Debug\Kontroln aja.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. Точно не уверен.
0
 Аватар для ZloyVolkey
27 / 27 / 7
Регистрация: 01.05.2011
Сообщений: 85
07.05.2011, 21:53
return matrix();
А что возвращает этот ретурн на 43 строке?
0
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 6
08.05.2011, 03:14  [ТС]
вот, скорее всего, в этом то и проблема, что что-то не то. Я точно не знаю, как сказать возвращать поделенную матрицу. Так что написал это скорее наобум и компилятор проглотил. Сейчас вот ковыряюсь, пытаюсь придумать, чем это заменить.

Добавлено через 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;
}
как его заставить работать? или можно сделать это безобразие проще и по-другому?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2011, 03:14
Помогаю со студенческими работами здесь

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

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

Переделать код для динамического и двухмерного массива
Есть код, нужно его переделать для динамического и двухмерного массива и добавить возможность не только редактирования, но и удаления...

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

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: , =, +, -,++...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru