Описание выполнения Задания 5.
Название работы: Задание 5.
Тема задания: “Процедуры и функции пользователя”.
Цель задания: Освоение принципов создания собственных процедур и функций пользователя, создания стандартного модуля в приложении и ознакомление с элементом управления ComboBox.
В этом задании нужно решить одну и ту же задачу, как с помощью создания пользовательской процедуры, так и с помощью создания соответствующей функции. В качестве примера выполнения данного задания ниже приводится решение следующей задачи:
Составить процедуру и функцию для вычисления:
Y =
принимая, что аргумент Х по модулю меньше единицы. Вычисления проводить до тех пор, пока модуль разности между очередным слагаемым и его предыдущим значением больше малой заданной величины, рассматриваемой в качестве точности вычислений.
Полученные подпрограммы записать в модуль. Используя подпрограммы модуля, вывести на экран с заданной точностью таблицу значений Y для аргумента Х от его заданного начального значения до заданного конечного значения с заданным шагом.
Создаем на дискете папку “Задание_5”, в которой нужно будет сохранить проект с 5-м заданием.
Открываем новый проект и размещаем на форме 8 меток, элементы ComboBox и ListBox, 2 командные кнопки.
Таблица свойств формы и расположенных на ней элементов управления
Объект |
Свойство |
Значение свойства |
Форма |
Name Caption Font |
frmZ5r Процедуры и функции пользователя Times New Roman, жирный, размер 12 |
Метка |
Name Caption Alignment Font |
Label1 Выводится условие текущей задачи 0-левая привязка MS Sans Serif, обычный, размер 8 |
Метка |
Name Caption Alignment Font ForeColor |
Label2 Исходные данные 2-центровка MS Sans Serif, жирный, размер 12 vbBlue
|
Метка |
Name Caption Alignment Font |
Label3 Значение задается в процедуре 0-левая привязка MS Sans Serif, обычный, размер 8 |
Метка |
Name Caption Alignment Font |
Label4 Значение задается в процедуре 0-левая привязка MS Sans Serif, обычный, размер 8 |
Метка |
Name Caption Alignment Font |
Label5 Значение задается в процедуре 0-левая привязка MS Sans Serif, обычный, размер 8 |
Метка |
Name Caption Alignment Font |
Label6 Значение задается в процедуре 0-левая привязка MS Sans Serif, обычный, размер 8 |
Метка |
Name Caption Alignment Font ForeColor |
Label7 Результат вычислений 2-центровка MS Sans Serif, жирный, размер 12 vbRed |
Метка |
Name Caption Alignment Font ForeColor |
Label8 X Y 2-центровка MS Sans Serif, жирный курсив, размер 14 vbBlue |
Комбинированный список |
Name Text Font ForeColor |
Combo1 Выбор средства Times New Roman, обычный, размер 11 vbBlue |
Список |
Name |
List1 |
Командная кнопка |
Name Caption Font BackColor |
Command1 MS Sans Serif, обычный, размер 8 Вычислить &HFFFFC0 |
Командная кнопка |
Name Caption Font BackColor |
Command2 MS Sans Serif, обычный, размер 8 Выход &HC0FFC0 |
Вид формы frmZ5r:
Процедура вывода условия задачи в момент загрузки формы:
Private Sub Form_Load()
Label1 = " Составить процедуру и функцию для вычисления:" & vbCrLf & _
"Y = 1 + 2/x + 2*3/x^2 + 2*3*2/x^3 + 2*3*2*3/x^4 + ... ," & vbCrLf & _
"принимая, что аргумент X по модулю меньше единицы. Вычисления проводить до тех пор, пока модуль " & vbCrLf & _
"разности между очередным слагаемым и его предыдущим значением больше заданной величины, " & vbCrLf & _
"рассматриваемой в качестве точности вычислений." & vbCrLf & _
" Полученные подпрограммы записать в модуль. Используя подпрограммы модуля, вывести с заданной " & vbCrLf & _
"точностью таблицу значений Y для аргумента X от его заданного начального значения до заданного " & vbCrLf & _
"конечного значения с заданным шагом изменения."
End Sub
Процедура и функция стандартного модуля приложения,
вычисляющие сумму членов ряда для заданного значения x:
Public Sub p(ByVal x!, ByVal eps#, ByRef sum#)
Dim pred#, posl#
Dim ch%, sum_sk_ch%, sk_ch%
Dim zn%, sum_sk_zn%, sk_zn%
Dim z%, kf!
' sum_sk_ch - сумма скачков между соседними числовыми
' сомножителями числителя
' sk_ch - текущий скачок между соседними числовыми
' сомножителями числителя
' sum_sk_zn - сумма скачков между соседними числовыми
' сомножителями знаменателя
' sk_zn - текущий скачок между соседними числовыми
' сомножителями знаменателя
' ch - очередной числовой сомножитель числителя
' zn - очередной числовой сомножитель знаменателя
' z - знак очередного члена ряда
' kf - числовой коэффициент очередного члена ряда
ch = 1: sum_sk_ch = 6: sk_ch = 4
zn = 2: sum_sk_zn = 9: sk_zn = 5
z = -1: sum = 1 - x / 2
pred = 1: posl = -x / 2
Do While Abs(Abs(pred) - Abs(posl)) > eps
sk_ch = sum_sk_ch - sk_ch: ch = ch + sk_ch
sk_zn = sum_sk_zn - sk_zn: zn = zn + sk_zn
kf = ch / zn: z = -z
pred = posl
posl = pred * z * kf * x
sum = sum + posl
Loop
End Sub
Public Function f(ByVal x!, ByVal eps#) As Double
Dim pred#, posl#, sum#
Dim ch%, sum_sk_ch%, sk_ch%
Dim zn%, sum_sk_zn%, sk_zn%
Dim z%, kf!
ch = 1: sum_sk_ch = 6: sk_ch = 4
zn = 2: sum_sk_zn = 9: sk_zn = 5
z = -1: sum = 1 - x / 2
pred = 1: posl = -x / 2
Do While Abs(Abs(pred) - Abs(posl)) > eps
sk_ch = sum_sk_ch - sk_ch: ch = ch + sk_ch
sk_zn = sum_sk_zn - sk_zn: zn = zn + sk_zn
kf = ch / zn: z = -z
pred = posl
posl = pred * z * kf * x
sum = sum + posl
Loop
f = sum
End Function
Процедура, вычисляющая значения сумм ряда для значений x
из заданного диапазона:
Private Sub Command1_Click()
Dim x As Single, y As Double
Dim xn As Single, dx As Single, xk As Single
Dim eps As Double, b As Boolean, s As String
Dim g As Double, i As Byte, j As Byte
xn = Val(InputBox("Введите начальное значение x"))
Label3.Caption = "Начальное значение x = " & xn
dx = Val(InputBox("Введите шаг по x"))
Label4.Caption = "Шаг по x = " & dx
xk = Val(InputBox("Введите конечное значение x"))
Label5.Caption = "Конечное значение x = " & xk
eps = Val(InputBox("Введите точность вычисления"))
Label6.Caption = "Точность вычислений = " & eps
'Выбор средства вычислений: с помощью процедуры или функции
If Combo1.Text = "Процедура" Then
b = True
Else
b = False
End If
'Вычисление значения суммы ряда для заданного интервала значений x.
List1.Clear
x = xn
Do While x < xk + 0.5 * dx
If b Then
Call p(x, eps, y)
Else
y = f(x, eps)
End If
' Вывод результатов вычисления суммы ряда с заданной точностью
g = eps: j = 0
Do While g < 1
g = g * 10
j = j + 1
Loop
s = "#0."
For i = 1 To j
s = s & "0"
Next i
List1.AddItem " " & Format(x, "0.00") & Space(16) & Format(y, s)
' Переход к следующему значению x из заданного диапазона
x = x + dx
Loop
End Sub
Вид формы с результатом решения задачи с помощью созданной
процедуры пользователя.
Вид формы с решением той же задачи с использованием созданной функции пользователя.
Процедура завершения работы приложения:
Private Sub Command3_Click()
End
End Sub
Как обычно добавляем к проекту форму-заставку frmZ5z. После ее разработки запускаем приложение на выполнение.
Вопросы для защиты Задания 5.
1. Назначения и основные свойства элементов управления ListBox и
MSFlexGrid.
2. Как добавить элемент MSFlexGrid на панель элементов управления?
3. Как выделить цветом отдельную ячейку элемента MSFlexGrid?
4. Какие существуют способы заполнения списка ListBox ( на этапах run и
design)?
5. В чем отличие в добавлении новых элементов в уже существующий список
ListBox с помощью свойства List и метода AddItem?
6. Отличие в предназначении цикла с параметром от итерационных циклов.
7. Как досрочно выйти из цикла с параметром и из итерационных циклов
любого типа?
8. В чем отличия итерационных циклов с предусловием и постусловием?
9. В чем отличия в работе итерационных циклов, в конструкции которых
используются ключевые слова While и Until?
10. Какие виды массивов существуют и как они объявляются?
11. Как переопределить размерность массива с сохранением его
содержимого?
12. Назначение функции Rnd и оператора Randomize.
Желаю успешной защиты Задания 5!