14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
1

Не могу создать нормальный двухмерный динамический массив

10.09.2019, 19:00. Показов 1238. Ответов 11
Метки нет (Все метки)

Были да жили хорошо статические массивы размерностью 255х255:
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <math.h>
using namespace std;
void main() {
    //setlocale(LC_ALL, "rus");
    system("chcp 1251");
        int a[255][255],b[255][255],na,ma,nb,mb; bool error = false;
        do {
            do { //Ввод массива а
                printf("Введите количество столбцов и строк матрицы a (через пробел)");
                printf("\nВвод: "); scanf("%i%i", &na, &ma);
                if ((na > 255) || (ma > 255)) { printf("Ошибка! Слишком много элементов, программа расчитана на не более 255 строк и столбцов. Повторите попытку"); error = true; }
                else { error = false; }
                if (((na < 1) || (ma < 1)) && (error != true)) { printf("Ошибка! Матрица должна содержать как минимум 1 столбец и 1 строку. Повторите попытку"); error = true; }
                else { error = false; }
            } while (error == true);
            do {//Ввод массива b
                printf("Введите количество столбцов и строк матрицы b (через пробел)");
                printf("\nВвод: "); scanf("%i%i", &nb, &mb);
                if ((nb > 255) || (mb > 255)) { printf("Ошибка! Слишком много элементов, программа расчитана на не более 255 строк и столбцов. Повторите попытку"); error = true; }
                else { error = false; }
            } while (error == true);
            if (na != mb) { printf("Ошибка! Чтобы можно было умножить матрицы, количество столбцов матрицы a должно быть равно количеству строк матрицы b."); }
        } while (na != mb);
        unsigned short i, j,k,l; //счётчики
        float Ga, Gb; //Середина массивов (для оформления), счёт с нуля
        Ga = ma / 2.0 - 0.5;
        Gb = mb/2.0-0.5;
 
        printf("\nВведите матрицу a[%ix%i]\n", na, ma);  //МАТРИЦА А
        for (j = 0; j < ma; j++)
        {
            if (j == Ga) { printf("|"); for (k = 0; k < Ga; k++) { printf(" "); } }
            else {
                if (j < Ga) { for (k = 0; k < Ga - j; k++) { printf(" "); } printf("/"); for (; k < Ga; k++) { printf(" "); } } //оформление псевдоскобки матрицы
                else {
                    if (j > Ga) { for (k = 0; k < j - Ga; k++) { printf(" "); } printf("\\"); for (; k < Ga; k++) { printf(" "); } }
            }
            }
            for (i = 0; i < na; i++)
            {
                scanf("%i", &a[i][j]);
            }
        }
 
 
 
        printf("\nВведите матрицу b[%ix%i]\n", na, ma); //МАТРИЦА B
        for (j = 0; j < mb; j++) 
        {
            if (j == Gb) { printf("|"); for (k = 0; k < Gb; k++) { printf(" "); } }
            else {
                if (j < Gb) { for (k = 0; k < Gb - j; k++) { printf(" "); } printf("/"); for (; k < Gb; k++) { printf(" "); } } //оформление псевдоскобки матрицы
                else {
                    if (j > Gb) { for (k = 0; k < j - Gb; k++) { printf(" "); } printf("\\"); for (; k < Gb; k++) { printf(" "); } }
                }
            }
            for (i = 0; i < nb; i++)
            {
                scanf("%i", &b[i][j]);
            }
        }
 
 
        long int c[255][255] = {}, temp; unsigned short znak[255] = {}, max_znak = 0;// количество цифр в строке (для оформления)
        for (j = 0; j < nb; j++) //УМНОЖЕНИЕ
        {
            for (i = 0; i < ma; i++)
            {
                for (k = 0; k < na; k++)
                {
                    c[i][j] += a[k][j] * b[i][k];
                }
                l = 0;
                temp = c[i][j];
                if (temp < 0) { l++; }
                for (; temp; l++) {
                    temp /= 10;
                }
                znak[j] += l;
            //  printf("\nznak[%hu]=%hu", j,znak[j]);
            }
            if (znak[j]>max_znak) { max_znak = znak[j]; }
            //printf("min znak[%hu]=%hu",j,max_znak);
        }
 
        printf("\nРезультат:\n");
        for (j = 0; j < ma; j++)                        //Вывод
        {
            if (j == Ga) { printf("|"); for (k = 0; k < Ga; k++) { printf(" "); } }
            else {
                if (j < Ga) { for (k = 0; k < (Ga - j); k++) { printf(" "); } printf("/"); for (; k < Ga; k++) { printf(" "); } }
                else {
                    if (j > Ga) { for (k = 0; k < (j - Ga); k++) { printf(" "); } printf("\\"); for (; k < Ga; k++) { printf(" "); } }
                }
            }
            for (i = 0; i < nb; i++)
            {
                printf("%ld ", c[i][j]); //ld – long int
            }
            for (i = 0; i < (max_znak-znak[j]);i++) {
                printf(" ");
            }
            if (j == Ga) { for (k = 0; k < Ga; k++) { printf(" "); } printf("|"); }
            else {
                if (j < Ga) { for (k = 0; k < j; k++) { printf(" "); } printf("\\"); }
                else {
                    if (j > Ga) { for (k = 0; k < (2 * Ga - j); k++) { printf(" "); } printf("/"); }
                }
            }
            printf("\n");
        }
        system("pause");
}
и работала программа правильно:
Не могу создать нормальный двухмерный динамический массив

Но захотел я изменить их на динамические, как программа стала работать неправильно:
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <math.h>
using namespace std;
void main() {
    //setlocale(LC_ALL, "rus");
    system("chcp 1251");
        int na,ma,nb,mb; bool error = false;        unsigned short i, j, k, l; //счётчики
        do {
            do { //Ввод массива а
                printf("Введите количество столбцов и строк матрицы a (через пробел)");
                printf("\nВвод: "); scanf("%i%i", &na, &ma);
                if ((na > 255) || (ma > 255)) { printf("\nОшибка! Слишком много элементов, программа расчитана на не более 255 строк и столбцов. Повторите попытку");   error = true; }
                else { error = false; }
                if (((na < 1) || (ma < 1)) && (error != true)) { printf("\nОшибка! Матрица должна содержать как минимум 1 столбец и 1 строку. Повторите попытку"); error = true; }
                else { error = false; }
            } while (error == true);
            do {//Ввод массива b
                printf("Введите количество столбцов и строк матрицы b (через пробел)");
                printf("\nВвод: "); scanf("%i%i", &nb, &mb);
                if ((nb > 255) || (mb > 255)) { printf("\nОшибка! Слишком много элементов, программа расчитана на не более 255 строк и столбцов. Повторите попытку");   error = true; }
                else { error = false; }
            } while (error == true);
            if (na != mb) { printf("\nОшибка! Чтобы можно было умножить матрицы, количество столбцов матрицы a должно быть равно количеству строк матрицы b."); }
        } while (na != mb);
 
        int** a = new int* [ma];
        for (i = 0; i < ma; i++) { 
            a[i] = new int[na];
        }
        int** b = new int* [mb];
        for (i = 0; i < mb; i++) {
            b[i] = new int[nb];
        }
        float Ga, Gb; //Середина массивов (для оформления), счёт с нуля
        Ga = ma / 2.0 - 0.5;
        Gb = mb/2.0-0.5;
 
        printf("\nВведите матрицу a[%ix%i]\n", na, ma);  //МАТРИЦА А
        for (j = 0; j < ma; j++)
        {
            if (j == Ga) { printf("|"); for (k = 0; k < Ga; k++) { printf(" "); } }
            else {
                if (j < Ga) { for (k = 0; k < Ga - j; k++) { printf(" "); } printf("/"); for (; k < Ga; k++) { printf(" "); } } //оформление псевдоскобки матрицы
                else {
                    if (j > Ga) { for (k = 0; k < j - Ga; k++) { printf(" "); } printf("\\"); for (; k < Ga; k++) { printf(" "); } }
            }
            }
            for (i = 0; i < na; i++)
            {
                scanf("%i", &a[i][j]);
            }
        }
 
        printf("\nВведите матрицу b[%ix%i]\n", nb, mb); //МАТРИЦА B
        for (j = 0; j < mb; j++) 
        {
            if (j == Gb) { printf("|"); for (k = 0; k < Gb; k++) { printf(" "); } }
            else {
                if (j < Gb) { for (k = 0; k < Gb - j; k++) { printf(" "); } printf("/"); for (; k < Gb; k++) { printf(" "); } } //оформление псевдоскобки матрицы
                else {
                    if (j > Gb) { for (k = 0; k < j - Gb; k++) { printf(" "); } printf("\\"); for (; k < Gb; k++) { printf(" "); } }
                }
            }
            for (i = 0; i < nb; i++)
            {
                scanf("%i", &b[i][j]);
            }
        }
 
        long int** c = new long int* [ma];
        for (i = 0; i < ma; i++) {
            c[i] = new long int[nb];
        }
        long int temp; unsigned short znak[255] = {}, max_znak = 0;// количество цифр в строке (для оформления)
        for (j = 0; j < nb; j++) //УМНОЖЕНИЕ
        {
            for (i = 0; i < ma; i++)
            {
                for (k = 0; k < na; k++)
                {
                    c[i][j] += a[k][j] * b[i][k];
                }
                l = 0;
                temp = c[i][j];
                if (temp < 0) { l++; }
                for (; temp; l++) {
                    temp /= 10;
                }
                znak[j] += l;
            //  printf("\nznak[%hu]=%hu", j,znak[j]);
            }
            if (znak[j]>max_znak) { max_znak = znak[j]; }
            //printf("min znak[%hu]=%hu",j,max_znak);
        }
        for (i = 0; i < ma; i++) {
            delete[] a[i];
        }
        delete a;
        for (i = 0; i < mb; i++) {
            delete[] b[i];
        }
        delete b;
        printf("\nРезультат:\n");
        for (j = 0; j < ma; j++)                        //Вывод
        {
            if (j == Ga) { printf("|"); for (k = 0; k < Ga; k++) { printf(" "); } }
            else {
                if (j < Ga) { for (k = 0; k < (Ga - j); k++) { printf(" "); } printf("/"); for (; k < Ga; k++) { printf(" "); } }
                else {
                    if (j > Ga) { for (k = 0; k < (j - Ga); k++) { printf(" "); } printf("\\"); for (; k < Ga; k++) { printf(" "); } }
                }
            }
            for (i = 0; i < nb; i++)
            {
                printf("%ld ", c[i][j]); //ld – long int
            }
            for (i = 0; i < (max_znak-znak[j]);i++) {
                printf(" ");
            }
            if (j == Ga) { for (k = 0; k < Ga; k++) { printf(" "); } printf("|"); }
            else {
                if (j < Ga) { for (k = 0; k < j; k++) { printf(" "); } printf("\\"); }
                else {
                    if (j > Ga) { for (k = 0; k < (2 * Ga - j); k++) { printf(" "); } printf("/"); }
                }
            }
            printf("\n");
        }
        system("pause");
}
Не могу создать нормальный двухмерный динамический массив

Что я сделал неправильно?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2019, 19:00
Ответы с готовыми решениями:

Создать двухмерный динамический массив строк
Ввести 2-мерный массив. Количество строк и столбцов заранее неизвестно. Признаком конца ввода...

Динамический двухмерный массив (создать матрицу)
Меня немного клинит, хочу уточнить. Задача заключается в том, чтобы создать двухмерный массив:...

Создать двухмерный динамический массив в котором размер строк случайное число
Пользователь вводит количество строк двумерного динамического массива. Программа создаёт этот...

Создать класс Matrix, реализующий двухмерный динамический массив типа int
Здравствуйте! Задание: Создать класс Matrix, реализующий двухмерный динамический массив типа int....

11
Модератор
Эксперт С++
12121 / 9788 / 5914
Регистрация: 18.12.2011
Сообщений: 26,263
10.09.2019, 20:46 2
C++
1
2
3
4
5
6
7
8
9
        for (j = 0; j < nb; j++) //УМНОЖЕНИЕ
        {
            for (i = 0; i < ma; i++)
            {
                c[i][j]=0; /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                for (k = 0; k < na; k++)
                {
                    c[i][j] += a[k][j] * b[i][k];
.....
1
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
11.09.2019, 18:57  [ТС] 3
zss, Спасибо! Ещё один вопрос – когда я полностью ввожу массив b, вызывается исключение:
Не могу создать нормальный двухмерный динамический массив
0
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
12.09.2019, 17:43  [ТС] 4
Оказывается, иногда срабатывает, даже если массив b введен не полностью (только одна строка из двух)
0
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
19.09.2019, 17:20  [ТС] 5
тема ещё актуальна.
0
woldemas
19.09.2019, 17:26
  #6

Не по теме:


Зачем вам двумерный массив? Используйте одномерный, но большой. Я всегда так делаю.

0
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
19.09.2019, 18:15 7
Цитата Сообщение от Титан_1 Посмотреть сообщение
Оказывается, иногда срабатывает
скорее всего не правильно память для массива выделяешь.
0
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
19.09.2019, 18:30  [ТС] 8
_stanislav, а как правильно? Пробовал при выделении памяти строки и столбцы менять местами, но от этого программа правильно работать не стала
0
Модератор
Эксперт С++
12121 / 9788 / 5914
Регистрация: 18.12.2011
Сообщений: 26,263
19.09.2019, 20:41 9
Думаю, проблема в:
Цитата Сообщение от Титан_1 Посмотреть сообщение
delete a;
Цитата Сообщение от Титан_1 Посмотреть сообщение
delete b;
C++
1
delete[] a;
C++
1
delete[] b;
delete и delete[] - это разные операторы.
0
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
21.09.2019, 09:19  [ТС] 10
zss, исправил, но это не решило проблему – ведь она иногда появляется ДО окончания ввода второго массива. Единственное, где может быть проблемы – при выделении памяти (или, в крайнем случае, при вводе), а где там ошибка я найти не могу
0
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
21.09.2019, 09:33  [ТС] 11
Выделил на единицу больше строк, как я сразу не догадался:
C++
1
2
3
4
5
6
7
8
int** a = new int* [ma];
        for (i = 0; i <= ma; i++) { 
            a[i] = new int[na];
        }
        int** b = new int* [mb];
        for (i = 0; i <= mb; i++) {
            b[i] = new int[nb];
        }
Правда зачем массиву b (и почему именно ему) требуется на один кусочек больше памяти, чем в него вводится – я понять не могу.

Теперь проблема при удалении массивов. Если эту часть убрать, то программа работает правильно:
C++
1
2
3
4
5
6
7
8
        for (i = 0; i <= ma; i++) { // Пробовал делать <; обе строки без [], но всё равно
            delete[] a[i]; //<-здесь срабатывает точка останова
        }
        delete[] a;
        for (i = 0; i <= mb; i++) {
            delete[] b[i];
        }
        delete[] b;
Не могу создать нормальный двухмерный динамический массив
0
14 / 14 / 3
Регистрация: 24.05.2014
Сообщений: 988
21.09.2019, 09:46  [ТС] 12
Нет, просто он зачем-то выделяет строкам память для столбцов и vv.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
        int** a = new int* [na];
        for (i = 0; i < na; i++) { 
            a[i] = new int[ma];
        }
        int** b = new int* [nb];
        for (i = 0; i < nb; i++) {
            b[i] = new int[mb];
        }
проблема решилась. Странно, что когда-то я делал так же и проблем только сменялась другой ошибкой

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
        for (i = 0; i < na; i++) {
            delete[] a[i];
        }
        delete[] a;
        for (i = 0; i < nb; i++) {
            delete[] b[i];
        }
        delete[] b;
Теперь программа работает и правильно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2019, 09:46
Помогаю со студенческими работами здесь

Создать двухмерный динамический массив
Создать двухмерный динамический массив, имея следующее описание const n = 100; type mas = array...

Как создать динамический двухмерный массив?
Количество элементов в массиве не известно и оно может изменяться.

Как создать двухмерный динамический массив на Java?
подскажите плиз, каким приблизительным методом можно создать двухмерный динамический массив

Как создать двухмерный динамический массив типа double
Погуглил, посмотрел на форуме, нашёл способ создания квадратной матрицы, а вот MxN не нашёл( ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru