Главная страница
Навигация по странице:

  • 3.2.4.2. Составной блочный if

  • Пример 1. Решить линейное алгебраическое уравнение a·x=b

  • 2.4.1. Оператор цикла For …Next

  • Примечание.

  • 2.4.2. Оператор цикла While Общий вид оператора: While L Операторы, составляющие тело цикла: Wend

  • 2.4.3. Операторы цикла Do

  • 3.1.1. Описание массива

  • Option Base , который можно вставлять в начале модуля. По умолчанию Option Base 0, т.е., если n1 опу- щено, то n1 = 0. Если закодировать Option Base

  • Примеры. Option base 1 Dim a(10 to 100) As Double, b(3,3) As Long, c(-2 to 4) As Integer Описываются три действительных массива a , b и c

  • 3.1.2. Задание начальных значений элементам массива

  • Программирование на visual basic


    Скачать 1.19 Mb.
    НазваниеПрограммирование на visual basic
    Анкорvb.pdf
    Дата05.06.2021
    Размер1.19 Mb.
    Формат файлаpdf
    Имя файлаvb.pdf
    ТипУчебное пособие
    #214287
    страница4 из 17
    1   2   3   4   5   6   7   8   9   ...   17
    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.
    1   2   3   4   5   6   7   8   9   ...   17


    написать администратору сайта