информатика.методичка
.pdfРис. 7.1 Рис. 7.1
Выполнение этой лабораторной работы целесообразно начинать с копирования программного модуля VBA из лабораторной работы «Табулирование разветвляющейся функции».
ПРОГРАММНЫЙ МОДУЛЬ VBA ИЗ ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ РАЗВЕТВЛЯЮЩЕЙСЯ ФУНКЦИИ» СКОПИРОВАТЬ В МОДУЛЬ ПЕРВОГО ОБЪЕКТА
CommandButton1 ЛАБОРАТОРНОЙ РАБОТЫ «ОПЕРАТОРЫ ЦИКЛА».
Внести изменения, соответствующие использованию грамматической конструкции Do While … loop. Убедиться в правильности функционирования.
ПРОГРАММНЫЙ МОДУЛЬ VBA ПЕРВОГО ОБЪЕКТА CommandButton1 СКОПИРОВАТЬ В МОДУЛЬ ВТОРОГО ОБЪЕКТА CommandButton2.
Внести изменения, соответствующие использованию грамматической конструкции Do Loop … while. Убедиться в правильности функционирования.
Последовательно повторить эти операции для всех видов операторов цикла, т. е. до конструкции For Each … next включительно.
ПрограммытабулированияразветвляющейсяфункциивVВА с использованием операторов цикла
Private Sub CommandButton1_Click() Dim i As Integer
Dim j As Integer
Dim x As Double
Dim w As String
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 1), Cells(28, 3)) = Clear
xn = InputBox("xn =", "Введите начало диапазона", -3)
40 |
41 |
xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)
i= InputBox("i =", "Введите начало таблицы, строку", 7)
j= InputBox("j =", "Введите начало таблицы, столбец", 1) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"
i= i + 1
x= xn
Do While x <= xk
Cells(i, j) = Format(x, "0.0#") If x <= 0 Then
Cells(i, j + 1) = Format(g(x), "#0.0###") Else
Cells(i, j + 2) = Format(g(x), "#0.0###") End If
x= x + xd: i = i + 1 Loop
End Sub
Private Sub CommandButton2_Click() Dim i As Integer
Dim j As Integer
Dim x As Double
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 4), Cells(28, 6)) = Clear
xn = InputBox("xn =", "Введите начало диапазона", -3) xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)
i= InputBox("i =", "Введите начало таблицы, строку", 7)
j= InputBox("j =", "Введите начало таблицы, столбец", 4) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"
i= i + 1
x= xn Do
Cells(i, j) = Format(x, "0.0#") If x <= 0 Then
Cells(i, j + 1) = Format(g(x), "#0.0###") Else
Cells(i, j + 2) = Format(g(x), "#0.0###") End If
x= x + xd: i = i + 1
42
Loop While x <= xk
End Sub
Private Sub CommandButton3_Click() Dim i As Integer
Dim j As Integer
Dim x As Double
Dim w As String
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 7), Cells(28, 9)) = Clear
w = InputBox("w =", "очистить диапазон? - Y/N")
If w = "Y" Then Range(Columns(1), Rows(15)) = Clear xn = InputBox("xn =", "Введите начало диапазона", -3) xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5) i = InputBox("i =", "Введите начало таблицы, строку", 7)
j = InputBox("j =", "Введите начало таблицы, столбец", 7) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2" i = i + 1
x = xn
Do Until x > xk
Cells(i, j) = Format(x, "0.0#") If x <= 0 Then
Cells(i, j + 1) = Format(g(x), "#0.0###") Else
Cells(i, j + 2) = Format(g(x), "#0.0###") End If
x = x + xd: i = i + 1 Loop
End Sub
Private Sub CommandButton4_Click() Dim i As Integer
Dim j As Integer
Dim x As Double
Dim w As String
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 10), Cells(28, 12)) = Clear
xn = InputBox("xn =", "Введите начало диапазона", -3)
43
xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)
i= InputBox("i =", "Введите начало таблицы, строку", 7)
j= InputBox("j =", "Введите начало таблицы, столбец", 10) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"
i= i + 1
x= xn Do
Cells(i, j) = Format(x, "0.0#") If x <= 0 Then
Cells(i, j + 1) = Format(g(x), "#0.0###") Else
Cells(i, j + 2) = Format(g(x), "#0.0###") End If
x= x + xd: i = i + 1 Loop Until x > xk End Sub
Private Sub CommandButton5_Click() Dim i As Integer
Dim j As Integer
Dim x As Double
Dim w As String
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 13), Cells(28, 15)) = Clear
xn = InputBox("xn =", "Введите начало диапазона", -3) xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)
i= InputBox("i =", "Введите начало таблицы, строку", 7)
j= InputBox("j =", "Введите начало таблицы, столбец", 13) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"
i= i + 1
x= xn
While x <= xk
Cells(i, j) = Format(x, "0.0#") If x <= 0 Then
Cells(i, j + 1) = Format(g(x), "#0.0###") Else
Cells(i, j + 2) = Format(g(x), "#0.0###") End If
44
x = x + xd: i = i + 1 Wend
End Sub
Private Sub CommandButton6_Click() Dim i As Integer
Dim j As Integer
Dim x As Double
Dim w As String
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 16), Cells(28, 18)) = Clear
xn = InputBox("xn =", "Введите начало диапазона", -3) xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5) i = InputBox("i =", "Введите начало таблицы, строку", 7)
j = InputBox("j =", "Введите начало таблицы, столбец", 16) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"
i = i + 1
For x = xn To xk Step xd Cells(i, j) = Format(x, "0.0#") If x <= 0 Then
Cells(i, j + 1) = Format(g(x), "#0.0###") Else
Cells(i, j + 2) = Format(g(x), "#0.0###") End If
i = i + 1 Next x End Sub
Private Sub CommandButton7_Click() Dim i As Integer
Dim j As Integer
Dim k As Integer Dim x() As Double Dim y() As Double Dim w As String
w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")
If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 19), Cells(28, 21)) = Clear
‘If w = "Y" Then Range(Columns(1), Rows(19)) = Clear
45
xn = InputBox("xn =", "Введите начало диапазона", -3) xk = InputBox("xk =", "Введите конец диапазона", 7)
xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)
i= InputBox("i =", "Введите начало таблицы, строку", 7)
j= InputBox("j =", "Введите начало таблицы, столбец", 19) Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"
i= i + 1 i0 = i
ReDim x((xk - xn) / xd) ReDim y((xk - xn) / xd) For k = 0 To (xk - xn) / xd x(k) = xn + k * xd
y(k) = g(x(k)) Next k
For Each n In x
Cells(i, j) = Format(n, "0.0#")
i= i + 1 Next n
i= i0
k= 0
For Each n In y
If x(k) <= 0 Then Cells(i, j + 1) = Format(n, "#0.0###") Else Cells(i, j + 2) = Format(n, "#0.0###")
i = i + 1 k = k + 1 Next n End Sub
Некоторые комментарии к программам:
в программах используется специально созданная пользовательская функция g(x).
Процесс создания функции пользователя следующий:находясь в Excel, включить редактор VBA, нажав ALT-F11;включить режим вставки (insert);
выбрать Module;
в появившемся окне написать текст модуля, соответствующий программируемой функции –
Function g(x)
If x <= 0 Then g = Sin(x) Else g = Exp(-x)
End Function
46
нажать пиктограмму – Run Sub/UserForm;
в появившемся окне Macros щелкнуть по клавише Cancel, что обеспечивает внесение функции g(x) в библиотеку модулей мастера функций fx; с этого момента функция g(x) доступна всем пользователям мастера функций fx в разделах «Полный алфавитный перечень» либо «Определенные пользователем».
ИМЕНА ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ НЕ ДОЛЖНЫ СОВПАДАТЬ С АДРЕСАМИ ЯЧЕЕК ТАБЛИЦЫ EXCEL.
Впрограммах используется функция Format(x, "0.0#”), которая обеспечивает вывод указанной переменной, в данном случае X, в заданном формате «0.0#», в данном случае один разряд до десятичной точки, два – после.
Вмодуле с оператором For Each … next используется динамическое объявление массивов
Dim x() As Double
Dim y() As Double
с последующим уточнением мерности массивов
ReDim x((xk - xn) / xd)
ReDim y((xk - xn) / xd)
которое может размещаться в любом месте программы.
Так как оператор цикла For Each … next может оперировать только с элементами одного множества, то для вывода спектров значений аргумента X и функции g(x) используются два разных оператора
For Each n In x
…
Next n
и
For Each n In y
…
Next n.
47
8. ИГРА «УГАДАЙ ЧИСЛО»
Целью лабораторной работы является приобретение навыков практического использования функций RND (Randomize) – для генерирования случайных чисел в заданном диапазоне; Round – округление; Cstr для выполнения операции сцепления (конкатенации) символьных данных.
Сценарий, алгоритмигрыследующий: программа«загадывает» целое (для простоты) число в заданном диапазоне и на предлагаемые играющим варианты ответов сообщает – больше или меньше «загаданное» ею число, считая при этом количество попыток. Выводимая информация – диалог программы с игроком – определяется программистом (рис. 8.1).
Программа игры в VВА
Private Sub CommandButton1_Click() Dim L, a, x As Integer
Range(Cells(5, 1), Cells(25, 7)) = Clear
d = InputBox("D =", "Введите диапазон игры")
Cells(5, 2) = "Нучтож, играем, угадайчислоX вдиапазонеот0 до" + CStr(d) Randomize
x = Round(d * Rnd()) L = 0: i = 10: j = 2
10 a = InputBox("x =", "Введите ваш вариант") L = L + 1: i = i + 1
If x > a Then
Cells(i, j) = "Загаданное число X больше вашего числа " + CStr(a) GoTo 10
End If
If x < a Then
Cells(i, j) = "Загаданное число X меньше вашего числа " + CStr(a) GoTo 10
End If
If x = a Then
Cells(i, j) = "Да, эточисло" + CStr(a) + ", Угадал, за" + CStr(L) + " попыток" Cells(1, 1).Select
Exit Sub
End If
End Sub
48
Рис. 8.1 Рис. 8.1
Ну что ж,
49
Некоторые комментарии к программе:
в программе реализована только основа алгоритма;можнодобавитьнижнююграницудиапазона; выполнитьтре-
бования грамматики русского языка и с помощью условных операторов, считающих количество попыток, согласовать ответы программы; ввести предложение сыграть еще и т. д.
9. ПОЛЬЗОВАТЕЛЬСКИЕ ФОРМЫ
Целью лабораторной работы является приобретение навыков практического использования объектов Userform, Textbox, Label,
CheckBox, OptionButton и других.
Рекомендуется созданные пользовательские формы объединять и активизировать с помощью кнопочного меню (рис. 9.1, 9.2).
Рис. 9.1
Рис. 9.2
Каждая кнопка меню обеспечивает вызов соответствующего объекта Userform, например:
Private Sub CommandButton2_Click()
UserForm1.Show
End Sub
Кнопка 2 вызывает калькулятор 1, использующий для выбора арифметических операций объекты OptionButton (рис. 9.3).
50 |
51 |
пять объектов OptionButton;
два объекта CommandButton,
расположив их, как показано на рис. 9.3.
Если будут использоваться объекты Frame (рамка) (см. рис. 9.3), два из которых переименованы в «Исходные данные» и «Арифметические действия», то необходимо помнить правило:
Объекты помещаются в Frame, а не Frame «одевается» на объекты!
Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вычислить») объекта UserForm, и написать программу, обеспечивающую организацию взаимодействия выбранных объектов для получения результатов при выбранных арифметических операциях.
Рис. 9.3 |
|
9.1. Калькулятор с OptionButton |
|
Создание пользовательской формы организуется следующим |
|
образом: |
|
войти в VBA – Alt-F11; |
|
выбрать Insert (вставка); |
|
выбрать UserForm. |
|
Затем на появившуюся «платформу» объекта UserForm с пане- |
|
ли Toolbox (рис. 9.4) последовательно переместить: |
|
три объекта Label; |
|
три объекта Textbox; |
Рис. 9.4 |
52 |
53 |
Программа калькулятора с OptionButton
Private Sub CommandButton1_Click()
If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) Then
MsgBox "Исходныеданныевведеныневерноилинеполностью!", , "Введите числа"
Exit Sub
End If
A = CDbl(TextBox1)
B = CDbl(TextBox2)
If OptionButton1 = True Then TextBox3 = A + B
If OptionButton2 = True Then TextBox3 = A - B If OptionButton3 = True Then
If B <> 0 Then TextBox3 = A / B Else TextBox3 = "На ноль не делим!" End If
If OptionButton4 = True Then TextBox3 = A * B If OptionButton5 = True Then
If (A = 0) And (B <= 0) Then TextBox3 = "Недопустимые значения!" Else TextBox3 = A ^ B
End If
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Некоторые комментарии к программе:
в программе используется функция IsNumeric(TextBox1), проверяющая, являются ли данные, помещенные в объекте TextBox1 или TextBox2, цифровыми;
в программе используется функция CDbl(TextBox), обеспечивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;
в программе обрабатывается ситуация невозможности деления на ноль;
в программе обрабатывается ситуация невозможности возведения нуля в нулевую степень;
модуль объекта CommandButton2, который в свойстве Caption переименованв«Выход», обеспечиваетзавершениефункционирования объекта UserForm.
54
9.2. Калькулятор с CheckBox
Создание пользовательской формы организуется следующим образом:
войти в VBA – Alt-F11;
выбрать Insert (вставка);
выбрать UserForm.
Затем на появившуюся «платформу» объекта UserForm с панели Toolbox (см. рис. 9.4) последовательно переместить:
два объекта Label;семь объектов Textbox;пять объектов CheckBox;четыре объекта Frame;
два объекта CommandButton,
расположив их, как показано на рис. 9.5.
Рис. 9.5
55
В объекте UserForm используются четыре объекта Frame (рамка) (см. рис. 9.5), три из которых переименованы в «Исходные данные», «Результаты» и «Арифметические действия».
Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вычислить») объекта UserForm, и написать программу, обеспечивающую организацию взаимодействия выбранных объектов для получения результатов при выбранных арифметических операциях.
Программа калькулятора с CheckBox
Private Sub CommandButton1_Click()
If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) Then
MsgBox "Исходныеданныевведеныневерноилинеполностью!", , "Введите числа"
Exit Sub
End If
A = CDbl(TextBox1)
B = CDbl(TextBox2)
If CheckBox1 = True Then TextBox3 = A + B Else TextBox3 = "" If CheckBox2 = True Then TextBox4 = A - B Else TextBox4 = "" If CheckBox4 = True Then
If B <> 0 Then TextBox6 = A / B Else TextBox6 = "На ноль не делим!" Else TextBox6 = ""
End If
If CheckBox3 = True Then TextBox5 = A * B Else TextBox5 = "" If CheckBox5 = True Then
If A = 0 And B <= 0 Then TextBox7 = "Недопустимые значения!" Else TextBox7 = A ^ B
Else TextBox7 = "" End If
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Некоторые комментарии к программе:
калькулятор с CheckBox, в отличие от калькулятора с OptionButton, позволяет вывести одновременно результаты вычисле-
ний всех или части выбранных операций, для чего используются пять объектов TextBox;
впрограммеиспользуетсяфункцияIsNumeric(TextBox), проверяющая, являются ли данные, помещенные в объекте TextBox1 или TextBox2, цифровыми;
в программе используется функция CDbl(TextBox), обеспечивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;
в программе обрабатывается ситуация невозможности деления на ноль;
в программе обрабатывается ситуация невозможности возведения нуля в нулевую степень;
в программе обеспечивается ситуация вывода пустого окна в случае, если какой-либо CheckBox не выбран;
модуль объекта CommandButton2, который в свойстве Caption переименован в «Выход», обеспечивает завершение функционирования объекта UserForm.
9.3. Логарифмический калькулятор
Создание пользовательской формы организуется следующим образом:
войти в VBA – Alt-F11;
выбрать Insert (вставка);
выбрать UserForm.
Затем на появившуюся «платформу» объекта UserForm с панели Toolbox (см. рис. 9.4) последовательно переместить:
два объекта Label;пять объектов Textbox;три объекта CheckBox;четыре объекта Frame;
два объекта CommandButton,
расположив их, как показано на рис. 9.6.
В объекте UserForm используются четыре объекта Frame (рамка) (см. рис. 9.6), три из которых переименованы в «Исходные данные», «Результаты» и «Действия».
56 |
57 |
Рис. 9.6
Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вычислить») объекта UserForm, и написать программу, обеспечивающую организацию взаимодействия выбранных объектов для получения результатов при выбранных математических операциях.
Программа логарифмического калькулятора
Private Sub CommandButton1_Click()
If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) Then
MsgBox "Исходныеданныевведеныневерноилинеполностью!", , "Введите
числа"
58
Exit Sub
End If
A = CDbl(TextBox1)
B = CDbl(TextBox2)
If CheckBox1 = True Then
If B > 0And B <> 1AndA> 0 Then TextBox3 =Application.WorksheetFunction. Log(A, B) Else TextBox3 = "Недопустимые значения!"
Else TextBox3 = "" End If
If CheckBox2 = True Then
If A > 0 Then TextBox4 = Application.WorksheetFunction.Log10(A) Else TextBox4 = "Недопустимые значения!"
Else TextBox4 = "" End If
If CheckBox3 = True Then
If A > 0 Then TextBox5 = Application.WorksheetFunction.Ln(A) Else TextBox5 = "Недопустимые значения!"
Else TextBox5 = "" End If
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Некоторые комментарии к программе:
логарифмический калькулятор с CheckBox позволяет вывести одновременно результаты вычислений трех видов логарифмов или некоторых, для чего используются три объекта TextBox;
в программе используется функция IsNumeric(TextBox1), проверяющая, являются ли данные, помещенные в объекте TextBox1 или TextBox2, цифровыми;
в программе используется функция CDbl(TextBox), обеспечивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;
в программе обрабатывается ситуация невозможности вычисления логарифмов от отрицательного числа или числа, равного нулю;
в программе обеспечивается ситуация вывода пустого окна в случае, если какой-либо CheckBox не выбран;
59