Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт VB.docx
Скачиваний:
2
Добавлен:
19.12.2018
Размер:
86.99 Кб
Скачать

Отладка программы

Итак, мы нашли недочёты (ошибки) . Посмотрим причину возникновения ошибок. Запустите программу. Ничего не вводя в поля нажмите на кнопку. Visual Basic выдаст окно, в котором скажет: "Type mismatch", т.е. ошибка в типах. В окне доступны 3 кнопки

:

Мы должны найти возможное решение ошибки. Давайте заглянем в раздел vbhelprus. Найдём там функцию Val. О! Это как раз то, что нужно! Давайте изменим код:

paramA = txtParamA.Text paramB = txtParamB.Text paramC = txtParamC.Text

На код:

paramA = Val(txtParamA.Text) paramB = Val(txtParamB.Text) paramC = Val(txtParamC.Text)

Теперь ошибок несовпадения типов быть не может, т.к. функция Val при любом параметре возвратит число, а сама функция Val никогда не вызовет ошибки, хотя ... но это уже на совести разработчиков VB :)

Проанализируем полученный результат. Что изменилось после того, как мы вставили функцию Val? Теперь мы знаем что переменным paramA, paramB и paramC в любом случае присвоится число. Но вот какое число? Ведь если мы введём в поля нули, то и переменные будут содержать нули! Также, если в поля мы введём !буквы!, то переменные также будут содержать нули. Значит нужно сделать проверку на содержание в переменных нулей.

Для этого, вставим после присвоения значения свойства Text переменным ещё одну проверку - проверку на содержание нулей в переменных:

If paramA = 0 Or paramB = 0 Or paramC = 0 Then     MsgBox "Нули в качестве коэффициентов не допускаются!", _     vbCritical     Exit Sub End If

Символ "_" используется в том случае, когда вы хотите перенести часть выражения на другую строчку. В данном случае мы переносим константу vbCritical.

Здесь мы проверяем переменные на содержание в них нулей. В принципе, можно было бы проверить не переменные, а сами текстовые поля (If Val(txtParamA.Text)=0 Then....). Это уже дело вкуса. Всё равно, результат одинаков.

Итоговый код программы:

Private Sub cmdCalculate_Click()

' объявляем переменные Dim paramA As Double Dim paramB As Double Dim paramC As Double Dim x1 As Double Dim x2 As Double Dim D As Double paramA = Val(txtParamA.Text) paramB = Val(txtParamB.Text) paramC = Val(txtParamC.Text) If paramA = 0 Or paramB = 0 Or paramC = 0 Then     MsgBox "Нули в качестве коэффициентов не допускаются!", _     vbCritical     Exit Sub End If

D = (paramB * paramB) - (4 * paramA * paramC) If D > 0 Then     x1 = (paramB + Sqr(D)) / (2 * paramA)     x2 = (paramB - Sqr(D)) / (2 * paramA)     lblD.Caption = "Дискриминант: " & D     lblX1.Caption = "Корень №1: " & x1     lblX2.Caption = "Корень №2: " & x2 ElseIf D = 0 Then     x1 = paramB / (2 * paramA)     x2 = x1     lblD.Caption = "Дискриминант: " & D     lblX1.Caption = "Корень №1: " & x1     lblX2.Caption = "Корень №2 = Корню №1" ElseIf D < 0 Then     lblD.Caption = "Дискриминант: " & D     lblX1.Caption = "Корней нет!"     lblX2.Caption = ""     MsgBox "Дискриминант меньше нуля! Корней нет!", vbCritical End If

End Sub

Процедуры и функции

Принцип модульного программирования очень облегчает программирование и отладку. Модульное программирование - означает разделение кода программы на отдельные куски, каждый из которых выполняет чётко определённую задачу. Это особенно важно для сложных программ.

Напишем функцию для вычисления дискриминанта. Напишем процедуру, которая будет выводить полученные значения в метки. Почему именно процедуру? Потому что процедуры пишутся для выполнения некоторой последовательности действий, где не требуется возвращать какое-либо значение. Давайте ещё раз посмотрим на ту часть кода, где происходит проверка значения дискриминанта и вычисление корней уравнения:

If D > 0 Then     x1 = (paramB + Sqr(D)) / (2 * paramA)     x2 = (paramB - Sqr(D)) / (2 * paramA)     lblD.Caption = "Дискременант: " & D     lblX1.Caption = "Корень №1: " & x1 ' <- здесь     lblX2.Caption = "Корень №2: " & x2 ElseIf D = 0 Then     x1 = paramB / (2 * paramA)     x2 = x1     lblD.Caption = "Дискременант: " & D     lblX1.Caption = "Корень №1: " & x1 ' <- и здесь     lblX2.Caption = "Корень №2 = Корню №1" ElseIf D < 0 Then     lblD.Caption = "Дискременант: " & D     lblX1.Caption = "Корней нет!" ' <- и здесь, тоже     lblX2.Caption = ""     MsgBox "Дискременант меньше нуля! Корней нет!", vbCritical End If

Заметьте, что в каждом из ветвей оператора If наблюдается присвоения свойству Caption 3-х меток (lblD, lblX1, lblX2). Поэтому логично этот участок оформить в виде процедуры, параметрами которой будут значения для меток.

Сначала напишем функцию для вычисления дискриминанта. Чтобы вычислить дискриминант необходимо знать 3 параметра - коэффициенты a, b и с. Функция будет возвращать значение - дискриминант. Чтобы самому не писать заготовку для этой функции, Visual Basic предоставляет возможность для автоматического создания такой заготовки. Для этого выберем в главном меню VB: Tools->Add Procedure. (Insert->Procedure).. Появится окно, в котором вас попросят указать вид добавляемой процедуры. Отметим радиокнопку Function. В поле "Name:", укажите имя добавляемой функции. Давайте назовём её, например, как CalcDiscremenant.

Итак, нажмите OK и Visual Basic создаст для вас следующую заготовку:

Public Function CalcDiscremenant()

End Function

Теперь модифицируем её так, чтобы функция принимала 3 аргумента (параметра) типа Double, и возвращала значение, которое тоже будет иметь тип Double:

Public Function CalcDiscremenant(a As Double, _ b As Double, c As Double) As Double

End Function

Осталось добавить код в нашу заготовку.

Public Function CalcDiscremenant(a As Double, _ b As Double, c As Double) As Double     CalcDiscremenant = (b * b) - (4 * a * c) End Function

Необходимо подчеркнуть, что в Visual Basic параметры можно передавать двумя способами: по значению и по ссылке. Первый способ передает в процедуру (или функцию) только значение передаваемой переменной. Внутри функции изменить значение такой переменной будет нельзя. Второй способ передаёт в функцию ссылку на передаваемую переменную, и её значение легко может быть изменено в теле функции. По умолчанию, Visual Basic всегда передает параметры по ссылке. В нашем случае параметры a, b и c не изменяются внутри функции. Поэтому можно сделать так, чтобы параметры передавались по значению. Для этого перед именем переменной необходимо поставить ключевое слово ByVal (By Value), вот так:

Public Function CalcDiscremenant(ByVal a As Double, _ ByVal b As Double, ByVal c As Double) As Double

Теперь у нас есть функция, которая будет принимать 3 коэффициента a, b, c и вычислять дискриминант. Опробуем её в действии. Для этого замените в нашей программе строчку, где вычислялся дискриминант:

D = (paramB * paramB) - (4 * paramA * paramC)

на строчку:

D = CalcDiscremenant(paramA, paramB, paramC)

Напишем процедуру для вывода результатов в метки. Добавим затоговку так же, как и в предыдущем случае (Tools->Add Procedure). Только на этот раз не будем отмечать радиокнопку Function, а оставим всё как есть (Sub). В качестве имени процедуры можно ввести, ну, скажем WriteResultsInLabels. Чем длиннее название, тем понятнее, чем занимается данная процедура или функция. Нажмём ОК:

Public Sub WriteResultsInLabels() End Sub

Сделаем так, чтобы наша процедура принимала 3 параметра - значения, которые необходимо вывести в соответствующие метки:

Public Sub WriteResultsInLabels (lblDCapt As String, _ lblX1Capt As String, lblX2Capt As String) End Sub

Входные параметры имеют тип String, т.к. передавать в процедуру мы будем именно строки.

Для того, чтобы процедура работала, необходимо добавить в неё код:

Public Sub WriteResultsInLabels (lblDCapt As String, _ lblX1Capt As String, lblX2Capt As String)     lblD.Caption = lblDCapt     lblX1.Caption = lblX1Capt     lblX2.Caption = lblX2Capt End Sub

Готово. Можно использовать процедуру. Давайте заменим каждые 3 строчки, где мы выводили значения в метки. Получится нечто подобное:

If D > 0 Then     x1 = (paramB + Sqr(D)) / (2 * paramA)     x2 = (paramB - Sqr(D)) / (2 * paramA)     WriteResultsInLabels "Дискриминант: " & D, _     "Корень №1: " & x1, "Корень №2: " & x2 ElseIf D = 0 Then     x1 = paramB / (2 * paramA)     x2 = x1     WriteResultsInLabels "Дискриминант: " & D, _     "Корень №1: " & x1, "Корень №2 = Корню №1" ElseIf D < 0 Then     WriteResultsInLabels "Дискриминант: " & D, _     "Корней нет!", ""     MsgBox "Дискриминант меньше нуля! Корней нет!", vbCritical End If

Программа готова.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]