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

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

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

Оператор

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