ПОНЯТНО О Visual Basic NET (том 2)

Двумерные массивы


Поясним суть двумерных массивов на простом примере. Пусть на целом ряде метеостанций, расположенных в разных точках земного шара, в течение многих дней измеряли температуру воздуха. Показания термометров свели в таблицу. Ограничимся для экономии места тремя станциями и четырьмя днями.

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.      
Вычислить разницу между максимальной и минимальной температурой во всей таблице.

Содержание раздела