Visual Basic_учебник (1108585), страница 11
Текст из файла (страница 11)
Но основное их назначение – управление исполнением программы в составе специальных предложений VB. Здесь мы рассмотримдве из подобных конструкций: предложение цикла Do … Loop и условное предложение If … End If.Предложение Do … LoopВ предыдущих главах в примерах программ мы применяли циклFor … Next. Он удобен, если заранее известно необходимое числоитераций. Однако зачастую при постановке задач на итеративные1 вычисления указывают точность решения. Тогда требуемое число итераций перестает быть фиксированным значением, и следует при каждомповторении проверять, не достигнута ли необходимая точность.В подобных случаях вместо предложения For … Next применяют более общий способ организации цикла – предложение Do … Loop.
Уэтого предложения две формы:1От латин. iterativus - часто повторяемый.77Do [ While | Until ] <условие><блок предложений>LoopиDo<блок предложений>Loop [ While | Until ] <условие>Начинается конструкция предложением Do, заканчивается предложением Loop. <Условие>– это любое выражение типа Boolean. Значениеэтого выражение управляет исполнением цикла. Перед условиемдолжно стоять либо слово While, либо Until.
Выбор слова меняетинтерпретацию значения, полученного при вычислении условия. Еслиуказано слово While, то итерации цикла повторяются, пока условиедает значение True. Как только условие даст False, итерации прекращаются. Если же перед условием – Until, то, наоборот, цикл исполняется до тех пор, пока условие не даст True. Значение условия False вэтом случае сигнализирует о необходимости повторять итерации.Две формы предложения Do … Loop отличаются тем, в какой моментвычисляется условие. Если оно стоит в начале цикла, в предложенииDo, то и условие вычисляется первый раз еще до того, как началисьитерации.
Например, если во фрагменте программыDo While Math.Abs(a - b) > 0.0001. . .Loopзначения переменных a и b с самого начала отличаются меньше, чемна одну десятитысячную, то блок предложений между Do и Loop небудет выполнен ни разу.78Когда условие указано в конце цикла, в предложении Loop, то всегдасначала выполняются предложения, составляющие тело цикла, а ужезатем вычисляется условие. Здесь, соответственно, гарантируется, чтотело цикла будет выполнено хотя бы один раз.В качестве примера использования цикла Do … Loop разберем задачувычисления суммы ряда = ∞=0 с заданной точностью . Очевидно, в общем случае невозможно написать программу, суммирующуюбесконечное число слагаемых. В качестве приближенного значенияберут конечную сумму ≈ =0 для некоторого . Если слагаемые достаточно быстро убывают с ростом , то хорошей верхней оценкой величины «хвоста» суммы, начиная с + 1 и до бесконечности, а,значит, и ошибки суммирования, будет величина последнего слагаемого.Вычисление величины 1,5 при помощи разложения в ряд Тейлора = 1 + +22+36+⋯=∞ =0 !можно оформить в виде следую-щей программы на VB.Module Module1Sub Main()Const eps As Double = 0.000001Dim x As Double = 1.5Dim summand As Double = 1Dim sum As Double = summandDim n As Integer = 0Don = n + 1summand = summand * x / nsum = sum + summandLoop Until Math.Abs(summand) < epsConsole.WriteLine(sum)End SubEnd Module79Общая идея состоит в том, чтобы переменную sum инициализироватьзначением первого слагаемого суммы (в данном случае – единица), азатем в цикле к текущему значению прибавлять очередное слагаемое.Таким образом, в конце каждой итерации значение этой переменнойбудет равно частичной сумме от 0 до n.
Для вычисления очередногослагаемого (в программе это переменная summand) мы воспользовались следующими свойствами: = −1 ∙ , ! = 1 ∙ 2 ∙ … ∙ = − 1 ! ∙ , и, следовательно, =!= −1 ∙−1 ! = −1 ∙ .Каждая итерация состоит из увеличения счетчика на единицу, вычисления очередного слагаемого, а затем и очередной частичной суммы.Цикл продолжается до тех пор, пока абсолютная величина слагаемого,являющаяся оценкой ошибки метода, не станет меньше заранее заданной величины.С точки зрения программирования, рассмотренная конструкцияDo … Loop является более универсальной, чем For … Next.
БезFor … Next можно обойтись. Вместо любого цикла For … Nextможно записать эквивалентную программу с использованиемDo … Loop. Скажем, вместо циклаFor iteration As Integer = 1 To 10. . .Nextможно воспользоваться эквивалентной конструкцией:Dim iteration As Integer = 1Do While iteration <= 10. . .iteration = iteration + 1Loopлибо, что то же самое80Dim iteration As Integer = 1Do Until iteration > 10. . .iteration = iteration + 1LoopПредложение If … End IfПредложение If … End If, называемое также условным предложением, является еще одной конструкцией VB, в которой без использования выражений типа Boolean обойтись невозможно.
При помощи условного предложения появляется возможность выбрать одну из альтернативных последовательностей действий в зависимости от текущихзначений переменных.Приведем пример простой программы, использующей условное предложение. Постарайтесь самостоятельно разобраться, в чем состоит еедействие.If Integer.Parse(Console.ReadLine) Mod 2 = 0 ThenConsole.WriteLine("четное!")ElseConsole.WriteLine("нечетное!")End IfConsole.ReadLine()В общем случае предложение If … End If выглядит в программеследующим образом:If <условие 1> Then<блок предложений 1>[ Else If <условие 2> Then<блок предложений 2> ] …[ Else<блок предложений иначе> ]End If81Здесь <условие 1>, <условие 2>, … – любые логические выражения.
Наих месте допустимы простые сравнения, сложные условия, предварительно вычисленные переменные типа Boolean и т.п. Блоки предложений могут включать любые исполняемые конструкции VB, например, операторы присвоения значений, циклы или, скажем, вложенныепредложения If..End If.Исполнение конструкции If..End If заключается в выборе и исполнении одного из указанных в ней блоков предложений. Вначале вычисляется <условие 1>.
Если оно выполнено (результат равен True), тоисполняется <блок предложений 1>, стоящий за Then. Если же<условие 1> не выполнено (результат равен False), то вычисляется<условие 2>, и, если оно True, то исполняется <блок предложений 2>.Частей Else If может быть несколько.Если не выполняется ни одно из условий, указанных в If и Else If, тоисполняется <блок предложений иначе>, следующий за Else. ЧастиElse и Else If могут отсутствовать. Если часть Else отсутствует и ниодно из условий не выполнено, то ни один из блоков в частях If иElse If не активизируется, и исполнение программы передается напредложение, следующее за End If.Понять практическую значимость условных предложений поможетподробное рассмотрение реализации одного из методов приближенного решения алгебраических уравнений.Решение алгебраических уравнений методомделения отрезка пополам (дихотомией)Как определить значение , при котором выполняется равенство − = ? Это простое алгебраическое уравнение невозможно решить82аналитически.
На помощь приходят численные методы. Один из самыхпростых и надежных – метод дихотомии.Метод основан на том, что непрерывная функция, меняющая знак нанекотором отрезке , обязательно принимает нулевое значение водной из точек этого отрезка. Если хотя бы один такой отрезок найден,пусть даже большой длины, то далее можно очень быстро найти решение уравнения = 0 с любой наперед заданной точностью.Метод дихотомии является итеративным, и заключается в том, что накаждой итерации отрезок, гарантированно содержащий корень уравнения, сокращается вдвое.
Соответственно, с ходом итераций эта длина быстро уменьшается. Например, за десять итераций длина отрезкасокращается примерно в 1000 раз1, за 20 итераций в 1000 000 раз и т.д.Итерации прекращают, как только достигнута необходимая точностьрешения, то есть корень уравнения локализован на достаточно маленьком отрезке.Итак, на -ой итерации метода дихотомии исходный отрезок [ , ]необходимо заменить в два раза меньшим. Перед началом итерациизнаки функции на концах отрезка известны и различны: на одномфункция принимает положительное значение, на другом – отрицательное. Найдем середину отрезка = + 2и вычислим значениефункции в этой точке.
Здесь возможны три варианта. Совсем маловероятный, что = 0. В этом случае искомая точка найдена абсолютно точно, и дальнейшие итерации можно прекратить. Но обычно значение функции в середине отрезка оказывается либо положительным,либо отрицательным. Из этого следует, что значения функции имеютразные знаки на концах только одного из двух отрезков, либо на110Точнее, в 2 =1024 раз83[ , ], либо на , . Именно на этом единственном отрезке гарантированно существует решение уравнения (нулевое значение функции).Соответственно, для следующей итерации принимают либо +1 = ,+1 = , либо +1 = , +1 = . Очевидно, и в том, и в другом случае длина отрезка [+1 , +1 ] в два раза меньше, чем [ , ].Вернемся к программированию и напишем программу, осуществляющую поиск решения с наперед заданной точностью = 10−6 . Начнем сописания переменных, предназначенных для хранения значений аргумента и функции на концах отрезка.DimDimDimDimDima As Double = 0b As Double = 1eps As Double = 0.000001Fa As Double = Math.Exp(-a) - aFb As Double = Math.Exp(-b) - bИтерации мы реализуем при помощи цикла Do … Loop.