Программирование на visual basic
Скачать 1.19 Mb.
|
3.2.4.1. Блочный полный If Общий вид: If(L) Then S Else S1 End If где L - логическое выражение; S, S1 - блоки операторов. Оператор работает следующим образом. Вычисляется логическое выражение L. Если оно истинно, то выполняется блок операторов S, после чего управление передается оператору следующему за End If. Если L - ложно, то выполняется блок операторов S1, после чего управление передается оператору, следующему за End If. 29 ⎪ ⎪ ⎪ ⎩ ⎪⎪ ⎪ ⎨ ⎧ ≥ ∈ − ∈ + − ∈ π − < = 7 x , 0 ) 7 , 2 [ x , x 7 ) 2 , 0 [ x , 1 2 x ) 0 , 1 [ x , x cos 1 x , 0 y 3.2.4.2. Составной блочный if Общий вид: If(L) Then S ElseIf(L 1 ) THEN S 1 ElseIf (L 2 ) THEN S 2 …............................ ElseIf (L N ) THEN S N Else S N+1 End If где L, L 1 , L 2 , …,L N - логические выражения; S, S 1 , S 2 , …,S N , S N+1 - блоки операторов. Оператор работает сле- дующим образом. Вычисляется логическое выражение L, если оно истин- но, то выполняется блок операторов S, после чего управ- ление передается оператору следующему за End If; ина- че вычисляется логическое выражение L 1 , если оно ис- тинно, то выполняется блок операторов S 1 , после чего управление передается оператору, следующему за END If, и т.д. Если все логические выражения L, L 1 , L 2 , …,L N ложны, то выполняется блок операторов S N+1 . Таким об- разом, выполняется ближайший блок операторов S i , для которого логическое условие L i принимает значение "истина", после чего происходит выход из блока. Else и блок S N+1 необязательны Пример 1. Решить линейное алгебраическое уравнение a·x=b Sub РешениеЛинейногоУравнения() Dim a As Double, b As Double, x As Double a = CDbl(InputBox("Введите a")) b = CDbl(InputBox("Введите b")) If a <> 0 Then x = b / a : Debug.Print " x= "; x ElseIf b <> 0 Then Debug.Print " Уравнение не имеет решения" Else Debug.Print " Любое число является решением уравнения" End If End Sub Пример 2. Вычислить значение функции: Sub ПримерНаСоставнойIf() Dim x As Double, y As Double 30 x = CDbl(InputBox("Введите аргумент функции")) If x < -1 Then y = 0 ElseIf x < 0 Then y = Cos(3.14159 * x) ElseIf x < 2 Then y = x ^ 2 + 1 ElseIf x < 7 Then y = 7 - x Else y = 0 End If MsgBox ("y= " + Str(y)) End Sub 2.3. Оператор выбора В разветвляющихся алгоритмах достаточно часто применяется опера- тор выбора. В зависимости от значения управляющего параметра key управление программой передается в определенный блок: Select Case key Case Lkey 1 S 1 Case Lkey2 S2 …..................... Case Lkey N SN [Case Else S N+1 ] End Select где key - любое числовое или строковое выражение. Lkey1, Lkey2, … , LkeyN - список значений, которые могут быть константными выражениями; S1, S2, … , SN, SN+1 - блоки операторов. Case Else является необязательным. Список значений Lkeyi можно задавать либо одним значением, либо списком отдельных значений, раз- деленных запятыми, либо диапазоном значений. Case Else ─ необязателен. Например: Case 5,12,19 - блок выполняется, если управляющий параметр равен либо 5, либо 12, либо 19. Case 2 To 10 - блок выполняется, если управляющий параметр заключен в диапазоне от 2 до 10. Case “A“ To ”z“ - блок выполняется, если управляю- щий параметр символьного типа является латинской буквой. Case 5To 10,15, Is > 20 блок выполняется, если управляющий параметр заключен в диапазоне от 5 до 10 или =15 или >20. Оператор Select работает следующим образом: Проверяется, есть ли среди списка Lkey 1 значение равное значению пе- ременной key. Если есть, то выполняется блок операторов S, а после вы- полнения этих операторов происходит выход из оператора Select. Если нет, то проверяется следующий список Lkey 2 . И так далее. Если переменная 31 key не принимает ни одно из перечисленных в Case значений, то если при- сутствует Case Else, выполняется блок операторов S N+1 , а если отсутству- ет, то происходит выход из оператора Select и выполняется оператор сле- дующий за End Select. Пример . Программа должна вывести количество дней в текущем меся- це и выводит текущее число. Sub ВывестиКоличествоДнейВТекущемМесяце() Dim n_day As Long Select Case Month(Now) Case 1, 3, 5, 7, 8, 10, 12 ' В эти месяцы 31 день n_day = 31 Case 4, 6, 9, 11 ' В эти месяцы 30 день n_day = 30 Case 2 ' Если текущий год високосный и месяц февраль If (Year(Now) Mod 4) = 0 Then n_day = 29 Else n_day = 28 End Select MsgBox ("В текущем месяце " & Str(n_day) & " дней " & " Сегодня " _ & day(Now) & "." & Month(Now) & "." & Year(Now)) End Sub 2.4. Операторы цикла Для выполнения циклических процессов используются операторы цик- ла. В VB существуют несколько операторов цикла. Операторы цикла по- зволяют многократно повторять вычисления некоторого участка програм- мы, называемого областью цикла, при разных значениях некоторых пара- метров. 2.4.1. Оператор цикла For …Next Общий вид оператора: For ForPar = begin To end [step inc] Операторы, составляющие тело цикла: [Exit For] Next ForPar ForPar - переменная целого или действительного типа, называемая па- раметром цикла; begin, end – выражения, задающие начальное и конечное значения па- раметра цикла; inc - необязательное выражение, задающее приращение параметра цик- ла, называемое шагом параметра цикла. Если шаг не указывается, то он (по умолчанию) принимается равным 1. Оператор работает следующим образом: 1. Параметру цикла ForPar присваивается начальное значение begin. 2. Проверяется выполнение условие sgn(inc)* ForPar ≤ end *sgn(inc), где sgn - функция определяющая знак аргумента. 32 3. Если это логическое условие принимает значение «истина», то вы- полняются операторы тела цикла и происходит переход на шаг 4. Если ло- гическое условие шага 2 принимает значение «ложь», то происходит выход из цикла, т.е. переход на шаг 5. 4. Параметр цикла получает приращение на величину inc (т.е. выполня- ется оператор присваивания ForPar = ForPar +inc), и происходит переход на шаг 2. 5. Выполняется следующий за Next For оператор. 6. Если в теле цикла встречается оператор Exit For – происходит выход из текущего цикла. Примечание. При использовании вложенных циклов закрывается вна- чале ближайший к текущему оператору Next For незакрытый цикл. Примеры. Пример 1 . Найти сумму первых 1000 членов ряда Дирихле: Sub СуммаРядаДирихле () Dim s As Double, n As Long s = 0 ‘ Обнуление переменной, в которой накапливается сумма For n = 1 To 100 ‘ Цикл выполняется 100 раз s = s + 1 / n^2 ‘ Накопление суммы в переменной s Next n ‘ Увеличение параметра цикла на 1 MsgBox (“Сумма= ” & s) ‘ Вывод результата в стандартное окно End Sub Пример 2 . Написать программу, которая табулирует функцию y=sin 2 x в диапазоне [0, π]. Sub ТабуляцияФункции() Dim pi As Double, x As Double, h As Double, i As Long Sheets("Лист1").Select ‘ Выбрать объект рабочий лист “Лист1” pi = 3.1415926535897: h = pi / 20: Row = 0 For x = 0 To pi + h / 100 Step h Row = Row + 1 ‘ Номер строки для вывода результатов Cells(Row, 1) = x ‘ В первый столбец абсциссы функции Cells(Row, 2) = Sin(x) ^ 2 ‘ Во второй столбец ординаты Next x End Sub Результатом работы данной программы является таблица, состоящая из двух столбцов по 21 значению в каждом. Для вывода результатов исполь- зуется рабочий лист Excel c именем Лист1. После завершения работы про- граммы можно при помощи мастера диаграмм построить график получен- ной функции. В первый столбец рабочего листа выводятся абсциссы, а во второй - ординаты точек функции. Для того чтобы организовать вывод ре- зультатов в рабочий лист, необходимо при помощи метода Select активи- зировать объект Sheets (рабочий лист) с именем Лист1. Вместо имени 100 1 2 1 ∑ = n n 33 Лист1 можно написать имя любого существующего в книге рабочего лис- та. При использовании в качестве параметра цикла переменной действи- тельного типа приращение параметра цикла вычисляется приближенно. Поэтому конечное значение параметра цикла необходимо немного увели- чить, чтобы цикл выполнился для конечного значения параметра цикла. В данном примере конечное значение параметра цикла равно не pi, а чуть больше pi+h/100. Пример 3. Найти двухмерную сумму ∑∑ = = + + 80 1 50 1 3 2 i j j i i j Sub ДвухмернаяСумма() Dim s As Double, i As Long, j As Long s = 0 For i = 1 To 80 For j = 1 To 50 s = s + (i + j) / (i ^ 2 + j ^ 3) Next j, i ‘ Если оба цикла заканчиваются одновременно MsgBox ("Сумма= " + Str(s)) End Sub 2.4.2. Оператор цикла While Общий вид оператора: While L Операторы, составляющие тело цикла: Wend где L - логическое выражение. Оператор работает следующим образом. 1. Вычисляется логическое условие L. 2. Если L принимает значение “Истина”, то выполняются операторы, составляющие тело цикла, а затем происходит переход на пункт 1. 3. Если L=”Ложь”, то происходит переход на оператор стоящий за оператором Wend. Более коротко: тело цикла выполняется до тех пор пока L=”Истина”. Пример. Написать игровую программу. Машина загадывает натураль- ное случайное трехзначное число. Человек должен за меньшее число по- пыток угадать его. Sub УгадайЧисло() Dim Number As Long, NumberRand As Long, ic As Long ' Генерировать произвольный ряд псевдослучайных чисел Randomize Timer ic=0 ‘ В этой переменной накапливаем количество ‘совершенных попыток ' Получение натурального случайного трехзначного числа NumberRand = 899 * Rnd + 100 ' Выполнять пока не угадали полученное случайное число 34 ‘NumberRand While Number <> NumberRand Number = Val(InputBox("Введите трехзначное число")) ic = ic + 1 If Number > NumberRand Then MsgBox ("Много") _ Elseif Number < NumberRand Then MsgBox ("Мало") Wend Dim S as String : S=” Угадал за " & ic & " попыток." Select Case ic ' Оценка результата игры Case Is < 10 S=S+"Гений!” Case 10 To 15 S=S+"Молодец!" Case 16 To 20 S=S+"Неплохо!" Case Else S=S+" Плохо!” End Select MsgBox(S) End Sub 2.4.3. Операторы цикла Do Таких операторов пять. Операторы, заключенные между строками с ключевыми словами Do и Loop, называются телом оператора цикла. Общий вид Описание работы оператора Do While L S 1 [Exit Do] S 2 Loop 1. Вычисляется логическое выражение L. 2. Если L — истина , то выполняется тело цикла, иначе происходит выход из цикла, т.е. переход на пункт 5. 3. Если среди операторов тела цикла встречается опе- ратор Exit Do, то происходит переход на пункт 5. 4. Переход на пункт 1. 5. Оператор, следующий за оператором Loop. Do Until L S 1 [Exit Do] S 2 Loop 1. Вычисляется логическое выражение L. 2. Если L — ложь , то выполняется тело цикла, иначе происходит выход из цикла (пункт 5). 3. Если среди операторов тела цикла встречается опе- ратор Exit Do, то происходит выход из цикла (пункт 5). 4. Переход на пункт 1. 5. Оператор, следующий за оператором Loop. Do S 1 [Exit Do] S 2 1. Выполняется тело цикла. 2. Если встречается оператор Exit Do, то происходит выход из цикла (пункт 5). 3. Вычисляется логическое выражение L. 35 Loop While L 4. Если L — истина , то выполняется переход на 1, иначе — выход из цикла (5). 5. Оператор, следующий за оператором Loop. Do S 1 [Exit Do] S 2 Loop Until L 1. Выполняется тело цикла. 2. Если встречается оператор Exit Do, то происходит выход из цикла (пункт 5). 3. Вычисляется логическое выражение L. 4. Если L — ложь , то происходит переход на 1, иначе — выход из цикла. 5. Оператор, следующий за оператором Loop. Do S 1 [Exit Do] S 2 Loop Бесконечный цикл. Выполнять тело цикла до тех пор, пока не встретится оператор Exit Do. В таблице S 1 , S 2 – пустой или непустой блок операторов VB. Пример . Вычислить значение функции для любого значения аргумента x, введенного с клавиатуры. Необходимо найти сумму бесконечного ряда. В развернутом виде эта сумма имеет вид: Слагаемые данного ряда являются индуктивными. Чтобы получить очередное слагаемое необходимо предыдущее слагаемое умножить на x и разделить на число равное номеру очередного слагаемого. Сумму вычис- ляем до тех пор, пока очередное слагаемое не станет по абсолютной вели- чине меньше некоторого малого значения. Sub БесконечнаяСумма() Dim x As Double, s As Double, a As Double, n As Long x = CDbl(InputBox("Введите аргумент функции")) a = x: s = a: n = 1 Do Until Abs(a) < 0.00000001 ‘ До тех пока условие=”Ложь” n = n + 1 : a = a * x / n : s = s + a Loop MsgBox ("Значение функции=" + Str(s)) End Sub n! x S(x) 1 n n ∑ ∞ = = 4 3 2 1 3 2 1 2 1 ) ( 4 3 2 … + ⋅ ⋅ ⋅ + ⋅ ⋅ + ⋅ + = x x x x x S 36 3. Массивы и пользовательские типы данных 3.1. Массивы переменных Массив - это упорядоченная последовательность однотипных данных, занимающих непрерывную область памяти, к которой можно обратиться по имени. Элемент этой последовательности называется элементом масси- ва. 3.1.1. Описание массива При описании массива необходимо указать его тип, размерность и диа- пазон изменения индексов. Размерность массива ⎯ это количество изме- рений. Бывают одномерные (векторы), двухмерные (матрицы или табли- цы) и многомерные массивы. Обычно массивы описывают в операторах описания переменных. Описание массива имеет вид: Dim name1(d 1 ,d 2 ,...,d n ) as тип, name2(d 1 ,d 2 ,...,d k ) as тип,… где name1 - имя массива; d 1 ,d 2 ,...,d n - диапазон изменения индексов; n - раз- мерность массива. При этом d i имеют вид (n 1 to n 2 ) (n 1 - нижняя, а n 2 - верхняя граница изменения индексов). Размерность массива n не может превышать 60. Нижняя граница массива n 1 — необязательна. Значение этой границы устанавливается оператором Option Base , который можно вставлять в начале модуля. По умолчанию Option Base 0, т.е., если n 1 опу- щено, то n 1 = 0. Если закодировать Option Base 1 - то по умолчанию n 1 =1. Примеры. Option base 1 Dim a(10 to 100) As Double, b(3,3) As Long, c(-2 to 4) As Integer Описываются три действительных массива a , b и c . В массиве a 91 элемент: a 10 ,a 11 , ..., a 100 . Массив b является матрицей состоящей из 9 эле- ментов: b 1,1 , b 2,1 , b 3,1 , b 1,2 ,b 2,2 , b 3,2 , b 1,3 , b 2,3 , b 3,3 . В памяти двухмерные массивы хранятся по столбцам, т.е. массив b хранится, как в приведенной выше последовательности. Массив c состоит из семи элементов: c -2 , c -1 , c 0 , c 1 , c 2 , c 3 , c 4 Обращение к элементу массива производится по имени массива, за ко- торым следуют в круглых скобках индексы разделенные запятыми. Например, чтобы обратиться к элементу матрицы b , стоящему в треть- ей строке и втором столбце, необходимо написать b(3,2). Нижнюю и верхнюю размерности массива Name можно узнать при по- мощи двух функций LBound(Name) и UBound(Name). Пример. Вводится 100 случайных целых чисел в диапазоне от -100 до 1000. Найти минимальное, среднее арифметическое и максимальное зна- чения этих чисел. Получить и вывести новый массив, разделив элементы первого массива на среднее арифметическое первого массива. Sub МассивСлучайныхЧисел() Const N = 100 ' Удобно описывать размерности массивов 37 Dim a(N) As Integer, b(N) As Double, s As Double Dim min As Integer, max As Integer, i As Integer ' это самое большое и самое малое числа типа integer min = 32767: max = -32768 ‘ или min=&H7FFF: max=&H8000 s = 0 ' Очистить переменную, в которой будем накапливать сумму Randomize Timer ' Настройка ряда случайных чисел For i = 1 To N a(i) = Rnd * 1100 - 100 ' Получение случайного числа [-100,1000] If a(i) < min Then min = a(i) ' Поиск наименьшего If a(i) > max Then max = a(i) ' Поиск наибольшего s = s + a(i) ' Накопление суммы Next i s = s / N ' Среднее значение MsgBox ("Минимальное =" & min & "Среднее =" & s & _ "Максимальное = " & max) ' Массивы a и b лучше выводить в ячейки рабочего листа Sheets("Лист1").Select ' Перейти на рабочий лист с именем Лист1 For i = 1 To N b(i) = a(i) / s Cells(i, 1) = a(i) ' В 1-ый столбец Cells(i, 2) = b(i) ' Во 2-ой столбец Next i End Sub 3.1.2. Задание начальных значений элементам массива При описании статического массива оператором Dim всем элементам массива присваиваются начальные значения по умолчанию в зависимости от типа массива: 0 – для числовых массивов; “” – пустая строка для символьных массивов; false – для логических массивов; 0:00:00 – для переменных типа Date. Часто необходимо присвоить элементам массива начальные данные, отличные от значений по умолчанию. Для решения этой задачи существует много методов. Приведем шесть наиболее часто встречающихся: 1. При помощи оператора присваивания задать всем элементам массива начальные значения. 2. В цикле прочитать значения элементов с рабочего листа или с файла и присвоить элементам массива. 3. Вычислить по формулам. 4. Задать при помощи функции Array. 5. Задать при помощи датчика случайных чисел. 6. При помощи функции InputBox. |