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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
#1

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

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

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

указатели многомерных массивов - C++
как в программе воспользоваться указателями? пишу по конспекту, но что то вообще ничего не получается #include <iostream> #include...

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

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

Передача многомерных массивов в функцию - C++
Привет. Почему при передаче многомерного массива в функцию необходимо обязательно указывать измерения, кроме первого? Зачем это нужно? ...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.04.2012, 12:05 #3
ИМХО аналогии с Паскалем при изучении массивов в Си не уместны.
В Си в отличие (хоть я его и не очень помню) Паскаля. Массивы гарантированно хранятся как указатель на кусок памяти с непрерывно следующими в нём подряд элементами.

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

Что общего с Паскалем?
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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 12:55 #6
И что? Как это связано с концепцией данных?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.04.2012, 13:16 #7
Цитата Сообщение от taras atavin Посмотреть сообщение
И как ты себе представляешь двумерный сёвфый массив?
как указатель на начало массива указателей на начальные элементы N одномерных массивов. Не?
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
583 / 521 / 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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" );
}
zss
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 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);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2012, 08:25
Привет! Вот еще темы с ответами:

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

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

Динамических массивов - C++
Всем доброго дня!!!Если есть минутка, помогите сделать эти задания!буду очень благодарен!! 1. Заданы два массива А(5) и В(5)....

Из динамических массивов в обычные - C++
#include &lt;iostream.h&gt; void trans_pointer() { int n,m,i,j; int **X,**Y; cout &lt;&lt; &quot;Enter m&quot;&lt;&lt;endl; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2012, 08:25
Ответ Создать тему
Опции темы

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