Лекция 12
1. Двумерные массивы Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор
int matr [6][8];
задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j], или более экзотическими способами: *(matr[i]+j) или *(*(matr+i)+j). Это возможно, поскольку matr[i] является адресом начала i-й строки массива.
При инициализации многомерного массива он представляется либо как массив массивов (при этом каждый массив заключается в свои фигурные скобки и в этом случае левую размерность при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти: int mass2 [][2] = { {1, 1}, {0, 2}, {1, 0} }:
int mass2 [3][2] = {1, 1, 0, 2, 1, 0}
Пример. Заполнить двумерный массив размером n x m натуральными числами в виде «змейки». Например, при n=3, m=4:
1 2 3 4
8 7 6 5
9 10 11 12 #include
using namespace std;
void main()
{
int n,m,i,j;
cin>>n>>m;
int a[10][10];
int k=1;
for (i=0;i if (i%2!=0)
for (j=0;j {
a[i][j]=k;
k++;
}
else
for (j=m-1;j>=0;j--)
{
a[i][j]=k;
k++;
}
for (i=0;i {
for (j=0;j cout< cout< } } Создание динамического многомерного массива: int nstr, nstb;
cout << " Введите количество строк и столбцов: ";
cin >> nstr >> nstb;
int **a = new int *[nstr]; // 1
for (int i = 0; i a[i] = new int [nstb]; // 3
... В операторе 1 объявляется переменная типа «указатель на указатель на int» и выделяется память под массив указателей на строки массива (количество строк — nstr). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int.
Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции delete [ ] . Указатель на константу удалить нельзя.
Решим предыдущую задачу с использованием динамического массива
#include
#include
using namespace std;
void main()
{
int n,m,i,j;
cin>>n>>m;
int **a;
a=new int *[n];//задаем массив из n элементов, каждый из которых является адресом строки
for (i=0;i a[i]=new int[m]; //выделяем память под каждую строку массива
int k=1;
for (i=0;i if (i%2!=0)
for (j=0;j {
a[i][j]=k;
k++;
}
else
for (j=m-1;j>=0;j--)
{
a[i][j]=k;
k++;
}
for (i=0;i {
for (j=0;j cout< cout< }
for (i=0;i delete[] a[i];
delete []a;//освобождаем память для массива указателей на строки }
Решим эту же задачу с использованием динамического массива и функции
#include
#include
using namespace std;
void zmey(int **a,int n,int m)
{
int i,j,k;
k=1;
for (i=0;i if (i%2==0)
for (j=0;j {
a[i][j]=k;
k++;
}
else
for (j=m-1;j>=0;j--)
{
a[i][j]=k;
k++;
}
}
int ** init_m(int &n,int &m)
{
int i;
cin>>n>>m;
int **a=new int *[n];//задаем массив из n элементов, каждый из которых является адресом строки
for (i=0;i a[i]=new int[m]; //выделяем память под каждую строку массива
zmey(a,n,m);
return a;
}
void del_m(int **a,int n)
{
for (int i=0;i delete [] a[i];
delete []a;//освобождаем память для массива указателей на строки
}
void print_m(int **a,int n,int m)
{
int i,j;
for (i=0;i {
for (j=0;j cout< cout< }
}
void main()
{
int n,m;
int **mas;
mas=init_m(n,m);
print_m(mas,n,m);
del_m(mas,n);
} Второй вариант решения этой же задачи (даны только те функции, в которых есть изменения):
…………
void init_m(int **&a,int &n,int &m)
{
int i;
cin>>n>>m;
a=new int *[n];//задаем массив из n элементов, каждый из которых является адресом строки
for (i=0;i a[i]=new int[m]; //выделяем память под каждую строку массива
zmey(a,n,m);
}
……………
void main()
{
int n,m;
int **mas;
init_m(mas,n,m);
print_m(mas,n,m);
del_m(mas,n,m);
} Ввод и вывод статического массива (с использованием функций)
Вариант 1
const int nmax=20;
const int mmax=20; void init_m(int a[][mmax],int &n, int &m)
{
int i,j;
cin>>n>>m;
for (i=0;i for (j=0;j cin>>a[i][j];
}
void print_m(int a[][mmax],int n,int m)
{
int i,j;
for (i=0;i {
for (j=0;j cout< cout< }
}
void main()
{
int n,m;
int mas[nmax][mmax];
init_m(mas,n,m);
print_m(mas,n,m);
} Вариант 2
#include
#include
using namespace std;
const int nmax=20;
const int mmax=20; void init_m(int *a,int &n, int &m)
{
int i,j;
cin>>n>>m;
for (i=0;i for (j=0;j cin>>*(a+i*m+j);
}
void print_m(int a[],int n,int m)
{
int i,j;
for (i=0;i {
for (j=0;j cout< cout< }
}
void main()
{
int n,m;
int mas[nmax][mmax];
init_m(&mas[0][0],n,m);
print_m(&mas[0][0],n,m);
}
Пример. Удаление из массива строки с номером k
#include
#include
using namespace std;
int ** init_m(int &n,int &m)
{
int i,j,k;
cin>>n>>m;
int **a=new int *[n];//задаем массив из n элементов, каждый из которых является адресом строки
for (i=0;i a[i]=new int[m]; //выделяем память под каждую строку массива
for (i=0;i for (j=0;j cin>>a[i][j]; //ввод массива
return a;
}
void del_m(int **a,int n)
{
for (int i=0;i delete [] a[i];
delete []a;//освобождаем память для массива указателей на строки
}
void print_m(int **a,int n,int m)
{
int i,j;
for (i=0;i {
for (j=0;j cout< cout<<"\n";
}
}
void udal(int **a,int &n,int &m) //удаляем строку k
{
int i,j,k;
cout<<"k";
cin>>k;
for (i=k;i for (j=0;j a[i][j]=a[i+1][j];
n--;
}
void main()
{
int n,m;
int **mas;
mas=init_m(n,m);
print_m(mas,n,m);
udal(mas,n,m);
print_m(mas,n,m);
del_m(mas,n);
}
|