Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
1

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

09.04.2012, 11:47. Показов 1278. Ответов 14
Метки нет (Все метки)

!!! Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. !!!
Помогите мне пожалуйста написать следующую "задачу", заранее большое спасибо!
Условие:
Создать проект, содержащий двумерный динамический массив, заполненный случайными числами. Высота и длина массива вводятся с клавиатуры. Реализовать 4 функции, каждая из которых принимает указатель на двумерный динамический массив, высоту и длину массива. Первая функция добавляет в массив строку в указанную позицию, вторая – добавляет в массив столбец в указанную позицию, третья – удаляет из массива строку из указанной позиции, четвёртая - удаляет из массива столбец из указанной позиции. Добавьте меню, в котором пользователь может выбрать желаемую операцию.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2012, 11:47
Ответы с готовыми решениями:

Обработка многомерных массивов
Создать многомерный массив 4x4.Вывести на экран минимальное значение многомерного массива.

Обработка многомерных массивов
Создать многомерный массив 3x3 элементов.Сделать Разность по горизонтали. Три полученых результата...

Быстрая инициализация многомерных массивов
Доброго времени суток. Работаю на QT Creator в связке с MinGW 32 Проблемы в общем то и нет,...

Не понимаю структуру многомерных массивов
Итак, по психологии я чистый визуал и мне, чтобы что-то сделать, нужно четко представлять это в...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
14
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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++ оператор [] поддерживает только один индекс, свести все массивы только к одномерным. Массив-элемент должен, как в паскале, принимать присваивание только в рамках точно равной размерности, количества элементов и диапазонов индексов.
0
3327 / 2701 / 732
Регистрация: 25.03.2012
Сообщений: 9,770
Записей в блоге: 1
09.04.2012, 12:05 3
ИМХО аналогии с Паскалем при изучении массивов в Си не уместны.
В Си в отличие (хоть я его и не очень помню) Паскаля. Массивы гарантированно хранятся как указатель на кусок памяти с непрерывно следующими в нём подряд элементами.

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

Что общего с Паскалем?
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
09.04.2012, 12:15 4
И как ты себе представляешь двумерный сёвфый массив?
0
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 12:53  [ТС] 5
Речь точно идет об консоле?
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
09.04.2012, 12:55 6
И что? Как это связано с концепцией данных?
0
3327 / 2701 / 732
Регистрация: 25.03.2012
Сообщений: 9,770
Записей в блоге: 1
09.04.2012, 13:16 7
Цитата Сообщение от taras atavin Посмотреть сообщение
И как ты себе представляешь двумерный сёвфый массив?
как указатель на начало массива указателей на начальные элементы N одномерных массивов. Не?
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
09.04.2012, 13:19 8
То есть двумерный массив, представленный массивом массивов. На c/c++ нет самого понятия многомерности, есть только вложение одного массива в другой, а в постановке задачи фигурирует не массив массивов, а именно многомерный массив. Я предложил использовать синонимичность этих понятий в других языках и реализовать контроль размеров вложенного массива при его присваивании.
0
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";
    }
}
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
09.04.2012, 14:03 10
вы оба такую ересь щас несете.
0
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
09.04.2012, 15:15  [ТС] 11
Может вернемся к теме? А не к "Философии"
0
3327 / 2701 / 732
Регистрация: 25.03.2012
Сообщений: 9,770
Записей в блоге: 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
0
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" );
}
0
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" );
}
0
Модератор
Эксперт С++
10489 / 8730 / 5274
Регистрация: 18.12.2011
Сообщений: 23,335
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);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2012, 08:25

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

Программирование обработки многомерных массивов
Дана целочисленная прямоугольная матрица. Определить: количество строк, содержащих хотя бы один...

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

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

Составление программ с использованием многомерных массивов
Задание1: С помощью генератора случайных чисел сформировать матрицу A (5x5) числами от -100 до 100...


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

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

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