Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Информатике на Машфаке и ТЭА-1.doc
Скачиваний:
12
Добавлен:
12.11.2019
Размер:
3.28 Mб
Скачать
    1. Операторы повтора

Для организации циклов язык VBA предоставляет несколько гибких и мощных структур – операторы повтора.

А) Оператор цикла с параметром ( For — Next)

Оператор цикла позволяет повторять группу операторов заданное число раз

Синтаксис:

For <счетчик цикла>=<начало> To <конец> [Step шаг]

<операторы>

[Exit For]

Next <счетчик цикла>

Где:

  • <счетчик цикла> - любая числовая переменная, в которой сохраняется информация о количестве выполненных проходов цикла (счетчик цикла);

  • Параметры <начало> и <конец> - это числовые выражения, задающие начальное и конечное значение счетчика и определяющие количество проходов цикла.

  • Числовая переменная шаг задает приращение, на которое увеличивается счетчик цикла при каждом проходе. [Step шаг] необязательная фраза. При её отсутствии VBA (по умолчанию) увеличивает счетчик цикла на единицу.

  • Во фразе Next <счетчик цикла> имя переменной счетчик указывать необязательно. Но при указании имени переменной улучшается читабельность программы и в случае вложенных циклов For — Next сразу видно, какому именно циклу принадлежит данное слово Next

Работа:

  • Переменной <счетчик цикла> присваивается значение параметра <начало> и проверяется условие счетчик цикла < конец. Если условие неверно, то управление передается оператору, следующему за Next. Если же условие - верно, то выполняются все операторы, входящие в блок, обозначенный как <операторы>, вплоть до ключевого слова Next

  • Значение переменной <счетчик цикла> увеличивается на величину, заданную во фразе [Step шаг] или на единицу, если фраза Step не указана

  • Управление возвращается

  • Данный процесс будет выполняться, пока значение <счетчик цикла> не достигнет значение <конец>

  • Досрочно завершить цикл For — Next можно с помощью оператора Exit For, который располагается в том месте блока <операторы>, где необходимо выйти из оператора цикла For — Next не дожидаясь условия завершения цикла.

На блок – схеме оператор изображается следующим образом:

Пример 1

Вычислить n-ый член последовательности, заданный формулой , если

Public Sub Prog1()

Dim n As Byte

Dim a1 As Integer, a2 As Integer, an As Integer

n = CByte(InputBox("введите N"))

a1 = 1: a2 = 1

For i = 3 To n

an = a2 + a1

a1 = a2: a2 = an

Next i

MsgBox n & "-й член последовательности = " & an

End Sub

Пример 2

Задана последовательность хi вещественных чисел. Вычислить

Public Sub Prog2()

Dim n As Byte

Dim i As Byte

Dim xi As Double, s As Double

n = CByte(InputBox("введите N"))

s = 0

For i = 1 To n

xi= CDbl(InputBox("Введите " & i & "-й элемент последовательности"))

s = s + xi

Next i

Worksheets(1).Range("a1") = "Значение суммы равно"

Worksheets(1).Cells(2, 1) = s

End Sub

Пример 3

Задан массив, содержащий N вещественных чисел. Найти наибольший и наименьший элементы и поменять их местами.

Public Sub Prog3()

Dim n As Integer, i As Integer

Dim imin As Integer, imax As Integer

Dim max As Double, min As Double

Dim a() As Double

n = CInt(InputBox("введите N"))

ReDim a(1 To n)

Worksheets(1).Range("A1") = "Исх. массив"

For i = 1 To n

a(i)=CDbl(InputBox("Введите " & i & "-й элемент последовательности"))

Worksheets(1).Cells(i + 1, 1) = a(i)

Next

imin = 1: imax = 1

min = a(1): max = a(1)

For i = 1 To n

If a(i) > max Then

imax = i: max = a(i)

End If

If a(i) < min Then

imin = i: min = a(i)

End If

Next i

a(imin) = max

a(imax) = min

Worksheets(1).Range("C1") = "Рез. массив"

For i = 1 To n

Worksheets(1).Cells(i + 1, 3) = a(i)

Next i

End Sub

Пример 4

Вывести на экран окно сообщения со строкой нечетных чисел

Public Sub Prog4()

Dim addnum As String

For a = 1 To 21 Step 2

addnum = addnum & a & " "

Next a

MsgBox "Это последовательность нечетных чисел:" & _

Chr(13) & addnum

End Sub

В) Операторы повтора

Инструкция ForNext применяется в тех случаях, когда известно число повторений.

Если число повторений неизвестно, то применяются операторы повтора.

Существует несколько типов Операторов повтора

Операторы повтора с предусловием.

Синтаксис:

Do While <условное выражение>

<операторы>

[Exit Do]

< операторы >

Loop

While < условное выражение >

<операторы>

[Exit Do]

< операторы >

Wend

Работа:

Вычисляется условное выражение. Если значение условного выражения равно TRUE (истина), то выполняется блок <операторы> и, достигнув слова Loop, опять управление передается в начало оператора повтора, чтобы опять проверить условное выражение. Если вычисленное значение условного выражения равно FALSE (ложь), то управление передается оператору, следующему за оператором повтора.

При наличии инструкции Exit Do есть возможность досрочного выхода из цикла.

На блок-схеме операторы отображаются следующим образом:

Еще одной формой записи оператора повтора с предусловием, является следующий оператор:

Do Until <условие>

<операторы>

[Exit Do]

< операторы >

Loop

Работа:

Вычисляется условное выражение. Если значение условного выражения равно FALSE (ложь), то выполняется блок <операторы> и, достигнув слова Loop, опять управление передается в начало оператора повтора, чтобы опять проверить условное выражение. Если вычисленное значение условного выражения равно TRUE (истина), то управление передается оператору, следующему за оператором повтора.

Операторы повтора с постусловием.

Синтаксис:

Do

<операторы>

[Exit Do]

< операторы >

Loop While <условное выражение>

Работа:

Блок операторов выполняется, если <условное выражение> имеет значение TRUE (истина). Оператор повтора прекращает свою работу, если <условное выражение> примет значение FALSE (ложь)

Do

<операторы>

[Exit Do]

< операторы >

Loop Until <условное выражение>

Работа:

Блок операторов выполняется, если <условное выражение> имеет значение FALSE (ложь). Оператор повтора прекращает свою работу, если <условное выражение> примет значение TRUE (истина).

Примечание:

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

Пример 1:

Вычислить значения Y=sin(x)+ex для всех значений х[a,b]

  • Программный код с использованием оператора Do While

Public Sub Операторы_повтора1()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do While x <= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

End Sub

  • Программный код с использованием оператора While

Public Sub Операторы_повтора2()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

While x <= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Wend

End Sub

  • Программный код с использованием оператора Do While

Public Sub Операторы_повтора1()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do While x <= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

End Sub

  • Программный код с использованием оператора Do Until

Public Sub Операторы_повтора3()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do Until x >= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

End Sub

  • Программный код с использованием оператора Do … Loop While

Public Sub Операторы_повтора4()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop While x <= b

End Sub

Пример 2

Рассортировать по убыванию одномерный массив, содержащий 10 вещественных элементов.

Текст программы приведен ниже

Public Sub Сортировка()

Dim a(1 To 10) As Double

Dim i As Integer, i1 As Integer

Dim n As Integer, imax As Integer

Dim j As Integer

Dim max As Double

Worksheets(1).Range("a1") = "Исходный массив"

n = 10

j = 2

For i = 1 To n

a(i) = Worksheets(1).Cells(j, 1)

j = j + 1

Next i

i1 = 1

Do While i1 <= n - 1

max = a(i1)

imax = i1

For i = i1 To n

If a(i) > max Then

imax = i: max = a(i)

End If

Next i

a(imax) = a(i1)

a(i1) = max

i1 = i1 + 1

Loop

Worksheets(1).Range("c1") = "Рассортированный массив"

j = 2

For i = 1 To n

Worksheets(1).Cells(j, 3) = a(i)

j = j + 1

Next i

End Sub

Пример 3

Вычислить . Вычисление суммы прекратить, когда при каком-то значении i, общий член ряда станет <=

Текст программного кода будет выглядеть следующим оьразом

Public Sub Summa_ряда()

Const eps = 0.001

Dim sum As Double, ai As Double

Dim n As Integer, i As Integer

Dim j As Integer

Dim f1 As Integer, f2 As Integer

sum = 0

i = 1

ai = 1 / 2

Do Until ai <= eps

sum = sum + ai

i = i + 1

f1 = 1

For j = 1 To i

f1 = f1 * j

Next j

f2 = 1

For j = 1 To 2 * i

f2 = f2 * j

Next j

ai = f1 / f2

Loop

MsgBox "Значение i=" & i & Chr(10) & _

"Значение ai=" & ai & Chr(13) & _

"Значение Sum=" & sum

End Sub