Описание выполнения Задания 4.
Название работы: Задание 4.
Тема задания: “Обработка одномерных и двумерных массивов”.
Цель задания: Освоение типовых алгоритмов обработки массивов и матриц, а также использование этих алгоритмов для решения практических задач в соответствии с индивидуальным заданием. Ознакомление с элементом управления MSFlexGrid.
В этом задании нужно решить 2 задачи. В качестве примера ниже решаются следующие задачи:
1. Обработка одномерных массивов:
Найти 3 наибольших элементов массива. При совпадении других
элементов с третьим список расширить.
2. Обработка двумерных массивов (матриц):
Определить номера строк матрицы, в которых максимальный элемент
строки стоит в правой ее половине.
Решение обеих задач производится на одной форме. Создаем на дискете папку “Задание_4”, в которой нужно будет сохранить проект с 4-м заданием.
Открываем новый проект и размещаем на форме метку и 3 командные кнопки. Нам потребуется также элемент MSFlexGrid. Его на панели элементов нет. Чтобы вызвать его на панель элементов управления, нужно выполнить: “Проект\ Компоненты” и в открывшемся окне щелкнуть на значке квадратика, стоящего левее строки “Microsoft FlexGrid Control 6”. Затем щелкнуть в том же окне на “Применить” и “Ok”. После этого пиктограмма элемента появится на панели элементов управления. Размещаем его на форме и изменяем его имя на fg.
Теперь нам нужно разместить поверх элемента MSFlexGrid элемент Frame. Он должен быть такого же размера, как и элемент MSFlexGrid, т.е. должен полностью закрывать собой элемент MSFlexGrid. При прорисовке элемента Frame нужно, чтобы точка начала прорисовки находилась вне элемента MSFlexGrid. На элементе Frame размещаем 2 метки и 2 элемента ListBox.
Таблица свойств формы и расположенных на ней элементов управления
Объект |
Свойство |
Значение свойства |
Форма |
Name Caption Font |
frmZ4r Обработка одномерных и двумерных массивов Times New Roman, жирный, размер 12 |
Метка |
Name Caption Alignment Font |
Label1 Выводится условие текущей задачи 0-левая привязка Times New Roman, жирный, размер 12 |
Командная кнопка |
Name Caption Font |
Command1 Задача № 1 Times New Roman, обычный, размер 10 |
Командная кнопка
|
Name Caption Font |
Command2 Задача № 2 Times New Roman, обычный, размер 10 |
Командная кнопка |
Name Caption Font |
Command3 Выход Times New Roman, обычный, размер 10 |
MSFlexGrid |
Name |
fg |
Фрейм |
Name |
Frame1 |
Метка на контейнере |
Name Caption Alignment Font |
Label2 Исходный массив 2-центровка Times New Roman, жирный, размер 10 |
Метка на контейнере |
Name Caption Alignment Font |
Label3 Результат 2-центровка Times New Roman, жирный, размер 10 |
Список на контейнере |
Name |
List1 |
Список на контейнере |
Name |
List2 |
Вид формы до размещения на ней контейнера Frame:
Вид формы после размещения на ней контейнера Frame:
Процедуры формы frmZ4:
Процедура решения 1-ой задачи:
Private Sub Command1_Click()
Dim a%(), ind%(), max%, i%, j%, k%, n%, f%
Label1 = " Найти 3 элемента массива, имеющие " & _
"наибольшие значения. При совпадении других элементов " & _
"с третьим список расширить."
Frame1.Visible = True: fg.Visible = False
List1.Clear
n = InputBox("Введите размерность массива")
ReDim a(1 To n), ind(1 To n)
Randomize
For i = 1 To n
a(i) = Rnd * 25
List1.AddItem Str(a(i))
Next i
For i = 1 To 3
max = -32767
For j = 1 To n
f = 0
For k = 1 To i
If j = ind(k) Then f = 1
Next k
If a(j) >= max And f = 0 Then
max = a(j)
ind(i) = j
End If
Next j
List2.AddItem Str(max)
Next i
k = 0
For i = 1 To n
If Str(a(i)) = List2.List(2) Then k = k + 1
Next i
For i = 1 To k - 1
List2.AddItem List2.List(2)
Next i
End Sub
Вид формы с результатом решения 1-ой задачи.
Процедура решения 2-ой задачи:
Private Sub Command2_Click()
Dim ar%(), m%, n%, i%, i_max%, j%, j_max%, max%
Label1 = " Определить номера строк матрицы, в которых " & _
"максимальный элемент строки стоит в правой ее половине."
Frame1.Visible = False: fg.Visible = True
m = InputBox("Введите количество строк матрицы")
n = InputBox("Введите количество столбцов матрицы")
ReDim ar(1 To m, 1 To n)
fg.Cols = n + 1: fg.Rows = m + 1
' Задаем параметры строк элемента NSFlexGrid и нумеруем его строки
For i = 0 To m
fg.RowHeight(i) = fg.Height / (m + 2)
If i > 0 Then fg.TextMatrix(i, 0) = i
Next i
' Задаем параметры столбцов элемента NSFlexGrid и нумеруем их
For j = 0 To n
fg.ColWidth(j) = fg.Width / (n + 2)
If j > 0 Then fg.TextMatrix(0, j) = j
Next j
' Вводим элементы матрицы и отображаем их в NSFlexGrid
Randomize
For i = 1 To m
For j = 1 To n
ar(i, j) = Int(Rnd * 100)
fg.TextMatrix(i, j) = Str(ar(i, j))
Next j, i
' Р Е Ш А Е М З А Д А Ч У:
For i = 1 To m
max = ar(i, 1)
For j = 2 To n
If ar(i, j) > max Then max = ar(i, j): j_max = j
Next j
If j_max > n / 2 Then
fg.Row = i: fg.Col = j_max
fg.CellBackColor = vbGreen
End If
Next i
End Sub
Вид формы с результатом решения 2-ой задачи.
Процедура завершения работы приложения:
Private Sub Command3_Click()
End
End Sub
Как обычно добавляем к проекту форму-заставку frmZ4z. После ее разработки запускаем приложение на выполнение.
Вопросы для защиты Задания 4.
1. Назначения и основные свойства элементов управления ListBox и
MSFlexGrid.
2. Как добавить элемент MSFlexGrid на панель элементов управления?
3. Как выделить цветом отдельную ячейку элемента MSFlexGrid?
4. Какие существуют способы заполнения списка ListBox ( на этапах run и
design)?
5. В чем отличие в добавлении новых элементов в уже существующий список
ListBox с помощью свойства List и метода AddItem?
6. Отличие в предназначении цикла с параметром от итерационных циклов.
7. Как досрочно выйти из цикла с параметром и из итерационных циклов
любого типа?
8. В чем отличия итерационных циклов с предусловием и постусловием?
9. В чем отличия в работе итерационных циклов, в конструкции которых
используются ключевые слова While и Until?
10. Какие виды массивов существуют и как они объявляются?
11. Как переопределить размерность массива с сохранением его
содержимого?
12. Назначение функции Rnd и оператора Randomize.
Желаю успешной защиты Задания 4!