- •Часть 4
- •Содержание
- •Предисловие
- •Задание в
- •Задание к работе Задание а
- •Варианты заданий а
- •Задание b
- •Варианты заданий в
- •Методические указания к выполнению задания а Определение массива
- •Обращение к элементам массива
- •Описание массива
- •Ввод и вывод массивов
- •Статические и динамические массивы
- •Новые значения свойств элементов управления формы
- •Пример выполнения задания a лабораторной работы
- •Задачи для самостоятельного выполнения
- •Методические указания к выполнению задания b
- •InputBox("Введите a(" & I & "," & j & ") элемент")
- •Пример выполнения задания в лабораторной работы
- •Контрольные вопросы
- •Содержание отчета
- •Библиографический список
- •3 46500, Г. Шахты, Ростовская обл., ул. Шевченко, 147
InputBox("Введите a(" & I & "," & j & ") элемент")
Введем таким же образом с помощью диалоговых окон остальные элементы двумерного массива А, определяя индексы элемента по поясняющей надписи.
После ввода массива щелкнем на второй командной кнопке «Визуализация матрицы А». В элемент управления ListBox (Список) будет выведен двумерный массив А.
Щелкнем на третьей командной кнопке «Обработка массива». Как было сказано выше, результатов работы этой процедуры мы не увидим, так как переменная s пока хранится в оперативной памяти.
Чтобы увидеть результат, щелкнем на четвертой командной кнопке «Визуализация результата». Результат – сумму всех отрицательных элементов двумерного массива А – мы увидим в элементе управления типа TextBox (Текстовое поле).
Полностью результаты выполнения программного кода при исходной матрице
А= ,
представлены на рисунке 26.
Рис. 26. Результаты работы программного кода вычисления суммы
всех отрицательных элементов двумерного массива
Пример выполнения задания в лабораторной работы
Задание В
Дана матрица А размерностью M × N. Вычислить и напечатать вектор S, компоненты которого являются произведениями нечетных элементов каждой строки (подразумеваются элементы нечётных столбцов).
Вектор S представляет собой одномерный массив, каждый элемент которого равен произведению нечетных элементов каждой строки матрицы А. Количество элементов одномерного массива равно количеству строк двумерного массива А.
Визуальное представление алгоритма изображено на рисунке 27.
Рис. 27. Визуальное представление алгоритма вычисления элементов
вектора S, компоненты которого являются произведениями
нечетных элементов каждой строки матрицы А
Для визуального представления алгоритма используем блоки, представленные в [10], в Приложении Б, в котором указаны обозначение и функциональное назначение некоторых блочных символов графического описания алгоритмов (визуальных алгоритмов).
В блоке 2 вводятся переменные m и n – количество строк матрицы и количество столбцов соответственно.
Далее алгоритм данной задачи представляет собой последовательность из трех детерминированных сложных (вложенных) структурных циклов с управлением по индексу.
Сначала это построчный ввод элементов матрицы (блок 3), т.е. происходит заполнение двумерного массива. Блок 3 представляет собой сложный циклический процесс, т.к. элемент двумерного массива A(I, J) имеет два индекса: индекс строки I и индекс столбца J.
В блоке 4 происходит вывод данного массива на экран – визуализация массива (с поясняющей надписью). Блок 4 представляет собой также сложный циклический процесс.
В блоке 5 выводится поясняющая надпись к результату – вектору S. При программировании на VBA этот блок можно опустить.
Поскольку необходимо вычислить произведение элементов каждой строки матрицы, то начальное значение произведения нужно задать перед внутренним циклом (блок 7), в котором перебираются и перемножаются элементы строки матрицы. Так как в строке нужно перемножить только элементы нечетных столбцов, то во внутреннем цикле шаг изменения параметра цикла J принимаем равным 2 (блок 8).
Вывод на экран компонентов вектора, т.е. результат умножения нечетных элементов каждой строки, выполняется во внешнем цикле после завершения внутреннего цикла по параметру J (блок 10).
Программа на языке QBasic
INPUT "Введите размер матрицы"; M, N
DIM A(1 TO M,N), S(1 TO M)
'--- Ввод матрицы
FOR I=1 TO M
FOR J=1 TO N
PRINT "A(";I;",";J;")=";
INPUT A(I, J)
NEXT J
NEXT I
‘---Визуализация исходной матрицы
PRINT SPC(5); "Исходная матрица"
FOR I=1 TO M
FOR J=1 TO N
PRINT TAB(5*J) A(I, J); ' вывод на экран очередного
NEXT J ' элемента матрицы
NEXT I
'--- Вычисление и вывод вектора
PRINT SPC(5); “Вектор S(";
FOR I=1 TO M
S(I)=1 ' начальное значение i-го элемента вектора
FOR J=1 TO N STEP 2
S(I)=S(I)*A(I,J)
NEXT J
PRINT S(I); ' вывод i-го элемента вектора
NEXT I
PRINT " )"
END
В качестве тестового варианта возьмем матрицу размером 3×5.
Результаты выполнения программы представлены на рисунке 28.
Рис. 28. Результаты выполнения программы вычисления элементов
вектора S, компоненты которого являются произведениями
нечетных элементов каждой строки двумерного массива А
размерностью M × N на экране вывода системы программирования QBasic
Из результатов видно, что элементы вектора S, которые являются произведениями нечетных элементов каждой строки двумерного массива А размерностью M × N, вычислены верно.
Теперь рассмотрим пример разработки программного кода того же примера, используя объектно-ориентированное программирование, реализуемое средствами языка VBA, используя экранные формы.
Создадим графический интерфейс приложения. Чтобы спроектировать наше приложение, нужно взять некоторые стандартные элементы управления, поместить их на форму, затем установить начальные свойства этих элементов и создать код обработки событий, связанных с этими элементами. Подробно последовательность всех этих действий рассмотрена в [10], [11] и [12].
В окне проекта выберите имя проекта, в который требуется добавить форму.
В меню редактора VBA выберите команду Insert (Вставка)\ UserForm. Выводится пустая экранная форма и набор инструментов.
При размещении на экранной форме стандартных элементов управления, в частности командных кнопок, будем придерживаться следующей стандартной последовательности в работе:
ввод элементов массива;
вывод данного массива на экран – визуализация массива (с поясняющей надписью);
обработка элементов массива согласно условию задачи;
вывод результатов, полученных после обработки, на экран (с поясняющей надписью).
Разместим на экранной форме (рис. 29), используя метод «drag-and-drop», следующие стандартные элементы управления:
четыре элемента управления типа CommandButton (командная кнопка) – CommandButton1, CommandButton2, CommandButton3 и CommandButton4 для реализации четырех стандартных этапов при решении задач с использованием массивов. Командную кнопку CommandButton1 используем для запуска событийной процедуры ввода исходного двумерного массива А. Расположим в ней надпись «Ввод матрицы А», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton2 используем для запуска событийной процедуры визуализации исходного двумерного массива B. Расположим в ней надпись «Визуализация матрицы А», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton3 используем для запуска событийной процедуры суммирования всех отрицательных элементов матрицы A. Расположим в ней надпись «Вычисление вектора», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton4 используем для запуска событийной процедуры визуализации результата – суммы всех отрицательных элементов матрицы A. Расположим в ней надпись «Визуализация вектора», изменив свойство элемента Caption (Надпись);
два элемента типа Label (метка) – Label1, Label2, в которых расположим надписи «Матрица А» и «Вектор S. Индекс. Элемент». Надписи расположим, изменив свойство элементов Caption (Надпись);
два элемента управления типа ListBox (Список) . ListBox1 для вывода (визуализации) исходного двумерного массива A и ListBox2 для вывода (визуализации) одномерного массива – вектора S.
Рис. 29. Форма и расположение на ней элементов управления
Зададим новые значения свойств элементам управления, размещенным на форме (рис. 29) согласно общепринятым соглашениям с помощью окна Propeties (Свойства объектов). Значения свойств по умолчанию и новые значения свойств представлены в таблице 4. Форма и расположение на ней элементов управления после задания новых свойств этим элементам представлены на рисунке 30.
Таблица 4
Новые значения свойств элементов управления формы
Элемент управления |
Свойство |
Значение по умолчанию |
Новое значение |
1 |
2 |
3 |
4 |
Label (метка) |
Name (имя) |
Label1 |
Lbl1 |
Caption (надпись) |
Label1 |
Матрица А |
|
Label (метка) |
Name (имя) |
Label2 |
Lbl2 |
Caption (надпись) |
Label2 |
Вектор S. |
|
ListBox (список) |
Name (имя) |
ListBox1 |
LbxMatrizaA |
ListBox (список) |
Name (имя) |
ListBox2 |
LbxS |
CommandButton (командная кнопка) |
Name(имя) |
CommandButton1 |
CmdVvodA |
Caption (надпись) |
CommandButton1 |
Ввод матрицы А |
Окончание табл. 4
1 |
2 |
3 |
4 |
CommandButton (командная кнопка) |
Name(имя) |
CommandButton2 |
CmdVyvodA |
Caption (надпись) |
CommandButton2 |
Визуализация матрицы A |
|
CommandButton (командная кнопка) |
Name(имя) |
CommandButton3 |
CmdVektor |
Caption (надпись) |
CommandButton3 |
Вычисление вектора |
|
CommandButton (командная кнопка) |
Name(имя) |
CommandButton4 |
CmdRezultat |
Caption (надпись) |
CommandButton4 |
Визуализация вектора |
Рис. 30. Форма и её элементы управления
после переименования и изменения свойств
Таким образом, в программном коде следует записать четыре процедуры обработки события Click (кликанье левой кнопки мыши) для четырех командных кнопок.
Объявим переменные, используемые во всех процедурах.
Dim m As Integer ‘количество строк матрицы А
Dim n As Integer ‘количество столбцов матрицы А
Dim i As Integer ‘индекс строки
Dim j As Integer ‘индекс столбца
Dim a() As Single ‘объявление двумерного массива (матрицы) А
Dim s() As Single ‘объявление одномерного массива (вектора) S
Сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для командной кнопки CmdVvodA с надписью «Ввод матрицы А». Для этого достаточно быстро кликнуть на этой кнопке два раза левой кнопкой мыши. В результате будет создана нужная нам процедура, в которую надо ввести следующий код:
Private Sub CmdVvodA_Click()
m = Val(InputBox("Введите m"))
n = Val(InputBox("Введите n"))
ReDim a(1 To m, 1 To n) As Single
ReDim s(1 To m) As Single
For i = 1 To m
For j = 1 To n
a(i, j) = InputBox("Введите a(" & i & "," & j & ") элемент")
Next j
Next i
End Sub
Пояснения к данной процедуре, предназначенной для ввода двумерного массива А, подробно приведены в разделе «Методические указания к выполнению задания В».
Далее выполняем второй этап работы – вывод исходного двумерного массива А на экран.
Аналогично сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для второй командной кнопки CmdVyvodА с надписью «Визуализация матрицы А», в которую введем программный код:
Private Sub CmdVyvodA_Click()
Dim stra As String
For i = 1 To m
stra = ""
For j = 1 To n
stra = stra + " " + Str(a(i, j))
Next j
LbxMatrizaA.AddItem stra
Next i
End Sub
Пояснения к данной процедуре, предназначенной для вывода двумерного массива А на экран, также подробно приведены в разделе «Методические указания к выполнению задания В».
Сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для третьей командной кнопки CmdVektor с надписью «Вычисление вектора» и впишем в нее программный код:
Private Sub CmdVektor_Click()
For i = 1 To m
s(i) = 1
For j = 1 To n Step 2
s(i) = s(i) * a(i, j)
Next j
Next i
End Sub
Пояснение. Обработка массива (вычисление элементов вектора S, компоненты которого являются произведениями нечетных элементов каждой строки двумерного массива А размерностью M × N) также организована с помощью вложенной структуры «цикл с параметром».
При «кликанье» левой кнопки мыши на третьей командной кнопке CmdVektor с надписью «Вычисление вектора» результатов работы этой процедуры мы не увидим, так как переменная s пока хранится в оперативной памяти.
Чтобы их увидеть, создадим процедуру обработки события Click для четвертой командной кнопки CmdRezultat с надписью «Визуализация вектора» и впишем в нее программный код.
Private Sub CmdRezultat_Click()
Dim stri As String
Dim strs As String
For i = 1 To m
stri = Str(i)
strs = Str(s(i))
LbxS.AddItem stri & " | " & strs
Next i
End Sub
Пояснение. Элементы одномерного массива S (вектор) выводим в элемент управления список ListBox при помощи оператора
LbxS.AddItem stri & " | " & strs.
Программный код полностью представлен в окне программы VBA на рисунке 31.
Рис. 31. Программный код в окне программы VBA
Запустим приложение, выбрав команду Run Run Sub/UserForm или нажав функциональную клавишу F5. Появится экранная форма (рис. 32).
Рис. 32. Экранная форма после запуска приложения
В качестве тестового варианта возьмем матрицу размером 3×5.
Подробно ход выполнения программного кода рассмотрен в разделе «Методические указания к выполнению задания В».
Последовательно щелкая на каждой из четырех командных кнопок, выполним все четыре этапа работы с массивами.
Подробно ход выполнения программного кода рассмотрен в разделе «Методические указания к выполнению задания В».
Полностью результаты выполнения программного кода представлены на рисунке 33.
Рис. 33. Результаты работы программного кода