Массивы в качестве формальных параметров в процедурах и функциях пользователя

Next i

Begin

Begin

Next i

Next j

Next i

Next j

End if

Else

End if

Nextj

'Если есть элементы из промежутка [20,40], то выводится их произведение, иначе

'выводится сообщение

If flag Then

Edit6.Text = Str(p)

Edit6.Text = "Таких элементов нет"

Преобразование двумерных массивов

Преобразование матриц заключается, как правило, в изменении порядка следования его элементов без изменения значений самих элементов.

Пример 2.Сформировать массив из n*m элементов. Получить новый массив, повернув исходный на: 1800 и 900 по часовой стрелке и на 900 против часовой стрелки.

Фрагменты кодов программы :

'Поворот на 1800 градусов

For i=1 To n 'Цикл по строкам

For j=1 To m 'Цикл по столбцам

b(i,j)=a(n-i+1,m-j+1)

Next j

Next i

 

'Поворот на 900 градусов по часовой

For i=1 To n

For j=1 To m

b(i,j)=a(n-j+1,i)

Next j

Next i

 

'Поворот на 900 градусов против часовой

For i=1 To n

For j=1 To m

b(i,j)=a(j,m-i+1)

Next j

Next i

Пример 3.Сформировать массив из n * m элементов. Зеркально отразить (повернуть) его относительно горизонтальной оси и вертикальной оси. Дополнительных массивов не создавать..

При повороте массива относительно горизонтальной оси внешний цикл по строкам организуется только до целой части от деления n на2(горизонтальной оси массива).

Фрагмент кода программы:

'Относительно горизонтальной оси

For i=1 To n\2 'Цикл по строкам

For j=1 To m 'Цикл по столбцам

tmp=a(i,j)

a(i,j)=a(n-i+1,j)

a(n-i+1,j)=tmp

При повороте массива относительно вертикальной оси внутренний цикл по столбцам организуется только до целой части от деления m на2 (вертикальной оси массива).

Фрагмент кода программы:

'Относительно вертикальной оси

For i=1 To n 'Цикл по строкам

For j=1 To m \ 2 'Цикл по столбцам

tmp=a(i,j)

a(i,j)=a(i,m-j+1)

a(n-i+1,j)=tmp

Пример 4.Сформировать массив из n * m элементов. Преобразовать его в одномерный массив.

Первый способ решения этой задачи состоит в том, что для формирования индекса очередного элемента одномерного массива задается независимый счетчик k.

Фрагмент кода программы:

'Использование независимого счетчика k для формирования одномерного массива

Dim a(1 To 30,1 To 30) As Single 'Описание статического двумерного

'массива, индексы элементов которого будут начинаться с 1

Dim b() As Single 'Описание динамического массива

DimiAs Integer,jAs Integer,nAs Integer,m As Integer

ReDim(n*m); 'Задание размера массива b, индексы элементов которого

'будут начинаться с 0!}

 

k=0 'Инициализация независимого счетчика

For i=1 To n Do 'Цикл по строкам

For j=1 To m Do 'Цикл по столбцам

b(k)=a(i,j)

k=k+1 'Значение счетчика увеличивается на 1

End;

Второй способ решения этой задачи состоит в том, что индекс очередного элемента одномерного массива вычисляется по формуле:

b(m * (i-1)+j-1) = a(i,j).

Фрагмент кода программы:

'Использование независимого счетчика k для формирования одномерного массива

Dim a(1 To 30,1 To 30) As Single 'Описание статического двумерного

'массива, индексы элементов которого будут начинаться с 1

Dim b() As Single 'Описание динамического массива

DimiAs Integer,jAs Integer,nAs Integer,m As Integer

ReDim(n*m); 'Задание размера массива b, индексы элементов которого

'будут начинаться с 0!

For i=1 To n Do 'Цикл по строкам

For j=1 To m Do 'Цикл по столбцам

b((i-1)*m +j-1)=a(i,j)

Типовые задачи с квадратными матрицами

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

Способ отбора нужных элементов для решения такого рода задач заключается в следующем:

Расположение элементов Соотношение индексов (i– номер строки,j– номер столбца)
На главной диагонали Одинаковые индексы (i = j)
Выше главной диагонали Номер строки меньше номера столбца (i<j)
Ниже главной диагонали Номер строки больше номера столбца (i>j)
На побочной диагонали Номер столбца вычисляется по формуле: j=n - i + 1
Выше побочной диагонали Номер строки меньшечем n-j + 1: (i < n - j + 1)
Ниже побочной диагонали Номер строки большечем n-j + 1: (i> n - j + 1)

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

Пример 5. Двумерный массив n * n заполнен случайными целыми числами из диапазона [-40,40]. Определить:

- минимальное значение для элементов, расположенных на главной диагонали,

- максимальное значение для элементов, расположенных на побочной диагонали;

- произведение элементов, расположенных выше побочной диагонали; среднее арифметическое элементов, расположенных ниже главной диагонали.

Фрагмент программного кода:

min=a(1,1) 'Первый на главной диагонали

max=a(1,n) 'Первый на побочной диагонали

For i=1 To n 'Цикл по строкам

'Определение минимума на главной диагонали

If a(i,i) < min Then min= a(i,i)

'Определение максимума на побочной диагонали

If a(i,n-i+1) > max Then max=a(i, n-i+1)

'Нахождение произведения элементов расположенных выше побочной диагонали

p=1

For i=1 To n 'Цикл по строкам

For j=1 To n 'Цикл по столбцам

If i < n-j+1 Then p=p* a(i,j)

'Нахождение суммы и количества элементов ниже главной диагонали

s=0: kol=0

For i=1 To n 'Цикл по строкам

For j=1 To n 'Цикл по столбцам

If i > j Then s=s+ a[i,j]: kol=kol+1

'Среднее арифметическое элементов расположенных ниже главной диагонали

sr=s / kol

Пример 6. Сформировать массив из n * n элементов. Зеркально отразить (повернуть) его относительно главной и побочной диагоналей. Дополнительных массивов не создавать.

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

- до i при повороте относительно главной диагонали,

- до n-i при повороте относительно побочной диагонали.

В противном случае, смена произойдет дважды и все останется на своих местах.

Фрагменты кодов программы:

'Зеркальноe отражение массива относительно главной диагонали

For i=1 To n 'Цикл по строкам

For j=1 To i 'Цикл по столбцам

tmp=a(i,j)

a(i,j)=a(j,i)

a(j,i)=tmp

Nextj

Nexti

 

'Зеркальноe отражение массива относительно побочной диагонали

For i=1 To n-1 'Цикл по строкам

For j=1 To n-i 'Цикл по столбцам

tmp=a(i,j)

a(i,j)=a(n-j+1,n-i+1)

a(n-j+1,n-i+1)=tmp

Nextj

Nexti

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

Пример. Вычислить

Фрагмент программного кода:

Option Explicit'Включение режима, при котором запрещается использовать

'необъявленные переменные

Dimx() As Integer 'Описание динамического массива a

Dim y() As Integer'Описание динамического массива b

Dim n As Integer

'Процедура заполнения массива m0, m1, …,mn-1 случайными числами из промежутка [a,b].

'Формальные параметры: промежуток [а,b], n – количество элементов массива,

'm - массив

Private Sub Vd(a As Integer,b As Integer,nAs Integer,m)

Dim i As Integer

Randomize

Text2.Text = "" 'Очистка текстового окна Text2

For i = 0 To n – 1 'Перебор элементов

' Заполнение массива случайными числами из промежутка[a,b]

m(i) = Int((b - a + 1) * Rnd + a)

'Вывод элементов массива в текстовое поле Text2

Text2.Text = Text2.Text + " " + Str(m(i))

Next i