Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB_6.doc
Скачиваний:
97
Добавлен:
01.12.2018
Размер:
3.77 Mб
Скачать

Приложение 3. Алгоритмы обработки массивов.

Типовые алгоритмы обработки одномерных массивов

  1. Ввод массива:

Dim i As Byte, Mas(10) As Single

Text1.Text = ””

For i = 0 To 10

Mas(i) = InputBox(“Введите очередной элемент массива“)

Text1.Text = Text1.Text & Str(Mas(i)) & ” “

Next i

  1. Вывод массива:

Text1.Text=””

For i = 0 To 10

Text1.Text = Text1.Text & Str(Mas(i)) & ” “

Next i

  1. Накопление сумм и произведений:

Dim i As Byte, sum As Single

Dim n As Byte, p As Single

Dim M() As Single

n = InputBox(“Введите n”)

ReDim M(1 To n)

Вводим массив:

For i = 1 To n

M(i) = Int(Rnd*50)-25

Next i

Решаем задачу:

sum = 0

For i = 1 To n

sum = sum + M(i)

Next i

p = 1

For i = 1 To n

p = p * M(i)

Next i

  1. Поиск max / min среди элементов массива:

Dim i As Byte, n As Byte

Dim A() As Single, max As Single

n=InputBox(“Введите n”)

ReDim A(1 To n)

Вводим массив А:

For i = 1 To n

A(i) = Int(Rnd*50)-25

Next i

Решаем задачу:

max=A(1)

For i=2 To n

If A(i) > max Then max=A(i)

Next i

  1. Поиск max / min из части массива по условию, например: найти max среди отрицательных элементов массива:

max=-32576

For i=1 To n

If max < A(i) And A(i) < 0 Then

max=A(i)

End If

Next i

  1. Сортировка (упорядочение) массива:

Dim i As Byte, j As Byte

Dim n As Byte, ks As Integer

Dim A() As Single, b As Single

n = InputBox(“Введите размерность массива”)

ReDim A(1 To n)

ks= InputBox(“Введите ключ сортировки: -1 или 1”)

For i = 1 To n-1

For j = i+1 To n { Массив

упорядочивается :

If ks*A(i) > ks*A(j) Then при ks=1 по

возрастанию;

b = A(i) при ks=-1 по

убыванию }

A(i) = A(j)

A(j) = b

End If

Next j,i

  1. Циклически сдвинуть влево элементы массива так, чтобы его максимальный элемент оказался на первом месте:

Dim i%, j%, n%

Dim A!(), b!, max!

n=InputBox(“Введите размерность массива”)

ReDim A(1 To n)

Text1.Text=””

For i=1 To n

A(i)=InputBox(“Введите ” & i & “-ый элемент массива”)

Text1.Text = Str(A(i)) & “ “

Next i

Ищем максимальный элемент массива:

max = A(1)

For i = 2 To n

If A(i) > max Then max = A(i)

Next i

Теперь начинаем сдвигать элементы массива:

If A(1) <> max Then

Do While A(1) <> max

b = A(1)

For j = 2 To n

A(j-1) = A(j)

Next j

A(n) = b

Loop

End If

Примеры обработки одномерных массивов.

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

Пример 1. Дан массив из N чисел. Какие разные числа были введены и сколько раз встретилось каждое из них?

Dim A() As Integer, B() As Integer, kol() As Byte

Dim i As Byte, j As Byte, k As Byte, n As Byte

Dim f As Boolean

n = InputBox("Введите размерность массива")

ReDim A(1 To n), B(1 To n), kol(1 To n)

Label3.Visible = True: Label4.Visible = True

Ввод исходного одномерного массива:

Randomize

For i = 1 To n

A(i) = Int(Rnd * 10) - 5

Next i

Задание количества столбцов и строк объекта MSFlexGrid1,

требующегося для отображения на экране введенного массива:

MSFlexGrid1.Cols = n: MSFlexGrid1.Rows = 1

Определение ширины столбцов объекта VSFlexGrid1,

необходимой для размещения в отведенном на форме поле всех

элементов массива:

For i = 0 To n - 1

MSFlexGrid1.ColWidth(i) = Int(MSFlexGrid1.Width / n)

Next i

Запись в ячейки объекта MSFlexGrid1 элементов введенного

массива:

For i = 1 To n

MSFlexGrid1.TextMatrix(0, i - 1) = Str(A(i))

Next i

Решение задачи:

k = 0

For i = 1 To n

f = True

For j = 1 To k

If A(i) = B(j) Then

kol(j) = kol(j) + 1

f = False

End If

Next j

If f Then

k = k + 1

B(k) = A(i)

kol(k) = 1

End If

Next i

Вывод результатов:

Задание количества столбцов и строк объекта MSFlexGrid2,

требующегося для отображения на экране результатов решения

задачи:

MSFlexGrid2.Cols = k: MSFlexGrid2.Rows = 2

Определение ширины столбцов объекта VSFlexGrid2,

необходимой для размещения в отведенном на форме поле

результатов решения задачи:

For i = 0 To k - 1

MSFlexGrid2.ColWidth(i) = Int(MSFlexGrid2.Width / k)

Next i

Запись в ячейки объекта MSFlexGrid2 результатов решения задачи:

For i = 1 To k

MSFlexGrid2.TextMatrix(0, i - 1) = Str(B(i))

MSFlexGrid2.TextMatrix(1, i - 1) = Str(kol(i))

Next i

Пример 2. Дан массив из N чисел. Найти 3 наибольших элемента этого массива, не используя сортировку.

Dim a%(), b%(1 To 3), max!, f As Boolean

Dim i%, j%, k%, n%

n = InputBox("Введите размерность массива")

ReDim a(1 To n)

Randomize

For i = 1 To n

a(i) = Int(Rnd * 100) - 50

List1.AddItem Str(a(i))

Next i

Text1.Text = " Три наибольших элемента: " & vbCrLf

b(1) = 1

For i = 1 To 3

max = -1E+38: f = False

For j = 1 To n

For k = 1 To i

If j = b(k) Then f = False

Next k

If a(j) >= max And f Then

max = a(j)

b(i) = j

End If

f = True

Next j

Text1.Text = Text1.Text & Str(max) & " "

Next i

Пример 3. Дан массив из N чисел. Переместить элементы массива так, чтобы сначала шли все положительные по возрастанию, а затем все

остальные в порядке их ввода.

Dim a%(), b%, c%, i%, j%, k%, n%

n = InputBox("Введите размерность массива")

ReDim a(1 To n)

Randomize

For i = 1 To n

a(i) = Int(Rnd * 100) - 50

List1.AddItem Str(a(i))

Next i

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

For i = 1 To n - 1

For j = i + 1 To n

If a(i) >= 0 And a(j) >= 0 Then

If a(j) < a(i) Then

b = a(j)

a(j) = a(i)

a(i) = b

End If

End If

Next j, i

Перемещаем положительные элементы в начало массива:

For i = 1 To n - 1

For j = i + 1 To n

If a(j) >= 0 And a(i) < 0 Then

b = a(j)

For k = j To i + 1 Step -1

a(k) = a(k - 1)

Next k

a(i) = b

End If

Next j, i

For i = 1 To n

List2.AddItem Str(a(i))

Next i

Пример 4. Массив A упорядочен по убыванию, а массив B - по возрастанию. Не создавая 3-го массива, вывести элементы обоих массивов в порядке возрастания значений их элементов.

Dim A%(), B%(), d%

Dim i%, j%, k%, m%, n%

n = InputBox("Введите размерность массива A")

m = InputBox("Введите размерность массива B")

ReDim A(1 To n), B(1 To m)

Ввод исходных одномерных массивов:

Randomize

For i = 1 To n

A(i) = Int(Rnd * 100) - 50

Next i

For i = 1 To m

B(i) = Int(Rnd * 100) - 50

Next i

Упорядочиваем массив А по убыванию:

For i = 1 To n - 1

For j = i + 1 To n

If A(i) < A(j) Then

d = A(j)

A(j) = A(i)

A(i) = d

End If

Next j, i

For i = 1 To n

List1.AddItem Str(A(i))

Next i

Упорядочиваем массив B по возрастанию:

For i = 1 To m - 1

For j = i + 1 To m

If B(i) > B(j) Then

d = B(j)

B(j) = B(i)

B(i) = d

End If

Next j, i

For i = 1 To m

List2.AddItem Str(B(i))

Next i

Решение задачи:

i = n: j = 1

For k = 1 To m + n

If i >= 1 And j <= m Then

If A(i) <= B(j) Then

List3.AddItem Str(A(i))

i = i - 1

Else

List3.AddItem Str(B(j))

j = j + 1

End If

ElseIf j > m Then

List3.AddItem Str(A(i))

i = i - 1

Else

List3.AddItem Str(B(j))

j = j + 1

End If

Next k

Пример 5. Массив A упорядочен по убыванию, а массив B - по возрастанию. Объединить эти массивы в один так, чтобы он был упорядочен по убыванию. Не допускается слияние исходных массивов в произвольном порядке с последующей сортировкой.

Dim A() As Integer, B() As Integer, C() As Integer, d As Integer

Dim i As Byte, j As Byte, k As Byte, m As Byte, n As Byte

n = InputBox("Введите размерность массива A")

m = InputBox("Введите размерность массива B")

ReDim A(1 To n), B(1 To m), C(1 To m + n)

Ввод исходных одномерных массивов:

Randomize

For i = 1 To n

A(i) = Int(Rnd * 100) - 50

Next i

For i = 1 To m

B(i) = Int(Rnd * 100) - 50

Next i

Упорядочиваем массив А по убыванию:

For i = 1 To n - 1

For j = i + 1 To n

If A(i) < A(j) Then

d = A(j)

A(j) = A(i)

A(i) = d

End If

Next j, i

For i = 1 To n

List1.AddItem Str(A(i))

Next i

Упорядочиваем массив B по возрастанию:

For i = 1 To m - 1

For j = i + 1 To m

If B(i) > B(j) Then

d = B(j)

B(j) = B(i)

B(i) = d

End If

Next j, i

For i = 1 To m

List2.AddItem Str(B(i))

Next i

Решение задачи:

i = 1: j = m

For k = 1 To m + n

If i <= n And j >= 1 Then

If A(i) >= B(j) Then

C(k) = A(i)

i = i + 1

Else

C(k) = B(j)

j = j - 1

End If

ElseIf j < 1 Then

C(k) = A(i)

i = i + 1

Else

C(k) = B(j)

j = j - 1

End If

Next k

For i = 1 To m + n

List3.AddItem Str(C(i))

Next i

Алгоритмы обработки двумерных массивов (матриц)

  1. Ввод матрицы и отображение ее на экране

Возможны 4 основных способа отобрахения матриц на экране:

- вывод в текстовое окно с установленным в True значением

cвойства Multiline;

- вывод в массив списков (групповой список);

- вывод в многоколонный список;

- вывод в элемент MSFlexGrid

Вывод в Текстовое окно:

Располагаем на форме Текстовое окно и в окне Свойств устанавливаем его свойство Multiline = True.

Вводим матрицу a(m,n) и отображаем ее в Текстовом окне:

Text1.Text=””: Randomize

For i=1 To m

For j=1 To n

a(i,j) = Int(Rnd * 100)

Text1.Text=Text1.Text & Str(a(i,j)) & ” “

Next j

Text1.Text=Text1.Text & vbCrLf

Next i

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

Вывод в массив списков (групповой список):

Располагаем на форме обычный список и в окне его свойств задаем значение свойства Index равным 0. Этим мы превратили обычный список в групповой. Теперь можно программным способом добавлять в групповой список новые элементы ListBox. Приведем полностью соответствующую процедуру.

Private Sub Command1_Click()

Dim a%(), m%, n%, i%, j%, k%

m = InputBox(“Введите кол-во строк матрицы”)

n = InputBox(“Введите кол-во столбцов матрицы”)

ReDim a(1 To m, 1 To n)

k = List1.Ubound

Добавляем программным путем новые элементы ListBox в массив

списков и размещаем их вплотную друг к другу:

For j = k + 1 To n – 1

Load List1(j)

List1(j).Left = List1(j – 1).Left + List1(j – 1).Width

List1(j).Visible = True

Next j

Метод Load загружает на форму новые элементы массива списков. Все они будут иметь те же значения свойств (кроме свойств Index

и Visible), которые были установлены для исходного списка, в том чис-

ле и одинаковые начения свойствTop, Lrft, Width и Height. Это значит, что все они будут располагаться поверх исходного списка. Поэтому у них

нужно изменить значение свойства Lrft, чтобы они раздвинулись на

форме и, кроме того, установить значение свойства Visible=True, так

как у вновь загружаемых элементов группового списка по умолчанию

значение этого свойства устанавливается равным False. Далее вводим матрицу и отображаем ее в созданном массиве списков (групповом списке):

For j = 1 To n

For i = 1 To m

a(i,j)=Int(Rnd * 100)

List1(j – 1).List(i – 1)=Str(a(i,j))

Next j, i

End Sub

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

Вывод в многоколонный список:

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

Private Sub Command1_Click()

Dim a%(), m%, n%, i%, j%, k%

m = InputBox(“Введите кол-во строк матрицы”)

n = InputBox(“Введите кол-во столбцов матрицы”)

ReDim a(1 To m, 1 To n)

List1.Columns = n

k = 25

List1.Height = m * (k * List1.FontSize)

For j = 1 To n

For i = 1 To m

a(i,j) = Int(Rnd * 100)

List1.AddItem Str(a(i,j))

Next i, j

End Sub

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

Вывод в элемент MSFlexGrid:

Размещаем на форме элемент MSFlexGrid и меняем его имя на

более короткое, например, fg. Записываем код процедуры:

Private Sub Command1_Click()

Dim a%(), m%, n%, i%, j%

m = InputBox(“Введите кол-во строк матрицы”)

n = InputBox(“Введите кол-во столбцов матрицы”)

ReDim a(1 To m, 1 To n)

fg.Rows = m + 1: fg.Cols = n + 1

‘ Делаем одинаковыми ширины всех столбцов таблицы

For j = 0 To n

fg.ColWidth(j) = fg.Width \ (n + 1)

Next j

‘ Нумеруем столбцы и строки таблицы

For j = 1 To n

fg. TextMatrix(0, j) = j

Next j

For i = 1 Tp m

fg.TextMatrix(i, 0) = i

Next i

‘ Вводим значения элементов матрицы и отображаем их в таблице

For i = 1 To m

For j = 1 To n

a(i, j) = Int(Rnd * 100)

fg.TextMatrix(i, j) = a(i, j)

Next j, i

End Sub

Этот способ избавлен от всех недостатков предыдущих способов и

поэтому является наиболее предпочтительным.

Обработка квадратных матриц.

Квадратной называется матрица с равным числом строк и

столбцов. Элемент a(i,j) квадратной матрицы A(n,n) принадлежит ее главной диагонали, если его индексы удовлетворяют условию: j = i.

Элемент a(i,j) квадратной матрицы A(n,n) принадлежит ее побочной диагонали, если для него выполняется условие: j=n-i+1.

  1. Определить сумму элементов главной диагонали квадратной матрицы.

Sum=0

For i=1 To n

Sum=Sum+A(i,i)

Next i

4. Определить произведение элементов побочной диагонали

матрицы.

p=1

For i=1 To n

p=p*A(i, n-i+1)

Next i

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

При решении этой задачи целесообразно пользоваться следующими соображениями. В интересующей нас области матрицы номера столбцов находятся в диапазоне от n\2 + 2 до n. Номера строк – от n – j + 2 до j – 1, т.к. номер элемента, лежащего на побочной диагонали, равен n – j + 1, а лежащего на главной диагонали равен j. Поэтому:

S = 0

For j = n\2 +2 To n

For i = n – j +2 To j - 1

S=S+A(i,j)

Next i,j

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

При решении этой задачи целесообразно пользоваться следующими соображениями. В интересующей нас области матрицы номера строк находятся в диапазоне от n\2 + 1 до n. Номера столбцов – от n - i + 1 до i, т.к. номер элемента, лежащего на главной диагонали, равен i , а лежащего на побочной диагонали равен n – i + 1. Поэтому:

S = 0

For i = n\2 +1 To n

For j = n - i + 1 To i

S=S+A(i,j)

Next j,i

Примеры обработки двумерных массивов (матриц).

Рассмотренные выше типовые алгоритмы обработки матриц могут быть использованы в качестве составных частей общего алгоритма

решения задачи на обработку матриц.

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

Dim a%(), b%, m%, n%, i%, j%, k%, sum_str%, sum_stlb%

Dim j_min%, max%, i_max%

m = InputBox("Введите кол-во строк")

n = InputBox("Введите кол-во столбцов")

ReDim a(1 To m, 1 To n)

MSFG1.Cols = n + 1: MSFG1.Rows = m + 1

For j = 0 To n

MSFG1.ColWidth(j) = MSFG1.Width \ (n + 2)

MSFG1.TextMatrix(0, j) = " j = " & j

Next j

For i = 0 To m

MSFG1.RowHeight(i) = MSFG1.Height \ (m + 2)

MSFG1.TextMatrix(i, 0) = " i = " & i

Next i

Randomize

For i = 1 To m

For j = 1 To n

a(i, j) = Int(Rnd * 100) - 50

MSFG1.TextMatrix(i, j) = a(i, j)

Next j, i

Решение задачи:

For i = 1 To m

For k = 1 To n

b = a(i, k): sum_str = 0

For j = 1 To n

If k <> j Then sum_str = sum_str + a(i, j)

Next j

If b < sum_str Then

sum_stlb = 0

For j = 1 To m

If j <> i Then sum_stlb = sum_stlb + a(j, k)

Next j

If b > sum_stlb Then List1.AddItem " i = " & i & " j = " & k & _

" a(i,j) = " & b

End If

Next k

Next i

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

Dim a%(), n%, i%, j%, k%, m%, sum%, max%

n = InputBox("Введите размерность квадратной матрицы")

ReDim a(1 To n, 1 To n)

Задаем параметры элемента MSFlexGrid1

fg1.Rows = n + 1: fg1.Cols = n + 1

For i = 0 To n

fg1.RowHeight(i) = Int(fg1.Height / (n + 2))

fg1.ColWidth(i) = Int(fg1.Width / (n + 2))

Next i

For i = 1 To n

fg1.TextMatrix(i, 0) = i

fg1.TextMatrix(0, i) = i

Next i

Задаем параметры элемента MSFlexGrid2

fg2.Rows = 2: fg2.Cols = n

fg2.FormatString = " ;Столбец | Сумма "

For i = 1 To n - 1

fg2.ColWidth(i) = Int(fg2.Width / (n + 2))

Next i

For i = 0 To n - 2

fg2.TextMatrix(0, i + 1) = i + 2

Next i

For i = 0 To 1

fg2.RowHeight(i) = Int(fg2.Height / (n + 1))

Next i

Вводим элементы матрицы и отображаем их в элементе MSFlexGrid1

Randomize

For i = 1 To n

For j = 1 To n

a(i, j) = Int(Rnd * 10)

fg1.TextMatrix(i, j) = a(i, j)

Next j, i

Закрашиваем главную диагональ матрицы зеленым цветом

For i = 1 To n

fg1.Row = i: fg1.Col = i

fg1.CellBackColor = vbGreen

Next i

Решаем задачу

max = a(1, n): m = n

k = n - 1

For j = 1 To k

sum = 0

For i = 1 To n - j

sum = sum + a(i, i + j)

Next i

If sum > max Then max = sum: m = j

fg2.TextMatrix(1, j) = sum

Next j

Закрашиваем номер столбца, с которого начинается линия,

параллельная главной диагонали с max суммой элементов

fg2.Row = 0: fg2.Col = m

fg2.CellBackColor = vbRed

Text1.Text = " Max сумма= " & max

Пример 3. В матрице A(M,N) поменять местами 1-ый и 3-ий квадранты.

Dim a%(), b%, i%, j%, m%, n%, k%, p%

m = InputBox("Введите число строк матрицы")

n = InputBox("Введите число столбцов матрицы")

ReDim a(1 To m, 1 To n)

Задание необходимого количества строк и столбцов

объектов MSFlexGrid1, MSFlexGrid2:

MSFG1.Cols = n + 1: MSFG1.Rows = m + 1

MSFG2.Cols = n + 1: MSFG2.Rows = m + 1

Определение требующейся ширины столбцов и высоты строк

объектов MSFlexGrid1, MSFlexGrid2:

For i = 0 To n

MSFG1.ColWidth(i) = Int(MSFG1.Width / (n + 2))

MSFG2.ColWidth(i) = Int(MSFG2.Width / (n + 2))

Next i

For i = 0 To m

MSFG1.RowHeight(i) = Int(MSFG1.Height / (m + 2))

MSFG2.RowHeight(i) = Int(MSFG2.Height / (m + 2))

Next i

Ввод исходной матрицы

Randomize

For i = 1 To m

For j = 1 To n

a(i, j) = Int(Rnd * 10) - 5

MSFG1.TextMatrix(i, j) = Str(a(i, j))

MSFG2.TextMatrix(i, j) = Str(a(i, j))

Next j

Next i

Решение задачи

k = m \ 2: p = n \ 2

For i = 1 To k

For j = 1 To p

MSFG1.Row = i: MSFG1.Col = j

MSFG1.CellBackColor = vbMagenta

MSFG1.Row = m - i + 1: MSFG1.Col = n - p + j

MSFG1.CellBackColor = vbGreen

b = a(i, j)

a(i, j) = a(m - k + i, n - p + j)

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

Next j, i

Вывод результата

For i = 1 To m

For j = 1 To n

MSFG2.TextMatrix(i, j) = a(i, j)

Next j, i

For i = 1 To k

For j = 1 To p

MSFG2.Row = i: MSFG2.Col = j

MSFG2.CellBackColor = vbGreen

MSFG2.Row = m - i + 1: MSFG2.Col = n - p + j

MSFG2.CellBackColor = vbMagenta

Next j, i

Пример 4. Даны расстояния между n городами. Найти город, ближайший к №1, затем - ближайший к найденному.

Dim r!(), n%, i%, j%, min!, j_min%, i_min%

n = InputBox("Введите кол-во городов")

ReDim r(1 To n, 1 To n)

Задаем параметры элемента MSFlexGrid

и закрашиваем его диагональ

flg1.Cols = n + 1: flg1.Rows = n + 1

For i = 0 To n

flg1.ColWidth(i) = Int(flg1.Width / (n + 2))

flg1.TextMatrix(0, i) = i

flg1.RowHeight(i) = Int(flg1.Height / (n + 2))

flg1.TextMatrix(i, 0) = i

flg1.Col = i: flg1.Row = i

If i <> 0 Then flg1.CellBackColor = vbRed

Next i

Заполняем таблицу расстояний между городами выше диагонали,

симметрично отображаем ее относительно диагонали и

отображаем таблицу в MSFlexGrid

Randomize

For i = 1 To n - 1

For j = i + 1 To n

r(i, j) = Round(Rnd * 1000, 1)

flg1.TextMatrix(i, j) = r(i, j)

r(j, i) = r(i, j)

flg1.TextMatrix(j, i) = r(j, i)

Next j, i

Первый город отмечаем зеленым цветом

flg1.Col = 1: flg1.Row = 0

flg1.CellBackColor = vbGreen

Двигаясь в первой строке таблицы по столбцам, находим город,

ближайший к первому, и отмечаем его малиновым цветом

min = 100000: j_min = 2

For j = 2 To n

If r(1, j) < min Then min = r(1, j): j_min = j

Next j

flg1.Col = j_min: flg1.Row = 0

flg1.CellBackColor = vbMagenta

Двигаясь в столбце найденного города по строкам, находим

город, ближайший к найденному, и отмечаем его желтым цветом

min = 100000: i_min = 1

For i = 2 To n

If i <> j_min And r(i, j_min) < min Then min = r(i, j_min): i_min = i

Next i

flg1.Col = j_min: flg1.Row = i_min

flg1.CellBackColor = vbYellow

Делаем текстовое окно видимым и отображаем в нем пояснения

о цветовой маркировке городов

Text1.Visible = True

Text1.Text = " Малиновым цветом отмечен" & vbCrLf & _

"город, ближайший к первому" & vbCrLf & _

" Желтым цветом отмечен" & vbCrLf & _

" город, ближайший к найденному"

Ниже представлен результат решения этой задачи для 8 городов.

Пример 5. Упорядочить элементы четных столбцов матрицы размерности n x m по возрастанию, а нечетных столбцов – по убыванию.

Dim i As Byte, n As Byte

Dim j As Byte, m As Byte

Dim k As Byte, ks As Integer

Dim a() As Single, b As Single

n=InputBox(“Введите число строк матрицы”)

m=InputBox(“Введите число столбцов матрицы”)

ReDim a(n,m)

Введем матрицу, затем:

For j=1 To m

If j mod 2 = 0 Then

ks = 1

Else

ks=-1

End If

For i=1 To n-1

For k=i+1 To n

If ks*a(i,j) > ks*a(k,j) Then

b=a(i,j)

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

a(k,j)=b

End If

Next k,i,j

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]