- •Институт информационных систем управления
- •Кандидат экономических наук, доцент в.А. Машурцев
- •Введение.
- •Глава 1. Vb 6.0 – среда разработки приложений.
- •1.1. Окна среды vb.
- •1.2. Файловая структура проекта.
- •1.3. Визуальное конструирование приложения.
- •1.4. Основные свойства формы и задание их значений.
- •1.5. Добавление форм к проекту и удаление форм из проекта.
- •1.6. Основные элементы управления и их свойства.
- •1.6.1. Элемент Label.
- •1.6.2. Элемент TextBox. Элемент TextBox (текстовое окно) предназначен для ввода исходной
- •1.6.3. Элементы HscrollBar и VscrollBar.
- •1.6.4. Элемент CommandButton.
- •1.7. События и методы.
- •1.8. Включение изображений в интерфейс пользователя.
- •1.8.1. Элемент Image. Элемент управления Image предназначен в основном для нанесе-
- •1.8.2. Элемент PictureBox.
- •1.9. Сохранение проекта.
- •Глава 2. Данные vb.
- •2.1. Типы данных.
- •2.1.1. Типы числовых данных.
- •2.1.1.1. Целочисленные данные.
- •2.1.1.2. Вещественные данные.
- •2.1.2. Типы нечисловых данных.
- •2.2. Объявление переменных и констант.
- •2.3. Область видимости переменных и констант.
- •2.4. Совместимость и преобразование типов данных.
- •2.5. Ввод исходных данных и вывод результатов обработки.
- •2.5.1. Окно сообщений. Оператор и функция MsgBox.
- •2.6. Форматирование вывода чисел.
- •Глава 3. Алгоритмизация вычислительных процессов.
- •3.1. Алгоритм и его свойства.
- •3.2. Типы вычислительных процессов.
- •3.3. Операторы vb.
- •3.4. Логические выражения.
- •3.5. Управляющие конструкции.
- •3.5.1. Операторы ветвлений.
- •3.5.1.1. Условный оператор.
- •3.5.1.2. Оператор выбора.
- •3.5.2. Операторы циклов.
- •3.5.2.1. Регулярный цикл.
- •3.5.2.2. Итерационные циклы.
- •3.5.2.3. Цикл перечислимого типа.
- •3.5.3. Элементы выбора.
- •3.5.3.1. Элемент CheckBox.
- •3.5.3.2. Элемент OptionButton.
- •3.5.4. Элемент управления и функция Timer.
- •3.5.5. Дата и время.
- •3.5.6. Оператор DoEvents.
- •3.5.7. Объединение кнопок в группы.
- •3.5.7.1. Элемент Frame.
- •3.6. Списки.
- •3.6.1. Элемент ListBox.
- •3.6.2. Элемент ComboBox.
- •Глава 4. Массивы.
- •4.1. Одномерные массивы.
- •4.2. Двумерные массивы.
- •4.3. Статические и динамические массивы.
- •4.4. Функция Array.
- •4.5. Генератор случайных чисел.
- •4.6. Функции lBound и uBound.
- •4.7. Массивы элементов управления.
- •4.8. Сопоставление массивов и списков.
- •4.9. Элемент msFlexGrid.
- •4.10. Упорядочение строк элемента msFlexGrid.
- •Глава 5. Процедуры и функции полоьзователя.
- •5.1. Создание стандартного модуля в приложении.
- •5.2.2. Вызов процедуры на выполнение.
- •5.3. Функции пользователя.
- •Глава 6. Обработка текстовой информации.
- •6.1. Изменение регистра символов в тексте.
- •6.2. Поиск заданной подстроки в тексте.
- •6.3. Выборка части текста.
- •6.4. Замена символов в тексте.
- •6.5. Удаление лишних пробелов из строки текста.
- •6.6. Инвертирование строк.
- •6.7. Преобразование текстовых строк в числа и наоборот.
- •6.8. Определение длины текста.
- •Глава 7. Создание меню пользователя.
- •Глава 8. Пользовательский тип данных.
- •8.1. Записи.
- •8.2. Сложные структуры данных.
- •Глава 9. Файлы.
- •9.1. Файлы последовательного доступа.
- •9.1.1. Открытие файла последовательного доступа.
- •9.1.2. Запись информации в файл.
- •9.1.3. Чтение информации из файла.
- •9.1.4. Закрытие файла.
- •9.2. Файлы произвольного доступа.
- •9.2.1. Открытие файла произвольного доступа.
- •9.2.2. Запись информации в файл.
- •9.4. Операции с файлами в vb.
- •9.5. Файловые операторы и функции обработки данных.
- •9.6. Сравнительный пример работы с файлами.
- •Глава 10. Обработка бд Access в среде vb.
- •10.1. Создание бд Access в среде vb.
- •10.2. Использование технологии Data Access Objects (dao).
- •10.2.1. Элемент управления Data.
- •10.2.2. Свойство Recordset элемента Data.
- •10.2.3. Программное связывание элементов.
- •10.3. Технология ActiveX Data Objects (ado).
- •10.3.1. Подключение ado Data к источнику данных (бд).
- •10.3.2. Подключение ado Data к источнику записей.
- •10.3.3. Элемент управления DataGrid.
- •10.4. Объекты ado.
- •10.4.1. Объект Connection.
- •10.4.2. Объект RecordSet.
- •10.4.3. Перемещение по набору записей.
- •10.4.4. Обращение к отдельным полям записи.
- •10.4.5. Выполнение запросов к бд.
- •10.5. Пример обработки бд в рамках технологии ado.
- •Глава 11. Обмен данными между приложениями.
- •11.1. Экспорт данных из бд в текстовый файл.
- •11.2. Технология внедрения и связывания (ole).
- •11.3. Связывание и внедрение на этапе design.
- •11.3.1. Связывание на этапе проектирования. Сразу же после размещения на форме элемента ole появляется
- •11.3.2. Внедрение на этапе проектирования.
- •11.4. Связывание и внедрение объектов на этапе run.
- •11.4.1. Свойства ole-контейнера.
- •11.4.2. Методы ole-контейнера.
- •11.4.3. События, связанные с ole-контейнером.
- •11.4.5. Внедрение объекта на этапе run. Для внедрения объектов в vb-приложение используется метод CreateEmbed. Синтаксис оператора, использующего этот метод:
- •Глава 12. Графические средства vb 6.
- •12.1. Управление цветом.
- •12.2. Изображения в интерфейсе проекта.
- •12.2.1. Наложение изображения на этапе проектирования. Наложение изображения на форму.
- •Восстановление утраченных графических файлов.
- •Наложение изображения на элемент PictureBox.
- •Наложение изображения на элемент CommandButton.
- •12.2.2. Наложение изображений на этапе выполнения.
- •12.3. Использование анимированных изображений.
- •12.3.1. Визуализация анимированных gif-файлов.
- •12.3.2. Визуализация на форме клипов.
- •12.4. Рисунки на графических объектах.
- •12.4.1. Элемент Shape.
- •12.4.2. Элемент Line.
- •12.5. Графические методы.
- •12.5.1. Методы для работы с изображением точки.
- •12.5.2. Метод Line.
- •12.5.3. Метод Circle.
- •12.6. Использование графики для решения отдельных задач.
- •12.6.1. Визуализация процесса сортировки элементов массива.
- •12.6.2. Принадлежность точки заданной области.
- •Приложение 1. Типовые алгоритмы обработки чисел.
- •Приложение 3. Алгоритмы обработки массивов.
- •Приложение 4. Примеры создания процедур и функций.
- •Приложение 5. Пример обработки типизированных файлов.
- •Приложение 6. Пример обработки бд Access в среде vb.
- •Оглавление
- •Глава 1. Vb 6.0 – среда разработки приложений. 4
- •Глава 2. Данные vb. 20
- •Глава 3. Алгоритмизация вычислительных процессов. 33
- •Глава 4. Массивы. 61
- •Глава 5. Процедуры и функции полоьзователя. 77
- •Глава 10. Обработка бд Access в среде vb. 110
- •Глава 11. Обмен данными между приложениями. 139
- •Глава 12. Графические средства vb 6. 150
Приложение 3. Алгоритмы обработки массивов.
Типовые алгоритмы обработки одномерных массивов
-
Ввод массива:
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
-
Вывод массива:
Text1.Text=””
For i = 0 To 10
Text1.Text = Text1.Text & Str(Mas(i)) & ” “
Next i
-
Накопление сумм и произведений:
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
-
Поиск 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
-
Поиск 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
-
Сортировка (упорядочение) массива:
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
-
Циклически сдвинуть влево элементы массива так, чтобы его максимальный элемент оказался на первом месте:
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
Алгоритмы обработки двумерных массивов (матриц)
-
Ввод матрицы и отображение ее на экране
Возможны 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.
-
Определить сумму элементов главной диагонали квадратной матрицы.
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
-
Определить сумму элементов, лежащих в правом секторе квадратной матрицы, образованном нересечением ее главной и побочной диагоналей. Элементы, расположенные на самих диагоналях, в сумму не включать.
При решении этой задачи целесообразно пользоваться следующими соображениями. В интересующей нас области матрицы номера столбцов находятся в диапазоне от 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
-
Вычислить сумму элементов, лежащих в нижнем секторе квадратной матрицы, образованном нересечением ее главной и побочной диагоналей. Элементы, расположенные на самих диагоналях, в сумме должны быть учтены.
При решении этой задачи целесообразно пользоваться следующими соображениями. В интересующей нас области матрицы номера строк находятся в диапазоне от 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