Прописать условие цикла for в vba. Циклы VBA (ч.1). Команды организации циклов. Цикл с отрицательными аргументами

Кроме структур принятия решений, существуют еще одна разновидность управляющих конструкций, называемая циклом.

Цикл - это алгоритмическая структура, при помощи которой реализуется многократное повторение блоков операторов.

В языке Visual Basic существует три основных вида циклов, которые реализуется при помощи конструкций For:Next, Do:Loop и While:Wend.

Цикл For:Next. Используется в том случае, когда количество повторов заданного блока операторов известно заранее. Данная конструкция выглядит следующим образом:

For счетчик = начальное значение To конечное значение Операторы1 Операторы2 Next [счетчик]

Когда приведенные операторы выполняются первый раз, то переменной счетчику присваивается начальное значение, после чего возможны два варианта действий. Если в результате проверки условия счетчик > конечное значение было получено значение True, то происходит завершение цикла, при этом блоки операторы1 и операторы2 ни разу не выполняются. С другой стороны, если результатом проверки условия является False, то в этом случае блоки операторов выполняются первый раз, после чего происходит переход на начало цикла. Далее значение переменной-счетчика увеличивается на шаг, расположенный после ключевого слова Step (в случае его отсутствия устанавливается шаг = 1). После этого снова проверяется истинность условия счетчик > конечное значение и т.д., окончание цикла происходит в тот момент, когда результатом данной проверки станет значение True.

Зачастую бывает необходимо "аварийно" завершать работу цикла при выполнении какого-либо дополнительного условия. В этом случае внутри цикла следует использовать служебное словосочетание Exit:For, которое обычно располагают в управляющей конструкции, например:

If условие Then Exit For

Если результатом проверки условия будет значение True, то выполнение цикла будет прекращено, причем блок операторы1 будет выполнен очередной раз, а блок операоры2 - нет.

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

Do Until условие Операторы Loop

Если результатом проверки условия является значение False, то блок операторы выполняется, иначе осуществляется переход на оператор, расположенный после служебного слова Loop. С другой стороны, если первая проверка условия даст результат True, то цикл не выполнится ни разу.

Do While условие Операторы Loop

Если условие истинно, то происходит выполнение блока операторы, если же ложно, то есть результатом проверки является False, то цикл не выполниться ни разу.

В случае использования последних двух конструкций цикл будет выполнен хотя бы один раз.

Do Операторы Loop Until условие

Блок операторы выполняется до тех пор, пока результатом проверки условия является значение False, иначе выполнение цикла заканчивается.

Do Операторы Loop While условие

В случае ложности условия выполняется блок операторы, если же оно истинно, т.е. результатом проверки является значение True, то происходит окончание чикла.

Цикл While:Wend. Также используется в том случае, когда число повторений операторов тела цикла заранее неизвестно, и имеет следующий синтаксис:

While условие Операторы Wend

Если результатом проверки условия является значение True, то блок операторы выполняется, иначе осуществляется переход на оператор, расположенный после служебного слова Wend. С другой стороны, если первая проверка условия даст результат False, то цикл не выполнится ни разу.

VBA. Организация циклов.

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

VBA поддерживает циклические конструкции двух видов:

  1. Циклы с фиксированным числом повторений (циклы со счетчиком ).
  2. Циклы с неопределенными числом повторений (циклы с условием ).

Для всех видов циклов используется понятие тело цикла , определяющее блок операторов, заключенных между начальным и конечным операторами цикла. Каждое повторение выполнения операторов тела цикла называется итерация .

Фиксированные циклы

VBA предоставляет две управляющие структуры для организации фиксированного цикла: For … Next (цикл со счетчиком) и For Each … Next (цикл с перечислением).

Оператор For … Next это типовой цикл со счетчиком, выполняющий заданное число итераций. Синтаксис оператора For … Next:

For <счетчик> = <начЗначение> То <конЗначение>

<блок операторов>

Next [<счетчик>]

Пример использования оператора For … Next.

Листинг 1. Оператор For … Next

‘ ЗАДАЧА: Составить программу, которая получает два числа от пользователя.

‘ Складывает все числа в диапазоне, заданном этими двумя числами, а затем

‘ отображает результирующую сумму.

Sub sample7()

Dim i As Integer ‘счетчик цикла

Dim sStart ‘начальное значение счетчика

Dim sEnd ‘конечное значение счетчика

Dim sSum As Long ‘результирующая сумма

sStart = InputBox(“Введите первое число:”)

sEnd = InputBox(“Введите второе число:”)

sSum = 0

For i = CInt(sStart) To CInt(sEnd)

sSum = sSum + i

Next i

MsgBox “Сумма чисел от ” & sStart & ” до ” & sEnd & ” равна: ” & sSum

End Sub

Оператор цикла For Each … Next относится к категории операторов объектного типа, т.е. применяется в первую очередь к коллекциям объектов , а также к массивам . Тело цикла выполняется фиксированное число раз, соответствующее числу элементов массива или коллекции. Формат оператора For Each … Next:

For Each <элемент> In <группа> <блок операторов> Next [<элемент>]

Циклы с условием (неопределенные циклы)

Циклы с условием используются в тех случаях, когда повторяющиеся действия нужно выполнять только при определенных условиях. Количество итераций не определено и в общем случае может быть равно нулю (в частности, для циклов с предусловием). VBA предлагает разработчикам несколько управляющих структур для организации циклов с условием:

  • Четыре вида циклов Do..Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.
  • Непрерываемый цикл While … Wend.

Цикл Do While … Loop – типичный цикл с предусловием . Условие проверяется до того, как выполняется тело цикла. Цикл продолжает свою работу, пока это <условие> выполняется (т.е. имеет значение True). Так как проверка выполняется в начале, то тело цикла может ни разу не выполниться. Формат цикла Do While … Loop:

Do While <условие>

<блок операторов>

Loop

Листинг 2. Цикл Do While … Loop

‘ ЗАДАЧА: Составить программу, которая предусматривает ввод пользователем

‘ произвольной последовательности чисел. Ввод должен быть прекращен

‘ только после того, как сумма введенных нечетных чисел превысит 100.

Sub sample8()

Dim OddSum As Integer ‘сумма нечетных чисел

Dim OddStr As String ‘строка с нечетными числами

Dim Num ‘для приема вводимых чисел

OddStr = “” ‘инициализация выходной строки

OddSum = 0 ‘инициализация суммы OddSum

Do While OddSum < 100 ‘начало цикла

Num = InputBox(“Введите число: “)

If (Num Mod 2) <> 0 Then ‘проверка на четность

OddSum = OddSum + Num ‘накопление суммы нечетных чисел

OddStr = OddStr & Num & ” ”

End If

Loop

‘вывод строки с нечетными числами

MsgBox prompt:=”Нечетные числа: ” & OddStr

End Sub

Оператор Do … Loop While предназначен для организации цикла с постусловием . Условие проверяется после того, как тело цикла, будет выполнено хотя бы один раз. Цикл продолжает свою работу, пока <условие> остается истинным. Формат цикла Do … Loop While:

Do <блок операторов> Loop While<условие>

Листинг 3. Цикл с постусловием

‘ ЗАДАЧА: Составить программу игры “Угадай число”. Программа должна случайным

‘ образом генерировать число в диапазоне от 1 до 1000, пользователь должен

‘ угадать это число. Программа на каждое вводимое число выводит подсказку

‘ “больше” или “меньше”.

Sub sample8()

Randomize Timer ‘ инициализация генератора случайных чисел

Dim msg As String ‘ строка сообщения

Dim SecretNumber As Long, UserNumber As Variant

Begin: SecretNumber = Round(Rnd * 1000) ‘ число, сгенерированное компьютером

UserNumber = Empty ‘ число, вводимое пользователем

Do ‘ игровой процесс

Select Case True

Case IsEmpty(UserNumber): msg = “Введите число”

Case UserNumber > SecretNumber: msg = “Слишком много!”

Case UserNumber < SecretNumber: msg = “Слишком мало!”

End Select

UserNumber = InputBox(prompt:=msg, Title:=”Угадай число”)

Loop While UserNumber <> SecretNumber

‘ проверка

If MsgBox(“Играть еще? “, vbYesNo + vbQuestion, “Вы угадали!”) = vbYes Then

GoTo Begin

End If

End Sub

Циклы Do Until … Loop и Do … Loop Until являются инверсиями ранее рассмотренных циклов с условием. В общем случае они работают аналогично, за исключением того, что тело цикла выполняется при ложном условии (т.е. <условие>=False). Формат цикла Do Until … Loop:

Do Until <условие> <блок операторов> Loop

Формат цикла Do … Loop Until:

<блок операторов>

Loop Until<условие>

Практическое задание: Перепишите программы из листингов 10 и 11 с использованием инвертированных операторов цикла.

Цикл While … Wend также относится к циклам с условием. Данный оператор полностью соответствует структуре Do While … Loop. Формат цикла While … Wend:

While <условие>

<блок операторов>

Wend

Отличительной особенностью этого оператора является невозможность принудительного завершения (прерывания) тела цикла (оператор Exit Do не работает в цикле While … Wend).

Прерывание цикла

Для досрочного завершения итерации и выхода из цикла применяется оператор Exit. Этот оператор применим в любой циклической структуре, кроме While … Wend. Общий синтаксис использования Exit для прерывания цикла таков:

<начало_цикла>

[<блок операторов1>]

Exit (For | Do)

[<блок операторов2>]

<конец_цикла>

При выполнении оператора Exit цикл прерывается, и управление передается оператору, следующему за оператором <конец_цикла>. В теле цикла может присутствовать несколько операторов Exit.

Листинг 4. Принудительный выход из цикла

Sub sample9()

For i = 1 To 10000000

If i = 10 Then Exit For ‘ выход из цикла, когда счетчик достигнет 10

Next

Операторы цикла

В VBA существуют два основных типа циклов – циклы со счетчиком (параметрические) и циклы с условием (итерационные).

Циклы со счетчиком используют в тех случаях, когда необходимо выполнить некоторые действия определенное число раз

Циклы с условием применяются тогда, когда некоторые действия в программе должны повторяться до тех пор, пока выполняется определенное условие.

Циклы с параметром For … Next

Структура цикла:

For Параметр_Цикла = Начальное_Значение To Конечное_Значение

[ Step Шаг]

Операторы

[ Exit For ]

Next [Параметр_Цикла]

где For – ключевое слово VBA (от), обозначающее начало цикла;

Параметр_цикла – переменная, определенная в качестве счетчика цикла;

Начальное_Значение – число, задающее начальное значение параметра цикла;

To – ключевое слово VBA (до), разделяющее

Начальное_значение и Конечное_Знаение;

Конечное_Значение – число, задающее значение параметра цикла,

При котором цикл завершается;

Step – ключевое слово VBA (шаг), используемое для

Задания шага цикла, необязательный аргумент;

Шаг – число, задающее шаг цикла, т.е. значение, на которое

Увеличивается (или уменьшается) значение параметра

Цикла на каждом шаге. Это число может быть

Отрицательным;

Exit For – оператор досрочного выхода из цикла (необязательный);

Next – ключевое слово VBA (следующий), обозначающее

Конец цикла.

Работа цикла:

Шаг 1 Сначала определяется параметр цикла, а также вычисляются и запоминаются начальное и конечное значения этой переменной.

Шаг 2 Параметру цикла присваивается начальное значение.

Шаг 3 Начальное значение параметра цикла сравнивается с конечным значением.

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

Шаг 4 Выполняется тело цикла.

Шаг 5 После выполнения тела цикла происходит присваивание параметру цикла следующего значения. Переход к шагу 3.

Примечание.

1. Если используется ключевое слово Step , то параметр цикла изменяется в соответствии с числом, указанным после этого слова. Если слово Step отсутствует, то значение шага равно единице.

Пример 1.

For I = 0 To 10 Step 2 (Значение I будет увеличиваться на 2)

2. Цикл For … Next может быть прерван досрочно при достижении какого либо условия. Для этого в нужном месте цикла нужно поместить оператор Exit For .

Пример 2.

Dim S As Integer

Dim j As Integer

S = 2

For j = 1 To 10

S = S + j

If S > 6 Then

Exit For (Выход из цикла, если значение S > 6)

End If

Next j

MsgBox (S)

Циклы с условием (итерационные)

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

В VBA есть два основных цикла DO … LOOP – с условием, вводимым ключевым словом While , и с условием, вводимым ключевым словом Until . Оба они могут быть с предусловием или с постусловием.

Синтаксис:

где Do – ключевое слово (делать);

While – ключевое слово (пока);

Until – ключевое слово (до тех пор пока);

Loop – ключевое слово, указывающее на окончание цикла;

<условие> – логическое выражение, истинность которого проверяется

В начале каждого выполнения тела цикла;

<тело_цикла> – произвольная последовательность операторов;

Конструкция Do … While читается: делать пока выполняется условие. В конструкции Do … While For

Конструкция Do … Until читается: делать до тех пор, пока не будет выполнено условие. В конструкции Do … Until для увеличения шага следует писать специальный оператор, т.к. в ней в отличие от конструкции For , не делается это автоматически.

Условие, записанное после ключевого слова Until , проверяется в конце каждой итерации (после выполнения тела цикла). Обратить внимание, что оно работает здесь не совсем так, как в цикле While . Если условие является истинным (True ), то выполнение цикла завершается. Если условие не выполняется (является ложным – False ), то вновь выполняется тело цикла.

Пример 1.

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

Технология выполнения задания:

1. Исходные данные: i  Z

Результат: S  R .

2.Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с предусловием While :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

Do While i <= 10

S = S + i ^ 2

i = i + 1

Loop

MsgBox (S)

End Sub

3.Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с предусловием Until :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

Do Until i > 10

S = S + i ^ 2

i = i + 1

Loop

MsgBox (S)

End Sub

4 Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с постусловием While :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

S = S + i ^ 2

i = i + 1

Loop While i <= 10

MsgBox (S)

End Sub

5 Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с постусловием Until :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

S = S + i ^ 2

i = i + 1

Loop Until i > 10

MsgBox (S )

End Sub

Синтаксис оператора:

For Счетчик = Начало Т o Конец [Step Шаг ]

Блок_Операторов

Next Счетчик

Здесь обозначено:

For для (обязательное ключевое словоVB);

To до (обязательное ключевое словоVB);

Блок_Операторов – один или несколько операторов, называемыхтелом цикла;

Счетчик – целая переменная, которая считает количество выполняемых циклов;

Начало, Конец – начальное и конечное значения счетчика;

Step шаг (ключевое словоVB);

Шаг – шаг изменения счетчика; может быть и отрицательным; параметр необязательный, так как если шаг равен 1, можноStepШаг опустить;

Next– следующий (обязательное ключевое словоVB, конец записи оператора цикла).

Значение счетчика (Начало, Конец) могут быть численными константами или переменными целого или вещественного типа, могут быть отрицательными или положительными числами. Чтобы тело цикла выполнилось хотя бы один раз, должно бытьНачало ≤ Конец, еслиШаг > 0, иНачало ≥ Конец, еслиШаг < 0. Как только окажется, чтоСчетчик >Конец (если Начало < Конец), выполнение цикла заканчивается. ЕслиНачало = Конец, цикл выполнится один раз;

Пример 9.1 .Вычисление функции Y = 2 – 1.5 Sinx при изменении Х с шагом 0.2 в диапазоне .

Фрагмент программы по вычислению Yи вывода аргумента Х и функцииY:

For X = 0 To 2.4 Step 0.2

Y = 2 – 1.5*Sin(X)

Чтобы понять, как работает этот цикл, приведем программу подобного цикла, созданного с помощью оператора GoTo , меток, оператора If Then .

M1: X = X + 0.2

If X <= 2.4 Then

Y = 2 – 1.5*Sin(X)

Разберем работу этой программы. Первый расчет Yнестандартный, как бы выпадает из цикла. Цикл начинается после первой передачи управленияGoToM1 на метку М1. В строке с меткой М1 аргумент Х увеличивается на шаг 0.2 и сразу идет проверка, не превышает ли новое значение Х конечного значения 2.4. Если не превышает, то расчетYповторяется с этим новым Х. Потом снова выполняется операторGoToM1 – передача управление в строку с меткой М1. Эти повторы (циклы) расчетаYзакончатся, как только Х превысит 2.4.

Теперь программу с Ifсравним с цикломFor…Next.

For X = 0 To 2.4 Step 0.2

заменяет собой две строки

M1: X = X + 0.2

If X <= 2.4 Then

Именно две последние строки кода выполняются в цикле For, но мы этого не видим. Мы закодировали их строкой сFor… Строка кодаGoTo M1 закодирована словомNext X (буквально: следующий Х). Получается компактная конструкция.

При использовании цикла For…Nextнадо научиться использовать счетчик цикла при решении различных задач. Чтобы сообразить, как можно использовать счетчик для решения задачи, надопровести анализ постановки задачи, найти закономерности изменения некоторых параметров задачи.

Пример 9.2 . Определение суммы элементов ряда: .

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 1 To 16 ‘ счетчик i – это знаменатель дроби

S = S + 1/i ‘ накопление суммы

Print “ S = “; S ‘ вывод суммы S на форму

При каждом значении счетчика iвыражение 1/iпоследовательно формирует элементы ряда, начиная с 1.

Пример 9.3 . Вычисление суммы ряда элементов
.

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 1 To 18 ‘ счетчик i – числитель

S = S + i/(i + 1) ‘ знаменатель больше числителя на 1

Print “ S = “; S ‘ вывод суммы S на форму

Пример 9.4 . Вычисление суммы: 5 + 8 + 11 + … + 32 + 35

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 5 To 35 Step 3 ‘ получаем арифметическую _

прогрессию со знаменателем 3

Print “ S = “; S

Пример 9.5. Вычисление суммы для заданного х:

Анализ задачи показывает, что степень при Х изменяется от 1 до 10. При этом числитель в коэффициенте при Х больше степени на 1, а знаменатель – на 2. Значение степени будем формировать с помощью счетчика i. Тогда можно составить такую программу (фрагмент):

S = 1 ‘ S – сумма ряда

For i = 1 To 10 ‘ как счетчик i, изменяется степень при Х

S = S + (-1)^i*(i + 1)*x^i / (i + 2)

Print “ S = “; S

Циклы For Next используются при вводе, выводе и обработке массивов .

Пример 9.6. Ввод и вывод значений элементов массива В(N ).

Фрагмент программы:

‘ Опускаем присваивание переменной N значения, _

введенного на форме в текстовое поле txtN:

B(i) = InputBox("Введите элемент B(" & i & ")", _

"Ввод массива B(" & N & “)”)

Print " "; B(i);

Функция InputBox () выводит на экран диалоговое окно с кнопкой закрытия, заданным сообщением, полем ввода, кнопкамиОК ,Отмена, заданным заголовком (или без него). Если будет введено число 12 – размер массиваN, то в нашем примере при первом появлении это окно будет иметь вид:

Как видим, сообщение Введите элемент В(1) предлагает ввести значение 1-го элемента в текстовое окно. Появится это окно 12 раз, так как массив содержит 12 элементов. Это следует из заголовка формы. Индекс элемента В(i) в приглашении будет меняться от 1 до 12.

Если требуется вывести на форму только значения элементов массива В(N), то тело цикла будет состоять из одного оператора:

Просмотр элементов массива для совершения над ними каких-то действий также происходит с помощью оператора цикла For…Next.

Приведем примеры обработки одномерных массивов.

Пример 9.7 . Определение максимального элемента в массиве В(M ).

Исключая ввод начальных данных и вывод результатов, кратко опишем алгоритм:

    Объявим переменную Вmaх, в которую занесем значение первого элемента массива, и переменнуюImax, которой присвоим 1 – индекс первого элемента массива.

    В цикле с помощью оператора For…Nextпросматриваем все элементы массива, начиная со 2-го. Используя операторIf…Then, сравниваем их значения со значением, которое хранится в переменнойBmax.

    Если окажется, что значение элемента массива больше величины Bmax, тоBmaxприсваиваем значение этого элемента, а значениюImax– индекс этого элемента массива.

После окончания цикла в переменной Bmaxокажется значение максимального элемента, а вImax– его индекс (номер).

Программа этой части алгоритма.

Bmax = B(1): Imax = 1

If B(i) > Bmax Then Bmax = B(i): Imax = i

Пример 9.8. Определение суммы, произведения и количества положительных элементов массива D (M ).

Переменные: S,P,K– соответственно сумма, произведение и количество положительных элементов.

Алгоритм такого определения:

    Присваиваем ноль переменной Sи К, переменнойPприсваиваем 1. Как правило, всегда переменные, где накапливается сумма, здесь этоSиk, перед циклом обнуляются, а переменным, в которых вычисляется произведение, присваивается 1.

    С помощью цикла For…Nextперебираем все элементы массива и проверяем положительные ли они (D(i) > 0).

    Если окажется, что элемент – положительный, то прибавляем его значение к значению суммы Sи сохраняем новую сумму в этой же переменной. ПеременнуюPумножаем на положительное значение элемента и сохраняем также в переменнойP. А к переменнойKприбавляем 1 и сохраняем новое значение в этой же переменной

Программа этой части алгоритма имеет вид:

S = 0: P = 1: K = 0

If D(i) > 0 Then

S = S + D(i) ‘ так происходит накопление суммы _

положительных значений элементов массива D(i)

P = P*D(i) ‘ определение произведения положительных

‘ элементов массива

K = K + 1 ‘ этот оператор называют СЧЕТЧИКОМ, здесь он

‘ определяет количество положительных элементов массива

Пример 9.9. Определение суммы, произведения, количества и среднего значения нечетных элементов массива D (M ).

Приведем фрагмент программы такого определения.

S = 0: P = 1: K = 0

If D(i) Mod 2 <> 0 Then

Ssr = S/k ‘ вычисление среднего значения нечетных элементов

Сравните этот фрагмент программы с программой Примера 9.8. Эта программа почти полностью повторяет предыдущую. Изменено только условие в операторе If. УсловиеD(i) Mod 2 <> 0 означает, что мы ищем элементы массиваD(i), которые не делятся нацело на 2, т. е. нечетные элементы. Если будем проверять условиеD(i) Mod 2 = 0, то мы будем отбирать четные элементы массива.

Как известно, деление по Mod даетв результате остаток от деления в целых числах. Например, после выполнения оператораd= 34Mod4 переменнаяdбудет равна 2. Поэтому для отбора элементов массива, которые кратны 4, надо проверять условиеD(i) Mod 4 = 0. Аналогичным будет условие, если будем искать элементы, кратные другим числам. Вместо 4 будут записаны эти другие числа.

Пример 9.10. Запись элементов массива R (N ), кратных 5, в другой массив и вывод нового массива на форму.

Другой массив обозначим, например, R5(N). Размер этого нового массива следует принять таким же, как исходный, т. к. в предельном случае все элементы могут быть кратными 5.

Алгоритм задачи:

    Обнуляем счетчик k. С помощью оператора циклаFor…Nextпросматриваем все элементы массиваR(N).

    Каждый элемент проверяем на кратность 5, используя оператор If…Thenи деление элемента массива поMod.

    Если элемент кратен 5, то с помощью счетчика типа k=k+ 1 формируем индексы массиваR5(N), начиная с 1, и записываем его в этот другой массив –R5(N).

    Если kотлично от нуля, выводим массивR5() на форму.

    Если же kравно нулю выводим: «Нет элементов, кратных 5».

Фрагмент программы:

If R(i) Mod 5 Then k = k + 1: R5(k) = R(i)

If k <> 0 Then

Print “Нет элементов, кратных 5”

Циклы могут быть вложенными в другие циклы.

Продемонстрируем работу вложенных циклов . Ниже в программе организован вывод значений счетчиков цикловi,jиk. Из результатов выводаi,j,kстановится понятно, как выполняются вложенные циклы.

Private Sub frmCycle_DblClick()

ScaleMode = 4 ‘единицы измерения – символы

For i = 1 To 3 ‘внешний цикл

Print "i = "; i;

For j = 1 To 4 ‘1-й вложенный цикл

CurrentX = TextWidth("i = 1 ") + 5

Print "j = "; j;

CurrentX = TextWidth("i = 1 j = 1 ") + 7

For k = 1 To 5 ‘2-й вложенный цикл

На изображенной форме (рис. 1) приведены результаты вывода счетчиков всех трех циклов: внешнего цикла – счетчик i, первого вложенного цикла – счетчикjи второго, самого внутреннего цикла – счетчикk. Как видим,самый «медленный» счетчик у внешнего цикла (поi), асамый «быстрый» – счетчик самого внутреннего цикла (по k ).

Программа выполняется после двойного щелчка левой кнопкой мыши по форме frmCicli.

CurrentX, CurrentY – свойства формы, задающие координатыX,Yточки начала вывода информации методомPrint(см. на рис.1 расположение осейXиYна форме).

TextWidth() – функция, возвращающая ширину текста, заданного в функции как аргумент в двойных кавычках.

Вложенные циклы используются при обработке двумерных массивов (матриц). Но в некоторых задачах, исключая ввод и вывод элементов двумерного массива, можно ограничиться и одним циклом. Рассмотрим некоторые примеры программирования матриц.

Пример 9.11. Ввод и вывод матрицы (двумерного массива) целых чисел intA (N ).

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

Ввод и вывод матрицы по строкам – фрагмент 1 .

Dim M As Integer, N As Integer, i As Integer, j As Integer

Dim intA() As Integer ‘ объявляем динамический массив

M = Val(txtN.Text) ‘ M – количество строк

N = Val(txtN.Text) ‘ N – количество столбцов

ReDim intA(M, N) As Integer ‘ переопределяем массив

For i = 1 To M ‘ i будет сохранять свое значение, пока полностью

‘не выполнится вложенный цикл по j

Print " "; intA(i, j); ‘ вывод по строкам

Print ‘ переход в начало новой строки

Чтобы вводить матрицу по столбцам, следует внешним сделать цикл по j(задает номера столбцов), а внутренним – цикл поi(задает номера строк).

Ввод и вывод матрицы по столбцам фрагмент 2 .

PrY = 2500: CurrentY = PrY ‘ PrY задает координату Y начала

‘ вывода первого элемента каждого столбца на форме

For j = 1 To N ‘ j будет сохранять свое значение, пока полностью

‘не выполнится вложенный цикл по i

intA (i, j) = InputBox("Введите элемент intA(" & i & “,” & j & ")", _

"Ввод матрицы intA(" & M & “,” & N & ")")

Print Tab(6 * j); intA(i, j) ‘ вывод по столбцам

CurrentY = PrY ‘ для вывода первого элемента

‘ следующего столбца

В этом втором фрагменте программы не повторяются 5 первых строк из первого фрагмента. Функция Tab(6 * j) устанавливает начало вывода в строке (в символах), начиная от левого края формы. КоординатаPrYздесь равна 2500 твипов, но можно подобрать и другое значение.

Пример 9.12 . Упорядочивание значений элементов массива V (N ) по возрастанию.

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

Фрагмент программы, реализующей этот алгоритм:

For i = 1 To N – 1

For j = i + 1 To N

If V(j) < V(i) Then P = V(i): V(i) = V(j): V(j) = P

Поясним этот фрагмент программы.

С помощью внешнего цикла со счетчиком iвыбираем элементV(i) для сравнения с последующими элементами. Внутренний цикл со счетчикомjвыбирает для сравнения последующие элементыV(j). Начальное значениеjравноi+ 1. Это первый элемент из последующих.

Для обмена значений элементов V(i) иV(j) вводим некоторую переменнуюP, в которую временно «прячем» значение одного из элементов массива (в программе – этоV(i)). Затем элементу V(i) присваиваем значение элементаV(j), а элементуV(j) присваиваем значениеV(i), которое хранится в переменнойP. Если «спрячем» вPзначениеV(j), то код по обмену значениями будет таким:P = V(j): V(j) = V(i): V(i) = P. Результат не изменится.

Чтобы упорядочить массив по убыванию , достаточно условие для проверки написать в видеV(j) > V(i), т. е. изменить знак неравенства на другой.

Если массив будет не числовой, а строковый, и в элементы массива будут введены фамилии, то по программе примера 9.12, можно упорядочить список фамилий по алфавиту. Дело в том, что для букв алфавита, используемых в компьютере, справедливы неравенства: А < Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

Пример 9.13 . Вычисление суммы положительных элементов для нечетных столбцов матрицы F (M , N ) и вывод сумм на форму.

Алгоритм программы:

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

    Обнуляем сумму S, в которой будет накапливаться сумма положительных элементов.

    Во внутреннем цикле проверяем знак элемента массива.

    Если элемент массива положителен (> 0), вычисляем сумму S.

    После окончания внутреннего цикла выводим сумму Sна форму.

Фрагмент программы :

For j = 1 To N Step 2

If F(i, j) > 0 Then S = S + F(i, j)

Print “Сумма столбца “; j; “:”; S ‘ j – номер столбца!

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

Пример 9.14. Имеется 1801 руб. Сколько можно купить шоколадок по 31 руб. и булок по 18 руб., чтобы полностью потратить все деньги.

Программа:

Сумма = 1801

ВсеШоколадки = Сумма \ 31: ВсеБулки = Сумма \ 18

For i = 1 To ВсеШоколадки

For j = 1 To ВсеБулки

Цена = i * 31 + j * 18 ‘общая цена покупки

If Цена = 1801 Then

Print "Шоколадок: "; i; Tab(19); "Булок: "; j

Поясним программу, в которой используем переменные, названные по-русски.

Сначала определяем, какое максимальное количество только шоколадок или только булок можно купить на всю сумму. Полученные значения ВсеШоколадки и ВсеБулки используем для ограничения количеств переборов по количеству шоколадок и булок. Для каждых значений количества шоколадок (i) и количество булок (j) определяем общую Цену для их покупки. Если рассчитанная Цена равна 1801, то подобранный вариант есть одно из решений задачи.

Функция Tab() указывает, с какой позиции от края формы будет вывод информации, следующий за этой функцией. ЕслиTab(19), то с 19-ой позиции.

Программа выводит 3 возможных вариантов покупки:

Шоколадок 7, булок 88

Шоколадок 25, булок 57

Шоколадок 43, булок 26

Если требуется дать однозначный ответ, надо сформулировать дополнительное условие. Например, «булок было куплено меньше, чем шоколадок». Тогда единственным решением будет 3-й вариант.

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

Лабораторные работы по основам программирования

2.1. Табулирование функций, представленных аналитически
и сходящимся рядом

Цель работы

· Закрепление теоретических знаний по основам организации разветвляющихся и циклических структур.

· Приобретение практических навыков программирования с использованием разветвляющихся и циклических структур в системе Visual Basic.

В VB существуют три вида операторов цикла:

· счетный цикл: For…To … Next

· циклы с предусловиями: Do While...Loop, Do Until...Loop, While…WEnd

· циклы с постусловиями:Do...Loop While, Do...Loop Until.

Счетный цикл – позволяет циклически выполнять набор операторов заданное число раз. Его синтаксис следующий:

For счетчик = начало To конец

[операторы ]

[операторы ]

Next [счетчик ]

Параметр счетчик – это числовая переменная (целого, вещественного типа или типа Date, Variant, Currency), которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное параметру – конец. Если не указан, то шаг считается равным 1, значение шага можно изменять. Оно может быть положительным или отрицательным числом.

Существуют четыре синтаксические конструкции цикла Do….Loop:

Операторы между ключевыми словами Do … Loop выполняются заданное количество раз в зависимости от условия. Например, в следующем фрагменте программы при C = 100 условие будет выполняться и произойдет вход в цикл. Внутри цикла происходит обращение к процедуре и уменьшение значения C на 1. Далее вновь проверяется условие (C > 0) и операторы цикла выполняются повторно (всего они выполнятся 100 раз), до C = 0. Когда же условие C >0 становится ложным и цикл прекращается.

Do While C > 0

Тот же самый фрагмент программы, выполненный с использованием цикла с предусловием по синтаксису 2:

В данном случае цикл выполняется, пока условие равно False, в отличие от предыдущего случая, то есть продолжается до выполнения условия C = 0.

Операторы циклов по синтаксису 3 и 4 очень похожи на первые два за исключением того, что условие не вычисляется до тех пор, пока цикл не выполнится хотя бы один раз.

В синтаксисах этих циклов можно использовать операторы безусловного выхода из цикла Exit For и Exit Do, позволяющих передать управление оператору, находящемуся за циклом. Например, в следующем фрагменте программы, если начальное значение C окажется >50, то цикл немедленно прекратиться.



Do Until C <= 0

MsgBox “Нач. значение больше допустимого”, ”Ошибка ввода”

Цикл While…Wend использовался в ранних версиях Visual Basic. Его синтаксис следующий:

While <условие>

<Операторы>

В отличии от цикла Do..Loop цикл While ..Wend не имеет второго варианта, в котором проверка условия выполняется в конце цикла. Кроме того, для него нет оператора выхода из цикла, наподобие Exit Do.