Двумерные динамические массивы
Динамическими в C++ могут быть не только одномерные массивы, но также и многомерные. Из тех, что входят в класс последних, рассмотрим двумерные динамические массивы (динамические матрицы).
Основной способ работы с динамическими матрицами базируется на использовании указателя на указатель и массива указателей.
Пусть, например, требуется создать динамическую матрицу целых чисел из n строк и m столбцов. Для этого сначала необходимо с помощью операции new создать одномерный массивиз n указателей и адрес массива указателей запомнить в переменнойmatr, объявленной как указатель на указатель. После этого необходимо в цикле с помощью операции new выделить память под m элементов каждой строки матрицы, и запомнить адрес выделенной области памяти в соответствующем элементе массива указателей.
Пример. Создание и удаление двумерного динамического массива.
…
int n, m;
int** matr; // matr – указатель на указатель
cin>>n>>m; // n – число строк, m –число столбцов
matr = new int *[n]; // массив указателей на строки
if(!matr){cout<<"Error"<<endl; exit(1);}
for(int i = 0; i < n; i++){ // выделение памяти для каждой
matr[i] = new int[m]; // строки по числу столбцов m
if(!matr[i]){cout<<"Error"<<endl; exit(1);}
}
for(int i = 0; i < n; i++) // освобождение памяти
delete [] matr[i];
delete [] matr;…
Удаление динамического двумерного массива происходит в несколько этапов. Cначала удаляются одномерные массивы элементов. Затем удаляется массив указателей на одномерные массивы элементов.
Для обращения к элементам динамического массива с индексами i и j допускаются только следующие записи:
matr[i][i] *(mat[i] + j) *(*(matr + i) + j)
Под обычный (статический) двумерный массив из n строк и m столбцов при объявлении выделяется сплошной участок памяти, равный произведению n*m . Для такого же динамического массива выделенная память не представляет собой сплошной участок, поскольку она выделяется с помощью нескольких операций new.
// Пример 9.3. Динамическая матрица a[n][m] создаётся в main()
// случайной выборкой. Используются указатель на указатель и массив
// указателей. Выполняется перестановка 0 и 1-ой строк матрицы.
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n, m;
cout<<"Vvedi n, m: "; cin>>n>>m;
srand(n + m);
int ** a = new int* [n]; // память под массив указателей
if(!a){cout<<"No memory"<<endl; exit(1);}
for(int i = 0; i < n; i++){
a[i] = new int[m]; // память под i-ую строку
if(!a[i]){cout<<" No memory "<<endl; exit(1);}
for(int j = 0; j < m; j++) // заполнение i-ой строки
*(a[i] + j) = rand() % 25 - 10;
}
cout<<"Isxodnaya matrix\n";
for(int i = 0; i < n; i++){ // вывод матрицы до перестановки строк
for(int j = 0; j < m; j++)
cout<<'\t'<<setw(4)<<a[i][j];
cout<<endl;
}
cout<<endl;
int* p = a[0]; a[0] = a[1]; a[1] = p; // перестановка 0 и 1-ой строк
// Вывод матрицы после перестановки строк
cout<<"Rezult matrix\n";
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++)
cout<<'\t'<<setw(4)<<a[i][j];
cout<<endl;
}
for(int i = 0; i < n; i++) //освобождение динамической памяти
delete [] a[i];
delete [] a;
system("pause");
}
// Пример 9.4. Память для матрицы a[n][m] выделяется в функции
// main(). Адрес матрицы передаётся в функциюinit() –создание
// матрицы. Используются функции vivod() –вывод матрицы,
// и delMemory() –освобождение памяти.
#include <iostream>
using namespace std;
void init(int** x, int n, int m){ // функция создания матрицы
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
x[i][j] = rand() % 25 - 10;
}
void vivod(int** x, int n, int m){ // функция вывода матрицы
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout.width(3); cout<<x[i][j];
}
cout<<endl;
}
}
void delMemory(int** x, int n, int m){ // функция удаления памяти
for(int i = 0; i < n; i++)
delete [] x[i];
delete [] x;
}
int main(){
int m, n; int punkt;
cout<<"Vvedi chislo strok: "; cin>>n;
cout<<"Vvedi chislo elementov v stroke: "; cin>>m;
int** a = new int* [n];
if(!a){cout<<"No memory"<<endl; exit(1);}
for(int i = 0; i < n; i++){
a[i] = new int[m];
if(!a[i]){cout<<"No memory"<<endl; exit(1);}
}
while(1){
cout<<"Vvedite nomer punkta:\n\n";
cout<<"1: init()\n";
cout<<"2: vivod()\n";
cout<<"3: delMemory()\n";
cout<<"4: exit()\n";
cout<<"You change: "; cin>>punkt;
switch(punkt){
case 1: init(a, n, m); break;
case 2: cout<<"Matrix isxodnaya== "<<endl;
vivod(a, n, m); break;
case 3: delMemory(a, n, m); break;
case 4: cout<<"Good-Bye!"; exit(1); break;
}
}
system("pause");
}
// Пример 9.5. Память для a[n][m] выделяется в функции memory().
//Используются функции init(), vivod(), delMemory().
#include <iostream>
using namespace std;
int** memory(int n, int m){
int** x = new int* [n];
if(!x){cout<<"No memory"<<endl; exit(1);}
for(int i = 0; i < n; i++){
x[i] = new int[m]; // Выделение памяти под i-ую строку
if(!x){cout<<"No memory"<<endl; exit(1);}
}
return x;
}
void delMemory(int** x, int n, int m){ // освобождение памяти
for(int i = 0; i < n; i++)
delete [] x[i];
delete [] x;
}
void init(int** x, int n, int m){
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++) // зpаполнение i-ой строки матрицы
x[i][j] = rand() % 25 - 10;
}
void vivod(int** x, int n, int m){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout.width(5); cout<<x[i][j];
}
cout<<endl;
}
}
int main(){
int m, n;
int ** a;
while(1){
cout<<"Vvedite nomer punkta:\n\n";
cout<<"1: memory() \n"<<"2: init() \n";
cout<<"3: vivod() \n"<<"4: delMemory() \n";
cout<<"5: exit() \n";
cout<<endl<<"You change:";
int punkt; cin>>punkt;
switch(punkt){
case 1: system("cls");
cout<<"Vvedi chislo strok:"; cin>>n;
cout<<"Vvedi chislo elementov v stroke:"; cin>>m;
a = memory(n, m); break;
case 2: init(a, n, m); break;
case 3: cout<<"Matrix isxodnaya=="<<endl;
vivod(a, n, m); break;
case 4: delMemory(a, n, m); break;
case 5: cout<<"Good-Bye!"; exit(1); break;
}
}
system("pause");
}
// Пример 9.6. Транспонировать матрицу a[n][m].
// Использовать функции.
#include <iostream>
using namespace std;
int** initMatrix(int);
void vivodMatrix(int**, int);
void transpMatrix(int**, int);
int main(){
int n;
cout<<"Enter the n: "; cin>>n;
int** matr = initMatrix(n);
if(!matr){cout << "\No memory!\n"; exit(1);}
cout<<"\n\tMatrix==\n";
vivodMatrix(matr, n);
transpMatrix(matr, n);
cout<<"\n\tRezult matrix\n";
vivodMatrix(matr, n);
for(int i = 0; i < n; i++) // освобождение памяти
delete [] matr[i];
delete [] matr;
system("pause");
}
int** initMatrix(int n){
int** p = new int* [n];
if(!p) return NULL;
for(int i = 0; i < n; i++){
p[i] = new int [n];
if(!p[i]) return NULL;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
p[i][j] = i + 1;
return p;
}
voidvivodMatrix(int** p, int n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cout.width(4);
cout<<p[i][j];
}
cout << endl;
}
}
void transpMatrix(int** p, int n){
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++){
int x = p[i][j];
p[i][j] = p[j][i];
p[j][i] = x;
}
}
Дата добавления: 2022-05-27; просмотров: 73;