Составить схему алгоритма, выбирающую тип

advertisement
Глава 4. Примеры программной реализации некоторых
инженерных и вычислительных задач в среде VBA
Задача. Рассчитать параметры сварного шва двух полос из стали марки СТ-3
Составить схему алгоритма, выбирающую тип сварного шва
(угловой или стыковой) в зависимости от исходных данных:
величины статической растягивающей нагрузки P , толщины ,
и ширины b стальных полос. При сварке полос из стали СТ3
использованы электроды Э34.
Выражения для расчёта углового шва:
Pугл = 1,4* b* *[]`ср ,
[]`ср = 0,5*[]р .
Выражения для расчёта стыкового шва:
Pстык =  * b*[]`р ,
[]`р = 0,6*[]р , где []р = 160 Мпа.
Текст Программы:
Private Sub CommandButton1_Click()
Dim a As Variant 'толщина
Dim b As Variant 'ширина
Dim P As Variant 'статическая растягивающая нагрузка
Dim Pugl As Single 'угловая
Dim Pstik As Single 'стыковая
Dim p1 As Single
Dim a1 As Single
Dim b1 As Single
'---------------------------------------------------------------------------P = TextBox1.Value
'Проверка содержимого Текстового Поля
Call wwod(P, res, res1, res2)
If res = 4 Then
TextBox1.SetFocus
Exit Sub
End If
If res1 = 4 Then
TextBox1.SetFocus
Exit Sub
End If
If res2 = 4 Then
TextBox1.SetFocus
Exit Sub
End If
'---------------------------------------------------------------------------a = TextBox2.Value
'Проверка содержимого Текстового Поля
Call wwod(a, res, res1, res2)
If res = 4 Then
TextBox2.SetFocus
Exit Sub
End If
If res1 = 4 Then
TextBox2.SetFocus
Exit Sub
End If
If res2 = 4 Then
TextBox2.SetFocus
Exit Sub
End If
2
'---------------------------------------------------------------------------b = TextBox3.Value
'Проверка содержимого Текстового Поля
Call wwod(b, res, res1, res2)
If res = 4 Then
TextBox3.SetFocus
Exit Sub
End If
If res1 = 4 Then
TextBox3.SetFocus
Exit Sub
End If
If res2 = 4 Then
TextBox3.SetFocus
Exit Sub
End If
'-----------------------------------------------------------------------------
p1 = CSng(P)
a1 = CSng(a)
b1 = CSng(b)
'----------------------------------------------------------------------------Pugl = a * b * 0.6 * 160
'------------------------Pstic = a * b * 0.7 * 160
'------------------------TextBox4.Text = CStr(Pugl)
TextBox5.Text = CStr(Pstic)
If p1 <= Pugl Then
TextBox6.Text = "Возможен Угловой Шов"
End If
If Pstic > p1 Then GoTo 10
10 If p1 > Pugl Then
TextBox6.Text = "Угловой Шов Не Подходит, Возможен Только Стыковой Шов"
End If
If p1 > Pstic Then
TextBox6.Text = "Ни Один Шов Не Подходит!!!"
End If
End Sub
Процедура проверки ошибок ввода:
Sub wwod(cv, res, res1, res2)
'объявляем модуль с именем wwod
If IsNumeric(cv) = False Then
'если аргумент cv не число то
res = MsgBox("Введи число", 53)
'сообщение
If res = 4 Then
'если нажата кнопка Повтор
Exit Sub
'выход из модуля
End If
End If
If cv < 0 Then
'если аргумент cv отрицательное число то
res1 = MsgBox("Введи положительное число", 53)
'сообщение
If res1 = 4 Then
'если нажата кнопка Повтор
Exit Sub
'выход из модуля
End If
End If
If cv = 0 Then
'если аргумент cv ноль то
res2 = MsgBox("Ноль в поле", 53)
'сообщение
If res2 = 4 Then
'если нажата кнопка Повтор
Exit Sub
'выход из модуля
3
End If
End If
End Sub
Окно программы:
Задача №14
Оп ределение
типа
св арного
ш ва.
Составить схему алгоритма, выбирающего тип сварного шва (угловой или
стыковой) в зависимости от исходных данных: величины статической
растягивающей нагрузки P, толщины  и ширины b стальных полос. При
сварке полос из стали СТ3 используются электроды Э34.
Формулы для расчёта:
Pугл = 0,7 b[]p
Pстык = 0,6 b[]p
В расчёте принять []p = 160 МПа
Обозначения:
В задаче:
В программе:
[]p
sigmap
4

P
b
Pугл
Pстык
Delta
p
b
Pугл
Pстык
Экранная форма:
Программный код:
Private Sub CommandButton1_Click()
Dim p As Single 'типы переменных
Dim sigmap As Single
Dim b As Single
Dim delta As Single
Dim Pугл As Single
Dim Pстык As Single
Dim сообщ1 As String
Dim сообщ2 As String
Dim сообщ3 As String
q = TextBox1.Value 'присваивается значение 1 текстового окна Р
Call Ввод(q, res)
If res = 4 Then 'введены буквы
TextBox1.SetFocus 'устанавливаем курсор на 1 текстовом окне
Exit Sub 'досрочный выход
ElseIf res = 2 Then 'введенное значение равно 0
TextBox1.SetFocus
Exit Sub 'досрочный выход
5
End If
q = TextBox2.Value
Call Ввод(q, res)
If res = 4 Then
TextBox2.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox2.SetFocus
Exit Sub
End If
p = CSng(TextBox1.Text) 'присваиваем значениe P из 1 текстового поля
b = CSng(TextBox2.Text) 'присваиваем значениe b из 2 текстового поля
delta = CSng(TextBox3.Text) 'присваиваем значениe delta из 3 текстового поля
sigmap = 160
Pуг = 0.7 * b * delta * sigmap 'производим расчеты
Pстык = 0.6 * b * delta * sigmap
TextBox4.Enabled = True 'открываем доступ к полю 4
TextBox4.Text = CStr(Pугл) 'присваиваем значение sigmap 4 полю
TextBox5.Enabled = True 'открываем доступ к полю 5
TextBox5.Text = CStr(Pстык) 'присваиваем значение sigmap 5 полю
сообщ1 = "Шов не прочен" 'присваиваем названия сообщениям
сообщ2 = "Угловой или стыковой шов"
сообщ3 = "Стыковой шов"
If p > Pуг Then 'производим проверку шва
TextBox6.Text = сообщ1
End If
If Pуг > p Then
TextBox6.Text = сообщ2
End If
If p < Pстык Then
TextBox6.Text = сообщ3
End If
End Sub
Private Sub CommandButton2_Click()
TextBox1.Text = "" 'очищаем 6 текстовых поля
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
End Sub
Private Sub CommandButton3_Click()
UserForm1.Hide 'выход
End Sub
Private Sub UserForm_Initialize()
UserForm1.Caption = "Расчёт типа сварного шва"
TextBox4.Enabled = False 'запрещен доступ к 4 полю
TextBox5.Enabled = False 'запрещен доступ к 5 полю
TextBox6.Enabled = False 'запрещен доступ к 6 полю
Label1.Caption = "Величина растягивающей нагрузкиP,МПа "
Label2.Caption = "Ширина полосы b,мм "
Label3.Caption = "Толщина полосы,мм"
Label4.Caption = "Угловой шов"
Label5.Caption = "Стыковой шов"
CommandButton1.Caption = "Считать" 'устанавливаю надписи на кнопках
6
CommandButton2.Caption = "Очистить"
CommandButton3.Caption = "Выход"
CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем
за ней
CommandButton1.ControlTipText = "Расчёт типа шва" 'всплывающую подсказку
CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую
подсказку
CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую
подсказку и
CommandButton3.Cancel = True 'присваиваем значение клавиши Escape
End Sub
Sub Ввод(q, res) 'программа обработки искомых значений
If IsNumeric(q) = False Then 'является ли P числом
res = MsgBox("Введеная величина - не число", 53, "Ошибка") 'выводим сообщение об ошибке на
экран
Exit Sub 'выход
End If
If CSng(q) = 0 Then 'является ли Р=0
res = MsgBox("Введеная величина =0", 53, "Ошибка")
Exit Sub 'выход
End If
If CSng(q) < 0 Then 'является ли Р<0
res = MsgBox("Эта величина должна быть >0", 53, "Ошибка")
Exit Sub 'выход
End If
End Sub
Задание:
Провести расчет зависимости величины предельной растягивающей нагрузки P для
сварного стыкового шва от его длины b' для двух стальных полос, толщиной  по
выражению
 b’
Исходные данные:  ,  b и граничные значения длины сварного b’ от150 до500
мм с шагом 50 мм.
Обозначения:
в задаче:
в программе:

sigma

q
7
Модуль инициализации. Инициализирует компоненты формы.
Sub init()
UserForm1.ComboBox1.AddItem ("Лист") Добовление в ComboBox1 значений
UserForm1.ComboBox1.AddItem ("Форма")
Добовление в ComboBox1 значений
UserForm1.Show
Фонкция показать форму.
End Sub
Private Sub CommandButton1_Click()
Dim qp As Single
Объявление переменных
Dim sigma As Single
Объявление переменных
Dim bn As Single
Объявление переменных
Dim bk As Single
Объявление переменных
Dim bs As Single
Объявление переменных
Dim i As Single
Объявление переменных
Dim j As Integer
Объявление переменных
qp = CSng(UserForm1.TextBox1.Value)
Считывание данных с формы
sigma = CSng(UserForm1.TextBox2.Value)
Считывание данных с формы
bn = CSng(UserForm1.TextBox3.Value)
Считывание данных с формы
bk = CSng(UserForm1.TextBox4.Value)
Считывание данных с формы
bs = CSng(UserForm1.TextBox5.Value)
Считывание данных с формы
If ((qp > 0) And (sigma > 0) And (bn > 0) And (bk > 0) And (bs > 0)) Then
Условие.
Проверяет чтобы все элементы были больше нуля
If (UserForm1.ComboBox1.Value = "Лист") Then
Условие. Считывает значение о
выводе распределяет вывод
Worksheets(1).Cells(1, 1).Value = "Значения b'"
Вывод на лист
Worksheets(1).Cells(1, 2).Value = "Значения P"
Вывод на лист
j=2
Начальное значение счётчика
For i = bn To bk Step bs
Цикл перебирает все значения от bn до bk с шагом bs
Worksheets(1).Cells(j, 1).Value = i
Вывод на лист
Worksheets(1).Cells(j, 2).Value = qp * sigma * i
Вывод на лист
j=j+1
увиличиваем счётчик на единицу
Next i
конец цикла
Else
For i = bn To bk Step bs
Цикл перебирает все значения от bn до bk с шагом bs
MsgBox "Значение b'= " & i & " полученное значение P= " & qp * sigma * i
Вывод получинных значений в окне.
Next i
конец цикла
End If
UserForm1.Hide закрытие формы
Else
MsgBox "Данные введены некоректно. Перезадайте их."
Сообщение
End If
End Sub
8
Алгоритм расчета типа сварных швов
Составить схему алгоритма, выбирающую тип сварного шва (угловой или стыковой)
в зависимости от исходных данных: величины статической растягивающей нагрузки
Р, толщины δ и ширины b стальных полос. При сварке полос из стали СТ3 используя
электроды Э34. Из формул (16), (17) получаем выражение для расчета параметров
углового шва:
Pугл  b *  * [ ]' p
[ ]' ср  0,5 * [ ] р
Pстык
Формулы (18), (19) используем для расчета параметров стыкового шва:
 1,4 * b *  * [ ]' ср
[ ]'Р  0,6[ ]Р
Принять [ ] р  160 МПа
Решением задачи является алгоритм разветвленной структуры, основным элементом
которого является блок, реализующий условия выбора (рис.12):
если P<=P ,то возможен угловой и стыковой шов;
если P>P,то угловой шов не подходит, возможен только стыковой шов;
если P>P,то и стыковой шов не подходит, швы не прочны.
По результатам проверок выдаются указанные сообщения.
9
Блок схема.
Начало
P, b, delta,
Sigma_p
да
isNumeric =
false,CSng=
0, CSng<0
нет
Pуг=0.6*b*delta*
sigma_p
Pст=0.7*b*del
ta*sigma_p
да
P>Pуг
Шов не
прочен
нет
P>Pст
нет
да
Только
стык
Угловой
либо стык
Конец
10
Экранная форма:
11
Программный код:
Private Sub CommandButton1_Click() 'программа вычесления Pu и Ps
Dim P As Single 'объявление переменной Р как простой
Dim b As Single 'объявление переменной b как простой
Dim delta As Single 'объявление переменной delta как простой
Dim sigma_p As Single 'объявление переменной sigma_p как простой
Dim Pu As Single 'объявление переменной Pu как простой
Dim Ps As Single 'объявление переменной Рs как постой
If IsNumeric(TextBox1.Text) = False Then ' проверка ввода числа P
MsgBox "Ошибка в вводе статистической нагрузке", 16, "контроль ввода данных" ' вывод окна
сообщений
TextBox1.SetFocus
Exit Sub
End If
If IsNumeric(TextBox2.Text) = False Then ' проверка ввода числа b
MsgBox "Ошибка в воде ширины полосы", 16, "Контроль ввода данных" ' вывод окна сообщений
TextBox2.SetFocus
Exit Sub
End If
If IsNumeric(TextBox3.Text) = False Then ' проверка ввода числа delta
MsgBox "Ошибка в воде толщины полосы", 16, "Контроль ввода данных" ' вывод окна сообщений
TextBox3.SetFocus
Exit Sub
End If
P = TextBox1.Text 'присвоение значений окна1 переменной P
b = TextBox2.Text 'присвоение значений окна2 переменной b
delta = TextBox3.Text 'присвоение значений окна3 переменной delta
sigma_p = 160 'присвоение переменной sigma_p числа 160
Pu = 0.7 * b * delta * sigma_p 'вычесление Pu по формуле
Ps = 0.6 * b * delta * sigma_p 'вычесление Ps по формуле
If P > Pu Then 'проверка условия задачи
TextBox4.Text = CStr(Ps) 'вывод значения Ps в окно4
TextBox6.Text = CStr(Pu) 'вывод значения Pu в окно5
TextBox5.Text = "Швы не прочны" 'вывод текста получившегося в результате проверки
Exit Sub
End If
If P > Ps Then 'проверка условия задачи
TextBox4.Text = CStr(Ps) 'вывод значения Ps в окно4
TextBox6.Text = CStr(Pu) 'вывод значения Pu в окно5
TetxBox5 = "Только угловой шов" 'вывод текста получившегося в результате проверки
Exit Sub
End If
If P <= Pu Then 'проверка условия задачи
TextBox4.Text = CStr(Pu) 'вывод значения Ps в окно4
TextBox6.Text = CStr(Ps) 'вывод значения Pu в окно5
TextBox5.Text = "Угловой или стыковой шов" 'вывод текста получившегося в результате проверки
Exit Sub
End If
End Sub
Private Sub CommandButton2_Click() 'выход из программы
End
End Sub
12
Private Sub CommandButton3_Click() 'очистка окон сообшений
TextBox1.Text = "" 'очистка окна1
TextBox2.Text = "" 'очистка окна2
TextBox3.Text = "" 'очистка окна3
TextBox4.Text = "" 'очистка окна4
TextBox5.Text = "" 'очистка окна5
TextBox6.Text = "" 'очистка окна5
End Sub
Private Sub UserForm_Initialize() 'установки программы
With CommandButton1 'создание всплывающей подсказки
.Visible = True
.ControlTipText = "Выполнение операции"
End With
With TextBox1 'создание всплывающей подсказки
.Visible = True
.ControlTipText = "Введите значение статистической растягивающей нагрузки"
End With
With TextBox2 'создание всплывающей подсказки
.Visible = True
.ControlTipText = "Введите значение ширины полосы"
End With
With TextBox3 'создание всплывающей подсказки
.Visible = True
.ControlTipText = "Введите значение толщины полосы"
End With
With TextBox5 'создание всплывающей подсказки
.Visible = True
.ControlTipText = "Результирующий тип шва"
End With
With TextBox4 'создание всплывающей подсказки
.Visible = True
.ControlTipText = "Значение нагрузки на стыковой шов "
End With
With TextBox6
.Visible = True
.ControlTipText = "Значение нагрузки на угловой шов"
End With
End Sub
Задание: Составить схему алгоритма расчёта результирующего изгибающего
момента на валу при заданных нагрузках Ft и Fr и определённой длине l.
Расчётная формула:
Mи= Mx 2  My 2
Где изгибающий момент по оси X
13
Mx=
Ft l
*
2 2
Изгибающий момент по оси Y
My 
Fr l
*
2 2
Исходные данные:
Нагрузки – Ft = 4.5и Fr =1.64, [Ft] = кН , [Fr] = кН.
Длина – l =170 ,[l] = мм.
Обозначения :
В задаче : Ft Fr Mx My Mи
В программе: F1 F2 M1 M2 M3
Алгоритм: решение задачи
1. Ввод данных и проверка их на ошибки.
2. Вычисления изгибающих моментов по осям X и Y по расчётным формулам.
3. Вычисление результирующего изгибающего момента на валу.
14
Показать форму
Программный код для экранной формы.
Dim mx As Single
Dim my As Single
r = TextBox1.Text
If IsNumeric(TextBox1.Text) = False Or r <= 0 Then
MsgBox "Не число или ноль", 64, "Ошибка ввода"
TextBox1.SetFocus
Exit Sub
End If
r = TextBox2.Text
If IsNumeric(TextBox2.Text) = False Or r <= 0 Then
MsgBox "Не число или ноль", 64, "Ошибка ввода"
TextBox2.SetFocus
Exit Sub
End If
r = TextBox3.Text
If IsNumeric(TextBox3.Text) = False Or r <= 0 Then
MsgBox "Не число или ноль", 64, "Ошибка ввода"
TextBox3.SetFocus
Exit Sub
End If
l = CSng(TextBox3.Text)
ft = CSng(TextBox2.Text)
fr = CSng(TextBox1.Text)
15
mx = ft * l / 4
my = fr * l / 4
mu = Sqr(mx ^ 2 + my ^ 2)
TextBox4.Text = mx
TextBox5.Text = my
TextBox6.Text = mu
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub
Private Sub UserForm Initialize()
UserForm1.Caption = "Расчет зависимости изгибающего момента от нагрузок"
CommandButton1.Caption = "Расчет"
CommandButton1.ControlTipText = " Произвести расчет момента"
CommandButton1.Default = True
CommandButton2.Caption = "Отмена"
CommandButton2.ControlTipText = "Сброс"
CommandButton2.Cancel = True
TextBox1.ControlTipText = "Введите значение L"
End Sub
Программный код для листа.
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
Расчет зависимости изгибающего момента на вал от нагрузок
Задача №24: Произвести расчет зависимости изгибающего момента на вал (рис.1), в
зависимости от нагрузок, которые изменяются в пределах:
Ft от 3000 до 8000 Н с шагом 500 Н;
Fr от 1500 до 3000 Н с шагом 500 Н;
L = 170 мм.
При расчете использовать формулы:
М И  М Х2  М У2
где изгибающий момент по оси X:
МХ 
Ft l

2 2
МY 
Fr l

2 2
изгибающий момент по оси Y:
Обозначение
16
В задаче
МИ – изгибающий момент
МХ – изгибающий момент по оси х
My – изгибающий момент по оси y
Ft
Fr
l - длина
В программе
M
mx
my
f1
f2
l
Рисунок 1
Тестовый пример решения
Private Sub ListBox1_Click()
Dim x As String
x = ListBox1.Text
Select Case x ‘ начало выбора
Case "3000 Н"
f1 = 3000
TextBox1.Text = f1
17
Case "3500 Н"
f1 = 3500
TextBox1.Text = f1
Case "4000 Н"
f1 = 4000
TextBox1.Text = f1
Case "4500 Н"
f1 = 4500
TextBox1.Text = f1
Case "5000 Н"
f1 = 5000
TextBox1.Text = f1
Case "5500 Н"
f1 = 5500
TextBox1.Text = f1
Case "6000 Н"
f1 = 6000
TextBox1.Text = f1
Case "6500 Н"
f1 = 6500
TextBox1.Text = f1
Case "7000 Н"
f1 = 7000
TextBox1.Text = f1
Case "7500 Н"
f1 = 7500
TextBox1.Text = f1
Case "8000 Н"
f1 = 8000
TextBox1.Text = f1
End Select ‘ конец выбора
End Sub
Private Sub ListBox2_Click()
Dim y As String
y = ListBox2.Text
Select Case y
Case "1500 Н"
f2 = 1500
TextBox2.Text = f2
Case "2000 Н"
f2 = 2000
TextBox2.Text = f2
Case "2500 Н"
f2 = 2500
TextBox2.Text = f2
Case "3000 Н"
f2 = 3000
TextBox2.Text = f2
End Select
End Sub
Private Sub CommandButton1_Click()
‘ задание типа переменной
Dim f1 As Single
Dim f2 As Single
Dim l As Single
Dim mx As Single
Dim my As Single
Dim M As Single
‘ задание значения переменных
f1 = CSng(TextBox1.Value)
f2 = CSng(TextBox2.Value)
l = CSng(TextBox3.Value)
‘ расчет по формулам
mx = (f1 / 2) * (l / 2)
my = (f2 / 2) * (l / 2)
M = Sqr(mx ^ 2 + my ^ 2)
18
‘ вывод результата
TextBox4.Text = CStr(M)
End Sub
Private Sub CommandButton3_Click()
UserForm1.Hide
End Sub
Private Sub CommandButton2_Click()
‘ придание текстовым полями значения “ “
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
End Sub
Private Sub CommandButton4_Click()
Dim f1 As Single
Dim f2 As Single
Dim l As Single
Dim M As Single
f1 = CSng(TextBox1.Value)
f2 = CSng(TextBox2.Value)
l = CSng(TextBox3.Value)
M = CSng(TextBox4.Value)
‘ вывод результата на рабочий лист
Worksheets(1).Cells(2, 1).Formula = f1
Worksheets(1).Cells(2, 2).Formula = f2
Worksheets(1).Cells(2, 3).Formula = l
Worksheets(1).Cells(2, 4).Formula = M
End Sub
Private Sub UserForm_initialize()
‘ заполнение списков
ListBox1.List = Array("3000 Н", "3500 Н", "4000 Н", "4500 Н", "5000 Н", "5500 Н", "6000 Н", "7000 Н", "7500 Н",
"8000 Н")
ListBox2.List = Array("1500 Н", "2000 Н", "2500 Н", "3000 Н")
‘ задание всплывающих подсказок
ListBox1.ControlTipText = "Выбери Ft"
ListBox2.ControlTipText = "Выбери Fr"
CommandButton1.ControlTipText = "Для решения жми сюда"
CommandButton2.ControlTipText = "Для очистки полей жми сюда"
CommandButton3.ControlTipText = "Для отмены жми сюда"
TextBox1.ControlTipText = "Нагрузка Ft"
TextBox2.ControlTipText = "Нагрузка Fr"
TextBox3.ControlTipText = "Сюда вводите длину L"
TextBox4.ControlTipText = "Изгибающий момент"
‘ блокировка окон от ввода
TextBox1.Locked = True
TextBox2.Locked = True
TextBox4.Locked = True
End Sub
19
Расчет зависимости изгибающего момента на вал от нагрузок
Используя формулы , произвести расчет зависимости изгибающего момента
на вал от нагрузок,
Которые изменяются в пределах :
Ft от 3000 до 8000 с шагом 500 Н;
Fr от 1500 до 6500 с шагом 500 Н;
L=170 мм.
Результаты расчетов представить в виде таблицы .
Расчетные формулы:
Mx = (F1 / 2) * (l / 2)
My = (F2 * l) / 4
M = Sqr((M1 ^ 2) + (M2 ^ 2))
Текст программы
Private Sub CommandButton1_Click()
Dim M1, M2, M3, F1, F2, l As Single
Dim M11(15), m12(15), mres(15) As Single
F1 = ListBox1.Value
F2 = ListBox2.Value
l = TextBox3.Value
TextBox3.Value = l
'проверка и исправление ошибок
If IsNumeric(TextBox3.Text) = False Then
MsgBox "Введен плохой символ", 16, "Проверка ввода"
TextBox3.SetFocus
Exit Sub
End If
If CSng(TextBox3.Value) = 0 Then
MsgBox "Длина должна быть отличной от нуля!", 48, "Проверка ввода"
TextBox3.SetFocus
Exit Sub
End If
'F1 = CSng(F1)
'F2 = CSng(F2)
'l = CSng(l)
'вычисление изгибающего момента по формуле
If OptionButton1.Value = True Then
M1 = (F1 / 2) * (l / 2)
M2 = (F2 * l) / 4
M3 = Sqr((M1 ^ 2) + (M2 ^ 2))
TextBox4.Value = M1
TextBox5.Value = M2
TextBox6.Value = M3
20
M4 = CInt(M3)
TextBox7.Value = M4
End If
If OptionButton2.Value = True Then
Cells(1, 1).Value = "Ft"
Cells(2, 1).Value = "Fr"
Cells(3, 1).Value = "M"
j=0
For i = 3000 To 8000 Step 500
j=j+1
Cells(1, j + 1).Value = i
M11(j) = (i / 2) * (l / 2)
Next i
k1 = 1
For k = 1500 To 6500 Step 500
Cells(2, k1 + 1).Value = k
m12(k1) = (k * l) / 4
k1 = k1 + 1
Next k
k2 = 1
For k3 = 1 To 11
mres(k3) = Sqr((M11(k3) ^ 2) + m12(k3) ^ 2)
Cells(3, k2 + 1).Value = mres(k3)
k2 = k2 + 1
Next k3
End If
End Sub
Private Sub UserForm_Initialize()
With ListBox1
For i = 3000 To 8000 Step 500
.AddItem i
Next i
End With
With ListBox2
For j = 1500 To 6500 Step 500
.AddItem j
Next j
End With
TextBox3.Value = "1,7"
UserForm1.Caption = "Курсовая работа по информатике"
Label1.Caption = "Ft-нагрузка по оси Ох, Н"
Label2.Caption = "Fr-нагрузка по оси Оу, Н"
Label3.Caption = "l-длина вала, м"
Label4.Caption = "Мх-изгиб. момент по Ох"
Label5.Caption = "Му-изгиб. момент по Оу"
Label6.Caption = "Ми-изгиб. момент на вал, Н*м"
Label7.Caption = "Мэкв. - эквивалентный момент"
21
CommandButton1.Caption = "вычислить"
OptionButton1.Caption = "Результат-на форму"
OptionButton2.Caption = "Результат в таблицу на лист"
OptionButton1.Value = True
End Sub
Экранная форма:
Ft
3000
Fr
1500
M
1425,49
3
3500
4000
4500
2000
2500
3000
5000
5500
6000
3500 4000
2593,89 2890,3
1713,23 2004,721 2298,539
3
13
4500
6500
7000
7500
8000
5000
5500 6000 6500
3485,25 3783,45 4081,9
3187,5
9
5
92 4380,8
22
начало
Ftнач,
шаг,Ftконеч,
Frнач, шаг,Frконеч
l
проверк
а
Вывод на
форму
Ft=Ftнач
F2=F2нач
Мх , Му ,
М
Ft=Ft+ аг
F2<=F2нач
F2=F2+шаг
Ft<=Fкон
еч
Вывод на
форму
КОНЕЦ
Расчет Мх
,Му , М
На лист
23
Задача. Произвести прочностной расчёт резьбы хвостовика грузоподъёмного
крюка по формулам
D0=1,13*Sqr(P/Q),
D>D0,
где
D0-внутренний диаметр резьбы хвостовика,
P-нагрузка,
Q-допускаемое напряжение на растяжение в металле,
Для различных значений нагрузки P от 10 до 100 кН с шагом 10 кН.
Допускаемое напряжение на растяжение в металле Q принять равным 72 Мпа.
Результатами расчёта являются табличные значения внутреннего диаметра
резьбы D0 и тип резьбы.
Private Sub CommandButton1_Click()
Dim i As Integer 'счетчик цикла
Dim p As Single 'Вес нагрузки
Dim res As Single 'результат расчёта
Dim ttt As String 'временная строковая переменная
Dim size As Integer 'количество ячеек в таблице с данными о диаметре
Dim j As Integer 'другой счетчик цикла
Const sigma = 72 '
j=1
For p = 10000 To 100000 Step 10000
res = 1.13 * Sqr(p / sigma)
'определение типа резьбы
'1 подсчет количества строк в таблице
size = 0
i=2
While IsNumeric(Worksheets(1).Cells(i, 2).Text) And IsNumeric(Worksheets(1).Cells(i + 1, 2).Text)
i=i+1
size = size + 1
Wend ' к концу цикла в переменной size будет количество строк в таблице.
For i = size To 2 Step -1
If res > CSng(Worksheets(1).Cells(i, 2).Text) Then
ttt = "Резьба " + Worksheets(1).Cells(i, 1).Text + _
" внутренний диаметр= " + CStr(res)
'MsgBox ttt, vbOKOnly + vbInformation, "конец"
GoTo exit1
End If
Next i
exit1:
Worksheets(2).Cells(j, 5).Value = ttt
j=j+1
Next p
Label1.Caption = "результаты расчета ищите на втором листе этого документа Excell"
End Sub
Private Sub CommandButton2_Click()
24
UserForm1.Hide
End Sub
D
M6
M8
M 10
M 12
M 14
M 16
M 18
M 20
M 22
M 24
M 27
M 30
M 36
M 42
M 46
D1
4
5,5
7
8
10
12
13
15
17
18
21
23
28
32
36
Вариант № 25
Произвести расчет эквивалентного момента в опасном сечении вала:
М экв 
М х2  М у2  0,75Т 2 .
Исходные данные: момент Т, пределы изменения момента Мх и Му;
формулы для их расчета, а также значение
l
взять из задачи 24.
Ft от 3000 до 5000 Н с шагом 500 Н.
Fr от 1500 до 3000 Н с шагом 500 Н.
l  170 мм
Mx 
Ft l

2 2
My 
Fr l

2 2
В программе используются переменные:
В формуле.
В программе
МЭКВ
МХ
МУ
Fr
Ft
l
mq (d для индивидуального)
mx
my
fr (qw для индивидуального)
ft (qe для индивидуального)
25
Public qw As Single 'глобальная переменная qw
Public qe As Single 'глобальная переменная qe
Private Sub CommandButton1_Click() 'расчет для всех значений
Dim i As Integer ' счетчик
Dim j As Integer ' счетчик
Dim mq As Single ' mq
Dim mx As Single ' mx
Dim my As Single ' my
Dim ft As Single ' ft
Dim fr As Single ' fr
Dim T As Single ' T
pr = TextBox1.Text ' проверка поля на ошибки
r = IsNumeric(pr) ' отсутствие чисел или ввод букв
If r = False Then
MsgBox "В первом поле нет числа", vbInformation, "Ошибка ввода"
TextBox1.SetFocus ' установка курсора в первое поле
Exit Sub
End If
T = CSng(TextBox1.Text)
If T = 0 Then ' проверка на наличия 0 в первом поле
MsgBox "Впервом поле 0", vbInformation, "Ошибка ввода"
TextBox1.SetFocus
Exit Sub
End If
i = 1: j = 1
For ft = 3000 To 5000 Step 500 ' цикл для расчета значений
mx = ft / 2 * 170 / 2
' mx для всех значений ft
i=i+1
For fr = 1500 To 3000 Step 500 ' my для всех значений fr
my = fr / 2 * 170 / 2
mq = Sqr(mx ^ 2 + my ^ 2 + (0.75 * T) ^ 2) 'расчет значений mq
j=j+1
Worksheets(1).Cells(i, j).Formula = mq 'заполнение листа
Next fr
j = 1 'что бы происходило заполнение следующей строчки, с ячейки А
Next ft
End Sub
Private Sub CommandButton2_Click() ' индивидуальный расчет
Dim d As Single
Dim T As Single
Dim q As Single
Dim g As Single
pr = TextBox1.Text ' проверка на наличие ошибок
r = IsNumeric(pr)
If r = False Then
26
MsgBox "В первом поле нет числа", vbInformation, "Ошибка ввода"
TextBox1.SetFocus
Exit Sub
End If
T = CSng(TextBox1.Text) 'переменной Т присваивается значение числа в первом поле
If T = 0 Then
MsgBox "Впервом поле 0", vbInformation, "Ошибка ввода"
TextBox1.SetFocus
Exit Sub
End If
q = qw / 2 * 85
g = qe / 2 * 85
d = Sqr((q) ^ 2 + (g) ^ 2 + (0.75 * T) ^ 2)
TextBox2.Text = CStr(d) 'вывод результата в поле №2
Worksheets(1).Cells(8, 1).Formula = d ' вывод результата на лист
End Sub
Private Sub ListBox1_Click() ' выбор из списка №1
Select Case ListBox1.ListIndex
Case 0
' если выбираешь первый пункт qw присваивается значение 3000
qe = 3000
Case 1
' аналогично
qe = 3500
Case 2
qe = 4000
Case 3
qe = 4500
Case 4
qe = 5000
End Select
End Sub
Private Sub ListBox2_Click() 'выбор из списка № 2
Select Case ListBox2.ListIndex
Case 0
qw = 1500
Case 1
qw = 2000
Case 2
qw = 2500
Case 3
qw = 3000
End Select
End Sub
Private Sub UserForm_Initialize() 'инициализация
With ListBox1 ' в-первый список заносятся даннные
27
.List = Array("3000", "3500", "4000", "4500", "5000")
.ListIndex = 0 ' при запуске выделяется первый пункт в списке № 1
End With
With ListBox2
.List = Array("1500", "2000", "2500", "3000")
.ListIndex = 0
End With
End Sub
На листе:
Расчет конденсатора, сглаживающего
пульсацию выпрямленного тока.
Задание: Составить схему алгоритма расчёта конденсатора
С, сглаживающего пульсации
выпрямленного тока в условиях изменяющейся нагрузки R , используя формулу:
С
1
 * P * fп * R
где fп – частота пульсации; P – коэффициент пульсации.
28
Д
R
C
Обозначения:
В задаче:
fn
P
R
C
Экранная форма:
В программе:
fn
P
R
C
29
Программный код:
Private Sub CommandButton1_Click()
Dim fp As Single 'определяем типы переменных величин,
Dim P As Single 'используемых в программе
Dim R As Single
Dim C As Single
Dim pi As Single
s = TextBox1.Value 'присваиваем значение первого текстового окна переменной Р
Call pr(s, res) 'вызываем подпрограмму pr,которая будет использовать переменные Р и res
If res = 4 Then 'если по ошибке пользователь вводит буквы
TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно
Exit Sub 'процедура досрочного выхода из программы
ElseIf res = 2 Then 'если введенное значение равно 0
TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно
Exit Sub 'процедура досрочного выхода из программы
End If
s = TextBox2.Value 'присваиваем значение второго текстового окна переменной Р
Call pr(s, res) 'вызываем подпрограмму wwod и производим аналогичные действия
If res = 4 Then
TextBox2.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox2.SetFocus
Exit Sub
End If
s = TextBox3.Value 'аналогично
Call pr(s, res)
If res = 4 Then
TextBox3.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox3.SetFocus
Exit Sub
End If
pi = 3.14
fp = CSng(TextBox1) 'присваиваем значения переменным из
P = CSng(TextBox2) 'соответствующих текстовых полей
R = CSng(TextBox3)
C = Round(1 / (pi * P * fp * R), 3) 'производим необходимые расчеты по формулам
TextBox4.Text = CStr(C)
End Sub
Private Sub CommandButton2_Click()
TextBox1 = "" 'очистка текстовых полей с 1 по 4
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""
End Sub
30
Private Sub CommandButton3_Click()
UserForm1.Hide 'процедура выхода из программы
End Sub
Private Sub UserForm_Initialize()
Label1.Caption = "Частота пульсации, Гц" 'устанавливаем подписи окон
Label2.Caption = "Коэффициент пульсации"
Label3.Caption = "Изменение нагрузки, Ом"
Label4.Caption = "Полученная ёмкость конденсатора, Ф"
Frame1.Caption = "Исходные данные" ' устанавливаем название рамок
Frame2.Caption = "Полученные данные "
CommandButton1.Caption = "Считать" 'устанавливаем на кнопках надписи, соответствующие
выполняемым действиям
CommandButton2.Caption = "Очистить"
CommandButton3.Caption = "Выход"
CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем
за ней
CommandButton1.ControlTipText = "Нахождение неизвестных величин" 'всплывающую подсказку
CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую
подсказку
CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую
подсказку и
CommandButton3.Cancel = True 'присваиваем значение клавиши Escape
End Sub
Sub pr(s, res) 'подпрограмма обработки введенных данных
If IsNumeric(s) = False Then 'проверяем,не является ли введеная величина числом
res = MsgBox("Введеная величина не число", 53, "Курсовая работа") 'если да,выводим сообщение
об этом на экран
Exit Sub 'процедура выхода из подпрограммы
End If
If CSng(s) = 0 Then 'проверяем,является ли введеная величина равной 0
res = MsgBox("Введеная величина 0", 53, "Курсовая работа") 'если да,выводим сообщение об
этом на экран
Exit Sub 'процедура досрочного выхода из подпрограммы
End If
If CSng(s) < 0 Then 'проверяем, является ли введеная величина меньше 0
res = MsgBox("Введеная величина должна быть положительной", 53, "Курсовая работа") 'если
да,выводим сообщение об этом на экран
Exit Sub 'процедура досрочного выхода из подпрограммыEnd If
End Sub 'окончание подпрограммы обработки введенных данных
Пример:
fn = 50 Гц;
P = 0,5;
R = 0,01 Ом;
C = 1,274 Ф.
31
Произвести расчёт параметров трансформатора, где число первичной обмотки w1,
число витков вторичной обмотки w2, площадь сечения сердечника S, площадь
сечения окна сердечника S’.
Исходные данные: напряжение первичной обмотки U1, ток и напряжение вторичной
обмотки I2 и U2, КПД трансформатора При расчёте использовать формулы:
  U2 I 2 /(U1I1 ) ,
S  U1I1
откуда
S  U 2 I 2 /
w1  50U1 / S
w2  50U 2 / S
Значение диаметра провода без изоляции :
d1, 2  0,8 I1, 2
По вычисленным значениям d1 и d2 выбрать ближайшие стандартные значения
диаметров проводов с изоляцией – dиз1 и dиз2..Площадь сечения окна сердечника S1
определить по формуле .
S   0,8( w1dиз2 1  w2 dиз2 2 )
I1
U1
I2
w1
w2
U2
32
Блок-схема:
Начало
Вводим U1,
U2, I1,
да
да
isNu
meric
нет
=
false
Csng
=0
нет
да
Csng<0
нет
S = Sqr(U2 * I2 /
n)
Вывод S
I1 = U2 * I2 / (n * U1)
d1,2 = 0.8 * (Sqr(I1,2))
S1 = 0.8 * (w1 * d1 ^ 2 + w2 * d2 ^ 2)
Вывод S1
конец
w1,2 = 50 * U1,2 / S
Вывод w1,2
33
Экранная форма:
Программный код :
Private Sub CommandButton1_Click()
Dim U1 As Single 'определяем типы переменных величин,
Dim U2 As Single 'используемых в программе
Dim I2 As Single
Dim n As Single
Dim I1 As Single
Dim S As Single
Dim S1 As Single
Dim w1 As Single
Dim w2 As Single
Dim d1 As Single
Dim d2 As Single
P = TextBox1.Value 'присваиваем значение первого текстового окна
переменной Р
Call wwod(P, res) 'вызываем подпрограмму wwod,которая будет
использовать переменные Р и res
If res = 4 Then 'если по ошибке пользователь вводит буквы
34
TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно
Exit Sub 'процедура досрочного выхода из программы
ElseIf res = 2 Then 'если введенное значение равно 0
TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно
Exit Sub 'процедура досрочного выхода из программы
End If
P = TextBox2.Value 'присваиваем значение второго текстового окна
переменной Р
Call wwod(P, res) 'вызываем подпрограмму wwod и производим
аналогичные действия
If res = 4 Then
TextBox2.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox2.SetFocus
Exit Sub
End If
P = TextBox3.Value 'аналогично
Call wwod(P, res)
If res = 4 Then
TextBox3.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox3.SetFocus
Exit Sub
End If
P = TextBox4.Value 'аналогично
Call wwod(P, res)
If res = 4 Then
TextBox4.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox4.SetFocus
Exit Sub
End If
U1 = CSng(TextBox1.Text) 'присваиваем значения переменным из
I2 = CSng(TextBox2.Text) 'соответствующих текстовых полей
U2 = CSng(TextBox3.Text)
n = CSng(TextBox4.Text)
35
I1 = U2 * I2 / (n * U1) 'производим необходимые расчеты по формулам
S = Sqr(U2 * I2 / n)
w1 = 50 * U1 / S
w2 = 50 * U2 / S
d1 = 0.8 * (Sqr(I1))
d2 = 0.8 * (Sqr(I2))
S1 = 0.8 * (w1 * d1 ^ 2 + w2 * d2 ^ 2)
TextBox5.Text = Int(CStr(w1)) 'присваиваем значения найденных
TextBox6.Text = Int(CStr(w2)) 'величин соответствующим текстовым
полям
TextBox7.Text = CStr(S)
TextBox8.Text = Int(CStr(S1))
End Sub
Private Sub CommandButton2_Click()
TextBox1.Text = "" 'очистка текстовых полей с 1 по 8
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
TextBox8.Text = ""
End Sub
Private Sub CommandButton3_Click()
UserForm1.Hide 'процедура выхода из программы
End Sub
Private Sub UserForm_Initialize()
TextBox5.Enabled = False 'запрещаем доступ к полям,куда будут
TextBox6.Enabled = False 'помещены результаты
TextBox7.Enabled = False
TextBox8.Enabled = False
UserForm1.Caption = "Расчёт параметров трансформатора"
Label1.Caption = "Напряжение первичной обмотки,В"
Label2.Caption = "Ток вторичной обмотки,А"
Label3.Caption = "Напряжение вторичной обмотки,В"
Label4.Caption = "КПД трансформатора,%"
Label5.Caption = "Число витков первичной обмотки,шт"
Label6.Caption = "Число витков вторичной обмотки,шт"
36
Label7.Caption = "Площадь сечения сердечника,кв. м"
Label8.Caption = "Площадь сечения окна сердечника,кв. м"
CommandButton1.Caption = "Считать" 'устанавливаем на кнопках
надписи,соответствующие выполняемым действиям
CommandButton2.Caption = "Очистить"
CommandButton3.Caption = "Выход"
CommandButton1.Default = True 'присваиваем первой кнопке значение
клавиши Enter и закрепляем за ней
CommandButton1.ControlTipText = "Нахождение неизвестных величин"
'всплывающую подсказку
CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за
2 кнопкой всплывающую подсказку
CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за
3 кнопкой всплывающую подсказку и
CommandButton3.Cancel = True 'присваиваем значение клавиши Escape
End Sub
Sub wwod(P, res) 'подпрограмма обработки введенных данных
If IsNumeric(P) = False Then 'проверяем,не является ли введеная величина
числом
res = MsgBox("Введеная величина не является числом", 53, "Курсовая
работа") 'если да,выводим сообщение об этом на экран
Exit Sub 'процедура выхода из подпрограммы
End If
If CSng(P) = 0 Then 'проверяем,является ли введеная величина равной 0
res = MsgBox("Введеная величина равна 0", 53, "Курсовая работа") 'если
да,выводим сообщение об этом на экран
Exit Sub 'процедура досрочного выхода из подпрограммы
End If
If CSng(P) < 0 Then 'проверяем,является ли введеная величина меньше 0
res = MsgBox("Введеная величина должна быть положительной", 53,
"Курсовая работа") 'если да,выводим сообщение об этом на экран
Exit Sub 'процедура досрочного выхода из подпрограммы
End If
End Sub 'окончание подпрограммы обработки введенных данных
37
Пример :
U1=10
U2=20
n=40
I1=30
w1=1.29
w2=387
S=3.87
S1=4065
Задание: Провести расчет индуктивности многослойной
катушки, имеющей размеры d min, d max, b и число витков
w.Индуктивность многослойных катушек определяется по
формуле:
Расчетная формула:
Где
d=0.5*(d max+d min)
L=(0.08*d^2*w^2)/(3*d+9*b+10*c),
c=0.5*(d max-d min)
Обозначения:
В задаче:
В программе:
dmin
dmax
b
w
L
dmin
dmax
b
w
L
38
Блок-схема:
Начало
Ввод Dmin,
Dmax,b,w,
проверка на
ошибки
да
isNumeric
= false
нет
да
Csng = 0
нет
да
Csng<0
нет
L = (0.08 * (0.5 * (dmax + dmin)) ^ 2 * w ^ 2) / 3 * (0.5 * (dmax + dmin)) + 9 *
b + 10 * (0.5 * (dmax - dmin))
Вывод L
конец
39
Экранная форма:
40
Программный код:
Private Sub CommandButton1_Click()
Dim dmax As Single
Dim dmin As Single
Dim b As Single
Dim w As Single
Dim L As Single
Q = TextBox1.Value 'присваиваем значение первого текстового окна переменной Р
Call prow(Q, res) 'вызываем подпрограмму wwod,которая будет использовать переменные Р
и res
If res = 4 Then 'если по ошибке пользователь вводит буквы
TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно
Exit Sub 'процедура досрочного выхода из программы
ElseIf res = 2 Then 'если введенное значение равно 0
TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно
Exit Sub 'процедура досрочного выхода из программы
End If
Q = TextBox2.Value 'присваиваем значение второго текстового окна переменной Р
Call prow(Q, res) 'вызываем подпрограмму wwod и производим аналогичные действия
If res = 4 Then
TextBox2.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox2.SetFocus
Exit Sub
End If
Q = TextBox3.Value 'аналогично
Call prow(Q, res)
If res = 4 Then
TextBox3.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox3.SetFocus
Exit Sub
End If
Q = TextBox4.Value 'аналогично
Call prow(Q, res)
If res = 4 Then
TextBox4.SetFocus
Exit Sub
ElseIf res = 2 Then
TextBox4.SetFocus
41
Exit Sub
End If
dmax = CSng(TextBox1.Text) 'присваиваем значения переменным из
dmin = CSng(TextBox2.Text) 'соответствующих текстовых полей
b = CSng(TextBox3.Text)
w = CSng(TextBox4.Text)
L = Round((0.08 * (0.5 * (dmax + dmin)) ^ 2 * w ^ 2) / 3 * (0.5 * (dmax + dmin)) + 9 * b + 10 *
(0.5 * (dmax - dmin)), 2)
TextBox5.Enabled = True
TextBox5.Text = CStr(L)
End Sub
Private Sub CommandButton2_Click()
TextBox1.Text = "" 'очистка текстовых полей с 1 по 6
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
End Sub
Private Sub CommandButton3_Click()
UserForm1.Hide
End Sub
Private Sub UserForm_Initialize()
TextBox5.Enabled = False 'запрещаем доступ к полям, куда будут помещены результаты
UserForm1.Caption = "Расчет индуктивности многослойной катушки"
Label1.Caption = "Максимальный диаметр,мм"
Label2.Caption = "Минимальный диаметр,мм"
Label3.Caption = "Ширина катушки,мм"
Label4.Caption = "Число витков,шт."
Label5.Caption = "Индуктивность,Гн"
CommandButton1.Caption = "Вычислить" 'устанавливаем на кнопках надписи,
соответствующие выполняемым действиям
CommandButton2.Caption = "Сброс"
CommandButton3.Caption = "Отмена"
CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и
закрепляем за ней
CommandButton1.ControlTipText = "Вычисление неизвестных величин" 'всплывающую
подсказку
CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой
всплывающую подсказку
42
CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой
всплывающую подсказку и
CommandButton3.Cancel = True 'присваиваем значение клавиши Escape
End Sub
Sub prow(Q, res) 'подпрограмма обработки введенных данных
If IsNumeric(Q) = False Then 'проверяем, не является ли веденая величина числом
res = MsgBox("Введеная величина не является числом", 53, "Курсовая работа") 'если
да,выводим сообщение об этом на экран
Exit Sub 'процедура выхода из подпрограммы
End If
If CSng(Q) = 0 Then 'проверяем,является ли введеная величина равной 0
res = MsgBox("Введеная величина равна 0", 53, "Курсовая работа") 'если да,выводим
сообщение об этом на экран
Exit Sub 'процедура досрочного выхода из подпрограммы
End If
If CSng(Q) < 0 Then 'проверяем,является ли введеная величина меньше 0
res = MsgBox("Введеная величина должна быть положительной", 53, "Курсовая работа")
'если да,выводим сообщение об этом на экран
Exit Sub 'процедура досрочного выхода из подпрограммы
End If
End Sub 'окончание подпрограммы обработки введенных данных
Пример
dmax = 10
dmin = 1
b=5
w = 15
L = 1088,25
43
Расчет числа витков катушки индуктивности и диаметра провода с изоляцией.
0,01Dw 2
Используя формулу L 
,рассчитать число витков катушки
0,44  (a / D)
индуктивности. Затем определить значение диаметра провода с изоляцией:
d из  а / w
Исходные данные:
D-диаметр катушки, a-длина намотки, w-число витков.
Обозначения:
B задаче:
a
D
d из
w
L
Экранная форма:
Програмный код:
Private Sub CommandButton1_Click()
Dim d As Single 'диаметр катушки
Dim a As Single 'длина намотки
Dim L As Single 'индуктивность
Dim w As Single 'число витков
В программе:
a
D
s
w
L
44
d = TextBox1.Value
'проверяем является ли d числом
Call wwod(d, res, res1)
If res = 4 Then
TextBox1.SetFocus
Exit Sub
End If
'проверяем d=0 или d<0
If res1 = 4 Then
TextBox1.SetFocus
Exit Sub
End If
'проверяем является ли a числом
a = TextBox2.Value
Call wwod(a, res, res1)
If res = 4 Then
TextBox1.SetFocus
Exit Sub
End If
'проверяем a=0 или a<0
If res1 = 4 Then
TextBox1.SetFocus
Exit Sub
End If
'проверяем является ли L числом
L = TextBox3.Value
Call wwod(L, res, res1)
If res = 4 Then
TextBox1.SetFocus
Exit Sub
End If
'проверяем L=0 или L<0
If res1 = 4 Then
TextBox1.SetFocus
Exit Sub
End If
w = (L * (0.44 + (a / d) / 0.01 * d)) ^ 0.5
d = CSng(d)
a = CSng(a)
L = CSng(L)
w = CSng(w)
TextBox4.Value = w
45
End Sub
Private Sub CommandButton2_Click()
Dim w As Single 'число витков
Dim b As Single 'диаметр провода с изоляцией
Dim a As Single 'длина намотки
a = TextBox2.Value
w = TextBox4.Value
w = TextBox4.Value
a = CInt(TextBox2.Value)
s=a/w
TextBox5.Value = s
End Sub
Private Sub CommandButton3_Click()
TextBox1.Value = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""
TextBox5.Value = ""
End Sub
Private Sub UserForm_Initialize()
Label1.Caption = "введите диаметр катушки,м"
UserForm1.Caption = "РАСЧЕТ"
Label2.Caption = "введите длину намотки,м"
Label3.Caption = "введите значение индуктивности,Гн"
CommandButton1.Caption = " вычислить "
Label4.Caption = "вычисленное число витков"
Label5.Caption = "вычисленный диаметр провода с изоляцией,м"
CommandButton3.Caption = "сброс"
CommandButton2.Caption = "вычислить"
End Sub
Процедура проверки корректности данных:
Sub wwod(a, res, res1)
If IsNumeric(a) = False Then
res = MsgBox("введён символ", 53, "ошибка ввода")
Exit Sub
End If
46
If a = 0 Or a < 0 Then
res1 = MsgBox("введите положительное число", 53, "введены 0 или
отрицательное число")
Exit Sub
End If
End Sub
Пример:
L=0,25 Гн
a=0,4 м
D=0,2 м
W=3,551
dиз=0,1408 м
Составить схему алгоритма определения числа витков и диаметра
провода с изоляцией для катушек индуктивности, обеспечивающих
наименьшее активное сопротивление, которое достигается при отношении
a/D=0,4.
April 2002
Вт
Ср
April
Чт
Пт
2002
Сб
Вс
Пн
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
Формулы для расчёта:
0,01Dw 2
L
d  a/w
0,44  a / D  ; из
Исходные данные: индуктивность L , значения диаметра катушки D
изменяются в пределах от 1 до 10 см с шагом 1 см, число витков w , длина
намотки a
Значение L=10мкГ задать в операторе присваивания;
изменяющиеся значения диаметра катушки индуктивности D
задать в операторе цикла.
47
Обозначения:
В задаче:
L
D
a
w
dиз
В программе:
l
d
a
w
diz
Экранная форма:
Программный код:
Private Sub CommandButton1_Click()
Dim l As Single 'определяем переменныe
Dim d As Single
Dim a As Single
Dim w As Single
Dim diz As Single
q = TextBox1.Value 'значение первого текстового присваиваем q
Call Proverka(q, otv) 'подпрограммa Proverka
If otv = 4 Then 'вводены буквы
TextBox1.SetFocus ' курсор устанавливается в первое текстовое окно
48
Exit Sub ' досрочный выход из программы
ElseIf otv = 2 Then ' введен 0
TextBox1.SetFocus
Exit Sub
End If
q = TextBox2.Value
If q < 1 Or q > 10 Then
MsgBox "Введи целое число от 1 до 10"
TextBox2.SetFocus
Exit Sub
End If
Call Proverka(q, otv)
If otv = 4 Then
TextBox2.SetFocus
Exit Sub
ElseIf otv = 2 Then
TextBox2.SetFocus
Exit Sub
End If
l = CSng(TextBox1.Text) 'назначаем значения из текстовых полей
d = CSng(TextBox2.Text)
a = Round(0.4 * d, 1) 'расчеты
w = Round(10 * Sqr(l * (0.84) / d), 0)
diz = Round(a / w, 2)
TextBox3.Enabled = True 'разрешаем доступ к полям результатов
TextBox4.Enabled = True
TextBox3.Text = CStr(w) 'присваиваем значения переменных текстовым полям
TextBox4.Text = CStr(diz)
End Sub
Private Sub CommandButton2_Click()
TextBox1.Text = "" 'очищаем текстовые поля
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
End Sub
Private Sub CommandButton3_Click()
UserForm1.Hide ' выход из программы
End Sub
Private Sub UserForm_Initialize()
TextBox3.Enabled = False 'запретим доступ к полям результата
TextBox4.Enabled = False
Label3.Caption = "число витков,шт"
Label2.Caption = "диаметр,мм"
Label1.Caption = "индуктивность,Гн"
Label4.Caption = "диаметр повода с изоляцией,мм"
CommandButton1.Caption = "Вычислить" 'устанавливаем на кнопках надписи,соответствующие
выполняемым действиям
CommandButton2.Caption = "Очистить"
CommandButton3.Caption = "Отмена"
CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем
за ней
CommandButton1.ControlTipText = "Нахождение неизвестных величин" 'всплывающую подсказку
49
CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую
подсказку
CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую
подсказку и
CommandButton3.Cancel = True 'присваиваем значение клавиши Escape
UserForm1.Caption = "Расчет числа витков и диаметра провода"
End Sub
Sub Proverka(q, otv) 'обработкa данных
If IsNumeric(q) = False Then 'является ли q числом
otv = MsgBox("Эта величина не является числом", 53, "Проверка")
Exit Sub 'выход из подпрограммы
End If
If CSng(q) = 0 Then 'является ли q = 0
otv = MsgBox("Bеличина равна 0", 53, "Проверка")
Exit Sub 'выход из подпрограммы
End If
If CSng(q) < 0 Then 'является ли q < 0
otv = MsgBox("Bеличина < 0", 53, "Проверка")
Exit Sub 'выход из подпрограммы
End If
End Sub
Составить схему алгоритма расчета сопротивления R проводов из 10
различных материалов, используя формулу:
l=d2R/4
Исходные данные:
длина провода
диаметр провода
удельные сопротивления
-
l
d

Обозначения:
В задаче:
l
d

R
В программе:
l
d
sop
R
50
Экранная форма:
51
Программный код:
Private Sub CommandButton1_Click()
Dim d As Single
'диаметр сечения провода
Dim p As Single
'удельное сопротивление металла
Dim met As String
'металл
Dim i As Integer
'номер строки листа
Dim R As Single
'сопротивление провода
l = TextBox2.Value 'присваиваем значение текстовых полей переменным
d = TextBox3.Value
Call wwod(l, Res, Res1) 'вызываем модуль проверки
If Res = 4 Then
TextBox2.SetFocus
'устанавливеат курсор на текстовое поле 2
Exit Sub
End If
If Res1 = 4 Then
TextBox2.SetFocus
Exit Sub
End If
Call wwod(d, Res, Res1) 'вызываем модуль проверки
If Res = 4 Then
TextBox3.SetFocus
Exit Sub
End If
If Res1 = 4 Then
TextBox3.SetFocus
'устанавливеат курсор на текстовое поле 3
Exit Sub
End If
l = CSng(l)
число
d = CSng(d)
'переменные представляем из последовательности символов в
met = ListBox1.Value 'присваиваем переменной met значение выбранного элемента
списка
For i = 1 To 10
'цикл с условием; выбираем значение "p" соответствующее
выбранному металлу
If Worksheets(1).Cells(i, 1) = met Then
p = Worksheets(1).Cells(i, 2)
End If
Next i
Label1.Caption = p 'присваиваем надписи значение "p" в качестве заголовка
R = 4 * l * p / (3.14 * d ^ 2) 'определяем значение "R"
TextBox1.Value = R
'присваиваем текстовому полю 1 значение "R"
End Sub
Private Sub ListBox1_Click()
52
met = ListBox1.Value 'присваиваем переменной met значение выбранного элемента
списка
For i = 1 To 10
'цикл с условием; выбираем значение "p" соответствующее
выбранному металлу
If Worksheets(1).Cells(i, 1) = met Then
p = Worksheets(1).Cells(i, 2)
End If
Next i
Label1.Caption = p 'присваиваем надписи значение "p" в качестве заголовка
End Sub
Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal
X As Single, ByVal Y As Single)
TextBox2.Value = " " 'при установке курсора на тектовое поле 2 присваиваем ему
значение пробела
End Sub
Private Sub TextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal
X As Single, ByVal Y As Single)
TextBox3.Value = " " 'при установке курсора на тектовое поле 3 присваиваем ему
значение пробела
End Sub
Private Sub UserForm_Initialize()
Frame1.Caption = "Введите данные для расчета" 'записываем заголовок
With ListBox1
'заполняем список данными с листа
For i = 1 To 10
.AddItem Cells(i, 1)
Next i
End With
CommandButton1.Caption = "Вычислить"
Label1.Caption = " "
Label2.Caption = "Искомое сопротивление"
Label3.Caption = "Длина провода"
Label4.Caption = "Диаметр сечения"
Label5.Caption = "Удельное сопротивление "
UserForm1.Caption = "Расчет сопротивления проводов"
End Sub
Sub wwod(A, Res, Res1) 'подпрограмма проверки
If IsNumeric(A) = False Then
Res = MsgBox("Введен символ", 53, "Введи число")
End If
If A < 0 Or A = 0 Then
Res1 = MsgBox("Введено недопустимое числовое значение", 53, "Введи число ")
End If
End Sub
53
Задание : Составить схему алгоритма определения диаметра провода для
обеспечения нужного сопротивления при заданном материале и длине.
При расчете использовать формулу :
l
Получив расчетное значение диаметра
значение .
d 2 R
4
(1)
d , выбрать ближайшее стандартное
Обозначения :
В задаче
l
R
В программе
L
R
R1
 серебра
Алгоритм решения задачи
1.Ввод исходных данных l = 30м
R = 100 Ом
 серебра = 0,016 Ом мм 2 /м и проверка их на ошибки .
2.Вычисление диаметра по расчетной формуле :
d=
l 4
R
которую получили из формулы (1)
Private Sub CommandButton1_Click()
Dim L As Single
Dim R As Single
Dim R1 As Single
Dim d As Single
If IsNumeric(TextBox1.Text) = False Then
MsgBox "Введите длину", vbInformation, "ввод"
TextBox1.SetFocus
Exit Sub
End If
If IsNumeric(TextBox2.Text) = False Then
MsgBox "Введите сопротивление", vbInformation, "ввод"
TextBox2.SetFocus
Exit Sub
End If
If CSng(TextBox2.Text) = 0 Then
MsgBox "Введите сопротивление серебра", vbInformation, "ввод"
TextBox2.SetFocus
Exit Sub
End If
54
If IsNumeric(TextBox3.Text) = False Then
MsgBox "Введите удельное сопротивление серебра", vbInformation, "ввод"
TextBox3.SetFocus
Exit Sub
End If
L = CSng(TextBox1.Text)
R = CSng(TextBox2.Text)
R1 = CSng(TextBox3.Text)
d = Sqr(L * 4 * R1 / 3.14 * R)
TextBox4.Text = CStr(d)
End Sub
Тестовый пример
Расчет делителя напряжения цепи постоянного тока
Произвести расчет делителя напряжения цепи постоянного тока (рис.18).
Исходные данные:Uи –напряжение источника подводимое к делителю; Uнапряжение, снимаемое с делителя, изменяется в пределах от 20 до 100 В с шагом
10 В; I-ток потребителя; I2- ток через сопротивление R2 делителя.
Результатом решения задачи являются значения сопротивления делителя R1 и
R2 для различных значений напряжения U.
Расчетные соотношения вывести из рис.18.
R1 
(U И  U )
(I  I2 )
R2 
U
I2
55
__
I1
Uи
I
+
+
R2
I2
U
К потребителю
R1
Рис.18
Исходные данные:
В программе В формуле
uu Uи – напряжение источника, подводимое к делителю;
u U – напряжение, снимаемое с делителя, изменяется в
пределах от 20 до 100В с шагом 10В;
i I – ток потребителя;
ii I2 – ток через сопротивление R2 делителя.
Программный код:
Private Sub CommandButton1_Click() ' Вычисление
Dim uu As Single
' переменная
Dim u(1 To 9) As Single 'массив от 1 до 9
Dim i As Single
Dim ii As Single
Dim g As Single '
Dim k As Integer ' счетчик
Dim r(1 To 9) As Single 'массив
Dim rr(1 To 9) As Single 'массив
pr = TextBox1.Text 'проверка на ошибки
g = IsNumeric(pr) 'наличие букв
If g = False Then
MsgBox "В первом поле нет числа", vbInformation, "Ошибка ввода"
TextBox1.SetFocus 'установка курсора в поле № 1
Exit Sub
End If
uu = CSng(TextBox1.Text)
pr = TextBox2.Text
g = IsNumeric(pr)
If g = False Then
MsgBox "Во втором поле нет числа", vbInformation, "Ошибка ввода"
TextBox2.SetFocus
Exit Sub
End If
i = CSng(TextBox2.Text)
56
If i = 0 Then 'проверка на 0
MsgBox "Во втором поле 0", vbInformation, "Ошибка ввода"
TextBox2.SetFocus 'установка курсора во второе поле
Exit Sub
End If
pr = TextBox3.Text
g = IsNumeric(pr)
If g = False Then
MsgBox "В третьем поле нет числа", vbInformation, "Ошибка ввода"
TextBox3.SetFocus
Exit Sub
End If
ii = CSng(TextBox3.Text)
If ii = 0 Then
MsgBox "В третьем поле 0", vbInformation, "Ошибка ввода"
TextBox3.SetFocus
Exit Sub
End If
k=1
For g = 20 To 100 Step 10
u(k) = g 'заполнение массива переменной
k = k + 1 ' счетчик
Next g
For k = 1 To 9
r(k) = (uu - u(k)) / (i + ii) 'вычисление всех значений r1
rr(k) = u(k) / ii 'вычисление всех значений r2
Next k
ListBox1.List = Array(r(1), r(2), r(3), r(4), r(5), r(6), r(7), r(8), r(9)) 'заполнение листа
№1
ListBox2.List = Array(rr(1), rr(2), rr(3), rr(4), rr(5), rr(6), rr(7), rr(8), rr(9)) 'заполнение
листа № 2
End Sub
Задание: Произвести расчет делителя напряжения цепи постоянного тока.
Расчетные формулы:
R1  (Uи  U ) /( I  I 2 ) ;
R2  U / I 2 .
Исходные данные: Uи, U, I, I2
Размерность: Напряжение источника -Uи [В],напряжение, снимаемое с
делителя, изменяется в пределах от 20 до 100 В с шагом 10В- U[В], ток потребителяI [А], ток через сопротивление делителя I2-[А], сопротивление - R1,R2 [Oм].
57
Обозначения:
В задаче:
U,(напряжение)
Uи,( напряжение источника)
I,( ток потребителя)
I2,( ток делителя )
R1, (сопротивление)
R2, (сопротивление)
В программе:
u, (напряжение )
ui,( напряжение источника)
i,( ток потребителя)
i2,( ток делителя)
r1, (сопротивление)
r2, (сопротивление)
Алгоритм решения задачи:
1. Ввод данных и проверка их на наличие ошибок.
2. Вычисление сопротивлений при заданных параметрах.
3. Вывести результаты вычислений, очистить поля ввода.
Тестовый пример:
58
Программный код:
DefSng A-G
Private Sub CommandButton1_Click()
If IsNumeric(TextBox1.Text) = False Then
MsgBox " Значение в поле 1 не число! Исправьте! ", 16, "Контроль ввода данных"
TextBox1.SetFocus 'Устанавливает фокус в поле 1
Exit Sub
End If
If CSng(TextBox1.Text) = 0 Or CSng(TextBox1.Text) < 0 Then
MsgBox "Напряжение не может быть равно или быть меньше 0! Исправьте!", 16, "Контроль
ввода данных"
TextBox1.SetFocus 'Устанавливает фокус в поле 1
Exit Sub
End If
If IsNumeric(TextBox2.Text) = False Then
MsgBox " Значение в поле 2 не число! Исправьте! ", 16, "Контроль ввода данных"
TextBox2.SetFocus 'Устанавливает фокус в поле 2
Exit Sub
End If
If CSng(TextBox2.Text) < 20 Or CSng(TextBox2.Text) > 100 Then
MsgBox "Вы вышли за пределы допустимых значений! Исправьте!", 16, "Контроль ввода
данных"
TextBox2.SetFocus 'Устанавливает фокус в поле 2
Exit Sub
End If
If IsNumeric(TextBox3.Text) = False Then
MsgBox " Значение в поле 3 не число ! Исправьте! ", 16, "Контроль ввода данных"
TextBox3.SetFocus 'Устанавливает фокус в поле 3
Exit Sub
59
End If
If CSng(TextBox3.Text) = 0 Or CSng(TextBox3.Text) < 0 Then
MsgBox "Ток не может быть равен или быть меньше 0! Исправьте!", 16, "Контроль ввода
данных"
TextBox3.SetFocus 'Устанавливает фокус в поле 3
Exit Sub
End If
If IsNumeric(TextBox6.Text) = False Then
MsgBox " Значение в поле 4 не число ! Исправьте! ", 16, "Контроль ввода данных"
TextBox6.SetFocus 'Устанавливает фокус в поле 6
Exit Sub
End If
If CSng(TextBox6.Text) = 0 Or CSng(TextBox6.Text) < 0 Then
MsgBox "Ток не может быть равен или быть меньше 0! Исправьте!", 16, "Контроль ввода
данных"
TextBox6.SetFocus 'Устанавливает фокус в поле 6
Exit Sub
End If
ui = CSng(TextBox1.Text) 'Присвоить переменной ui числовое значение поля 1
u = CSng(TextBox2.Text) 'Присвоить переменной u числовое значение поля 2
i = CSng(TextBox3.Text) 'Присвоить переменной i числовое значение поля 3
i2 = CSng(TextBox6.Text) 'Присвоить переменной i2 числовое значение поля 6
r1 = (ui - u) / (i + i2) 'Формула для расчета сопротивления R1
TextBox4.Text = CStr(r1) 'Занести результат в поле 4
r2 = u / i2 'Формула для расчета сопротивления R2
TextBox7.Text = CStr(r2) 'Занести результат в поле 7
CommandButton3.SetFocus 'Устанавливает фокус на кнопку очистки полей
End Sub
Private Sub CommandButton3_Click()
TextBox1.Value = "" 'Очищает поле ввода 1
TextBox2.Value = "" 'Очищает поле ввода 2
TextBox3.Value = "" 'Очищает поле ввода 3
TextBox4.Value = "" 'Очищает поле ввода 4
TextBox6.Value = "" 'Очищает поле ввода 6
TextBox7.Value = "" 'Очищает поле ввода 7
TextBox1.SetFocus 'Устанавливает фокус в поле 1
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide 'Работает кнопка отмены
End Sub
Расчет числа витков и диаметра провода с изоляцией катушки индуктивности
Задача №34 Определить число витков и диаметр провода с изоляцией для катушек
индуктивности, обеспечивающих наименьшее активное сопротивление, которое
достигается при отношении:
a/D=0,4
(1)
Для расчета воспользоваться формулами:
L =0,01*D*w^2/(0,44+a/D)
Dиз = a / w
(2)
60
Где D- диаметр катушки индуктивности; а – длина намотки; w- число витков, Dиз –
диаметр провода с изоляцией.
Исходные данные: индуктивность L, значение диаметра D катушки изменяются в пределах
от 1 до 10 см.
Обозначения:
В задаче
Dиз
D
a
w
L
В программе
Di
D
a
w
L
Пример решения для катушки индуктивностью 120 МГн и диаметра 40 мм
Private Sub ListBox1_Click()
Dim x As Integer ' задание типа переменной x
x = ListBox1.Text ' присвоение значению переменной x значения из списка
Select Case x ' Начало выбора переменной x
Case "1" ' Выбор значения "1"
TextBox2.Text = 10 ' Помешение в тестовое поле 2 значение = 10
Case "2" ' Выбор значения "2"
TextBox2.Text = 20 ' Помешение в тестовое поле 2 значение = 20
Case "3" ' Выбор значения "3"
TextBox2.Text = 30 ' Помешение в тестовое поле 2 значение = 30
Case "4" ' Выбор значения "4"
TextBox2.Text = 40 ' Помешение в тестовое поле 2 значение = 40
Case "5" ' Выбор значения "5"
TextBox2.Text = 50 ' Помешение в тестовое поле 2 значение = 50
Case "6" ' Выбор значения "6"
TextBox2.Text = 60 ' Помешение в тестовое поле 2 значение = 60
Case "7" ' Выбор значения "7"
TextBox2.Text = 70 ' Помешение в тестовое поле 2 значение = 70
Case "8" ' Выбор значения "8"
TextBox2.Text = 80 ' Помешение в тестовое поле 2 значение = 80
Case "9" ' Выбор значения "9"
TextBox2.Text = 90 ' Помешение в тестовое поле 2 значение = 90
Case "10" ' Выбор значения "10"
TextBox2.Text = 100 ' Помешение в тестовое поле 2 значение = 100
End Select ' Конец выбора
End Sub
Private Sub CommandButton1_Click()
' Задание типа переменной
Dim L As Single
Dim a As Single
Dim w As Single
Dim D As Single
61
Dim Di As Single
L = (TextBox1.Value) ' Задание значения переменной L = значению в текстовом поле 1
D = (TextBox2.Value) ' Задание значения переменной D = значению в текстовом поле 2
a = 0.4 * D ' Расчет длины намотки a по формуле
w = Sqr(L * (0.44 + (a / D)) / (0.01 * D)) ' Расчет количества витков w по формуле
Di = a / w ' Расчет диаметра провода с изоляцией Dиз по формуле
w = Int(w + 0.5) ' Округление числа витков до ближайшего большего целого числа
Label3.Caption = "Число витков катушки = " & w & " шт." ' Вывод значения числа витков
Label4.Caption = "Диаметр провода с изоляцией = " & Di & " мм" ' Вывод значения диаметра провода с
изоляцией
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub
Private Sub CommandButton3_Click()
TextBox1.Text = "" ' Помешение в текстовое поле 1 значение пустоты
TextBox2.Text = "" ' Помешение в текстовое поле 2 значение пустоты
Label3.Caption = "" ' Присвоение надписи 3 имени " "
Label4.Caption = "" ' Присвоение надписи 4 имени " "
End Sub
Private Sub UserForm_Initialize()
ListBox1.List = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") ' Заполнение спика
' Задание всплывающих подсказок
TextBox1.ControlTipText = "Введите значение индуктивности"
ListBox1.ControlTipText = "Выберите значение диаметра катушки, см"
TextBox2.ControlTipText = "Диаметр катушки, мм"
TextBox2.Locked = True ' Блокировка окна ввода
End Sub
Программа решения системы 3-х линейных уравнений
Программа решения системы линейных уравнений
Введите коэффициенты уравнений
a11 =
3 a12 =
7 a13 =
15
a21 =
1 a22 =
-3 a23 =
-10
a31 =
-3 a32 =
-4 a33 =
-5
Корни уравнений системы
x1 =
10 x2 =
38 x3 =
-6,4
Проверка найденных корней уравнений системы
x1
200 = 200
x2
-40 = -40
x3
-150 = -150
Программа завершена. Надеюсь, вы довольны
результатом
Private Sub CommandButton1_Click()
Dim f(3) As Single
Dim t As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
b1 =
b2 =
b3 =
200
-40
-150
62
Dim l As Integer
Dim a(3, 3) As Single
Dim b(3) As Single
Dim a1(3, 5) As Single
Dim delta As Single
Dim deltaS(3) As Single
Dim x(3) As Single
CommandButton1.Left = 96
UserForm2.Height = 217.5
'Лист1.Cells(1, 1).Value = " Программа решения системы линейных уравнений"
'Лист1.Cells(2, 1).Value = "
Введите коэффициенты уравнений"
'For i = 1 To 3
' For j = 1 To 3
'
Лист1.Cells(i + 2, 2 * j - 1).Value = "a" & i & j & " = "
'
t=2*j-1
' Next j
'Next i
'For i = 1 To 3
' Лист1.Cells(i + 2, t + 2).Value = "b" & i & " = "
'Next i
'For i = 1 To 3
' For j = 1 To 3
'
a(i, j) = Лист1.Cells(i + 2, 2 * j).Value
'
t=2*j
' Next j
'N'ext i
'For i = 1 To 3
' b(i) = Лист1.Cells(i + 2, t + 2).Value
'Next i
't = 0
'TextBox1.SetFocus
If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text
= "" Or _
TextBox5.Text = "" Or TextBox6.Text = "" Or TextBox7.Text = "" Or TextBox8.Text =
"" Or _
TextBox9.Text = "" Or TextBox10.Text = "" Or TextBox11.Text = "" Or
TextBox12.Text = "" Then
TextBox1.SetFocus
UserForm2.Hide
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
TextBox8.Text = ""
63
TextBox9.Text = ""
TextBox10.Text = ""
TextBox11.Text = ""
TextBox12.Text = ""
Load UserForm5
UserForm5.Show
End If
a(1, 1) = CSng(TextBox1.Text)
a(1, 2) = CSng(TextBox2.Text)
a(1, 3) = CSng(TextBox3.Text)
b(1) = CSng(TextBox4.Text)
a(2, 1) = CSng(TextBox5.Text)
a(2, 2) = CSng(TextBox6.Text)
a(2, 3) = CSng(TextBox7.Text)
b(2) = CSng(TextBox8.Text)
a(3, 1) = CSng(TextBox9.Text)
a(3, 2) = CSng(TextBox10.Text)
a(3, 3) = CSng(TextBox11.Text)
b(3) = CSng(TextBox12.Text)
For l = 1 To 4
1: For i = 1 To 3
For j = 1 To 3
a1(i, j) = a(i, j)
Next j
Next i
If l = 4 Then GoTo 2
For i = 1 To 3
a1(i, l) = b(i)
Next i
2: For i = 1 To 3
For k = 1 To 2
a1(i, k + 3) = a1(i, k)
Next k
Next i
If l = 4 Then delta = Опред(a1()): GoTo 3 Else
deltaS(l) = Опред(a1())
't = l
'If t = 3 Then t = t + 1: GoTo 1
Next l
3: If delta = 0 Then
TextBox1.SetFocus
UserForm2.Hide
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
64
TextBox7.Text = ""
TextBox8.Text = ""
TextBox9.Text = ""
TextBox10.Text = ""
TextBox11.Text = ""
TextBox12.Text = ""
CommandButton1.Left = 96
UserForm2.Height = 217.5
Load UserForm4
UserForm4.Show
Exit Sub
End If
For i = 1 To 3
x(i) = deltaS(i) / delta
Next i
Label10.Visible = True
Label11.Visible = True
Label12.Visible = True
TextBox13.Visible = True
TextBox14.Visible = True
TextBox15.Visible = True
TextBox13.Text = x(1)
TextBox14.Text = x(2)
TextBox15.Text = x(3)
'delta1 = a(2, 2) * b(1) - a(1, 2) * b(2)
'delta2 = a(1, 1) * b(2) - b(1) * a(2, 1)
'delta = a(1, 1) * a(2, 2) - a(1, 2) * a(2, 1)
'x(1) = delta1 / delta
'x(2) = delta2 / delta
'Лист1.Cells(6, 1).Value = " Корни уравнений системы"
'For i = 1 To 3
' Лист1.Cells(7, 2 * i - 1).Value = "x" & i & " = "
'Next i
'For i = 1 To 3
' Лист1.Cells(7, 2 * i).Formula = x(i)
'Next i
'Лист1.Cells(8, 1).Value = " Проверка найденных корней уравнений системы"
'f(1) = 0: f(2) = 0: f3 = 0
'For i = 1 To 3
' For j = 1 To 3
'
f(i) = f(i) + a(i, j) * x(j)
' Next j
'Next i
'For i = 1 To 3
' Лист1.Cells(8 + i, 1).Value = "x" & i
' Лист1.Cells(8 + i, 2).Value = f(i) & " = " & b(i)
'Next i
65
'Лист1.Cells(12, 1).Value = "Программа завершена. Надеюсь, вы довольны
результатом."
CommandButton2.Visible = True
CommandButton3.Left = 96
CommandButton3.Top = 204
UserForm2.Height = 257.25
End Sub
Private Function Опред(z() As Single) As Single
Dim s1 As Single
Dim s2 As Single
Dim p As Single
s1 = 0: s2 = 0
For l = 0 To 2
p1 = 1: p2 = 1
For j = 1 To 3
If (j + l) = 3 Then w = 3 Else w = (j + l) Mod 3
p1 = p1 * z(j, w)
If (4 - j + l) = 3 Then q = 3 Else q = (4 - j + l) Mod 3
p2 = p2 * z(j, q)
Next j
s1 = s1 + p1
s2 = s2 + p2
Next l
Опред = s1 - s2
End Function
Private Sub CommandButton2_Click()
Dim a(3, 3) As Single
Dim b(3) As Single
Dim x(3) As Single
UserForm2.Height = 289.5
a(1, 1) = CSng(TextBox1.Text)
a(1, 2) = CSng(TextBox2.Text)
a(1, 3) = CSng(TextBox3.Text)
b(1) = CSng(TextBox4.Text)
a(2, 1) = CSng(TextBox5.Text)
a(2, 2) = CSng(TextBox6.Text)
a(2, 3) = CSng(TextBox7.Text)
b(2) = CSng(TextBox8.Text)
a(3, 1) = CSng(TextBox9.Text)
a(3, 2) = CSng(TextBox10.Text)
a(3, 3) = CSng(TextBox11.Text)
b(3) = CSng(TextBox12.Text)
x(1) = CSng(TextBox13.Text)
x(2) = CSng(TextBox14.Text)
x(3) = CSng(TextBox15.Text)
66
Label13.Caption = a(1, 1) & " * " & x(1) & " " & a(1, 2) & " * " & x(2) & " " & a(1, 3) &
" * " & x(3) & " = " & a(1, 1) * x(1) + a(1, 2) * x(2) + a(1, 3) * x(3)
Label14.Caption = a(2, 1) & " * " & x(1) & " " & a(2, 2) & " * " & x(2) & " " & a(2, 3) &
" * " & x(3) & " = " & a(2, 1) * x(1) + a(2, 2) * x(2) + a(2, 3) * x(3)
Label15.Caption = a(3, 1) & " * " & x(1) & " " & a(3, 2) & " * " & x(2) & " " & a(3, 3) &
" * " & x(3) & " = " & a(3, 1) * x(1) + a(3, 2) * x(2) + a(3, 3) * x(3)
Label16.Caption = b(1)
Label17.Caption = b(2)
Label18.Caption = b(3)
CommandButton3.Visible = True
UserForm2.Height = 337.5
CommandButton3.Left = 96
CommandButton3.Top = 282
CommandButton3.Caption = "Завершить"
UserForm2.Top = 100
End Sub
Private Sub CommandButton3_Click()
UserForm2.Hide
Load UserForm1
UserForm1.Show
End Sub
VBA – ПРИЛОЖЕНИЕ «МНОГОМЕРНЫЕ LП – ЧИСЛА» ДЛЯ
СТОХАСТИЧЕСКИХ МЕТОДОВ ОПТИМИЗАЦИИ (МОДИФИКАЦИЯ МЕТОДА
БОКСА)
При решении задач оптимального управления достойное место могут занять
стохастические методы многокритериального поиска.
Стохастические методы или методы случайного поиска получили достаточно
широкое распространение при построении оптимальных решений в различных
приложениях. Это объясняется в первую очередь тем, что с ростом размерности
задач резко снижается эффективность регулярных методов поиска (детерминированных), так называемое “проклятие размерности”. Во-вторых, зачастую
информация об оптимизируемом объекте слишком мала для того, чтобы можно было
применить детерминированные методы. Стохастические алгоритмы часто
используют при поиске оптимального решения в системах управления, когда отклик
можно получить только при задании управляющих воздействий на входах системы.
В таких ситуациях стохастические алгоритмы могут оказаться значительно
эффективнее детерминированных.
Известно, что стохастические методы наиболее эффективны при решении задач
оптимизации большой размерности или при поиске глобального экстремума
многомерной функции. Принято считать, что преимущество таких методов
проявляется с ростом размерности задач, так как вычислительные затраты в
детерминированных методах поиска с ростом размерности растут быстрее, чем в
стохастических алгоритмах [1—3].
67
Стохастическими методами поиска считаются методы, использующие
элемент случайности либо о сборе информации о целевой функции при пробных
шагах, либо для улучшения значений функции при рабочем шаге. Случайным
образом может выбираться направление спуска, длина шага, величина штрафа при
нарушении ограничения. Практически в каждом стохастическом методе, так или
иначе, используются случайные равномерно распределенные последовательности
чисел.
В действительности, даже в одномерном случае не вполне ясно, что значит
«равномерно». Вопрос еще более усложнится, если точки придется размещать в
кубе или n-мерном кубе (гиперкубе), не нарушая равномерности. В теории
равномерно распределенных последовательностей исследуются бесконечные
последовательности точек P0 , P1,..., Pi ,..., обладающие тем свойством, что группа
точек P0 , P1,..., Pi ,...PN 1 при каждом N в каком-то смысле равномерно расположена
в кубе. При увеличении N «плотность заполнения» увеличивается, а
равномерность сохраняется. Среди известных в настоящее время равномерно
распределенных последовательностей наилучшими характеристиками
равномерности (с увеличением количества элементов) обладают LП последовательности.
Нами рассматривается технология формирования комплекса точек,
являющихся LП -числами, на примере реализации комплексного метода Бокса
[4-5]. Комплексный метод Бокса представляет модификацию метода
деформируемого многогранника и применяется для решения задач многомерной
нелинейной оптимизации с ограничениями. Достоинствами комплексного метода
Бокса являются его простота, удобство для программирования, надежность в
работе. Метод на каждом шаге использует информацию только о значениях
целевой функции и функций ограничений задачи. Все это обусловливает
успешное применение его для решения различных задач нелинейного
программирования.
Ограничения могут быть заданы как явно, так и неявно.
 f  x   f  x1,..., xn   min

 l j  x j  u j , j  1,..., n
 g  x   b , i  1,..., m

t
i
На каждой итерации необходимо выбрать 2n точек, равномерно распределенных
в области, задаваемой ограничениями. Множество этих точек называется
комплексом. В каждой точке комплекса вычисляется значение целевой функции.
Начальная точка x 1 , удовлетворяющая всем ограничениям, предполагается
известной.
В классическом методе Бокса остальные точки выбираются случайным образом:
xij  l j  r u j  l j , j  1,..., n, i  2,...,2n ,
где r – случайная величина, равномерно распределенная в интервале (0,1).
При формировании начального комплекса с использованием равномерно
распределенной случайной величины возникает вопрос о «равномерности» в nмерном кубе.
68
Мы предлагаем для формирования точек комплекса использовать те точки в
многомерном пространстве параметров, координаты которых представляют собой
LП -числа. Точки Q0 , Q1 ,...,Qi ,... LП -последовательности легко вычисляются с
помощью весьма простого алгоритма [6]. Этот алгоритм предполагает наличие
таблицы так называемых направляющих точек V t   Q2t 1 . Таблица, содержащая
20 направляющих точек, позволяет вычислить 220, т.е. более миллиона точек
последовательности.


Пусть V t   V1t  ,...,Vnt  , так что V j t  – это направляющие числа. Если в
двоичной системе i  em ...e2e1 , то координаты qi1 ,..., qin  точки Q, вычисляются по
формуле:
qij  e1V j1  e2V j2   ... emV jm  , 1  j  n.
Так как все V j t  – двоично-рациональные числа, то удобнее хранить таблицу
числителей. Такие таблицы составлены для l  t  20, l  j 51 и позволяют легко
вычислять точки Qi размерности n  51 в количестве N < 221. Быстрые программы
для расчета точек Qi сравнительно просто составляются в кодах любой ЭВМ.
Нами предлагается вычислять точки LП -последовательностей с помощью
направляющих чисел, представляющих собой элементы матрицы переменной
размерности. Матрица генерируется с помощью предлагаемого оригинального
алгоритма на основе строковой константы длиной 1960 символов, что позволяет
вычислить 220, т.е. более миллиона точек последовательности, при максимальной
конструктивной размерности, равной 14. Алгоритм отличается от [6] тем, что не
использует битовые операции.
Для реализации генератора многомерных LП -чисел предлагается
применение технологии VBA с использованием электронных таблиц Excel. Такой
выбор обусловлен удобством дальнейшего использования полученных LП чисел. Во-первых, с их помощью можно реализовывать собственные алгоритмы
поиска, считывая данные с листа электронной таблицы. Во-вторых, такое
представление LП -чисел позволяет использовать их в стандартных функциях
оптимизации Excel.
Процедура расчета направляющих чисел записывается на VBA следующим
образом:
Sub lp_tau_15_Dim()
a = "00001000010000100001000010000100001000010000100001" + _
"0000100001000010000100001" + _
"00001000030000500015000170005100085002550025700771" + _
"0128503855043690310721845" + _
"00001000010000700011000130006100085000790046500721" + _
"0082304091041250414128723" + _
"00001000030000700005000070004300049001470043901013" + _
"0072700987058890691516647" + _
69
"00001000010000500003000150005100125001410017700759" + _
"0028503855043690310721845" + _
"00001000030000500015000170005100085002550025700771" + _
"0026701839069291624116565" + _
"00001000030000100001000090005900025000890032100835" + _
"0083304033039131164318777" + _
"00001000010000300007000310004700109001730018100949" + _
"0047102515062110214703169" + _
"00001000030000300009000090005700043000430022500113" + _
"0160100579017310119707241" + _
"00001000030000700013000030003500089000090023500929" + _
"0047103855043690314703169"
For k = 1 To 10
For j = 1 To 15
b(k, j) = Mid$(a, 75 * (k - 1) + 5 * (j - 1) + 1, 5)
n1(k, j) = Val(b(k, j))
Next j
Next k
End Sub
Для создания последовательности LП -чисел используется процедура:
Sub tau_coord(i, n)
Dim m As Integer, j As Integer, k As Integer, t As Integer
' i номер точки ' n размерность
m = 1 + Int(Log(i) / 0.693147)
For j = 1 To n
s=0
For k = 1 To m
n2 = 0
For t = k To m
bb = n1(j, t)
n2 = n2 + Int(2 * fnd(i / 2 ^ t)) * Int(2 * fnd((bb / 2 ^ (t + 1 - k))))
Next t
s = s + fnd(0.5 * n2) / (2 ^ (k - 1))
70
Next k
q(j) = s 'очередная точка с п координатами
Next j
' пошаговый тест
For tt = 1 To n
For j2 = 1 To tt
Worksheets(2).Cells(i, j2).Formula = q(j2)
Next j2
Next tt
End Sub
Существует возможность переноса данных в какой-нибудь математический
пакет, например Matlab, и также использовать в стандартных функциях пакета:
%матрица опорных точек
function Matr = form(i,j)
M = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
1, 3, 5, 15, 17, 51, 85, 255, 257, 771, 1285, 3855, 4369, 3107, 21845;
1, 1, 7, 11, 13, 61, 85, 79, 465, 721, 823, 4091, 4125, 4141, 28723;
1, 3, 7, 5, 7, 43, 49, 147, 439, 1013, 727, 987, 5889, 6915, 16647;
1, 1, 5, 3, 15, 51, 125, 141, 177, 759, 285, 3855, 4369, 3107, 21845;
1, 3, 5, 15, 17, 51, 85, 255, 257, 771, 267, 1839, 6929, 16241, 16565;
1, 3, 1, 1, 9, 59, 25, 89, 321, 835, 833, 4033, 3913, 11643, 18777;
1, 1, 3, 7, 31, 47, 109, 173, 181, 949, 471, 2515, 6211, 2147, 3169;
1, 3, 3, 9, 9, 57, 43, 43, 225, 113, 1601, 579, 1731, 1197, 7241;
1, 3, 7, 13, 3, 35, 89, 9, 235, 929, 471, 3855, 4369, 3147, 3169];
Matr = M(i,j);
%получение i-й lpt-точки размерности n
function q = tauc(i, n)
m = 1 + floor(log(i) / 0.693147);
for j=1:n
s = 0;
for k = 1:m
n2 = 0;
for t = k:m
b = form(j,t);
n2 = n2 + floor(2 * fnd(i / (2 ^ t))) * floor(2 * fnd((b / (2 ^ (t + 1 - k)))));
end
s = s + fnd(0.5 * n2)/(2 ^ (k - 1));
end
q(j) = s;
end
%получение дробной части числа
function f = fnd(x)
f = x - floor(x);
%получение p числа lpt-точек размерности n
71
function mq = lptau (p, n)
for i = 1:p
m = 1 + floor(log(i) / 0.693147);
for j=1:n
s = 0;
for k = 1:m
n2 = 0;
for t = k:m
b = form(j,t);
n2 = n2 + floor(2 * fnd(i / (2 ^ t))) * floor(2 * fnd((b / (2 ^ (t + 1 - k)))));
end
s = s + fnd(0.5 * n2)/(2 ^ (k - 1));
end
mq(i,j) = s;
end
end
%получение дробной части числа
function f = fnd(x)
f = x - floor(x);
LП -последовательности
Так
как
описанные
представляют
собой
детерминированные последовательности в единичном гиперкубе n-мерного
пространства, то это позволяет нам решать задачи многопараметрической
оптимизации [7].
И, наконец, основной методический аргумент предлагаемой технологии
моделирования — существование возможности импорта LП—чисел из таблицы
Excel в математические пакеты, например MatLab, MathCAD, Maple, и
использования в стандартных функциях оптимизации [8].
Литература
1. Соболь И.М., Статников Р.Б. Выбор оптимальных параметров в задачах со
многими критериями. – М.: Наука, 1981, 186с.
2. Соболь И.М., Статников Р.Б. Наилучшие решения – где их искать. – М.:
Знание, 1982, 64с.
3. Банди Б. Методы оптимизации. – М.: Радио и связь, 1988, 128с.
4. Box M.J. A new method of constrained optimization and a comparison with other
methods. Comp.J. 8 (1965), pp.42—52.
5. Richardson J.A., Kuester J.L. The Complex Method for Constained Optimization. –
Communications of the ACM, 1973, V.16, N8, pp.487—489.
6. Соболь И.М. Точки, равномерно заполняющие многомерный куб. – М.:
Знание, сер. Математика, кибернетика, 1985, N2, 32с
7. Клинаев Ю.В. Статистические модели ЛБВО – анализ, синтез, управление
параметрами. – Саратов, СГТУ, 1998, 274с..
8. Клинаев Ю.В., Кац А.М., Ставский Ю.В. Технологии VBA и MatLab в
базовом курсе «Вычислительная математика». «ИТО—2002» – ХII Межд.
конф.–выставка «Информационные технологии в образовании»: Сб.трудов
уч.конф. Часть III.– М.:МИФИ, 2002.– с.32—33.
Download