Сделай Сам Свою Работу на 5

Цикл ПОКА. Оператор Do While





Кроме цикла ДО, который повторяется заданное количество раз, применяется также цикл ПОКА, который повторяется до тех пор, пока верно некоторое заданное условие (или, наоборот, пока некоторое условие не станет верным). В VBA имеется несколько операторов для реализации цикла ПОКА. Простейший из них – оператор Do While:

Do While условие

операторы, выполняемые в цикле

Loop

Цикл повторяется, пока заданное в нем условие верно, и прекращается, когда оно становится неверным. Условие проверяется перед началом цикла. Если условие сразу оказывается неверным, то цикл не выполняется ни разу.

Примечание – В VBA имеется также оператор цикла Do Until, по структуре аналогичный оператору Do While. Цикл, заданный оператором Do Until, повторяется, пока заданное в нем условие неверно, и прекращается, когда оно становится верным.

Пример 4.16 – В программе вводится одномерный массив из восьми чисел, и выполняется суммирование его элементов (начиная с первого), пока сумма не превысит 20.

Sub primer4_16a()

Dim a(1 To 8) As Integer

MsgBox(“Вводите массив”)

For i = 1 To 8

a(i) = InputBox("a(" & i & ")")

Next i

sum = 0 : i = 0

Do While sum <= 20

i = i + 1

sum = sum + a(i)



Loop

MsgBox ("Сумма достигнута на " & i & "-м элементе и равна" & sum)

End Sub

Здесь переменная sum сначала равна нулю, поэтому условие sum<=20 верно. Выполняются операторы цикла:

i = i + 1

sum = sum + a(i)

Таким образом, переменная sum становится равной первому элементу массива a. Если он превышает 20, то цикл завершается, так как условие sum<=20 оказывается неверным. Выполняется оператор, следующий за циклом, т.е. выводится сообщение о найденной сумме. Если же элемент a(1) не превышает 20, то условие sum<=20 остается верным, и цикл повторяется снова: переменная i принимает значение 2, и к переменной sum прибавляется величина a(2). Цикл повторяется, пока переменная sum не превысит 20.

Следует обратить внимание, что рассмотренная программа не вполне правильная: в ней не предусмотрено, что сумма элементов массива может оказаться меньше 20. В этом случае программа завершится с выдачей сообщения об ошибке, когда переменная i превысит объявленное количество элементов массива (в данном примере оно равно 8). Чтобы исправить эту ошибку, можно изменить программу, как показано ниже.



Sub primer4_16b()

Dim a(1 To 8) As Integer

MsgBox ("Вводите массив")

For i = 1 To 8

a(i) = InputBox("a(" & i & ")")

Next i

sum = 0: i = 0

Do While (sum <= 20) And (i < 8)

i = i + 1

sum = sum + a(i)

Loop

If sum > 20 Then

MsgBox ("Сумма достигнута на " & i & "- м элементе и равна " & Sum)

Else

MsgBox ("Сумма не достигнута")

End If

End Sub

Здесь цикл Do While выполняется до тех пор, пока верны два условия: переменная sum не превышает 20, и переменная i меньше 8. Если хотя бы одно из этих условий нарушается, то цикл прекращается. Поэтому, если в ходе выполнения цикла переменная sum достигает значения, превышающего 20, то цикл прекращается, так как нарушается условие sum <= 20. Если же оказывается, что сумма всех элементов массива меньше 20, то цикл прекращается из-за нарушения условия i < 8 (так как переменная i увеличивается на единицу в каждом цикле и достигает значения 8, когда вычислена сумма всех элементов массива). После прекращения цикла в операторе If проверяется достигнутое значение переменной sum, и выводится соответствующее сообщение.

Пример 4.17– Вычислить сумму ряда с точностью до 0,0001.

Sub primer4_17()

n=0 : element = 1 : sum = 0

Do While Abs (element) >= 0.0001

sum = sum + element

n=n+1

factorial = 1

For i=1 To n

factorial = factorial * i

Next i

element = ((-1)^n)/(factorial*(2*n+1))

Loop

MsgBox(“Сумма ” & sum & “достигнута при n = ” & n-1)

End Sub

Здесь Abs – встроенная (стандартная) функция языка VBA, вычисляющая модуль. Для вычисления факториала использован цикл For, рассмотренный ранее. Вычитание при выводе результата (n-1) требуется из-за того, что в цикле переменная n увеличивается, вычисляется очередной (n-й) элемент ряда, и только после этого проверяется условие окончания цикла (превышает ли вычисленный элемент ряда заданную величину 0,0001). Цикл завершится, когда вычисленный элемент ряда окажется меньше 0,0001. Этот элемент уже не прибавляется к вычисляемой сумме. Поэтому на момент окончания цикла переменная n будет иметь значение, на единицу превышающее количество элементов вычисленной суммы.



Подпрограммы

Во многих случаях удобно выделить часть программы в отдельную процедуру (подпрограмму) и вызывать ее для выполнения из другой процедуры. Подпрограмма может иметь входные и выходные параметры. Входные параметры – это величины, передаваемые в подпрограмму из другой (вызывающей) процедуры и являющиеся для вызываемой подпрограммы «исходными данными». Этими величинами могут быть как переменные, так и константы (например, конкретные числа). Выходные параметры – это переменные, являющиеся результатами выполнения вызываемой подпрограммы.

Пример 4.18 – Требуется разработать программу для составления массива из элементов арифметической прогрессии. Первый элемент прогрессии a1, шаг прогрессии d и необходимое количество элементов n указываются пользователем. Составление массива требуется реализовать как подпрограмму.

Sub primer4_18()

Dim a1 As Single, d As Single, n As Byte, a() as Single

a1 = InputBox("Введите первый элемент прогрессии ")

d = InputBox("Введите шаг прогрессии ")

n = InputBox("Укажите, сколько элементов требуется ")

ReDim a (1 To n) ‘a – массив из элементов прогрессии, который требуется составить

Call arif_progr(a1, d, n, a)

For i = 1 To n

MsgBox(i & “-й элемент прогрессии равен “ & a(i))

Next i

End Sub

Sub arif_progr(nach, shag, kol, elem)

elem(1) = nach

For i=2 To kol

elem(i) = elem(i-1)+shag

Next i

End Sub

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

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

Оператор Call – вызов подпрограммы. В данном примере он имеет следующий вид: Call arif_progr(a1, d, n, a). Здесьarif_progr– имя вызываемой подпрограммы. Переменные a1, d и n – входные параметры, так как при вызове подпрограммы их значения уже заданы. Переменная a – выходной параметр, так как она определяется в результате выполнения подпрограммы.

Следующая строка представляет собой заголовок подпрограммы:

Sub arif_progr(nach, shag, kol, elem)

Количество параметров в вызове подпрограммы (т.е. в операторе Call) и в ее заголовке должно совпадать, и порядок параметров в этих операторах должен соответствовать друг другу.

В данном примере при вызове подпрограммы arif_progr переменная nach получает значение переменной a1, переменная shag – значение d, переменная kol – значение n. Переменная elemполучает значение переменной a, т.е. она будет представлять собой массив из n элементов; так как этим элементам в основной программе не было присвоено никакого значения, они равны нулю.

Затем выполняется подпрограммаarif_progr. В результате ее выполнения вычисляются элементы массива elem. Эти же значения получают и соответствующие элементы массива a в основной программе.

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

Примечание – В данном примере имена переменных в основной программе (a1, d, n и a) отличаются от имен соответствующих переменных в вызываемой подпрограмме (nach, shag, kol и elem). Эти имена могут и совпадать.

В качестве входных параметров могут использоваться не только переменные, но и константы. Пусть, например, в рассматриваемой задаче не требуется запрашивать у пользователя начальный элемент прогрессии и ее шаг: задано, что a1 = 5, d = 2. У пользователя запрашивается только количество элементов прогрессии, которые требуется вычислить. Тогда вызов подпрограммы мог бы иметь следующий вид: Call arif_progr(5, 2, n, a). Никаких изменений в самой подпрограмме arif_progr при этом не требуется. При вызове подпрограммы переменная nach получит значение 5, а переменная shag – значение 2. Все остальные действия выполняются точно так же, как описано выше.

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

Пример 4.19 – Требуется разработать подпрограмму, которая бы меняла местами два столбца в двумерном массиве.

Private m As Byte

Sub primer4_19()

Dim a() As Single, k1 As Byte, k2 As Byte, n As Byte

‘a – двумерный массив из m строк и n столбцов

… ‘Объявление и ввод массива (см. примеры, рассмотренные выше).

‘k1 и k2 – номера столбцов, которые требуется поменять местами

k1 = InputBox("Введите первый номер столбца ")

k2 = InputBox("Введите второй номер столбца ")

Call obmen_stolbcov(a, k1, k2)

For i = 1 To m

For j = 1 To n

MsgBox("a(" & i & "," & j & ") = " & a(i,j)) ‘Вывод измененного массива на экран

Next j

Next i

End Sub

Sub obmen_stolbcov(massiv, k1, k2)

For i=1 To m

x = massiv(i, k1)

massiv(i, k1) = massiv(i, k2)

massiv(i, k2) = x

Next i

End Sub

Здесь переменная m (количество строк в массиве) используется в обеих процедурах (primer4_19 и obmen_stolbcov), поэтому ее требуется объявить как переменную уровня модуля, т.е. в операторе Private перед текстом процедур.

В подпрограмму obmen_stolbcov передаются три входных параметра: массив a (в подпрограмме он получает имя massiv) и номера столбцов k1 и k2 (в подпрограмме они получают такие же имена – k1 и k2). В подпрограмме массив изменяется: столбцы с номерами k1 и k2 меняются местами. Измененный массив возвращается в основную подпрограмму.

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

Функции

Функция, как и подпрограмма – это отдельная процедура, вызываемая из другой процедуры. Отличие функции от подпрограммы состоит в том, что в результате выполнения функции определяется значение одной переменной, в то время как подпрограмма может определять значения нескольких переменных. Имя переменной, определяемой в результате выполнения функции, должно совпадать с именем самой функции.

Функция, как и подпрограмма, имеет параметры, т.е. величины, передаваемые в функцию из вызывающей процедуры. Этими величинами могут быть как переменные, так и константы. Если параметрами являются переменные, то они могут изменяться при выполнении функции, но такие изменения, как правило, нежелательны, так как усложняют понимание программы.

Следует обратить внимание, что способы вызова подпрограммы и функции существенно различаются. Подпрограмма вызывается с помощью специального оператора Call. Функция обычно вызывается в правой части оператора присваивания.

Пример 4.20 – Требуется разработать функцию для вычисления среднего значения заданного столбца в двумерном массиве.

Private m As Byte

Sub primer4_20()

Dim a() As Single, n As Byte, k As Byte

‘a – двумерный массив из m строк и n столбцов

… ‘Объявление и ввод массива (см. примеры, рассмотренные выше).

k = InputBox("Введите номер столбца, для которого требуется вычислить среднее ")

s = sred_stolb(a, k)

MsgBox ("Среднее по " & k & “-му столбцу равно ” & s)

End Sub

Function sred_stolb(massiv, nomer)

sum = 0

For i = 1 To m

sum = sum + massiv(i, nomer)

Next i

sred_stolb = sum / m

End Function

Здесь sred_stolb – функция. Она вызывается в операторе присваивания s = sred_stolb(a, k). Таким образом, переменные a и k (т.е. массив и номер столбца, по которому требуется вычислить среднее) являются входными параметрами функции sred_stolb. В самой функции sred_stolb значения этих переменных присваиваются переменным massiv и nomer соответственно (можно было использовать и любые другие имена переменных). Функция вычисляет среднее по столбцу с номером nomer. Результат присваивается переменной sred_stolb. Следует обратить внимание, что имя этой переменной обязательно должно совпадать с именем самой функции. По окончании выполнения функции sred_stolb происходит возврат в основную программу: выполняется оператор, где была вызвана функция, т.е. оператор s = sred_stolb(a, k). Таким образом, значение функции sred_stolb присваивается переменной s. Затем эта переменная выводится на экран оператором MsgBox.

Примечание – В данном примере, как и в примере 4.19, переменная m объявлена как переменная уровня модуля, чтобы ее можно было использовать во всем модуле (т.е. и в подпрограмме primer4_20, и в функции sred_stolb). Вместо такого объявления можно было передать эту переменную в функцию sred_stolb в качестве одного из параметров.

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

Для решения этой задачи средние значения по столбцам массива будут вычисляться с использованием функции, разработанной в примере 4.20. Столбец с максимальным средним значением будет определяться в основной программе. Чтобы поменять местами первый столбец массива и столбец с максимальным средним значением, воспользуемся процедурой, разработанной в примере 4.19.

Private m As Byte

Sub primer4_21()

Dim a() As Single, n As Byte

‘a – двумерный массив из m строк и n столбцов

… ‘Объявление и ввод массива.

max_sred = -10000

For j=1 To n

s = sred_stolb(a, j)

If s > max_sred Then

jmax = j

max_sred = s

End If

Next j

call obmen_stolbcov(a, 1, jmax)

MsgBox(“Измененный массив”)

For i = 1 To m

For j = 1 To n

MsgBox("a(" & i & "," & j & ") = " & a(i,j)) ‘Вывод измененного массива на экран

Next j

Next i

End Sub

Function sred_stolb(massiv, j)

… ‘См. пример 20.

End Function

Sub obmen_stolbcov(massiv, k1, k2)

… ‘См. пример 19.

End Sub

Здесь переменной max_sred сначала присваивается очень большое отрицательное число. Затем в этой переменной сохраняется максимальное из вычисленных средних значений по столбцам. С этой целью перебираются все столбцы, по каждому столбцу вычисляется среднее (с помощью функции sred_stolb), и оно сравнивается с текущим значением переменной max_sred. Если выполняется условие s > max_sred (т.е. найденное среднее превышает текущее значение переменной max_sred), то значение среднего сохраняется в переменной max_sred, а номер столбца, где найдено это среднее – в переменной jmax. В результате в переменной jmax сохраняется номер столбца с максимальным средним. В подпрограмме obmen_stolbcov столбцы с номерами 1 и jmax меняются местами.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.