Информатика_ЗФ / Лабораторный практикум по программированию / Лабораторный_практикум_по_программированию_4
.pdfОператор
Dim B(4,6) As Single
объявляет двумерный массив вещественных чисел обычной точности с именем B (матрицу), состоящий из пяти строк и семи столбцов, включая нулевую строку и нулевой столбец.
Выполняя оператор Dim, транслятор выделяет для массива соответствующее количество ячеек памяти.
Массив A и переменная обычной точности с таким же именем являются различными переменными.
Если в программе используется массив переменных без объявления его в операторе Dim, то QBasic обрабатывает его так, как если бы был объявлен массив из 11 элементов (значения индексов от 0 до 10). Однако хороший стиль программирования рекомендует в явном виде задавать размерность каждого массива.
В отличие от интерпретирующего Basic, QBasic и VBA позволяет определять диапазон значений индексов (мин to мах), а не только верхний предел.
Например, оператор
Dim B (50 to 60) As Single
создает одномерный массив из 11 вещественных элементов обычной точности, пронумерованных от 50 до 60.
Оператор
Dim A (1 to 3, 1 to 3) As Single
объявляет двумерный массив (матрицу) вещественных чисел обычной точности с именем A, состоящий из трех строк и трех столбцов.
Ввод и вывод массивов
Перед обработкой массива элементам массива должны быть присвоены числовые значения, т.е. числовые значения элементов массива должны быть записаны в ячейки памяти компьютера. Ввод элементов массива (заполнение массива) в зарезервированную память и вывод элементов массива (визуализацию массива) рассмотрим далее на конкретных примерах.
Статические и динамические массивы
Массивы, границы которых явно заданы в команде описания, называются статическими. Их размер известен и не меняется на всем протяжении работы программы.
Иногда в процессе выполнения программы требуется изменять размер массива. В этом случае первоначально массив объявляют как динамический. Для этого при объявлении массива не надо указывать размерность, например,
Dim A() As Single
11
Затем в программе следует вычислить необходимый размер массива в некоторой переменной n, и изменить размер динамического массива с помощью оператора ReDim.
Синтаксис
ReDim [Preserve] Имя_Массива (индексы) [As Тип] [,Имя_Массива (индексы) [As Тип]]
Preserve – ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности. Если ключевое слово Preserve не используется, то данные в массиве при изменении размерности не сохраняются.
Решая задачи с использованием массивов, необходимо четко придерживаться следующей последовательности в работе:
1.Ввод элементов массива, т.е. происходит заполнение массива.
2.Вывод данного массива на экран – визуализация массива (с поясняющей надписью).
3.Обработка элементов массива согласно условию задачи.
4.Вывод результатов, полученных после обработки, на экран (с по-
ясняющей надписью).
Пример 1. Просуммировать два одномерных массива A и В. Массивы содержат по n элементов (n<=20). Результат записать в массив С. Массив С вывести на экран.
Визуальное представление алгоритма суммирования элементов двух одномерных массивов представлено на рисунке 1.
Рис. 1. Визуальное представление алгоритма суммирования элементов двух одномерных массивов
12
Для визуального представления алгоритма используем блоки, представленные в [10], в Приложении Б, в котором указаны обозначение и функциональное назначение некоторых блочных символов графического описания алгоритмов (визуальных алгоритмов).
В блоке 2 вводится переменная n – количество элементов одномерного массива. Блок 3 организует ввод элементов массива, т.е. происходит заполнение массива. Ввод массивов А и B организуем с помощью структуры «цикл с параметром», причем оба массива будем вводить в одном цикле.
Из схемы видно, что суммирование массивов представляет собой циклический процесс – «цикл с параметром». Элементы результирующего одномерного массива С можно выводить в цикле одновременно с суммированием. Но чтобы показать, как выводится одномерный массив, организуем отдельный цикл для вывода одномерного массива С – блок 6. Предварительно в блоке 5, внутри цикла суммирования, организовано запоминание результатов в массиве С.
Таким образом, структура данного процесса будет представлять собой три структуры «цикл с параметром», соединенные между собой последовательно, т.е. следующие одна за другой, что ясно просматривается в программе.
Программа на языке QBasic
REM ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
CLS |
‘очистка экрана |
OPTION BASE 1 |
‘нижняя граница индекса |
|
‘устанавливается равной 1 |
DIM A(20), B(20), C(20) |
‘объявление исходных массивов A, B |
|
‘и результирующего массива С |
INPUT «введите количество элементов массивов»;N
REM ввод массивов А и В
PRINT «введите элементы массивов А и В поочередно»
FOR I=1 TO N |
|
|
PRINT «A(»; I; «)=»; : INPUT;A(I) |
‘ввод i-го элемента массива А |
|
PRINT «B(»; I; «)=»; : INPUT B(I) |
‘ввод i-го элемента массива В |
|
NEXT I |
‘следующий элемент массивов А и В |
REM суммирование массивов А и В
FOR I=1 TO N
C(I)=A(I)+B(I)
NEXT I
REM вывод на экран одномерного массива С
PRINT «МАССИВ С(»; |
|
FOR I=1 TO N |
|
PRINT C(I); |
‘вывод очередного элемента массива С |
NEXT I |
|
PRINT «)» |
|
END |
|
13
Пояснения. Разделитель (;) в операторе
INPUT;A(I)
подавляет «перевод строки» после ввода элемента А(I). Поэтому, после нажатия клавиши {ENTER} для завершения ответа, курсор будет оставаться на той же строке.
В результате суммирования одномерных массивов А и B получается одномерный массив С такой же размерности. Его вывод выполняется в цикле. Перед циклом и после выводятся соответствующие символьные константы для оформления наглядного ответа.
Если в качестве тестовых значений исходных данных взять следующие одномерные массивы:
–массив А = (3,-4,-10,5,10,-5,1,3,6,3);
–массив В = (8,7,15,15,5,3,15,8,-8,7);
то результаты выполнения программы следующие (рис. 2).
Рис. 2. Результаты выполнения программы суммирования двух одномерных массивов на экране вывода
системы программирования QBasic
Из результатов видно, что массивы просуммированы верно.
В данной программе в явной форме отсутствует рекомендуемый этап: вывод данного массива на экран – визуализация массива (с поясняющей надписью). Однако из рисунка 2 видно, что элементы массивов A и B визуализируются при вводе элементов массивов. При необходимости этот этап программы можно написать по аналогии с выводом массива результатов С.
Теперь рассмотрим пример разработки программного кода того же примера, используя объектно-ориентированное программирование, реализуемое средствами языка VBA, используя экранные формы.
14
Первым этапом при решении задач с использованием массивов должен быть ввод элементов массива, т.е. заполнение массива.
ВVBA удобным способом определения одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми в вектор из этих значений, и присваивающая их переменной типа Variant. Например, в результате выполнения операторов
Dim A As Variant A= Array (3, 10, 15)
элементы массива А примут значения: А(1)=3, А(2)=10 и А(3)=15. Создадим графический интерфейс приложения. Чтобы спроектиро-
вать наше приложение, нужно взять некоторые стандартные элементы управления, поместить их на форму, затем установить начальные свойства этих элементов и создать код обработки событий, связанных с этими элементами. Последовательность всех этих действий рассмотрена в [10], [11]
и[12].
Вокне проекта выберите имя проекта, в который требуется добавить
форму.
Вменю редактора VBA выберите команду Insert (Вставка)\ UserForm. Выводится пустая экранная форма и набор инструментов.
Разместим на экранной форме (рис. 3), используя метод «drag-and- drop», следующие стандартные элементы управления:
–шесть элементов типа Label (метка) – Label1, Label2, Label3, Label4, Label5 и Label6, в которых потом расположим надписи «Массив А», «Массив B», «Массив С» и три надписи «Индекс
Элемент» соответственно. Надписи расположим, изменив свойство элементов Caption (Надпись);
–три элемента управления типа ListBox (Список) – ListBox1, ListBox2 и ListBox3. Два из них используем для вывода (визуализации) исходных одномерных массивов A и B. Один элемент – для визуализации массива результатов C;
–четыре элемента управления типа CommandButton (командная кнопка) – CommandButton1, CommandButton2, CommandButton3 и CommandButton4. Командную кнопку
CommandButton1 используем для запуска событийной процедуры визуализации исходного одномерного массива А. Расположим в ней надпись «Вывод (визуализация) массива А», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton2 используем для запуска событийной процедуры визуализации исходного одномерного массива B. Расположим в
15
ней надпись «Вывод (визуализация) массива В», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton3 используем для запуска событийной процедуры сложения двух исходных одномерных массивов A и B. Расположим в ней надпись «Обработка (суммирование) массивов», изменив свойство элемента Caption (Надпись). Командную кнопку CommandButton4 используем для запуска событийной процедуры визуализации одномерного массива результатов С. Расположим в ней надпись «Вывод массива результатов С», изменив свойство элемента Caption (Надпись).
Таким образом, с помощью командных кнопок CommandButton1 и CommandButton2 выполним второй этап работы – вывод исходных массивов на экран.
Обработку элементов массива согласно условию задачи выполним с помощью третьей командной кнопки CommandButton3.
Вывод результатов, полученных после обработки, на экран (с поясняющей надписью) выполнит четвертая командная кнопка CommandButton4.
ListBox1 ListBox2 ListBox3
Рис. 3. Форма и расположение на ней элементов управления
16
Зададим новые значения свойств элементам управления, размещенным на форме (рис. 3) согласно общепринятым соглашениям с помощью окна Propeties (Свойства объектов). Значения свойств по умолчанию и новые значения свойств представлены в таблице 1. Форма и расположение на ней элементов управления после задания новых свойств этим элементам представлены на рисунке 4.
Таблица 1
Новые значения свойств элементов управления формы
Элемент |
Свойство |
Значение |
Новое значение |
||
управления |
по умолчанию |
||||
|
|
|
|||
Label (метка) |
Name (имя) |
Label1 |
Lbl1 |
|
|
|
|
|
|
||
|
Caption (надпись) |
Label1 |
Массив А |
||
Label (метка) |
Name (имя) |
Label2 |
Lbl2 |
|
|
|
Caption (надпись) |
Label2 |
Массив В |
||
Label (метка) |
Name (имя) |
Label3 |
Lbl3 |
|
|
|
Caption (надпись) |
Label3 |
Массив С |
||
|
|
|
|
|
|
Label (метка) |
Name (имя) |
Label4 |
Lbl4 |
|
|
|
|
|
|
||
|
Caption (надпись) |
Label4 |
Индекс Элемент |
||
Label (метка) |
Name (имя) |
Label5 |
Lbl5 |
|
|
|
|
|
|
||
|
Caption (надпись) |
Label5 |
Индекс Элемент |
||
Label (метка) |
Name (имя) |
Label6 |
Lbl6 |
|
|
|
Caption (надпись) |
Label6 |
Индекс Элемент |
||
ListBox (список) |
Name (имя) |
ListBox1 |
LbxMassivA |
||
ListBox (список) |
Name (имя) |
ListBox2 |
LbxMassivB |
||
ListBox(срисок) |
Name (имя) |
ListBox3 |
LbxMassivC |
||
CommandButton |
Name (имя) |
CommandButton1 |
CmdMassivA |
||
(командная кнопка) |
|
|
|
|
|
|
Caption (надпись) |
CommandButton1 |
Вывод |
(визуализа- |
|
|
|
|
ция) массива А |
||
CommandButton |
Name (имя) |
CommandButton2 |
CmdMassivB |
||
(командная кнопка) |
|
|
|
|
|
|
|
|
|
|
|
|
Caption (надпись) |
CommandButton2 |
Вывод |
(визуализа- |
|
|
|
|
ция) массива B |
||
CommandButton |
Name (имя) |
CommandButton3 |
CmdSumma |
||
(командная кнопка) |
|
|
|
|
|
|
Caption (надпись) |
CommandButton3 |
Обработка (сумми- |
||
|
|
|
рование) массивов |
||
CommandButton |
Name (имя) |
CommandButton4 |
CmdMassivC |
||
(командная кнопка) |
|
|
|
|
|
|
Caption (надпись) |
CommandButton4 |
Вывод |
массива ре- |
|
|
|
|
зультатов С |
17
Рис. 4. Форма и её элементы управления после переименования и изменения свойств
Таким образом, в программном коде следует записать четыре процедуры обработки события Click (кликанье левой кнопки мыши) для четырех командных кнопок.
Объявим переменные, используемые во всех процедурах.
Option Base 1 |
‘нижняя граница индекса равна 1 |
Dim n As Integer |
‘количество элементов массива |
Dim i As Integer |
‘индекс элемента |
Dim a As Variant |
‘объявление массива А |
Dim b As Variant |
‘объявление массива B |
Dim c(6) As Variant |
‘объявление массива C |
Dim stri As String * 3 |
‘строковая переменная для индекса |
Dim stra As String ‘строковая переменная для элемента массива А Dim strb As String ‘строковая переменная для элемента массива B Dim strc As String ‘строковая переменная для элемента массива C
Сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для командной кнопки CmdMassivA с надписью «Вывод (визуализация) массива А». Для этого достаточно быстро кликнуть на этой кнопке два раза левой кнопкой мыши. В результате будет создана нужная нам процедура, в которую надо ввести следующий код.
18
Private Sub CmdMassivA_Click()
a = Array(1.1, 2, 5, -7, 6, 3)
n = UBound(a)
For i = 1 To n
stri = Str(i)
stra = Str(a(i))
LbxMassivA.AddItem stri & " | " & stra
Next i
End Sub
Пояснение. Данная процедура предназначена для ввода одномерного массива А и вывода его на экран.
Для ввода массива А использована функция Array. В результате выполнения операторов
Dim A As Variant
a = Array(1.1, 2, 5, -7, 6, 3)
элементы массива А примут значения: А(1)=1.1, А(2)=2, А(3)=5,
А(4)=-7, А(5)=6, А(6)=3.
С помощью функции UBound(a) можно выяснить, сколько элементов может вместить некоторое измерение массива.
Синтаксис:
UBound(Имя_Массива[,измерение])
Измерение задает целое число, которое указывает, какое измерение вас интересует. Если измерение не указано, функция UBound(a) возвратит размер первого измерения массива.
В нашем случае функция UBound(a) возвращает количество элементов одномерного массива А.
Ввод массивов А и B организован с помощью структуры «цикл с параметром». Причем оба массива вводятся в одном цикле. Структура «цикл с параметром» реализована на алгоритмическом языке оператором цикла For/Next. Параметром цикла является индекс I одномерных массивов А и В.
Для визуализации массивов А, В и С использовали три элемента управления (объекта) ListBox (Список).
Для добавления в список нового элемента массива используем метод AddItem, который является наиболее часто используемым методом элемента управления элемента ListBox (Список). Обратиться к методу объекта можно точно так же, как и к свойству объекта, с использованием
точечной нотации.
Метод AddItem в качестве аргумента имеет строковую переменную. Отметим использование функции Str(), которая позволяет переводить преобразование десятичного числа в десятичное число в строковой форме.
19
Аргументом функции является десятичное число, а значением – строка. Всегда форматирует строку в соответствии со стандартом английского языка США с точкой в качестве десятичного разделителя.
Для слияния строк использована операция & (конкатенация). Допустимо использовать также «+».
Private Sub CmdMassivB_Click()
b = Array(9, -5.9, 2, 3, -6, 4) n = UBound(b)
For i = 1 To n stri = Str(i) strb = Str(b(i))
LbxMassivB.AddItem stri & " | " & strb
Next i
End Sub
Пояснение. Данная процедура предназначена для ввода одномерного массива В и вывода его на экран.
Сгенерируем процедуру обработки события Click (кликанье левой кнопки мыши) для третьей командной кнопки CmdSumma с надписью «Обработка (суммирование) массивов» и впишем в нее программный код.
Private Sub CmdSumma_Click()
For i = 1 To n c(i) = a(i) + b(i)
Next i
End Sub
Пояснение. Данная поцедура предназначена для суммирования двух одномерных массивов А и В.
При «кликанье» левой кнопки мыши на третьей командной кнопке CmdSumma с надписью «Обработка (суммирование) массивов» результатов работы этой процедуры мы не увидим, так как массив результатов С пока хранится в оперативной памяти.
Чтобы их увидеть, создадим процедуру обработки события Click для четвертой командной кнопки CmdMassivC с надписью «Вывод массива результатов С» и впишем в нее программный код.
Private Sub CmdMassivC_Click() n = UBound(c)
For i = 1 To n stri = Str(i) strc = Str(c(i))
LbxMassivc.AddItem stri & " | " & strc
Next i
End Sub
20