Кроме одномерных массивов в С++ существуют двух и более мерные массивы. Вот как будет выглядеть объявление трехмерного массива, который содержит элементы типа int:
int array[10][2][2];
А вот как будет выглядеть код, с помощью которого выводиться первый элемент данного массива:
cout << arrray[0][0][0];
Конечно, никто не может нам запретить использовать только одномерные массивы, но иногда их использование может сильно запутать логику программы а, следовательно, и ее код. Для того чтобы понять, о чем я говорю, давайте представим, что мы получили задание написать программу, которая сначала предлагает пользователю ввести координаты пяти точек по трем осям: x, y и z соответственно. А затем выводит сведения насколько вторая, третья, четвертая и так далее вплоть до пятой точки отличаются от первой по оси x, по оси y и по оси z от первой точки. Для этого нам потребуется массив типа float состоящий из пятнадцати элементов. Вот как будет выглядеть объявление одномерного массива:
float coordinates[15];
И так что у нас получается в этом случае... В первый элемент мы записываем координату точки 1 по оси x, в следующий элемент координату той же точки по оси y, а в третий элемент координату по оси z. В четвертый, пятый и шестой элемент координаты второй точки и так далее до точки 5. В этом случае нам придется придумать изощренную систему, что бы присвоить координату определенному элементу, и такую же изощренную систему, когда мы будем выводить результаты работы программы на экран. Писать эту программу я не буду. Вместо нее я привожу код программы, с использованием двухмерного массива:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
float coordinates[5][3];
for(int i=0; i<5; i++)
{
cout << "Введите координаты точки " << i+1 << " по оси x: ";
cin >> coordinates[i][0];
cout << "\n";
cout << "Введите координаты точки " << i+1 << " по оси y: ";
cin >> coordinates[i][1];
cout << "\n";
cout << "Введите координаты точки " << i+1 << " по оси z: ";
cin >> coordinates[i][2];
cout << "\n";
}
cout << "\n\n";
cout << "Изменение координат по оси x.\n\n";
for(int i=1; i<5; i++)
{
if(coordinates[0][0] == coordinates[i][0])
{
cout << "Координата точки " << i+1 << " по оси x равна "
<< "координате точки 1 по той же оси.\n";
}
else if(coordinates[0][0] > coordinates[i][0])
{
cout << "Координата точки " << i+1 << " по оси x больше "
<< "координаты точки 1 по той же оси на ";
cout << coordinates[0][0] - coordinates[i][0];
cout << ".\n";
}
else
{
cout << "Координата точки " << i+1 << " по оси x меньше "
<< "координаты точки 1 по той же оси на ";
cout << coordinates[i][0] - coordinates[0][0];
cout << ".\n";
}
}
cout << "\n\n";
cout << "Изменение координат по оси y.\n\n";
for(int i=1; i<5; i++)
{
if(coordinates[0][1] == coordinates[i][1])
{
cout << "Координата точки " << i+1 << " по оси y равна "
<< "координате точки 1 по той же оси.\n";
}
else if(coordinates[0][1] > coordinates[i][1])
{
cout << "Координата точки " << i+1 << " по оси y больше "
<< "координаты точки 1 по той же оси на ";
cout << coordinates[0][1] - coordinates[i][1];
cout << ".\n";
}
else
{
cout << "Координата точки " << i+1 << " по оси y меньше "
<< "координаты точки 1 по той же оси на ";
cout << coordinates[i][1] - coordinates[0][1];
cout << ".\n";
}
}
cout << "\n\n";
cout << "Изменение координат по оси z.\n\n";
for(int i=1; i<5; i++)
{
if(coordinates[0][2] == coordinates[i][2])
{
cout << "Координата точки " << i+1 << " по оси z равна "
<< "координате точки 1 по той же оси.\n";
}
else if(coordinates[0][2] > coordinates[i][2])
{
cout << "Координата точки " << i+1 << " по оси z больше "
<< "координаты точки 1 по той же оси на ";
cout << coordinates[0][2] - coordinates[i][2];
cout << ".\n";
}
else
{
cout << "Координата точки " << i+1 << " по оси z меньше "
<< "координаты точки 1 по той же оси на ";
cout << coordinates[i][2] - coordinates[0][2];
cout << ".\n";
}
}
cout << "\n\n";
system("PAUSE");
return 0;
}
Хочу обратить ваше внимание, что если мы захотим изменить количество точек увеличив их до десяти, то нам для этого достаточно лишь изменить объявление массива и условия в четырех циклах for. Если же мы захотим увеличить количество координат у каждой точки, это то же не будет слишком сложным.
Многомерный массив можно инициализировать как одномерный массив в одну строчку. Внизу пример такой инициализации:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
float coordinates[5][3] = {1.1, 1.2, 1.3, 2.1, 2.2,
2.3, 3.1, 3.2, 3.3, 4.1, 4.2, 4.3, 5.1, 5.2, 5.3};
for(int i=0; i<5; i++)
{
for(int j=0; j<3; j++)
{
cout << "coordinates[" << i << "][" << j << "] - ";
cout << coordinates[i][j] << "\n";
}
}
cout << "\n\n";
system("PAUSE");
return 0;
}
Существует другой вид инициализации (его еще называют агрегатным), который является более наглядным. Внизу еще один вариант предыдущей программы, в которой используется агрегатная инициализация:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
float coordinates[5][3] =
{
{1.1, 1.2, 1.3},
{2.1, 2.2, 2.3},
{3.1, 3.2, 3.3},
{4.1, 4.2, 4.3},
{5.1, 5.2, 5.3}
};
for(int i=0; i<5; i++)
{
for(int j=0; j<3; j++)
{
cout << "coordinates[" << i << "][" << j << "] - ";
cout << coordinates[i][j] << "\n";
}
}
cout << "\n\n";
system("PAUSE");
return 0;
}
Если мы скомпилируем и выполним эту программу, то результат будет точно такой же, как и у предыдущей.
Ну и для полноты, давайте создадим трехмерный массив и выведем его на экран:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
float coordinates[3][3][3] =
{
{
{1.1, 1.2, 1.3},
{2.1, 2.2, 2.3},
{3.1, 3.2, 3.3}
},
{
{4.1, 4.2, 4.3},
{5.1, 5.2, 5.3},
{6.1, 6.2, 6.3}
},
{
{7.1, 7.2, 7.3},
{8.1, 8.2, 8.3},
{9.1, 9.2, 9.3}
}
};
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
for(int k=0; k<3; k++)
{
cout << "coordinates[" << i << "]"
<< "[" << j << "]"
<< "[" << k << "] - ";
cout << coordinates[i][j][k] << "\n";
}
}
}
cout << "\n\n";
system("PAUSE");
return 0;
}
Ну, вот и все, что я хотел рассказать про многомерные массивы. В следующем уроке, мы перейдем к очень важной теме. Начиная со следующего урока мы будем изучать указатели.