Организация защиты программы от неверных действий пользователя
Лабораторная работа №8
Организация защиты программы от неверных действий пользователя
Цель работы:
В созданной программе при выполнении лабораторной работе № 5 организовать защиту от неверных действий пользователя.
Порядок выполнения работы
В лабораторной работе № 5 был рассмотрен следующий пример.
Задача. Составьте программу, которая производит расчет по формуле при различных значениях a , b , c.
Программа должна содержать форму, на которой должны располагаться текстовые поля для ввода величин, кнопки для выполнения расчета, формирования отчета и выхода из программы.
Сформировать отчет средствами VBA. Отчет должен содержать:
условие задачи; формулу расчета с обозначениями и подставленными вместо них числами; полученный результат.
Решая задачу, мы спроектировали следующую форму [1] рис. 2.
Рис. 2. Форма для расчета формулы.
Мы написали программу, с помощью которой рассчитывается формула по введенным данным и создается отчет.
Dim a As Single, b As Single, c As Single, result As Single
Private Sub cmdRaschet_Click()
a = CSng (txtA.Text)
b = CSng (txtB.Text)
c = CSng (txtC.Text)
result = (b + Sqr(b ^ 2 + 4 * a^ 3 * c)) / (2 * a) - a ^ 3 * c + b ^ (-2)
lblOtvet.Caption = CStr(result)
End Sub
Private Sub cmdOtchet_Click()
frmFormula.Hide
Dim docNew As Document 'объявляем новый документ
'создаем новый документ и устанавливаем на него ссылку
Set docNew = Documents.Add
With Selection
'Печатаем заголовок
|
|
.InsertAfter "Программа для расчета формулы."
'напечатанный заголовок форматируем по середине
.ParagraphFormat.Alignment = wdAlignParagraphCenter
'создаем отступ для первой строки
.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0.7)
'устанавливаем для заголовка полужирный шрифт, 14 размера
.Font.Bold = True
.Font.Size = 14
'вставляем два параграфа
.InsertParagraphAfter
.InsertParagraphAfter
'Перемещаем курсор в конец документа
.EndOf Unit:=wdSection
'Печатаем задание
.InsertAfter "Задание. "
.ParagraphFormat.Alignment = wdAlignParagraphJustify
.EndOf Unit:=wdSection
.InsertAfter "Составить программу для расчета формулы. Программа должна содержать форму, которая должна иметь текстовые поля для ввода величин, кнопки для расчета, формирования отчета, выхода из программы."
.InsertParagraphAfter
.InsertAfter "Сформировать отчет средствами VBA. Отчет должен содержать:"
.InsertParagraphAfter
.InsertAfter "условие задачи;"
.InsertParagraphAfter
.InsertAfter "формулу расчета с обозначениями и подставленными вместо них числами;"
.InsertParagraphAfter
.InsertAfter "полученный результат."
.Font.Bold = False
.InsertParagraphAfter
.EndOf Unit:=wdSection
'Вывод результатов в отчет
.Font.Bold = True
.InsertAfter "Решение. "
.InsertParagraphAfter
.EndOf Unit:=wdSection
.Font.Bold = False
.InsertAfter "Для a = " & CStr(a) & ", для b = " & CStr(b) & ", для c = " & CStr(c) & " значение формулы:"
|
|
.InsertParagraphAfter
.InsertParagraphAfter
.EndOf Unit:=wdSection
'Формируем формулу с обозначениями
'Formula = "(b+" & ChrW(8730) & "(b^2+4·a·c))/(2·a)-a^3·c+b^-2=" & "(" & b & "+" & ChrW(8730) & "(" & b & "^2" & "+4" & "·" & a & "·" & c & "))/" & "(2·" & a & ")-" & a & "^3·" & c & "+" & b & "^-2=" & result
Formula = "(b+" & ChrW(8730) & "(b^2+4·a·c))/(2·a)-a^3·c+b^-2=(" & b & "+" & ChrW(8730) & "(" & b & "^2+4·" & a & "·" & c & "))/(2·" & a & ")-" & a & "^3·" & c & "+" & b & "^-2=" & result
'Объявляемобъект - диапазонobjRange
Dim objRange As Range
'ОбъявляемобъктobjEq, какформулу
Dim objEq As OMath
' УстанавливаемобъектobjRange, как выделенную часть документа. В нашем случае место под курсором
Set objRange = Selection.Range
'свойствуtextобъектаobjRange присваиваем код формулы
objRange.Text = Formula
'преобразуемобъектobjRange в математическую формулу
Set objRange = Selection.OMaths.Add(objRange)
' создаем объект objEq, образуя его из объекта objRange
Set objEq = objRange.OMaths(1)
'Преобразуем формулу из линейного вида к профессиональному
objEq.BuildUp
End With
frmFormula.Show
End Sub
Private Sub cmdExit_Click()
|
|
End
End Sub
Кажется, что мы все сделали. Но это не так. Мы не учли следующее:
1. Пользователь может нажать кнопку Рассчитать, забыв ввести данные в текстовые поля. В формулу будет подставлена пустая величина и приложение, в этом случае, выдаст ошибку и прекратит выполнение программы.
2. Пользователь может ввести неверные данные, например, не числовые, что опять может привести к ошибке выполнения программы.
3. Пользователь может ввести данные правильно, однако следует учесть, что подкоренное выражение в формуле не может быть меньше 0, а также знаменатель формулы не может быть равен 0. Если пользователь введет такие данные, которые не удовлетворят математическим ограничениям, это также приведет к ошибке.
4. Пользователь может нажать кнопку Создать отчет, не рассчитав прежде значение по формуле.
Для того, чтобы программа правильно реагировала на введенные не верно данные, нужно создать код проверки правильности ввода. У программистов такой код обычно называется «защита от дурака».
Для кода проверки правильности ввода данных можно использовать рассмотренную ранее конструкцию
If условие Then
[операторы]
[ElseIf условие-n Then
[операторы_elseif] ...
|
|
[Else
[операторы_else]]
End If
Составим алгоритм проверки введенных данных при нажатии на кнопку Рассчитать:
Если a не введено
Выдать сообщение и вернуться на форму
Иначе если a введено не правильно (a – не число)
Выдать сообщение и вернуться на форму
Иначе если b не введено
Выдать сообщение и вернуться на форму
Иначе если b введено не правильно (b - не число)
Выдать сообщение и вернуться на форму
Иначе если c не введено
Выдать сообщение и вернуться на форму
Иначе если c введено не правильно (c - не число)
Выдать сообщение и вернуться на форму
Иначе (если введено все правильно)
Если знаменатель равен 0 (a=0)
Выдать сообщение и вернуться на форму
Иначе если значение под корнем < 0
Выдать сообщение и вернуться на форму
Иначе(если все верно)
Рассчитать значение формулы
Конец если
Конец если
Составим также алгоритм для проверки нажатия кнопки Создать отчет:
Если поле ответа пустое
Выдать сообщение и вернуться на форму
Иначе
Создать отчет
Конец если
С учетом первого алгоритма, изменим текст программы для события нажатия кнопки Рассчитать:
Private Sub cmdRaschet_Click()
'Объявляем переменные, значения которых вводятся в текстовые поля
Dim a As Single
Dim b As Single
Dim c As Single
'Объявляем переменные, которые показывают, являются ли введенные данные числами
Dim AA As Boolean
Dim BB As Boolean
Dim CC As Boolean
'очищаем метку, в которую выводится рассчитанный результат
lblOtvet.Caption = ""
'Выясняем, являются ли введенные данные числами.
AA = IsNumeric(txtA.Text)
BB = IsNumeric(txtB.Text)
CC = IsNumeric(txtC.Text)
If txtA.Text = "" Then 'заполнено ли текстовое поле a
MsgBox ("Не введены данные для переменной a")
txtA.SetFocus 'устанавливаем фокус на текстовое поле
ElseIf Not (AA) Then 'Если введено не число
MsgBox ("Не правильно введены данные для переменной a (a – не число)")
txtA.SetFocus
ElseIf txtB.Text = "" Then 'заполнено ли текстовое поле b
MsgBox ("Не введены данные для переменной b")
txtB.SetFocus
ElseIf Not (BB) Then 'Если введено не число
MsgBox ("Не правильно введены данные для переменной b (b - не число)")
txtB.SetFocus
ElseIf txtC.Text = "" Then 'заполнено ли текстовое поле c
MsgBox ("Не введены данные для переменной c")
txtC.SetFocus
ElseIf Not (CC) Then 'Если введено не число
MsgBox ("Не правильно введены данные для переменной c (c - не число)")
txtC.SetFocus
Else
'переводим данные в числовую форму
a = CSng (txtA.Text)
b = CSng (txtB.Text)
c = CSng (txtC.Text)
If a = 0 Then 'Если знаменатель равен 0
MsgBox ("Число a не может быть равно 0, т.к. знаменатель в этом случае станет равен 0")
txtA.SetFocus
ElseIf b ^ 2 + 4 * a * c ^ 3 < 0 Then 'Если значение под корнем < 0
MsgBox ("Значение под корнем < 0")
txtA.SetFocus
Else 'Если все нормально
'рассчитываем формулу
result = (b + Sqr(b ^ 2 + 4 * a * c ^ 3)) / (2 * a) - a ^ 3 * c + b ^ (-2)
'заносим ответ в метку на форме
lblOtvet.Caption = CStr(result)
End If
End If
End Sub
Используя второй алгоритм, напишем программу для проверки нажатия кнопки Создать отчет.
If lblOtvet = "" Then
MsgBox ("Вы не расчитали формулу")
cmdRaschet.SetFocus
Else
'в этом месте идет код программы, как в примере выше для создания отчета
End If
Лабораторная работа №9
Организация защиты программы от неверных действий пользователя
Цель работы:
Закрепить знания, полученные при изучении темы «Организация защиты программы от неверных действий поль-зователя»
Варианты заданий
Задача. Для программы созданной в практической работе №2 [1] создайте программный код защиты от неправильного ввода данных.
Разработанная программа должна быть предоставлена в двух вариантах:
в первом программа должна содержать подробные комментарии, для того чтобы преподаватель мог без труда оценить принятый вами для решения задачи алгоритм;
во втором программа должна быть полностью без комментариев для проведения контроля полученных знаний.
Дата добавления: 2021-04-06; просмотров: 213; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!