До этого момента мы рассматривали одномерные массивы, которыми не всегда можно ограничиться. Допустим, необходимо обработать некоторые данные из таблицы. В таблице есть две характеристики: количество строк и количество столбцов. Также и в двумерном массиве, кроме количества элементов массива, есть такие характеристики как, количество строк и количество столбцов двумерного массива. То есть, визуально, двумерный массив — это обычная таблица, со строками и столбцами. Фактически двумерный массив — это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m на n показана ниже (см. Рисунок 4).
Рисунок 4 — Массивы в С++
где, m — количество строк двумерного массива;
n — количество столбцов двумерного массива;
m * n — количество элементов массива.
1
2
|
// синтаксис объявления двумерного массива
/*тип данных*/ /*имя массива*/[/*количество строк*/][/*количество столбцов*/];
|
В объявлении двумерного массива, также как и в объявлении одномерного массива, первым делом, нужно указать:
После чего, в первых квадратных скобочках указывается количество строк двумерного массива, во вторых квадратных скобочках — количество столбцов двумерного массива. Двумерный массив визуально отличается от одномерного второй парой квадратных скобочек. Рассмотрим пример объявления двумерного массива. Допустим нам необходимо объявить двумерный массив, с количеством элементов, равным 15. В таком случае двумерный массив может иметь три строки и пять столбцов или пять строк и три столбца.
1
2
|
// пример объявление двумерного массива:
int a[5][3];
|
a — имя целочисленного массива
число в первых квадратных скобках указывает количество строк двумерного массива, в данном случае их 5;
число во вторых квадратных скобках указывает количество столбцов двумерного массива, в данном случае их 3.
1
2
|
// инициализация двумерного массива:
int a[5][3] = { {4, 7, 8}, {9, 66, -1}, {5, -5, 0}, {3, -3, 30}, {1, 1, 1} };
|
В данном массиве 5 строк, 3 столбца. после знака присвоить ставятся общие фигурные скобочки, внутри которых ставится столько пар фигурных скобочек, сколько должно быть строк в двумерном массиве, причём эти скобочки разделяются запятыми. В каждой паре фигурных скобочек записывать через запятую элементы двумерного массива. Во всех фигурных скобочках количество элементов должно совпадать. Так как в массиве пять строк, то и внутренних пар скобочек тоже пять. Во внутренних скобочках записаны по три элемента, так как количество столбцов — три. Графически наш массив будет выглядеть, как двумерная таблица (см. Рисунок 5).
Рисунок 5 — Массивы в С++
В каждой ячейке двумерного массива a показано значение, в нижнем правом углу показан адрес данной ячейки. Адресом ячейки двумерного массива является имя массива, номер строки и номер столбца.
Разработаем несложную программу, на обработку двумерного массива, которая называется «Лабиринт». Лабиринт должен быть построен на основе двумерного массива. Размер лабиринта выберем на свое усмотрение.
MVS
Code::Blocks
Dev-C++
QtCreator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// array2.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include
using namespace std;
int main(int argc, char* argv[])
{
// 1-условно "стенки лабиринта"
// 2-"правильный путь, выход из лабиринта"
// 0-"ложный путь"
int mas[33][20] = { {1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, // инициализация двумерного массива
{1,2,1,0,0,1,0,1,2,2,2,1,1,1,1,0,0,0,0,1,},
{1,2,1,1,0,1,0,1,2,1,2,2,2,2,1,0,1,1,0,1,},
{1,2,2,2,2,2,2,1,2,1,1,1,1,2,1,0,0,1,0,1,},
{1,1,1,1,1,1,2,1,2,1,0,0,1,2,1,1,0,1,0,1,},
{1,0,0,1,0,0,2,2,2,1,1,0,0,2,0,0,0,1,0,1,},
{1,0,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,1,0,1,},
{1,0,0,0,0,0,0,0,0,1,1,1,1,2,1,0,0,0,0,1,},
{1,1,1,1,1,1,0,1,1,1,2,2,2,2,1,0,1,1,1,1,},
{1,1,0,0,0,1,0,0,1,1,2,1,1,1,1,0,0,0,0,1,},
{1,0,0,1,0,0,0,0,0,1,2,2,2,2,1,1,1,1,0,1,},
{1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,},
{1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,1,1,1,1,},
{1,2,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,},
{1,2,1,0,0,0,1,2,2,2,1,0,0,0,0,0,1,1,0,1,},
{1,2,1,1,1,1,1,2,1,2,1,1,1,0,1,0,0,0,0,1,},
{1,2,1,2,2,2,1,2,1,2,2,2,1,1,1,1,1,1,1,1,},
{1,2,1,2,1,2,1,2,1,0,1,2,2,2,2,2,2,2,2,1,},
{1,2,1,2,1,2,1,2,1,0,1,1,1,1,1,1,1,1,2,1,},
{1,2,1,2,1,2,1,2,1,0,0,0,0,0,0,0,0,0,2,1,},
{1,2,1,2,1,2,2,2,1,0,1,1,1,1,1,1,0,1,2,1,},
{1,2,1,2,1,1,1,1,1,0,0,0,1,0,1,0,0,1,2,1,},
{1,2,1,2,2,1,0,0,1,1,1,0,0,0,1,0,1,1,2,1,},
{1,2,1,1,2,1,1,0,0,0,0,0,1,0,1,0,0,1,2,1,},
{1,2,1,1,2,1,0,0,1,1,1,1,1,1,1,1,1,1,2,1,},
{1,2,1,1,2,1,1,0,1,2,2,2,2,2,2,2,2,2,2,1,},
{1,2,1,1,2,1,0,0,1,2,1,1,1,1,1,1,1,1,1,1,},
{1,2,1,1,2,1,0,1,1,2,1,1,1,1,1,1,1,1,2,2,},
{1,2,1,1,2,1,0,0,1,2,1,1,2,2,2,2,2,2,2,1,},
{1,2,1,1,2,1,0,1,1,2,1,1,2,1,1,1,1,1,1,1,},
{1,2,1,1,2,1,0,0,1,2,1,1,2,1,0,0,0,1,0,1,},
{1,2,2,2,2,1,0,1,1,2,2,2,2,0,0,1,0,0,0,1,},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,} };
// два цикла - внутренний и внешний, осуществляющие обращение к каждому элементу массива
for (int i = 0; i < 33; i++) //переключение по строкам
{
for (int j = 0; j < 20; j++)// переключение по столбцам
if (mas[i][j] == 1)
{
// вывести два раза символ (номер которого 176 в таблице аски) в консоль
cout << static_cast(176);
cout << static_cast(176);
} else
cout << " "; // вывести два пробела
cout << endl;
}
system("pause");
return 0;
}
|
Правильный и ложный пути можно было бы обозначать одной и той же цифрой, например, нулём, но для наглядности правильный путь обозначен цифрой 2. Инициализация массива выполнялась вручную, только для того, что бы упростить программу. Так как в программе выполняется обработка двумерного массива, нужны два цикла, для переключения между элементами двумерного массива. Первый цикл for выполняет переключение между строками двумерного массива. Так как строк в двумерном массиве 33, то и переменная-счетчик i инкрементируется от 0 до 33,
Do'stlaringiz bilan baham: |