* Задание: Разработать приложение, которое находит «седловые» точки данной целочисленной матрицы порядка n х m (для отображения матрицы на форме использовать элемент управления DataGridView).
Выполнение:
Элемент матрицы назовем «седловой» точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце.
- Создайте новый проект стандартного приложения и разместите элементы управления (txtN, txtM, txtMin, txtMax, btnНоваяМатрица, btnСедловыеТочки и btnВыход) на форме (рисунок). Не забудьте добавить на форму элемент управления DataGridView.
- Установите значение для свойства Enabled кнопки btnСедловыеТочки равным False, а также значение свойства AutoSizeColumnsMode для элемента управления DataGridView → AllCells (авторазмер для всех ячеек).
- В разделе описаний объявите переменные n, m (для хранения размерности матрицы) и динамический массив следующим образом:
Private n As Integer Private m As Integer Private Матрица(,) As Integer |
- Теперь необходимо инициализировать нашу матрицу целыми числами из некоторого промежутка, а затем вывести ее в элемент управления DataGridView. Процедура обработки события click для кнопки btnНоваяМатрица выглядит следующим образом:
Private Sub btnНоваяМатрица_Click(…) Handles btnНоваяМатрица.Click Dim a As Integer Dim b As Integer Dim i As Integer Dim j As Integer Randomize() n = Val(txtN.Text) : m = Val(txtM.Text) a = Val(txtMin.Text) : b = Val(txtMax.Text) If n < 1 Or m < 1 Or b < a Then MsgBox("Введены ошибочные параметры матрицы!", MsgBoxStyle.OkOnly + _ MsgBoxStyle.Critical, "Ошибка!") Exit Sub End If ReDim Матрица(n, m) With Dat .RowCount = n .ColumnCount = m .ClearSelection() For i = 0 To n - 1 For j = 0 To m - 1 Матрица(i + 1, j + 1) = Rnd() * (b - a) + a .Item(j, i).Value = Матрица(i + 1, j + 1) Next Next End With btnСедловыеТочки.Enabled = True End Sub |
- Наконец, реализуем описанный выше алгоритм сортировки в процедуре обработки события Click для кнопки btnСедловыеТочки, предварительно описав функции Максимальный_в_строке, Минимальный_в_строке , Максимальный_в_столбце , Минимальный_в_столбце:
Private Function Максимальный_в_строке(ByVal x(,) As Integer, ByVal m As Integer, ByVal i As Integer, ByVal j As Integer) As Boolean Максимальный_в_строке = True For k = 1 To m If x(i, j) < x(i, k) Then Максимальный_в_строке = False Next End Function Private Function Минимальный_в_строке(ByVal x(,) As Integer, ByVal m As Integer, ByVal i As Integer, ByVal j As Integer) As Boolean Минимальный_в_строке = True For k = 1 To m If x(i, j)> x(i, k) Then Минимальный_в_строке = False Next End Function Private Function Максимальный_в_столбце(ByVal x(,) As Integer, ByVal n As Integer, ByVal i As Integer, ByVal j As Integer) As Boolean Максимальный_в_столбце = True For k = 1 To n If x(i, j) < x(k, j) Then Максимальный_в_столбце = False Next End Function Private Function Минимальный_в_столбце(ByVal x(,) As Integer, ByVal n As Integer, ByVal i As Integer, ByVal j As Integer) As Boolean Минимальный_в_столбце = True For k = 1 To n If x(i, j) > x(k, j) Then Минимальный_в_столбце = False Next End Function … |
- Процедура обработки события Click для кнопки btnСедловыеТочки:
Private Sub btnСедловыеТочки_Click(…) Handles btnСедловыеТочки.Click Dim i As Integer Dim j As Integer For i = 1 To n For j = 1 To m If (Максимальный_в_строке(Матрица, m, i, j) = True _ And Минимальный_в_столбце(Матрица, n, i, j) = True) Or _ (Максимальный_в_столбце(Матрица, n, i, j) = True _ And Минимальный_в_строке(Матрица, m, i, j) = True) Then Dat.Item(j - 1, i - 1).Selected = True End If Next Next End Sub |
- Наконец, необходимо обработать событие Change для текстовых окон txtN, txtM, txtMin и txtMax следующим образом:
btnСедловыеТочки.Enabled=False |
Блокировка кнопки при изменении текстовых полей.
В противном случае, после внесения изменений в параметры матрицы поиск «седловых» точек может быть некорректным.
- Запустите и отладьте приложение.
Дополнительное задание:
Добавить в приложение возможность выбирать режим инициализации матрицы разными числами. Поместите соответствующий переключатель в окно с параметрами матрицы.
Контрольные задания:
- Найти все эелементы данной матрицы большие заданного числа (число вводится пользователем).
- Поменять местами в данной матрице указанные столбцы.
Вопросы для самоконтроля:
- Что такое матрица?
- Каково основное назначение элемента DataGridView?
- Как отобразить матрицу в таблице DataGridView? Опишите основные шаги этого процесса.
* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.