Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сидорова-004.С34.doc
Скачиваний:
91
Добавлен:
01.04.2025
Размер:
3 Мб
Скачать
☆

9.5. Срочный выход из процедур и циклов

Для срочного выхода из модульной или циклической структуры до ее окончания (например, при получении недопустимых значений) служит оператор Exit <структура>, который записывается непосредственно в теле этой структуры, а в результате его выполнения осуществляется переход к оператору, следующему за последним оператором структуры:

Exit Sub  выход из ПП к оператору, следующему за оператором ее вызова;

Exit Function  выход из ПФ к оператору, следующему за оператором ее вызова;

Exit For  выход из цикла For … Next к оператору, следующему за Next;

Exit Do  выход из цикла Do … Loop к оператору, следующему за Loop.

Прервать работу программы можно, нажав клавиши Ctrl + Pause/Break.

10. Переменные с индексами. Одномерные массивы

10.1. Понятие массива

Начнем изучение этой темы с простого примера.

Пример ОМ1. Вычислить сумму шести произвольных чисел.

Первый способ. Каждое число обозначим отдельной переменной:

Sub Пример_ОМ1_способ1()

Dim a As Single, b As Single, c As Single, d As Single,

Dim e As Single, f As Single, Dim s As Single

a = Val(InputBox("Введите a")) : b = Val(InputBox("Введите b"))

c = Val(InputBox("Введите c")) : d = Val(InputBox("Введите d"))

e = Val(InputBox("Введите e")) : f = Val(InputBox("Введите f"))

s = a + b + c + d + e + f

Debug.Print "Сумма ="; s

End Sub

Преимущество этого способа заключается в том, что сохраняются все введенные значения, недостаток – объем программы зависит от количества чисел (например, для 500 чисел он будет очень большим).

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

Sub Пример_ОМ1_способ2()

Dim a As Single, i As Byte, s As Single

s = 0

For i = 1 To 6

a = Val(InputBox("Введите a" & i))

s = s + a

Next i

Debug.Print "Сумма ="; s

End Sub

Преимущество второго способа состоит в том, что объем программы не зависит от количества чисел (программа вводит каждое новое значение в одну и ту же переменную а и добавляет его к сумме предыдущих чисел), недостаток – в конце цикла переменная а содержит только последнее введенное значение, все предыдущие значения оказываются утраченными. Таким образом, положительные и отрицательные моменты рассмотренных способов решения данного примера прямо противоположны.

Чтобы объединить положительные свойства обоих способов существуют специальные средства. В тех случаях, когда необходимо манипулировать множеством значений одной переменной с сохранением этих значений в памяти ЭВМ, используют переменную с индексом. Индекс – порядковый номер очередного значения переменной, он может быть записан в виде константы, переменной или арифметического выражения и может принимать целые положительные значения и быть нулем. Индексы записывают в скобках после имени переменной, например: z(5), x1(i), pr(n+2).

Переменные с индексами являются элементами массивов.

Массив – упорядоченный по возрастанию индексов набор значений одной переменной.

Массив характеризуется:

именем (записывается по обычным правилам);

количеством измерений (индексов): одномерные, двумерные, многомерные массивы;

размером (верхней границей каждого из индексов).

Примерами одномерных массивов в математике являются векторы, двумерных – матрицы.

Отдельными элементами массива можно пользоваться так же, как и простыми переменными, не забывая при этом в скобках указывать индекс, например: x(5) = 2, r(7) = 2 * x + 4, x(i) = y(k) + 1, Debug.Print x(n).

По умолчанию элементы массива в VBA нумеруются, начиная с нуля. Чтобы установить нумерацию элементов всех массивов с единицы, в тексте программы на уровне общих объявлений модуля необходимо записать оператор Option Base 1.

До использования массива в программе его необходимо объявить, это можно сделать с помощью оператора Dim с указанием имени массива, максимально возможного индекса и типа данных в нем:

Dim Имя_массива(Max_индекс) [As Тип]

Например: Dim A(7) As Single

или: Const n = 7

Dim A(n) As Single

При выполнении оператора Dim в памяти ЭВМ резервируется необходимое для размещения массива количество ячеек (в данном случае 8 – от 0 до 7 (так как нет Option Base 1)). В ГСА оператор Dim не отображается.

Возможно объявление массива с указанием диапазона изменения индексов, например:

Dim A(imin To imax) As Single,

где imin и imax – числа или объявленные константы, например:

Dim Z(5 To 9) As Single

В тех случаях, когда первоначально размер массива неизвестен или меняется в разных местах программы, используют динамический массив. Тогда массив сначала объявляется без верхней границы, например:

Dim x() As Single, n As Integer

а затем в нужном месте программы указывается его размер:

n = 6

ReDim x(n) 'Задаем (изменяем) размер массива

При использовании оператора ReDim размер массива n может быть как переменной, так и константой.

Команда ReDim не только изменяет размер массива, но и удаляет из него старые значения. Чтобы их сохранить, используют ключевое слово Preserve:

ReDim Preserve x(n)

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

Работа с элементом массива xi может включать в себя любые операции с ним: ввод, вывод, расчет, проверку выполнения какого-либо условия и др. Обычно работа с элементами массива осуществляется в цикле.

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

i – индекс элемента массива;

ni – начальное значение индекса;

ki – конечное значение индекса;

∆i – шаг изменения индекса;

xi – значение i-го элемента массива x.

Т ретий способ. Запишем решение примера ОМ1 с использованием массива. ГСА приведена на рис. 38. Текст программы (подчеркнутым шрифтом отмечены отличия от второго способа решения задачи):

Sub Пример_ОМ1_способ3()

Dim a(6) As Single, i As Byte, s As Single

s = 0

For i = 1 To 6

a(i) = Val(InputBox("Введите a" & i))

s = s + a(i)

Next i

Debug.Print "Сумма ="; s

End Sub

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