1.2 Работа с двумерным массивом
Двумерным массивом называется совокупность данных, каждое значение которых, зависит от его положения в строке и в столбце.
Каждый элемент двумерного массива описывается как В[i , j], где:
В – имя массива
i - номер строки
j – номер столбца
Если число строк двумерного массива равняется числу столбцов, то матрицы данного типа называются квадратными. Элементы квадратной матрицы вида B[1,1], B[2,2], B[3,3]… составляют главную диагональ. Элементы главной диагонали можно записать так: В[i,i], т.е. индексы строки и столбца совпадают. Например, заполнение нулями главной диагонали матрицы:
for (i=0; i<n; i++) a[i][j]=0;
Побочная диагональ квадратной матрицы проходит из правого верхнего угла в левый нижний. Элементы вспомогательной диагонали можно записать так: В[i,n-i-1], где n – размер массива. Например, заполнение нулями элементов выше вспомогательной диагонали:
for (i=0; i<n-1; i++)
for (j=0; j<n-i-1; j++)
a[i][j]=0;
Заполнение нулями элементов по периметру массива:
for (i=0; i<n; i++) {
a[i][0]=0;
a[i][n-1]=0;
a[0][i]=0;
a[n-1][i]=0;
};
Особое значение при работе с квадратными массивами занимает задача «транспонирования», т.е переворачивания массива относительно главной диагонали. Для выполнения этой задачи нужно поменять местами элементы A[i,j] и A[j,i]. Для перестановки двух элементов в массиве необходимо воспользоваться вспомогательной переменной:
Temp=A[2][5]
A[2][5]=A[5][2];
A[5][2]=Temp;
Для переворачивания всего массива используется двойной цикл
for (i=0; i<n; i++)
for (j=i; j<n; j++) {
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
};
Пример. Вводится квадратная матрица с максимальным размером 10 на 10. Программа заменяет все отрицательные числа их модулями.
#include <iostream.h>
#include <conio.h>
void main() {
int a[10][10];
int n,i,j;
cout<<"\n Введите количество строк и столбцов";
cin>>n;
for (i=0; i<n; i++){
cout <<"\nVvedi "<< i<<" stroky";
for (j=0; j< n; j++)
cin>> a[i][j]; // Ввод элементов матрицы
}
for (i=0; i< n; i++)
for (j=0; j< n; j++)
if (a[i][j] < 0) a[i][j]=-a[i][j];
// Вывод матрицы
cout <<"\n";
for (i=0; i< n; i++) {
for (j=0; j< n; j++)
cout<< a[i][j]<<" ";
cout<<"\n";
}
getch();
}
1.3 Динамические массивы
Динамическим считается массив, который способен в любой момент изменять свой размер. Эта возможность обеспечивается за счет динамического выделения памяти под массив.
Идеология языка C++ предполагает, что каждый объект создаётся (объявляется) именно в том месте, где он нужен, и является работоспособным сразу после создания. Для этого каждый класс имеет определённый набор конструкторов — функций, которые должны автоматически запускаться при создании объекта (экземпляра данного класса) и инициализировать его члены.
При создании динамического массива необходимо указать его имя (указатель) и размерность. Например, для двумерного массива:
int n=10, m=10;
int** a=new int* [n];
for (int i=0; i<n; i++)
a[i]=new int[m];
Будет выделен фрагмент динамической памяти 8х10x10=800 байт и адрес начала этого фрагмента помещен в a.
Освобождение памяти выполняется следующей операцией (квадратные скобки обязательны)
delete[] a;
Пример. Дана целочисленная матрица, состоящая из NxM элементов. Заполнить ее с клавиатуры. Вывести индексы четных элементов второй строки.
Начнем решение задачи с составления алгоритма.
Словесный алгоритм решения задачи следующий:
1. Запрос количества строк и столбцов в матрице.
2. Ввод матрицы a, состоящей из NхМ целых чисел.
3. Просматриваются в цикле все элементы второй строки массива (с номером 1) с целью четные (т.е. остаток от деления на 2 равен 0: a[1,j]%2==0). В случае, если в матрице найдено выполнение указанного соотношения, на экран выдается номер строки 1 и столбца j, для которого выполняется рассматриваемое соотношение.
На рисунке 1 дана детальная блок-схема алгоритма.
Программа, реализующая данный алгоритм, представлена ниже:
#include<iostream.h>
#include <conio.h>
main () {
int N, temp;
int i, k;
cout << "\n Введите количество строк ";
cin >> N;
cout << "\n Введите количество столбцов ";
Рис. 1 Блок-схема
int** a=new int* [N];
for (int i=0; i<N; i++)
a[i]=new int[M];
// Ввод матрицы
for (i=0; i<N; i++){
cout <<"\nVvedi "<< i<<" stroky";
for (j=0; j< M; j++)
cin>> a[i][j];
}
for (i=0; i< M; i++)
if (a[1][i]%2==0) cout<<”1,“<<j<<”\n”;
delete[] a;
getch();
}