Двумерные массивы
Поясним суть двумерных массивов на простом примере. Пусть на целом ряде метеостанций, расположенных в разных точках земного шара, в течение многих дней измеряли температуру воздуха. Показания термометров свели в таблицу. Ограничимся для экономии места тремя станциями и четырьмя днями.
1-й день | 2-й день | 3-й день | 4-й день |
| |||||
Метеостанция 1 | -8 | -14 | -19 | -18 | |||||
Метеостанция 2 | 25 | 28 | 26 | 20 | |||||
Метеостанция 3 | 11 | 18 | 20 | 25 |
Требуется (в порядке возрастания трудности):
1) Распечатать температуру на 2-й метеостанции за 4?й день и на 3-й метеостанции за 1?й день.
2) Распечатать показания термометров всех метеостанций за 2?й день
3) Определить среднюю температуру на 3-й метеостанции
4) Распечатать всю таблицу
5) Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла
Для этого обозначим показания термометров при помощи индексированной переменной с двумя индексами по следующей схеме:
t(1,1) | t(1,2) | t(1,3) | t(1,4) | ||||
t(2,1) | t(2,2) | t(2,3) | t(2,4) | ||||
t(3,1) | t(3,2) | t(3,3) | t(3,4) |
Первый индекс в скобках обозначает номер строки (метеостанция), второй – номер столбца (день) прямоугольной таблицы. Такую таблицу математики называют матрицей.
В памяти отводим массив из ячеек типа Integer под значения индексированной переменной t. Будем называть его двумерным массивом:
Dim t (3, 4) As Integer
Аналогично одномерному массиву, первый индекс здесь будет меняться не от 1 до 3, а от 0 до 3, а второй – от 0 до 4. Таким образом в памяти будет отведен следующий массив ячеек:
t(0,0) | t(0,1) | t(0,2) | t(0,3) | t(0,4) | |||||
t(1,0) | t(1,1) | t(1,2) | t(1,3) | t(1,4) | |||||
t(2,0) | t(2,1) | t(2,2) | t(2,3) | t(2,4) | |||||
t(3,0) | t(3,1) | t(3,2) | t(3,3) | t(3,4) |
Мы просто не будем пользоваться верхней строкой и левым столбцом.
Программа:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t(3, 4) As Integer
Dim i, j, s As Integer
' Зададим значения элементов массива примитивным присваиванием:
t(1, 1) = -8 : t(1, 2) = -14 : t(1, 3) = -19 : t(1, 4) = -18
t(2, 1) = 25 : t(2, 2) = 28 : t(2, 3) = 26 : t(2, 4) = 20
t(3, 1) = 11 : t(3, 2) = 18 : t(3, 3) = 20 : t(3, 4) = 25
'Выполняем 1 пункт задания:
Debug.WriteLine(t(2, 4) & " " & t(3, 1))
'А теперь распечатаем второй столбец массива (2 пункт задания):
Debug.Write("Второй столбец: ")
For i = 1 To 3 : Debug.Write(t(i, 2) & " ") : Next
Debug.WriteLine("") 'Переводим строку
'Определим среднее значение элементов третьей строки (3 пункт задания):
i = 3
s = 0
For j = 1 To 4 : s = s + t(i, j) : Next
Debug.WriteLine("Средняя температура равна " & s / 4)
'Распечатаем всю таблицу (4 пункт задания):
For i = 1 To 3
For j = 1 To 4
Debug.Write(t(i, j) & " ")
Next j
Debug.WriteLine("") 'Переводим строку
Next i
'Распечатаем станции и дни с температурой 24-26 градусов (5 пункт задания):
For i = 1 To 3
For j = 1 To 4
If t(i, j) >= 24 And t(i, j) <= 26 Then Debug.WriteLine("Станция " & i & " день " & j)
Next j
Next i
End Sub
Вот что напечатает эта программа:
20 11
Второй столбец: -14 28 18
Средняя температура равна 18,5
-8 -14 -19 -18
25 28 26 20
11 18 20 25
Станция 2 день 1
Станция 2 день 3
Станция 3 день 4
Инициализация двумерного массива. Вместо фрагмента, объявляющего массив и задающего его значения присваиванием:
Dim t(3, 4) As Integer
t(1, 1) = -8 : t(1, 2) = -14 : t(1, 3) = -19 : t(1, 4) = -18
t(2, 1) = 25 : t(2, 2) = 28 : t(2, 3) = 26 : t(2, 4) = 20
t(3, 1) = 11 : t(3, 2) = 18 : t(3, 3) = 20 : t(3, 4) = 25
можно использовать более короткую запись:
Dim t ( , ) As Integer = { {99, 99, 99, 99, 99} , {99, -8, -14, -19, -18} , {99, 25, 28, 26, 20} , {99, 11, 18, 20, 25} }
Разберемся в ней. Верхние границы индексов не указываются, но запятая в круглых скобках остается, чтобы было понятно, что массив двумерный, а не одномерный. Чисел в фигурных скобках нужно столько, чтобы заполнить столбцы 0,1,2,3,4 и строки 0,1,2,3. Каждую строку берем в свои фигурные скобки и отделяем от других строк запятой. Весь массив снаружи «обнимается» дополнительной парой фигурных скобок. Ненужные нам нулевую строку и нулевой столбец я заполнил числами 99, а мог бы и любыми другими, так как в программе мы их не используем.
Задание 104.
Вычислить разницу между максимальной и минимальной температурой во всей таблице.