Пример 4.8.2-1. Написать процедуру, которая определяет количество положительных элементов целочисленной матрицы a (,).



Тема 4.8

 Программирование алгоритмов
формирования и обработки
двумерных массивов

 

4.8.1. Средства описания и работы с двумерными
массивами данных

 

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

Из предыдущей темы известно, что массив представляет собой последовательность переменных одинакового типа, объединенных общим именем.

Количество индексов (измерений) указывает на размерность (ранг) массива. Например, двумерный массив b(3,2):

 

b(0,0) b(0,1) b(0,2)
b(1,0) b(1,1) b(1,2)
b(2,0) b(2,1) b(2,2)
b(3,0) b(3,1) b(3,2)

 

Так, в приведенном выше примере размерность массива b (3,2) 2, т.е. массив двумерный (имеет два измерения). В нашем примере количество элементов массива b (3,2)равно 12 (4 строки и 3 столбца).

Перед использованием двумерного массива в программе, его необходимо объявить с помощью оператора Dim, который выделяет место в памяти для размещения элементов статического массива. Например:

 

Dim b(3,2) As Single

 

Необходимо обратить внимание на то, что, как при описании – A(m,n), так и при обращении – A ( i , j ) к элементам двумерного массива, в скобках сначала указывается номер строки, а затем номер столбца (рис. 4.8.1-1).

Для определения параметров двумерного массива могут использоваться свойство класса Array – Rank и метод класса ArrayGetLength() . Свойство Rank используется для определения количества измерений (ранга) массива (для двумерного массива ранг равен 2). Причем каждое измерение в массиве может иметь свою длину. Метод GetLength() используется для определения количества элементов в заданном измерении массива (для первого измерения используется значение 0, для второго – 1 и т.д.). Необходимо обратить внимание, что метод  GetLength() возвращает значение, которое на единицу больше, чем указанное в объявлении Dim, так как индексация элементов массива в VBвсегда начинается с нуля, а метод GetLength() определяет количество элементов, считая от единицы.

 

Матрица прямоугольная A ( n , m ) - n¹m Матрица квадратная A ( n , m ) - n=m

 

  0 j m
0      
       
i   A(i,j)  
       
n

 

                                  

 

 

  

  0   j   m
0          
           
i          
           
n          

 

 

Побочная диагональ Главная диагональ                                                                                                        

матрицы i=n-j         матрицы i= j

 

Рис. 4.8.1-1. Прямоугольная и квадратные матрицы

Так, для определения параметров массива Mac1(,) , описанного как

 

Dim Mac1(4,7) As Integer

 

можно воспользоваться следующими выражениями:

 

ArrayRank = Mac1.Rank RawCount = Mac1.GetLength(ArrayRank-2) ColumnCount= Mac1.GetLength(ArrayRank-1)

 

Где   ArrayRank      – ранг матрицы (равен 2);

RawCount    – количество строк (равно 5);

ColumnCount – количество столбцов (равно 8).

 

Таким образом, ArrayRank , RawCount , ColumnCount являются переменными целочисленного типа, которые принимают значения 2, 5 и 8.

Кроме того, для определения параметров двумерного массива можно использовать метод GetUpperBound (), который находит верхнюю границу (максимальный индекс) заданного измерения. В качестве параметра этот метод принимает значения аналогично методу GetLength (), т.е. для первого измерения (строк) используется значение 0, для второго (столбцов) – 1.

Например, для массива Mac2(4,7):

Dim Mac2(4,7) As Double Dim Cтрока1, Столбец2 As Integer Строка1 = Mac 2. GetUpperBound (0) ' Значение Строка1 ' равно 4 Столбец2 = Mac 2. GetUpperBound (1) ' Значение Столбец2 ' равно 7

 

Ввод, вывод и обработка двумерных массивов, как правило, основаны на ис­пользовании вложенных циклов, которые обеспечивают перебор всех элементов массива. В некоторых задачах может иметь значение порядок перебора элементов массива: «по строкам» или «по столбцам». Если внешний цикл будет организован по первому индексу (по строкам), а внутренний цикл по второму индексу (по столб­цам), то выполняется построчный перебор элементов двумерного массива. Если внешний цикл в качестве параметра использует второй индекс, а внутренний цикл – первый индекс, то эле­менты массива перебираются по столбцам.

 

Пример 4.8.1-1 . Написать процедуры ввода/вывода, которые могут использоваться в алгоритмах обработки двумерных массивов.

Некоторые процедуры ввода и вывода приведены в Темах 4.3, 4.4, 4.5, 4.6 и 4.7. Остальные процедуры ввода и вывода, которые можно использовать при написании базовых алгоритмов формирования и обработки двумерных массивов, представлены на рис. 4.8.1-2, 4.8.1-3, 4.8.1-4 и 4.8.1-5.

 

'Процедура ввода элементов двумерного массива Single с клавиатуры Sub vvodSngMac18(ByRef a(,) As Single) Dim i, j, m, n As Integer, y As Single m = a.GetLength(0) – 1 : n = a.GetLength(1) - 1 Dim r1, r2 As String For i = 0 To m For j = 0 To n     r1 = СStr(i) : r2 = СStr(j)     y = InputBox(" эл - т массива a(" + r1 + "," + r2 + ") = ", _                    "Ввод эначений эл-тов массива a ()" )     a(i,j) = CSng(Val(y)) Next j Next i End Sub

Рис. 4.8.1-2. Процедура ввода элементов двумерного массива
vvodSngMac 18() Примера 4.8.1-1

 

'Процедура формирования двумерного массива случайными числами Sub vvod2( ByRef a(,) As Double , ByVal m As Integer , _                            ByVal n As Integer )    Dim i, j As Integer    Randomize()    For i = 0 To m        For j = 0 To n            a(i, j) = 10 * Rnd() - 5        Next i    Next j End Sub

Рис. 4.8.1-3. Процедура формирования массива vvod 2()

случайными числами Примера  4.8.1-1

'Процедура форматированного вывода двумер-го массива в L istBox Sub vivodSngMac19(ByRef x(,) As Single, ByRef LB As ListBox) Dim i, j, m, n As Integer Dim z, z1 As String m = x.GetLength(0) – 1 : n = x.GetLength(1) - 1 LB.Items.Clear() For i = 0 To m    z= ""    For j = 0 To n        z1 = Format(x(i,j), "0.000")        If x(i,j) < 0 Then                z1 = Space(2) + z1        Else                z1 = Space(3) + z1        End If        z = z + z1    Next j    LB.Items.Add(z) Next i End Sub

Рис. 4.8.1-4. Процедура форматированного вывода массива vivodSngMac 19()

Примера  4.8.1-1

На рис. 4.8.1-4 представлен пример процедуры вывода целочисленной матрицы в TextBox . Напомним, что для того, чтобы в элементе управления TextBox можно было записать несколько строк текста, необходимо присвоить его свойству MultiLine значение True.

 

'Процедура форматированного вывода двум-го массива Integer в TextBox Sub vivodIntMac20(ByRef x(,) As Integer, ByRef TB As TextBox) Dim i, j, m, n As Integer Dim z As String m = x.GetLength(0) – 1 : n = x.GetLength(1) - 1 TB.Text = "" For i = 0 To m    For j = 0 To n        If Abs(x(i,j)) >= 100 Then                z = CStr (x(i,j)) & Space(2)        ElseIf Abs(x(i,j)) >= 10 Then                z = CStr (x(i,j)) & Space(4)        Else                z = CStr (x(i,j)) & Space(6)        End If        If x(I,j) >= 0 Then z = Space(1) + z        TB.Text = TB.Text & z    Next j    TB.Text = TB.Text & vbCrLf Next i End Sub

Рис. 4.8.1-5. Процедура форматированного вывода массива
vivodIntMac 20 в TextBox Примера 4.8.1-1


4.8.2. Базовые алгоритмы
обработки двумерных массивов

 

Для работы с массивами, как правило, используются алгоритмы регулярной циклической структуры. 

К базовым алгоритмам обработки двумерных массивов можно отнести алгоритмы:

· Нахождение количества элементов матрицы при заданном условии
(Пример 4.8.2-1).

· Нахождение суммы значений элементов матрицы при заданном условии (Пример 4.8.2-2).

· Нахождение произведения значений элементов матрицы при заданном условии (Пример 4.8.2-3).

· Поиск экстремальных значений элементов матрицы
(Пример 4.8.2-4 – 4.8.2-5).

· Формирование матрицы в соответствии с определенными правилами (Пример 4.8.2-6 – 4.8.2-7).

· Формирование одномерного массива из двумерного в соответствии с некоторым условием ((Пример 4.8. 2-8)).

· Транспонирование матриц ((Пример 4.8.2-9)).

· Произведение двух матриц ((Пример 4.8.2-10)).

 

Пример 4.8.2-1. Написать процедуру, которая определяет количество положительных элементов целочисленной матрицы a (,).

Function Pr821(ByRef a(,)As Integer) As Integer Dim i, j, kol As Integer = 0   For i = 1 To a.GetLength(0) – 1 For j = 1 To a.GetLength(1) – 1    If a (i,j) > = 0 Then kol = kol + 1 Next j Next i Return kol END Function

 

Рис. 4.8.2-1. Программный код процедуры Pr 821()

Примера 4.8.2-1

Пример 4.8.2-2. Написать процедуру, которая вычисляет сумму значений элементов матрицы b(,) для элементов b(i,j) > 0.

 

Function Pr822(ByRef b(,) As Single) As Single Dim i, j As Integer, sum As Single sum = 0 For i = 1 To b.GetLength(0) – 1 For j = 1 To b.GetLength(1) – 1   If b(i,j) > 0 Then sum = sum + b(i,j) Next j Next i Return sum End Function

 

Рис. 4.8.2-2. Программный код процедуры Pr 822()

Примера 4.8.2-2

Пример 4.8.2-3. Написать процедуру, которая вычисляет произведение значений элементов матрицы для элементов x ( i , j ) < 0.

Function Pr823(ByRef x( , ) As Single ) As Single Dim i, j As Integer  Dim proizv As Single  proizv = 1  For i = 1 To x.GetLength(0) – 1   For j = 1 To x.GetLength(1) – 1    If a(i, j) < 0 Then proizv = proizv * a(i, j)   Next Next End Function

 

Рис. 4.8.2-3. Программный код процедуры Pr 823()

Примера 4.8.2-3

 


Дата добавления: 2019-07-15; просмотров: 280; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!