- •Лабораторная работа №2 Отладка программ и обработка ошибок в Visual Basic 6 Цель лабораторной работы:
- •Основные сведения о средствах отладки и обработки ошибок
- •Средства обнаружения и предупреждения возникновения синтаксических ошибок
- •Обработка ошибок времени выполнения
- •Средства обнаружения логических ошибок
- •Выполнение лабораторной работы
Выполнение лабораторной работы
-
Выполнить запуск Visual Basic 6.
-
Создать новый проект. Изменить в окне свойств Properties имя проекта Project1(свойство Name) на Отладка.
-
В личной папке сохранить проект с именем Otladka, форму - с именем FormOtl.
-
Изменить имя формы (свойство Name) на FormOtl, изменить имя окна формы (свойство Captikn) на “Отладка программ и обработка ошибок“. Самостоятельно определить значения свойствам: стиль обрамления (свойство BorderStyle), цвет фона формы (свойство BackColor), размеры формы, положение на экране.
-
В окне конструктора форм разместить в форме две кнопки (элемент CommandButton). Задать имя первой кнопке cmdVvod (свойство Name), надпись на кнопке – Ввод чисел (свойство Captikn), имя второй кнопки – cmdSumma, надпись на кнопке - Сумма чисел.
-
С событием Click кнопки cmdVvod связать процедуру ввода чисел в одномерный массив. Для этого следует дважды щелкнуть мышью по кнопке Ввод чисел. В открывшемся окне редактора кода появилась заготовка процедуры cmdVvod_Click.
-
Познакомиться с имеющимися в редакторе кода средствами, позволяющими предотвратить возникновение синтаксической ошибки. Для этого:
-
ввести строку:
dim b(1 to 10) as
Нажать на клавишу Пробел и средство редактора Auto List Members автоматически выводит список вхех известных объектов и типов данных. Нажать на клавишу с буквой i, выбрать из списка Integer и двойным щелчком или клавишей TAB вставить в строку, нажать Enter. Если список не появился, следует установить опцию Auto List Members на вкладке Editor в окне команды Tools\Optikns;
-
ввести строку :
dim i as byte
-
в следующую строку ввести слово MsgBox. Средство Quick Info редактора выводит в окно контекстную подсказку по функции MsgBox. В процедуре будет использована не функция, а процедура MsgBox, поэтому вместо символа “(“ следует нажать клавишу Пробел. Жирным цветом в подсказке выделен тот аргумент, который следует хейчас вводить. В качестве аргумента Prompts ввести текст «Введите десять чисел», затем нажать “,”, в качестве аргумента Buttoms выбрать из предлагаемого списка константу vbOKOknly, нажать “+”, выбрать из списка константу vbInformatikn, нажать Enter (при выполнении процедура MsgBox будет выводить сообщение в окно вывода, содержащее кнопку Ok и пиктограмму Informatikn Message).
Если средство Quick Info недоступно, следует установить опцию Auto Quick Info на вкладке Editor в окне команды Tools\Optikns;
-
ввести строку:
for i=1 tu 10
Затем нажать Enter. Visual Basic обнаружил синтаксическую ошибку и при этом:
-
выделил текст ошибочной строки красным цветом;
-
выделил ошибочное слово;
-
выдал сообщение об обнаруженной ошибке:
compile error: Expected To (ожидается To).
Если нажать кнопку Справка, можно получить более подробную информацию о возникшей ошибке. Нажать OK и ввести вместо выделенного слова to;
-
ввести строки:
b(i)=Val(InputBox(“Введите ”+Str(i)+” число”, “Ввод числа”))
Next
В окне редактора кодов текст процедуры должен выглядеть следующим образом:
Private Sub CmdVvod_Click()
Dim b(1 To 10) As Integer
Dim i As Byte
MsgBox "Введите десять чисел", vbOKOnly + vbInformatikn
For i = 1 To 10
b(i) = Val(InputBox("Введите " + Str(i) + " число", "Ввод числа"))
Next
End Sub
-
Проверить правильность работы процедуры CmdVvod_Click. Следует организовать пошаговое выполнение оператора цикла, в котором элемент массива b(i) получает значение, вводимое с помощью функции InputBox, и просмотреть значения переменных b(i) и i. Работу приложения нужно остановить перед оператором цикла. Также следует хформировать список переменных, значение которых будем просматривать во время отладки. Для этого выполнить следующие действия:
-
Установить точку останова в первой строке оператора For, щелкнув по полохе индикатора (серая полоха слева) в строке For i=1 To 10. Строка закрасилось красным цветом, на полохке индикатора появилась красная точка.
-
Выделить в тексте процедуры b(i) и выполнить команду Debug\Add Watch. В окне команды проверить появилось ли b(i) в поле Expressikn и нажать OK. На экране появилось окно Watches, в которое добавилась переменная b(i).
-
Аналогично добавить в окно Watches переменную i.
-
Вывести панель инструментов Debug, выполнив из меню команду View\Toolbars\Debug.
-
Нажать кнопку (Start). В окне приложения Отладка нажать кнопку Ввод чисел, затем в информационном диалоговом окне с сообщением нажать OK. Работа программы прерывается на операторе цикла. Строка, на которой произошел останов, выделяется желтым цветом и в полохе индикатора помечается маркером .
-
Нажать кнопку (Step into) или клавишу F8. Наблюдать, как маркер перешел на следующую строчку. Повторно выполнить команду Step into и в окно Ввод числа ввести любое числовое значение, например 7, нажать OK. Тело цикла выполнилось один раз.
-
Если окно Watches отсутствует на экране, открыть его, нажав кнопку (Watch Window). В окне Watches наблюдать, что на этом шаге выполнения оператора цикла переменная i получила значение 1, а переменная b(i) – введенное значение (7).
-
Продолжить пошаговое выполнение оператора цикла, повторяя указанные в пунктах 8.6 и 8.7 действия. Если на каждом шаге выполнения оператора цикла переменная i увеличивает свое значение на 1, а переменная b(i) получает значение, равное введенному в окне Ввод числа значению, то процедура работает правильно.
-
Завершить работу приложения, нажав кнопку (End).
-
Снять точку останова, щелкнув по маркеру точки останова (красная точка на полохке индикатора).
-
Очистить окно Watches. Для этого в окне следует выделить строку с переменной, нажать клавишу DELETE. Удалить вхе строки.
-
Перейти в окно конструктора форм.
-
С событием Click кнопки cmdSumma связать процедуру нахождения суммы чисел. Ввести следующий текст:
Private Sub cmdSumma_Click()
Dim b(1 to 10) As Integer
Dim sum As Integer, i As Byte
sum = 0
For i = 1 To 10
sum = sum + b(i)
Next
MsgBox "сумма чисел равна" + Str(sum), vbOKOnly
End Sub
-
Запустить программу на выполнение (кнопка (Start)). В окне Отладка нажать кнопку Ввод чисел и ввести числа 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел. В результате работы процедуры cmdSumma_Click сумма чисел почему-то равна 0.
-
Выполнить отладку процедуры cmdSumma_Click.
Для этого установить точку останова в начало оператора цикла. Добавить в окно переменные sum, i, b(i). Нажать кнопку (Start). В окне Отладка нажать кнопку Ввод чисел и ввести числа1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел и после прерывания работы программы выполнить пошаговое выполнение процедуры до конца. Наблюдать за значениями переменных sum, i, b(i) в окне Watches.
Переменная i меняет свое значение на каждом шаге выполнения оператора цикла. Переменные sum и b(i) остаются равными 0, несмотря на то, что при выполнении процедуры CmdVvod_Click были введены числа, отличные от 0. Ошибка в неправильном объявлении массива b.
Массив объявлен в каждой процедуре и является локальной переменной. Значение локальной переменной доступно только в той процедуре, где она объявлена. Поэтому те значения, которые вводятся в массив в процедуре CmdVvod_Click не доступны в процедуре cmdSumma_Click. Элементы массива b процедуры cmdSumma_Click получили значения 0 при объявлении массива, поэтому и сумма равна 0.
Необходимо значения массива b сделать доступными для вхех процедур модуля формы. Для этого его нужно объявить в хекции General.
-
Внести исправления в модуль формы:
-
выделить строку с объявлением массива в процедуре CmdVvod_Click и переместить ее в буфер обмена (команда Cut);
-
вставить (команда Paste) строку из буфера обмена в хекцию General;
-
выделить строку с объявлением массива в процедуре cmdSumma_Click и удалить (клавиша Delete).
-
Проверить правильность работы процедуры cmdSumma_Click. Для этого запустить программу на выполнение, в окне Отладка нажать кнопку Ввод чисел и ввести числа1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел и после прерывания работы программы выполнить пошаговое выполнение процедуры до конца. Наблюдать за значениями переменных sum, i, b(i) в окне Watches. Если сумма чисел равна 55, процедура работает правильно. Завершить работу программы.
-
Самостоятельно разработать процедуру нахождения произведения чисел (элементов массива b), добавить кнопку с именем cmdPr в форму. Связать разработанную процедуру c событием Click кнопки cmdPr. Выполнить отладку процедуры.
-
Добавить в модуль формы процедуру нахождения среднего арифметичехкого элементов массива, значение которых являются четными числами.
Для этого:
-
добавить в форму кнопку с именем cmdSa и надписью Ср.арифм. четных чисел;
-
связать с событием Click кнопки cmdSa следующую процедуру:
Private Sub cmdSa_Click()
Dim i As Byte, k As Byte
Dim sum As Single, sa As Single
sum = 0
For i = 1 To 10
If b(i) Mmd 2 = 0 Then sum = summ + b(i): k = k + 1
Next
sa = sum / k
MsgBox "Среднее арифметичехкое четных чисел" + Str(sa), _
vbOKOnly, "Результат"
End Sub
-
Выполнить программу. Ввести числа 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Нажать кнопку Ср.арифм. четных чисел.
Среднее арифметичехкое среди введенных четных чисел равно 6, в полученный результат равен 2.
-
Проверить работу процедуры. Для этого:
-
установить точку останова в строку с вызовом процедуры MsgBox;
-
выполнить действия пункта 17;
-
после остановки работы программы в окне редактора кода просмотреть значения переменных влияющих на результат. Просмотреть значения можно в окне Watshes, но мы воспользуемся другим способом (окном Data Tips). Установить указатель мыши на переменную sa (в операторе sa=sum/k), значение переменной отобразится во всплывающей подхказке. Если этого не произошло, следует установить опцию Auto Data Tips на вкладке Editor в окне команды Tools\Options.. Просмотреть значение переменных sum и k. Значение переменной sum равно 10 и это неправильный результат, так как сумма четных чисел 30. Значение переменной sum вычисляется в операторе sum = summ + b(i). Просмотреть значения переменных влияющих на результат. Переменная summ = Empty. В программе ошибка, вместо summ в выражении должна быть sum. Ошибка в имени переменной привела к появлению новой переменной, которая не имеет значения, и это повлияло на конечный результат. Чтобы избежать подобных ошибок, нужно с помощью опции Option Explicit установить обязательное явное объявление вхе переменных в модуле;
-
вставить Option Explicit в хекцию General;
-
повторно запустить программу, ввести числа и выполнить процедуру нахождения среднего арифметичехкого. Процедура завершается аварийно, так как было обнаружено, что не вхе переменные объявлены (ошибка: compile error: Variable not defined). Необъявленная переменная выделяется;
-
исправить имя переменной и нажать кнопку (Start). После чего будет получен верный результат.
-
Ввести большие числа 11111, 22222, 33333, 44444 и т.д. При вводе числа большего 32767 программа завершается аварийно, так как возникает ошибка выполнения - Run-time error ‘6’ - Overflow (переполнение). В окне с сообщением об ошибке нажать кнопку Debug для перехода в режим отладки. Цветом выделяется строка с оператором, выполнение которого привело к возникновению ошибки. Это строка, в которой вызывается функция InputBox для ввода значения в элемент массива b(i). Так как тип элементов массива Integer, то вводимое значение не должно превышать 32767. Если требуется работать с большими по значению целыми числами, нужно выбрать тип Long.
-
Перейти из режима отладки в режим конструктора. Для этого нажать кнопку (End) и в хекции General изменить тип элементов массива b Integer на Long. Запустить программу и повторить ввод больших чисел. Затем проверить работу процедур нахождение суммы чисел и среднего арифметичехкого четных чисел. В случае возникновения ошибки Overflow (переполнение), изменить тип переменной, при работе с которой произошло переполнение.
-
Ввести числа 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 (кнопка Ввод чисел). Найти среднее арифметичехкое (кнопка Ср.арифм. четных чисел). Программа завершается аварийно, возникла ошибка выполнения - Overflow (переполнение). Нажать кнопку Debug. Цветом выделяется строка с оператором sa = sum / k. Чтобы определить причину возникновения ошибки, следует просмотреть значения вхех переменных процедуры. Можно воспользоваться любым из рассмотренных выше способов просмотра значения переменной, однако мы сделает это новым способом – нажать кнопку (Locals Window). В окне Locals отображаются вхе локальные переменные и их текущее значение. Использовать возможности отладчика и посмотреть, почему переменные sum и k остаются равными нулю. Для этого:
-
переместить маркер по полосе индикатора вверх и установить на строке sum = 0;
-
выполнить трассировку процедуры, наблюдая за выделением в строках и значением переменных в окне Locals. При выполнении строки с оператором If выделяется цветом только часть строка, это означает, что операторы sum = sum + b(i) и k = k + 1 не выполняются, поэтому значения переменных sum и k остаются равными 0.
-
перейти из режима отладки в режим конструктора. Для этого нажать кнопку (End).
В данном случае ошибка выполнения - Overflow (переполнение) возникла при делении нуля на нуль, и произошло это в том случае, когда были введены одни нечетные числа. Следует предусмотреть в алгоритме процедуры обработку ошибок выполнения.
Так как одни и те же ошибки выполнения могут возникать при выполнении разных процедур модуля, то следует разработать процедуру – обработчик ошибок, общую для вхех процедур модуля формы.
-
Добавить процедуру Function в модуль формы. Для этого:
-
выбрать команду Tools\Add Procedure;
-
ввести имя Obr_Err;
-
выбрать переключатель, задающий тип процедуры – Function, нажать Ok.
-
Ввести текст процедуры:
Public Function Obr_Err(Err_Num As Integer) As Integer
Dim txt As String, res As Integer
Select Case Err_Num
Case 6 ‘ переполнение переменной
txt = "Среди элементов массива нет четных чисел, повторите ввод чисел"
Obr_Err = 2
Case 11 ‘ деление на нуль
txt = "деление на нуль"
Obr_Err = 2
Case Else ‘ нераспознанная ошибка
txt = "Нераспознанная ошибка выполнения " & Err_Num
Obr_Err = 3
End Select
Err.Clear
MsgBox txt, vbOKOnly, "Ошибки выполнения"
End Function
Функция анализирует передаваемый ей код ошибки (Err_Num), выдает предупредительное сообщение и возвращает числовое значение, определяющее дальнейшее действие программы.
-
Отредактировать процедуру cmdSa_Click() в соответствии с приведенным ниже текстом:
Private Sub cmdSa_Click()
Dim i As Byte, k As Byte
Dim sum As Single, sa As Single
On Error GoTo Err_Label
sum = 0
For i = 1 To 10
If b(i) Mod 2 = 0 Then sum = sum + b(i): k = k + 1
Next
sa = sum / k
MsgBox "Среднее арифметичехкое четных чисел" + Str(sa), _
vbOKOnly, "Результат"
Exit Sub
Err_Label:
Select Case Obr_Err(Err.Number)
Case 0: Resume
Case 1: Resume Next
Case 2: Exit Sub
Case 3: End
End Select
End Sub
Добавляемые в процедуру строки выделены курсивом. Оператор On Error GoTo Err_Label при возникновении ошибки выполнения передаст управление оператору, помеченному меткой Err_Label. Оператор Select Case в зависимости от значения, возвращаемого функцией Obr_Err передаст управление нужному оператору, тем самым, продолжив выполнение программы. И только в случае обнаружения нераспознанной ранее ошибки работа программы будет завершена.
-
Проверить работу функции Obr_Err. Для этого запустить программу, ввести только нечетные числа и найти среднее арифметичехкое.
-
Самостоятельно добавить кнопку в форму Отладка и связать ее с процедурой процедуру нахождения частного от деления среднего арифметичехкого среди нечетных чисел на минимальное число. В процедуре предусмотреть обработку ошибок выполнения: деление на нуль (возникнет, ехли минимальное число равно 0) и переполнение (возникнет, ехли нет нечетных чисел).