Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
56 / 29 / 13
Регистрация: 24.06.2014
Сообщений: 249
Записей в блоге: 1
1

Работа с матрицей, представленной динамическим массивом

09.10.2014, 00:42. Просмотров 403. Ответов 4
Метки нет (Все метки)

Есть задание: Написать программу, которая осуществляет добавление, удаление строки или столбца в любое место двумерной матрицы по выбору пользователя.

Идея есть, в процессе воплощения решил проверить работоспособность.

Кликните здесь для просмотра всего текста
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<windows.h>
using namespace std;
 
inline void get_number(int&);
inline int menu();
inline void rand (int**, const int, const int);
 
template <class T>
void add_col(T**, const int, int&);
template <class T>
void add_row (T**, int&, const int);
template <class T>
void get_ins(T*, const int);
template <class T>
void remove_col (T**, const int, int&);
template <class T>
void remove_row (T**, int&, const int);
template <class T>
inline void out (T**, const int, const int);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(unsigned(time(0)));
 
    int **Matr = 0;
    int nCol, nRow;
 
    cout<<"Введите размерность матрицы, в формате количество строк, пробел, количество столбцов.\n";
    cin>>nRow>>nCol;
 
    Matr = new int*[nRow];
    for (int i = 0; i < nRow; i++)
        *(Matr+i) = new int[nCol];
 
    rand(Matr, nRow, nCol);
 
    bool bOutLabel = true;
    while (bOutLabel)
    {
        switch (menu ())
        {
            case 0: bOutLabel = false;
                break;
            case 1: add_row (Matr, nRow, nCol);
                break;
            case 2: add_col (Matr, nRow, nCol);
                break;
            case 3: remove_row (Matr, nRow, nCol);
                break;
            case 4: remove_col (Matr, nRow, nCol);
                break;
            case 5: out (Matr, nRow, nCol);
                break;
            default : cout<<"Некорректный ввод.\n";
                break;
        }
    }
 
    for (int i = 0; i < nRow; i++)
        delete[] *(Matr+i);
    
    return 0;
}
 
void get_number (int& num)
{
    cout<<"введите номер : ";
    cin>>num;
}
 
int menu ()
{
    int c;
    
        cout<<"Выберите операцию с матрицей : ";
        cout<<"\n1 - добавить строку после выбраной;\n2 - добавить столбец после выбраного;\n"
            <<"3 - удалить выбраную строку;\n4 - удалить выбраный столбец;\n"
            <<"5 - вывести матрицу;\n0 - выход из программы.\n";
        cin>>c;
    if ( 0 == c) return 0;
    if ( 1 == c) return 1;
    if ( 2 == c) return 2;
    if ( 3 == c) return 3;
    if ( 4 == c) return 4;
    if ( 5 == c) return 5;
    else return 999;
}
 
void rand (int **M, const int r, const int c)
{
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            *(*(M+i)+j) = rand()%51;
}
 
template <class T>
void add_col(T **M, const int r, int& c)
{
 
}
 
template <class T>
void add_row (T **M, int& r, const int c)
{
    int num;
    cout<<"В матрице "<<r<<" строк ";
    do {
        get_number(num);
        if (num < 0 || num > r+1)
            cout<<"Номер строки некорректен, возможно значение от 0 до "<<r+1<<"\n";
    } while(num < 0 || num > r+1);
 
    T *ins = 0;
    get_ins(ins, c);
 
    T **tmp = new T*[r+1];
    for (int i = 0; i < r+1; i++)
        *(tmp+i) = new T[c];
 
    for (int i = 0; i < num; i++)
        *(tmp+i) = *(M+i);
    *(tmp+num) = ins;
    for (int i = num; i < r; i++)
        *(tmp+i+1) = *(M+i);
 
    for (int i = 0; i < r; i++)
        delete[] *(M+i);
 
    M = tmp;
    r++;
}
 
template <class T>
void get_ins(T *Ins, const int size)
{
    cout<<"Введите элементы для вставки:\n";
    for (int i = 0; i < size; i++)
    {
        cout<<i+1<<" элемент = ";
        cin>>*(Ins+i);
        cout<<"\n";
    }
}
 
template <class T>
void remove_col (T **M, const int r, int& c)
{
 
}
 
template <class T>
void remove_row (T **M, int& r, const int c)
{
 
}
 
template <class T>
void out (T **M, const int r, const int c)
{
 
}


Проверял только add_row, так как написал первой. Логика вроде правильная. Но при выполнении get_ins ругается.

При отладке выдало следующее:
Необработанное исключение по адресу 0x566E21E8 (msvcp110d.dll) в ConsoleApplication1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000.

В чем косяк?

Добавлено через 3 минуты
Косяк нашёл, вроде пока работает.

Добавлено через 9 минут
Добавил вывод матрицы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class T>
void out (T **M, const int r, const int c)
{
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
            {
                cout.width(4);
                cout<<*(*(M+i)+j);
            }
        cout<<"\n";
    }
}
Если после добавления вызвать вывод программа вылетает, почему?

Добавлено через 56 секунд
+ вместо элементов матрицы - мусор.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2014, 00:42
Ответы с готовыми решениями:

Работа с динамическим массивом
Дано: динамический двумерный массив. Определить сумму всех элементов (с помощью функции, массив и...

Работа с динамическим массивом
Помогите, пожалуйста. В чем проблема? Компилирует, но выполнять не хочет. Надо вставить элемент в...

Работа с динамическим массивом структур
Односвязный список. Проблема (скорее всего) в строке ListPoint1 = pointer; Pointer использую как...

Работа с динамическим двумерным массивом
Написал код. В двумерном массиве 5х5 находится максимальное значение каждой строки и затем...

4
1182 / 467 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
09.10.2014, 15:34 2
Цитата Сообщение от EfimKR Посмотреть сообщение
вместо элементов матрицы - мусор
Инициализируй матрицу для начала
0
56 / 29 / 13
Регистрация: 24.06.2014
Сообщений: 249
Записей в блоге: 1
09.10.2014, 21:46  [ТС] 3
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
Инициализируй матрицу для начала
какую именно?
0
1182 / 467 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
15.10.2014, 01:39 4
EfimKR, все. Перед работой-все.
0
56 / 29 / 13
Регистрация: 24.06.2014
Сообщений: 249
Записей в блоге: 1
16.10.2014, 20:40  [ТС] 5
^Tecktonik_KiLLeR, вообще то я рьяный поклонник принципа "Не уверен - обнули". Но тут проблема в другом была. Решилась при изменении способа передачи массива в функцию. Нужно было передавать как ссылку на указатель на указатель на инт.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2014, 20:40

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

Работа с динамическим одномерным массивом
Нужно реализовать функцию void appendElements (Array, *array, int *xs, int n);, которая добавляет n...

Работа с динамическим массивом: три варианта инициализации в отдельной функции
Не правильно выводит cout &lt;&lt; &quot;1 елемент массива: &quot; &lt;&lt; mainArray &lt;&lt; endl; В чем проблема? Спасибо....

Работа с динамическим массивом (Упорядочить его по возрастанию элементов в каждом столбце)
Дан массив L,размером n*m.Упорядочить его по возрастанию элементов в каждом столбце. Программа...

Работа с динамическим массивом кнопок
Помогите советом! Имеется динамический массив кнопок: const int i=50, j=30; TBitBtn *MyButton;...

Работа с динамическим массивом CheckBox и событие onclick
вопрос: например у меня в файле хранится заданное число N необходимо динамически создать N...

Работа с динамическим массивом
Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка ....


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

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

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