Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика_ЗФ / Лабораторный практикум по программированию / Лабораторный_практикум_по_программированию_4

.pdf
Скачиваний:
142
Добавлен:
22.03.2016
Размер:
1.4 Mб
Скачать

Строки 220–260 – обработка матрицы также представляет собой вложенный цикл, в котором каждый элемент матрицы сравнивается с нулем (строка 240). Если очередной элемент матрицы меньше нуля (A(I,J)<0), происходит суммирование отрицательных элементов матрицы.

В строке 270 осуществляется вывод суммы отрицательных элементов. Теперь рассмотрим пример разработки программного кода того же примера, используя объектно-ориентированное программирование, реали-

зуемое средствами языка VBA, используя экранные формы.

Создадим графический интерфейс приложения. Чтобы спроектировать наше приложение, нужно взять некоторые стандартные элементы управления, поместить их на форму, затем установить начальные свойства этих элементов и создать код обработки событий, связанных с этими элементами. Подробно последовательность всех этих действий рассмотрена в

[10], [11] и [12].

Вокне проекта выберите имя проекта, в который требуется добавить

форму.

Вменю редактора VBA выберите команду Insert (Вставка)\ UserForm. Выводится пустая экранная форма и набор инструментов.

При размещении на экранной форме стандартных элементов управления, в частности командных кнопок, будем придерживаться следующей стандартной последовательности в работе:

1) ввод элементов массива; 2) вывод данного массива на экран – визуализация массива (с пояс-

няющей надписью); 3) обработка элементов массива согласно условию задачи;

4) вывод результатов, полученных после обработки, на экран (с поясняющей надписью).

Разместим на экранной форме (рис. 19), используя метод «drag-and- drop», следующие стандартные элементы управления:

четыре элемента управления типа CommandButton (командная кнопка) – CommandButton1, CommandButton2, CommandButton3 и CommandButton4 для реализации четырех стандартных этапов при решении задач с использованием массивов. Командную кнопку CommandButton1 используем для запуска событийной процедуры ввода исходного двумерного массива А. Расположим в ней надпись «Ввод матрицы А» изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton2 используем для запуска событийной процедуры визуализации исходного двумерного массива B. Расположим в ней надпись «Визуализация матрицы А», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton3 используем для запуска событийной процедуры суммирования

41

всех отрицательных элементов матрицы A. Расположим в ней надпись «Обработка массива», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton4 используем для запуска событийной процедуры визуализации результата – суммы всех отрицательных элементов матрицы A. Расположим в ней надпись «Визуализация результата», изменив свойство эле-

мента Caption (Надпись);

два элемента типа Label (метка) – Label1, Label2, в которых расположим надписи «Матрица А» и «Сумма отрицательных элементов матрицы равна». Надписи расположим, изменив свойство элементов Caption (Надпись);

один элемент управления типа ListBox (Список) – ListBox1 для вывода (визуализации) исходного двумерного массива A;

один элемент управления типа TextBox (Текстовое поле или ок-

но ввода) TextBox1 для размещения результата – суммы всех отрицательных элементов матрицы A.

ListBox1

TextBox1

Рис. 19. Форма и расположение на ней элементов управления

Зададим новые значения свойств элементам управления, размещенным на форме (рис. 19) согласно общепринятым соглашениям с помощью окна Propeties (Свойства объектов). Значения свойств по умолчанию и новые значения свойств представлены в таблице 3. Форма и расположение на ней элементов управления после задания новых свойств этим элементам представлены на рисунке 20.

42

Таблица 3

Новые значения свойств элементов управления формы

Элемент

Свойство

Значение

Новое значение

управления

по умолчанию

 

 

Label (метка)

Name (имя)

Label1

Lbl1

 

 

 

 

 

Caption (надпись)

Label1

Матрица А

Label (метка)

Name (имя)

Label2

Lbl2

 

Caption (надпись)

Label2

Сумма отрицатель-

 

 

 

ных элементов мат-

 

 

 

рицы равна

ListBox (список)

Name (имя)

ListBox1

LbxMatrizaA

CommandButton

Name (имя)

CommandButton1

CmdVvodA

(командная кнопка)

 

 

 

 

Caption (надпись)

CommandButton1

Ввод матрицы А

 

 

 

 

CommandButton

Name (имя)

CommandButton2

CmdVyvodA

(командная кнопка)

 

 

 

 

 

 

 

 

Caption (надпись)

CommandButton2

Визуализация

 

 

 

матрицы A

CommandButton

Name (имя)

CommandButton3

CmdSumma

(командная кнопка)

 

 

 

 

 

 

 

 

Caption (надпись)

CommandButton3

Обработка массива

 

 

 

 

CommandButton

Name (имя)

CommandButton4

CmdRezultat

(командная кнопка)

 

 

 

 

Caption (надпись)

CommandButton4

Визуализация

 

 

 

результата

TextBox

Name (имя)

TextBox1

TxtS

(текстовое окно)

 

 

 

Рис. 20. Форма и её элементы управления после переименования и изменения свойств

43

Таким образом, в программном коде следует записать четыре процедуры обработки события Click (кликанье левой кнопки мыши) для четырех командных кнопок.

Объявим переменные, используемые во всех процедурах.

Option Base 1

‘нижняя граница индекса равна 1

Dim m As Integer

‘количество строк матрицы А

Dim n As Integer

‘количество столбцов матрицы А

Dim i As Integer

‘индекс строки

Dim j As Integer

‘индекс столбца

Dim a() As Single

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

Dim s As Single

‘переменная для накопления результата.

Сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для командной кнопки CmdVvodA с надписью «Ввод матрицы А». Для этого достаточно быстро кликнуть на этой кнопке два раза левой кнопкой мыши. В результате будет создана нужная нам процедура, в которую надо ввести следующий код.

Private Sub CmdVvodA_Click() m = Val(InputBox("Введите m")) n = Val(InputBox("Введите n"))

ReDim a(1 To m, 1 To n) 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

Пояснение. Данная процедура предназначена для ввода двумерного массива А.

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

Dim a() As Single.

Затем количество строк m и столбцов n двумерного массива A вводится с помощью функции Inputbox. После этого изменяем размер массива с помощью оператора

ReDim a(1 To m, 1 To n) As Single

Для ввода элементов двумерного массива использована функция InputBox(), которая выводит на экран диалоговое окно, содержащее сообщение и поле ввода. Функция возвращает введенное значение типа string (строковое), поэтому его надо «подредактировать» функцией Val(), которая переводит «строку» в числовое значение соответствующего типа.

При выполнении функции InputBox() выводится поясняющая над-

пись.

44

Ввод массива А организован с помощью вложенной структуры «цикл с параметром». Структура «цикл с параметром» реализована на алгоритмическом языке оператором цикла For/Next. Параметром внешнего цикла является индекс строки I двумерного массива А. Параметром внутреннего цикла является индекс столбца J двумерного массива А. Функция Inputbox размещена в теле цикла.

Далее выполняем второй этап работы – вывод исходного двумерного массива А на экран.

Аналогично сгенерируем процедуру обработки события 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

Пояснение. Данная процедура предназначена для вывода двумерного массива А на экран.

Оператор

Dim stra As String

описывает строковую переменную, предназначенную для визуализации очередной строки двумерного массива А.

Вывод массива А также организован с помощью вложенной структуры «цикл с параметром». Структура «цикл с параметром» реализована на алгоритмическом языке оператором цикла For/Next. Параметром внешнего цикла является индекс строки I двумерного массива А. Параметром внутреннего цикла является индекс столбца J двумерного массива А.

В теле внутреннего цикла размещен оператор присваивания stra = stra + " " + Str(a(i, j)),

который формирует строковую переменную stra, состоящую из элементов очередной строки двумерного массива А. Для слияния строк использована операция & (конкатенация). Допустимо использовать также

«+».

Для визуализации двумерного массива А, использован элемент управления (объекта) ListBox (Список). Для добавления в список нового элемента массива используем метод AddItem, который является наиболее часто используемым методом элемента управления элемента ListBox

(Список).

45

Метод AddItem в качестве аргумента имеет строковую переменную. Отметим использование функции Str(), которая позволяет переводить преобразование десятичного числа в десятичное число в строковой форме. Аргументом функции является десятичное число, а значением – строка. Всегда форматирует строку в соответствии со стандартом английского языка США с точкой в качестве десятичного разделителя.

Добавление очередного элемента двумерного массива в список ListBox выполняется внутри внешнего цикла с помощью оператора

LbxMatrizaA.AddItem stra

после формирования строковой переменной stra внутри внутреннего цикла.

Перед заголовком внутреннего цикла во внешнем цикле размещен оператор присваивания

stra = "",

который присваивает строковой переменной stra значение пустой строки.

Сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для третьей командной кнопки CmdSumma с надписью «Обработка массива» и впишем в нее программный код:

Private Sub CmdSumma_Click() s = 0

For i = 1 To m

For j = 1 To n

If a(i, j) < 0 Then s = s + a(i, j)

Next j

Next i

End Sub

Пояснение. Обработка массива (вычисление суммы всех отрицательных элементов двумерного массива) также организована с помощью вложенной структуры «цикл с параметром». Внутрь сложного цикла вложена структура «Ветвление».

Вданной задаче необходимо вычислить сумму отрицательных элементов всей матрицы, поэтому начальное значение суммы задаем перед внешним циклом оператором присваивания s = 0.

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

If a(i, j) < 0 Then s = s + a(i, j).

Впротивном случае переходим к следующему элементу матрицы. При «кликанье» левой кнопки мыши на третьей командной кнопке

CmdSumma с надписью «Обработка массива» результатов работы этой процедуры мы не увидим, так как переменная s пока хранится в оперативной памяти.

46

Чтобы их увидеть, создадим процедуру обработки события Click для четвертой командной кнопки CmdRezultat с надписью «Визуализация результата» и впишем в нее программный код.

Private Sub CmdRezultat_Click() TxtS.Value = s

End Sub

Пояснение. Переменную s выводим в элемент управления TextBox (Текстовое поле или окно ввода) TxtS при помощи свойства Value.

Программный код полностью представлен в окне программы VBA на рисунке 21.

Рис. 21. Программный код в окне программы VBA

47

Запустите ваше приложение, выбрав команду Run Run Sub/UserForm или нажав функциональную клавишу F5. Появится экранная форма (рис. 22).

Рис. 22. Экранная форма после запуска приложения

В качестве тестового варианта возьмем матрицу размером 3х3, в которой есть отрицательные элементы

1

2

4

 

 

 

10

1

 

А= 7

,

 

3

4

6

 

 

 

После щелчка на первой командной кнопке с надписью «Ввод матрицы А» появится диалоговое окно ввода переменной m – количества строк матрицы А (рис. 23).

Рис. 23. Диалоговое окно ввода переменой m – результат использования функции InputBox("Введите m")

48

Введем количество строк двумерного массива – 3 – и нажмем кнопку ОК либо клавишу Enter.

Следующим появится диалоговое окно ввода переменной n – количества столбцов матрицы А (рис. 24).

Рис. 24. Диалоговое окно ввода переменой n – результат использования функции InputBox("Введите n")

Также введем количество столбцов двумерного массива – 3 – и нажмем кнопку ОК либо клавишу Enter.

Следующим появится диалоговое окно ввода элемента массива a(1,1) c соответствующей поясняющей надписью (рис. 25).

Рис. 25. Диалоговое окно ввода элементов двумерного массива А – результат использования функции

InputBox("Введите a(" & i & "," & j & ") элемент")

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

После ввода массива щелкнем на второй командной кнопке «Визуализация матрицы А». В элемент управления ListBox (Список) будет выведен двумерный массив А.

Щелкнем на третьей командной кнопке «Обработка массива». Как было сказано выше, результатов работы этой процедуры мы не увидим, так как переменная s пока хранится в оперативной памяти.

49

Чтобы увидеть результат, щелкнем на четвертой командной кнопке «Визуализация результата». Результат – сумму всех отрицательных элементов двумерного массива А – мы увидим в элементе управления типа TextBox (Текстовое поле).

Полностью результаты выполнения программного кода при исходной матрице

1

2

4

 

 

 

10

1

 

А= 7

,

 

3

4

6

 

 

 

представлены на рисунке 26.

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

Пример выполнения задания В лабораторной работы

Задание В

Дана матрица А размерностью M × N. Вычислить и напечатать вектор S, компоненты которого являются произведениями нечетных элементов каждой строки (подразумеваются элементы нечётных столбцов).

Вектор S представляет собой одномерный массив, каждый элемент которого равен произведению нечетных элементов каждой строки матрицы А. Количество элементов одномерного массива равно количеству строк двумерного массива А.

50