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

Редактор многомерных динамических массивов - C++

Восстановить пароль Регистрация
 
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 11:47     Редактор многомерных динамических массивов #1
!!! Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. !!!
Помогите мне пожалуйста написать следующую "задачу", заранее большое спасибо!
Условие:
Создать проект, содержащий двумерный динамический массив, заполненный случайными числами. Высота и длина массива вводятся с клавиатуры. Реализовать 4 функции, каждая из которых принимает указатель на двумерный динамический массив, высоту и длину массива. Первая функция добавляет в массив строку в указанную позицию, вторая – добавляет в массив столбец в указанную позицию, третья – удаляет из массива строку из указанной позиции, четвёртая - удаляет из массива столбец из указанной позиции. Добавьте меню, в котором пользователь может выбрать желаемую операцию.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 11:47     Редактор многомерных динамических массивов
Посмотрите здесь:

C++ Использование динамических массивов
Из динамических массивов в обычные C++
C++ Динамических массивов
C++ Обработка многомерных массивов
C++ Обработка многомерных массивов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 11:56     Редактор многомерных динамических массивов #2
Предлагаю смотреть в сторону паттерна, применённого при разработке паскаля:
Многомерный массив есть синоним массива массивов,
то есть
Pascal
1
A[1,2]
- синоним
Pascal
1
A[1][2]
, а
Pascal
1
A[1,2,3]
- синоним не только
Pascal
1
A[1][2][3]
, но и
Pascal
1
A[1,2][3]
и
Pascal
1
A[1][2,3]
и вообще можно произвольно перекраивать в разделе операций скобки одного и того же массива и присваивать целиком массив-элемент любой размерности. Но, так как в c/c++ оператор [] поддерживает только один индекс, свести все массивы только к одномерным. Массив-элемент должен, как в паскале, принимать присваивание только в рамках точно равной размерности, количества элементов и диапазонов индексов.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.04.2012, 12:05     Редактор многомерных динамических массивов #3
ИМХО аналогии с Паскалем при изучении массивов в Си не уместны.
В Си в отличие (хоть я его и не очень помню) Паскаля. Массивы гарантированно хранятся как указатель на кусок памяти с непрерывно следующими в нём подряд элементами.

Двумерные массивы соответственно указатель на кусок памяти с подряд записанными в него указателями, каждый из которых указывает на строку массива, то есть тоже на непрерывный кусок памяти размера N*sizeof(element)

Что общего с Паскалем?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 12:15     Редактор многомерных динамических массивов #4
И как ты себе представляешь двумерный сёвфый массив?
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 12:53  [ТС]     Редактор многомерных динамических массивов #5
Речь точно идет об консоле?
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 12:55     Редактор многомерных динамических массивов #6
И что? Как это связано с концепцией данных?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.04.2012, 13:16     Редактор многомерных динамических массивов #7
Цитата Сообщение от taras atavin Посмотреть сообщение
И как ты себе представляешь двумерный сёвфый массив?
как указатель на начало массива указателей на начальные элементы N одномерных массивов. Не?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 13:19     Редактор многомерных динамических массивов #8
То есть двумерный массив, представленный массивом массивов. На c/c++ нет самого понятия многомерности, есть только вложение одного массива в другой, а в постановке задачи фигурирует не массив массивов, а именно многомерный массив. Я предложил использовать синонимичность этих понятий в других языках и реализовать контроль размеров вложенного массива при его присваивании.
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 13:38  [ТС]     Редактор многомерных динамических массивов #9
Признаться честно, я не в теме разговора, на разве это не двумерный массив?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
# include <locale>
#include <Windows.h>
using namespace std;
void main ()
{
    const int row = 4;
    const int col=5;
    int arr[row][col];
    for(int i=0 ; i < row ; i++ )
    {
        for (int z=0; z<col;z++)
        {
            arr[i][z]=rand()%(5);
            cout<<arr[i][z]<<"\t";
        }
        cout<<"\n";
    }
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
09.04.2012, 14:03     Редактор многомерных динамических массивов #10
вы оба такую ересь щас несете.
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 15:15  [ТС]     Редактор многомерных динамических массивов #11
Может вернемся к теме? А не к "Философии"
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.04.2012, 17:20     Редактор многомерных динамических массивов #12
короче мой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
int** allocate2d(int m, int n){
  int** ppi;
  int* pi;
  int i;
  ppi=(int**)malloc(m*sizeof(int*));
  pi=(int*)malloc(n*m*sizeof(int));
  for (i=0; i<m*n; i+=n){
    ppi[i]=pi+i;
  }
  return ppi;
}
Но так как ТС по-видимому только начал изучать Си, в указателях ему ещё предстоит разбираться.
Про это я и говорил выше. В Си, в отличие от Паскаля, не разобравшись в работе памяти, с массивами, а тем более с динамическими 2d массивами лучше не начинать работать.

Добавлено через 37 минут
Цитата Сообщение от Hqw33 Посмотреть сообщение
int arr[row][col];
Hqw33, то что ты объявил - это массив размера row из row штук массивов размера col
массив массивов.
Компьютерная память вообще линейна, все 2D 3D и прочие массивы существуют только в нашей голове.
В си нам даётся только одномерный массив,
Для обращения к массиву в памяти, нам нужен только адрес его первого элемента
То есть в row содержится адрес начала массива, применяя к которому оператор []
мы совершаем действие аналогичное *(arr+i), которое в свою очередь возвращает нам i-й ряд
Но i-й ряд тоже является массивом из column элементов, а значит хранится в памяти как адрес первого элемента
Применяя к нему оператор разадресации получаем *( *(arr+i) + j ) это и будет эквивалентно arr[i][j]
Но это не значит что массив многомерен.
Если посмотрите в мой пример, в нём я все m*n штук элементов создаю в одном линейном куске памяти,
И затем Создаю массив указателей, которые уже указывают, откуда в этом куске начинается первая строка, откуда вторая, откуда i-я
Через возвращаемый указатель на указатель мы можем обращаться к массиву, как к двумерному,
но в памяти он лежит одним линейным куском размера m*n
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 19:43  [ТС]     Редактор многомерных динамических массивов #13
Просто помогите сделать "меню" (про это написано в условии.)
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
#include <iostream>
#include <iomanip>
#include <stdlib.h>
int ** insertRow( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos > rows ) {
        return arr;
    }
    int ** new_arr = new int*[ rows + 1 ];
    for ( int i = 0; i < rows + 1; i++ ) {
        new_arr[ i ] = new int[ cols ];
        if ( i == pos ) {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = rand() % 100;
            }
        }
        else if ( i < pos ) {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
            delete []arr[ i ];
        }
        else {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i - 1 ][ j ];
            }
            delete []arr[ i - 1 ];
        }
    }
    delete []arr;
    rows++;
    return new_arr;
}
int ** insertCol( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos > cols ) {
        return arr;
    }
    int ** new_arr = new int*[ rows ];
    for ( int i = 0; i < rows; i++ ) {
        new_arr[ i ] = new int[ cols + 1 ];
        for ( int j = 0; j < cols + 1; j++ ) {
            if ( j == pos ) {
                new_arr[ i ][ j ] = rand() % 100;
            }
            else if ( j < pos ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
            else {
                new_arr[ i ][ j ] = arr[ i ][ j - 1 ];
            }
        }
        delete []arr[ i ];
    }
    delete []arr;
    cols++;
    return new_arr;
}
int ** deleteRow( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos >= rows ) {
        return arr;
    }
    int ** new_arr = new int*[ rows - 1 ];
    for ( int i = 0; i < rows - 1; i++ ) {
        new_arr[ i ] = new int[ cols ];
        if ( i < pos ) {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
        }
        else {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i + 1 ][ j ];
            }
        }
        delete []arr[ i ];
    }
    delete []arr[ rows - 1 ];
    delete []arr;
    rows--;
    return new_arr;
}
int ** deleteCol( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos >= cols ) {
        return arr;
    }
    int ** new_arr = new int*[ rows ];
    for ( int i = 0; i < rows; i++ ) {
        new_arr[ i ] = new int[ cols - 1 ];
        for ( int j = 0; j < cols - 1; j++ ) {
            if ( j < pos ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
            else {
                new_arr[ i ][ j ] = arr[ i ][ j + 1 ];
            }
        }
        delete []arr[ i ];
    }
    delete []arr;
    cols--;
    return new_arr;
}
void printArray( int ** arr, int rows, int cols ) {
    for ( int i = 0; i < rows; i++ ) {
        for ( int j = 0; j < cols; j++ ) {
            std::cout << std::setw( 2 ) << arr[ i ][ j ] << "  ";
        }
        std::cout << std::endl;
    }
    std::cout << "-----------------------------------" << std::endl;
}
int main()
{
    int rows = 10;
    int cols = 10;
    int ** arr = new int*[ rows ];
    for ( int i = 0; i < rows; i++ ) {
        arr[ i ] = new int[ cols ];
        for ( int j = 0; j < cols; j++ ) {
            arr[ i ][ j ] = rand() % 100;
        }
    }
    std::cout << "initial:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = insertRow( arr, rows, cols, 2 );
    std::cout << "inserted row 2:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = insertCol( arr, rows, cols, 2 );
    std::cout << "inserted col 2:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = deleteRow( arr, rows, cols, 2 );
    std::cout << "deleted row 2:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = deleteCol( arr, rows, cols, 2 );
    std::cout << "deleted col 2:" << std::endl;
    printArray( arr, rows, cols );
    
    for ( int i = 0; i < rows; i++ ) {
        delete []arr[ i ];
    }
    delete []arr;
    system( "pause" );
}
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
10.04.2012, 07:41  [ТС]     Редактор многомерных динамических массивов #14
Помогите сделать меню!

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
#include <iostream>
#include <iomanip>
#include <stdlib.h>
int ** insertRow( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos > rows ) {
        return arr;
    }
    int ** new_arr = new int*[ rows + 1 ];
    for ( int i = 0; i < rows + 1; i++ ) {
        new_arr[ i ] = new int[ cols ];
        if ( i == pos ) {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = rand() % 100;
            }
        }
        else if ( i < pos ) {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
            delete []arr[ i ];
        }
        else {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i - 1 ][ j ];
            }
            delete []arr[ i - 1 ];
        }
    }
    delete []arr;
    rows++;
    return new_arr;
}
int ** insertCol( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos > cols ) {
        return arr;
    }
    int ** new_arr = new int*[ rows ];
    for ( int i = 0; i < rows; i++ ) {
        new_arr[ i ] = new int[ cols + 1 ];
        for ( int j = 0; j < cols + 1; j++ ) {
            if ( j == pos ) {
                new_arr[ i ][ j ] = rand() % 100;
            }
            else if ( j < pos ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
            else {
                new_arr[ i ][ j ] = arr[ i ][ j - 1 ];
            }
        }
        delete []arr[ i ];
    }
    delete []arr;
    cols++;
    return new_arr;
}
int ** deleteRow( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos >= rows ) {
        return arr;
    }
    int ** new_arr = new int*[ rows - 1 ];
    for ( int i = 0; i < rows - 1; i++ ) {
        new_arr[ i ] = new int[ cols ];
        if ( i < pos ) {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
        }
        else {
            for ( int j = 0; j < cols; j++ ) {
                new_arr[ i ][ j ] = arr[ i + 1 ][ j ];
            }
        }
        delete []arr[ i ];
    }
    delete []arr[ rows - 1 ];
    delete []arr;
    rows--;
    return new_arr;
}
int ** deleteCol( int ** arr, int & rows, int & cols, int pos ) {
    if ( pos < 0 || pos >= cols ) {
        return arr;
    }
    int ** new_arr = new int*[ rows ];
    for ( int i = 0; i < rows; i++ ) {
        new_arr[ i ] = new int[ cols - 1 ];
        for ( int j = 0; j < cols - 1; j++ ) {
            if ( j < pos ) {
                new_arr[ i ][ j ] = arr[ i ][ j ];
            }
            else {
                new_arr[ i ][ j ] = arr[ i ][ j + 1 ];
            }
        }
        delete []arr[ i ];
    }
    delete []arr;
    cols--;
    return new_arr;
}
void printArray( int ** arr, int rows, int cols ) {
    for ( int i = 0; i < rows; i++ ) {
        for ( int j = 0; j < cols; j++ ) {
            std::cout << std::setw( 2 ) << arr[ i ][ j ] << "  ";
        }
        std::cout << std::endl;
    }
    std::cout << "-----------------------------------" << std::endl;
}
int main()
{
    int rows = 10;
    int cols = 10;
    int ** arr = new int*[ rows ];
    for ( int i = 0; i < rows; i++ ) {
        arr[ i ] = new int[ cols ];
        for ( int j = 0; j < cols; j++ ) {
            arr[ i ][ j ] = rand() % 100;
        }
    }
    std::cout << "initial:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = insertRow( arr, rows, cols, 2 );
    std::cout << "inserted row 2:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = insertCol( arr, rows, cols, 2 );
    std::cout << "inserted col 2:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = deleteRow( arr, rows, cols, 2 );
    std::cout << "deleted row 2:" << std::endl;
    printArray( arr, rows, cols );
    
    arr = deleteCol( arr, rows, cols, 2 );
    std::cout << "deleted col 2:" << std::endl;
    printArray( arr, rows, cols );
    
    for ( int i = 0; i < rows; i++ ) {
        delete []arr[ i ];
    }
    delete []arr;
    system( "pause" );
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2012, 08:25     Редактор многомерных динамических массивов
Еще ссылки по теме:

указатели многомерных массивов C++
C++ Быстрая инициализация многомерных массивов
Программирование обработки многомерных массивов C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
10.04.2012, 08:25     Редактор многомерных динамических массивов #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    ....
     int menu;
     do
     {
         cout<<"1 - insert row\n2 - insert column...\n0 - finish:\n"
         cin>>menu;
         switch(menu)
         {
               case 1:
                        ....
                   mass=insertRow( mass,rows, cols, pos );
                   break;
               case 2:
                        ....
                   mass=insertColumn( mass,... );
                   break;
         case 3:
                     ....
         }
     }while(menu);
}
Yandex
Объявления
10.04.2012, 08:25     Редактор многомерных динамических массивов
Ответ Создать тему
Опции темы

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