Двумерные динамические массивы


Динамическими в 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.025 сек.