Двумерные массивы
В соответствии с синтаксисом С++ в языке существуют только одномерные массивы. Однако элементами одномерного массива могут, в свою очередь, быть одномерные массивы.
Таким образом, двумерные массивы (матрицы) представляют собой массивы одномерных массивов и должны быть объявлены в программе следующим образом:
тип_элементов имя_массива[размер1][размер2]; где
тип_элементов – допустимый в С++ тип данных;
имя_массива – идентификатор, задаваемый правилами языка;
размер1 – количество строк; размер2 – количество столбцов.
В памяти компьютера матрицы располагаются в следующем порядке: сначала располагаются элементы первой строки, за ней – элементы второй, третьей и т.д. Например, объявление
float b[4][3];
определяет двумерный массив (матрицу), первый индекс которого изменяется от 0 до 3, второй – от 0 до 2. Элементы этого массива можно перечислить следующим образом:
b[0][0], b[0][1], b[0][2], b[1][0],...,b[1][2],…,b[3][0], …,b[3][2]
Отметим ещё раз, что нумерация элементов по каждому из индексов начинается с нуля.
Заполнение и обработку двумерных массивов обычно производят, пользуясь вложенными циклами.
Инициализация двумерных массивов
При объявлении двумерного массива может выполняться его инициализация, которая осуществляется аналогично инициализации одномерных массивов.
Массив можно проинициализировать, группируя с помощью фигурных скобок элементы строк, например:
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
Эта запись эквивалентна следующей записи:
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;
Тот же результат можно получить с одним списком инициализации:
int a[2][3] = {1, 2, 3, 4, 5, 6};
С помощью инициализации можно присваивать значения не всем элементам многомерного массива. Например, чтобы инициализировать только элементы первого столбца матрицы, её можно объявить так:
int b[4][3] = {{1}, {2}, {3}, {4}};
Обработка двумерных массивов
Обращение к элементам двумерных массивов осуществляется с помощью индексированных переменных, с той лишь разницей, что вместо одного индекса используются два индекса, например:
y = a[1][4] * 3;
a[3][1] = 15 * x;
При вводе двумерных массивов обычно используются два вложенных цикла: внешний – по одному измерению массива, внутренний цикл – по другому измерению, например:
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin>>a[i][j];
Параметр i в ходе выполнения цикла изменяется от 0 до n-1, таким образом, перебираются все строки. Для каждого значения параметра i выполняется вложенный цикл, в котором параметр j изменяется от 0 до m-1, таким образом, в каждой строке перебираются все её элементы.
Вывод массива выполняется аналогично, с помощью двух вложенных циклов. Как правило, двумерный массив выводится в виде матрицы:
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout.width(4); // задаём ширину поля для элемента
cout<<a[i][j];
}
cout << endl;
}
Аналогичным образом можно присвоить всем элементам массива некоторое случайное значение:
const int N = 3, M = 5;
int a[N][M];
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
a[i][j] = rand() % 10 – 5;
// Пример 6.6. Дана матрица a[n][m]. Вычислить сумму элементов
// нижнего треугольника матрицы и произведение элементов
// главной диагонали матрицы.
#include <iostream>
using namespace std;
const int DIM = 20;
int main(){
int a[DIM][DIM], n;
cout<<" Vvdite razmer massiva n: "; cin >> n;
srand(n);
cout<<"\n\tMatrix==\n";
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
a[i][j] = rand() % 9 - 3;
cout.width(4); cout<<a[i][j];
}
cout << endl;
}
int sum = 0;
for(int i = 1; i < n; i++)
for(int j = 0; j < i ; j++)
sum = sum + a[i][j]; // сумма элементов нижнего
cout<<"sum = "<<sum<<endl; // треугольника матрицы
long mult = 1;
for(int i = 0; i < n; i++) // произведение элементов
mult = mult * a[i][i]; // главной диагонали матрицы
cout<<"mult = "<<mult<<endl;
system("pause");
}
// Пример 6.7. Дана матрица a[n][m]. Вычислить суммы
// элементов строк матрицы, записав их в массив sum[n].
#include <iostream>
using namespace std;
const int D1 = 10, D2 = 10;
int main(){
int a[D1][D2], sum[D1], n, m;
cout<<" Vvdite razmer massiva: (n, m): "; cin>>n>>m;
srand(n+m);
cout << "\n\tIsxodnaya matrix\n";
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
a[i][j] = rand() % 20 - 5;
cout.width(6); cout<<a[i][j];
}
cout<<endl;
}
for(int i = 0; i < n; i++){
sum[i] = 0;
for(int j= 0; j < m; j++)
sum[i] = sum[i] + a[i][j];
}
for(int i = 0; i < n; i++)
cout<<"\nsum "<<i<<" stroki matrix = "<<sum[i]<<endl;
system("pause");
}
// Пример 6.8. Дана матрица a[n][m]. Найти максимальный и
// минимальный элементы матрицы и их индексы.
#include <iostream>
using namespace std;
const int D1 = 10, D2 = 10;
int main(){
float a[D1][D2];
int n, m;
cout<<" Vvеdite razmer massiva (n, m): "; cin>>n>>m;
srand(n + m);
cout << "\nSourse matrix\n";
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++) {
a[i][j] = rand() % 15 - 5;
cout.width(4); cout<<a[i][j];
}
cout<<endl;
}
int max = a[0][0], imax = 0, jmax = 0;
int min = a[0][0], imin = 0, jmin = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++){
if(a[i][j] >= max){ max = a[i][j]; imax = i; jmax = j; }
if(a[i][j] <= min){ min = a[i][j]; imin = i; jmin =j; }
}
cout<<"Maximum element of matrix: ";
cout<<"a[" << imax << "," << jmax << "] = "<<a[imax][ jmax]<<endl;
cout<<"Minimum element of matrix: ";
cout<<"a[" << imin << "," << jmin << "] = "<<a[imin][jmin]<<endl;
system("pause");
}
// Пример 6.9. Дана матрица a[n][m]. Поменять местами элементы
// 0-й и (n-1)-й, 1-ой и (n-2)-й и т.д. строк матрицы.
#include <iostream>
using namespace std;
const int D1 = 10, D2 = 10;
int main(){
int a[D1][D2];
int n, m, temp;
cout<<"\ Vvdite razmer massiva (n, m): "; cin>>n>>m; srand(n + m);
cout << "\nSourse matrix\n";
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
a[i][j] = rand() % 15 - 5;
cout.width(4); cout<<a[i][j];
}
cout<<endl;
}
for(int i = 0; i < n / 2; i++)
for(int j= 0; j < m; j++){
temp = a[i][j];
a[i][j] = a[n-1-i][j];
a[n-1-i][j] = temp;
}
cout<<"\n\tRezult matrix\n";
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout.width(4);
cout<<a[i][j];
}
cout<<endl;
}
}