- •Программирование на языке visual basic 2005
- •Лабораторная работа № 1. Изучение интегрированной среды разработки Visual Studio 2005
- •Основные сведения об интегрированной среде разработки
- •1.6. Вид формы с калькулятором
- •Лабораторная работа №2 Отладка программ и обработка ошибок в Visual Basic 2005 Цель лабораторной работы:
- •Основные сведения о средствах отладки и обработки ошибок
- •Средства обнаружения и предупреждения возникновения синтаксических ошибок
- •Обработка ошибок времени выполнения
- •Средства обнаружения логических ошибок
- •Выполнение лабораторной работы
- •Лабораторная работа №3 Создание и обработка файлов Цель лабораторной работы:
- •Выполнение лабораторной работы
- •Лабораторная работа № 4. Разработка и отладка приложения по индивидуальному заданию
- •Лабораторная работа 5
- •5.1. Наследование формы
- •5.2. Настройка производной формы
- •5.3. Создание собственных базовых классов
- •5.3.1. Добавление в проект нового класса
- •Создание проекта Person Class
- •Объявление переменных класса
- •Создание свойств
- •Создание метода
- •Создание объекта с помощью нового класса
- •5.4. Наследование базового класса
- •Использование ключевого слова Inherits
- •Краткая справка по лабораторной работе 5
- •Приложение 1
- •Приложение 2
- •Приложение 3
- •Библиографический список
Выполнение лабораторной работы
-
Выполнить запуск Visual Basic 2005.
-
Создать новый проект с именем Otladka .
-
Создать форму с именем FormOtl.
-
Изменить имя формы (свойство Name) на FormOtl, изменить имя окна формы (свойство Text) на “Отладка программ и обработка ошибок”. Самостоятельно определить значения свойствам: стиль обрамления (свойство FormBorderStyle), цвет фона формы (свойство BackColor), размеры формы, положение на экране.
-
В окне конструктора форм разместить в форме две кнопки (элемент Button). Задать имя первой кнопке btnInput (свойство Name), надпись на кнопке – Ввод чисел (свойство Text), имя второй кнопки – btnSum, надпись на кнопке - Сумма чисел.
-
С событием Click кнопки btnInput связать процедуру ввода чисел в одномерный массив. Для этого следует дважды щелкнуть мышью по кнопке Ввод чисел. В открывшемся окне редактора кода появилась заготовка процедуры btnInput_Click.
-
Познакомиться с имеющимися в редакторе кода средствами, позволяющими предотвратить возникновение синтаксической ошибки. Для этого:
-
ввести строку:
dim b(10) as
Нажать на клавишу Пробел и средство редактора Auto List Members автоматически выводит список всех известных объектов и типов данных. Нажать на клавишу с буквой S, выбрать из списка Short и двойным щелчком или клавишей Space вставить в строку, нажать Enter.
-
ввести строку:
dim i as byte
-
в следующую строку ввести слово MsgBox. Средство Quick Info редактора выводит в окно контекстную подсказку по функции MsgBox. Теперь необходимо поставить открывающую скобку. Жирным цветом в подсказке выделен тот аргумент, который следует сейчас вводить. В качестве аргумента Prompt As Object ввести текст в кавычках – “Введите 10 чисел”, затем поставить запятую, в качестве аргумента Buttons выбрать из предлагаемого списка константу MsgBoxStyle.OKOnly, нажать “+”, ввести ключевое слово MsgBoxStyle, поставить точку и из списка выбрать значение Information. Теперь необходимо поставить закрывающую скобку и нажать Enter. После чего ваша строка должна иметь следующий вид:
MsgBox("Введите 10 чисел", MsgBoxStyle.OKOnly + MsgBoxStyle.Information)
При выполнении процедура MsgBox будет выводить сообщение в окно вывода, содержащее кнопку Ok и пиктограмму Information Message.
-
ввести строку:
for i=1 tu 10
Затем нажать Enter. Visual Basic обнаружил синтаксическую ошибку и при этом:
-
выделит строку с ошибочным ключевым словом tu синим подчёркиванием;
-
выдаст в окне Task List сообщение об обнаруженной ошибке: Syntax error (синтаксическая ошибка).
Ввести вместо выделенного слова to;
-
ввести строки:
b(i)=Val(InputBox(“Введите ”+str(i)+” число”, “Ввод числа”))
Next
В окне редактора кодов текст процедуры должен выглядеть следующим образом:
Private Sub btnInput_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnInput.Click
Dim b(10) As Short
Dim i As Byte
MsgBox("Введите 10 чисел", MsgBoxStyle.OKOnly + _ MsgBoxStyle.Information)
For i = 1 To 10
b(i) = Val(InputBox("Введите " + Str(i) + " число", _ "Ввод числа"))
Next
End Sub
-
Проверить правильность работы процедуры btnInput_Click. Следует организовать пошаговое выполнение оператора цикла, в котором элемент массива b(i) получает значение, вводимое с помощью функции InputBox, и просмотреть значения переменных b(i) и i. Работу приложения нужно остановить перед оператором цикла. Также следует сформировать список переменных, значение которых будем просматривать во время отладки. Для этого выполнить следующие действия:
-
Установить точку останова в первой строке оператора For, щелкнув по полосе индикатора (серая полоса слева) в строке For i=1 To 10. Строка закрасилась красным цветом, на полоске индикатора появилась красная точка.
-
Вывести панель инструментов Debug, выполнив из меню команду View\Toolbars\Debug.
-
Нажать кнопку (Start Debugging). В окне приложения Отладка нажать кнопку Ввод чисел, затем в информационном диалоговом окне с сообщением нажать OK. Работа программы прерывается на операторе цикла. Строка, на которой произошел останов, выделяется желтым цветом и в полосе индикатора помечается маркером .
-
Выделить в тексте процедуры b(i) и выполнить команду контекстного меню Add Watch. На экране появилось окно Watch 1, в которое добавилась переменная b(i).
-
Аналогично добавить в окно Watch переменную i.
-
Нажать кнопку (Step into) или клавишу F11. Наблюдать, как маркер перешел на следующую строчку. Повторно выполнить команду Step into и в окно Ввод числа ввести любое числовое значение, например 7, нажать OK. Тело цикла выполнилось один раз.
-
Если окно Watch отсутствует на экране, открыть его, нажав кнопку (Watch Window). В окне Watch наблюдать, что на этом шаге выполнения оператора цикла переменная i получила значение 1, а переменная b(i) – введенное значение (7).
-
Продолжить пошаговое выполнение оператора цикла, повторяя указанные в пунктах 8.6 и 8.7 действия. Если на каждом шаге выполнения оператора цикла переменная i увеличивает свое значение на 1, а переменная b(i) получает значение, равное введенному в окне Ввод числа значению, то процедура работает правильно.
-
Завершить работу приложения, нажав кнопку (Stop Debugging).
-
Снять точку останова, щелкнув по маркеру точки останова (красная точка на полоске индикатора).
-
Очистить окно Watch, выбрав команду Clear Watch.
-
Перейти в окно конструктора форм.
-
С событием Click кнопки btnSum связать процедуру нахождения суммы чисел. Ввести следующий текст:
Private Sub btnSum_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSum.Click
Dim b(10) As Short
Dim sum As Integer, i As Byte
sum = 0
For i = 1 To 10
sum = sum + b(i)
Next
MsgBox("сумма чисел равна" + Str(sum), MsgBoxStyle.OKOnly)
End Sub
-
Запустить программу на выполнение (кнопка (Start)). В окне Отладка нажать кнопку Ввод чисел и ввести числа 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел. В результате работы процедуры btnSum_Click сумма чисел почему-то равна 0.
-
Выполнить отладку процедуры btnSum_Click.
Для этого установить точку останова в начало оператора цикла. Нажать кнопку (StartDebugging). В окне Отладка нажать кнопку Ввод чисел и ввести числа: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел, и после прерывания работы программы добавить в окно Watch переменные Sum, i, b(i). Выполнить пошаговое выполнение процедуры до конца. Наблюдать за значениями переменных Sum, i, b(i) в окне Watch.
Переменная i меняет свое значение на каждом шаге выполнения оператора цикла. Переменные Sum и b(i) остаются равными 0, несмотря на то, что при выполнении процедуры btnSum_Click были введены числа, отличные от 0. Ошибка в неправильном объявлении массива b.
Массив объявлен в каждой процедуре и является локальной переменной. Значение локальной переменной доступно только в той процедуре, где она объявлена. Поэтому те значения, которые вводятся в массив в процедуре btnInput_Click, не доступны в процедуре btnSum_Click. Элементы массива b процедуры btnSum_Click получили значения 0 при объявлении массива, поэтому и сумма равна 0.
Необходимо значения массива b сделать доступными для всех процедур модуля формы. Для этого его нужно объявить в секции FormOtl Declarations.
-
Внести исправления в модуль формы:
-
выделить строку с объявлением массива в процедуре btnSum_Click и переместить ее в буфер обмена (команда Cut);
-
вставить (команда Paste) строку из буфера обмена в секцию FormOtl Declarations;
-
выделить строку с объявлением массива в процедуре btnSum_Click и удалить (клавиша Delete).
-
Проверить правильность работы процедуры btnSum_Click. Для этого запустить программу на выполнение, в окне Отладка нажать кнопку Ввод чисел и ввести числа: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел, и после прерывания работы программы выполнить пошаговое выполнение процедуры до конца. Наблюдать за значениями переменных Sum, i, b(i) в окне Watch. Если сумма чисел равна 55, процедура работает правильно. Завершить работу программы.
-
Самостоятельно разработать процедуру нахождения произведения чисел (элементов массива b), добавить кнопку с именем btnPr в форму. Связать разработанную процедуру c событием Click кнопки btnPr. Выполнить отладку процедуры.
-
Добавить в модуль формы процедуру нахождения среднего арифметического элементов массива, значение которых являются четными числами.
Для этого:
-
добавить в форму кнопку с именем btnSa и надписью «Ср. арифм. четных чисел»;
-
связать с событием Click кнопки btnSa следующую процедуру:
Private Sub btnSa_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSa.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) Mod 2 = 0 Then
sum = summ + b(i)
k = k + 1
End If
Next
sa = sum / k
MsgBox("Среднее арифметическое четных чисел" + _ Str(sa), vbOKOnly, "Результат")
End Sub
-
При попытке выполнить программу выведется сообщение об ошибке: «There were build errors. Would you like to continue and run the last successful build? ». После нажатия кнопки Yes запустится старая версия программы, в которой не было добавлена возможность расчёта среднего арифметического. Чтобы понять, в чём дело необходимо посмотреть на содержимое окна Error List, в нём вы увидите следующее: поле Description будет содержать текст – «Name ‘summ’ is not declared», а поле line – номер ошибочной строки. Данное сообщение говорит о том, что переменная summ не объявлена. Действительно, если посмотреть на процедуру btnSa_Click, мы нигде не увидим объявления этой переменной. Как теперь стало понятно имя переменной задано неправильно – надо удалить лишнюю букву m, чтобы имя переменной стало – sum.
-
Ввести большие числа 11111, 22222, 33333, 44444 и т.д. При вводе числа большего 32767 программа завершается аварийно, так как возникает ошибка выполнения – An unhandled exception of type ‘OverflowException was unhandled’, т.е. ошибка переполнения. Цветом выделяется строка с оператором, выполнение которого привело к возникновению ошибки. Это строка, в которой вызывается функция InputBox для ввода значения в элемент массива b(i). Так как тип элементов массива Short, то вводимое значение не должно превышать 32767. Если требуется работать с большими по значению целыми числами, нужно выбрать тип Integer или Long.
-
Перейти из режима отладки в режим конструктора. Для этого нажать кнопку (End) и в секции FormOtl Declarations изменить тип элементов массива b(10) Short на Long. Запустить программу и повторить ввод больших чисел. Затем проверить работу процедур нахождение суммы чисел и среднего арифметического четных чисел. В случае возникновения ошибки OverflowException (переполнение), изменить тип переменной, при работе с которой произошло переполнение.
-
Ввести числа 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 (кнопка Ввод чисел). Найти среднее арифметическое (кнопка Ср.арифм. четных чисел). При попытки расчёта среднего арифметического, программа выдаст строку: «Среднее арифметическое четных чисел NaN». Чтобы определить причину возникновения ошибки следует просмотреть значения всех переменных процедуры. Для этого поставим точку останова на строке sa = sum / k. После остановки программы на этой строке посмотрим значения переменных sum и k, они оказались равными нулю. Значит, ошибка в расчёте среднего арифметического возникла из-за деления на нуль. Можно воспользоваться любым из рассмотренных выше способов просмотра значения переменной, однако мы сделает это новым способом – нажать кнопку (Locals Window). В окне Locals отображаются все локальные переменные и их текущее значение. Использовать возможности отладчика, и посмотреть, почему переменные sum и k остаются равными нулю. Для этого:
-
установить точку останова на строке sum = 0;
-
выполнить трассировку процедуры, наблюдая за выделением в строках и значением переменных в окне Locals. При выполнении строки с оператором If строки с операторами sum = sum + b(i) и k = k + 1 пропускаются, что означает, что они не выполняются, поэтому значения переменных sum и k остаются равными 0.
-
перейти из режима отладки в режим конструктора. Для этого нажать кнопку (End).
В данном случае ошибка в расчёте возникла при делении нуля на нуль, и произошло это в том случае, когда были введены одни нечётные числа. Если бы результирующая переменная sa имела бы тип не Single, а какой-нибудь целочисленный тип данных, то произошло бы переполнение. Следует предусмотреть в алгоритме процедуры обработку ошибок выполнения.
Так как одни и те же ошибки выполнения могут возникать при выполнении разных процедур модуля, то следует разработать процедуру – обработчик ошибок, общую для всех процедур модуля формы.
-
Добавить процедуру Function в модуль формы. Для этого следует в конец файла с кодом программы, между строками End Sub и End Class ввести следующий текст.
-
Ввести текст процедуры:
Public Function Obr_Err(ByVal Err_Num As Integer) _ As Integer
Dim txt As String
Select Case Err_Num
Case 6 ' переполнение переменной
txt = "Произошло переполнение переменной"
Obr_Err = 2
Case Else ' нераспознанная ошибка
txt = "Нераспознанная ошибка выполнения " & _ Err_Num
Obr_Err = 3
End Select
Err.Clear()
MsgBox(txt, vbOKOnly, "Ошибки выполнения")
End Function
Функция анализирует передаваемый ей код ошибки (Err_Num), выдает предупредительное сообщение и возвращает числовое значение, определяющее дальнейшее действие программы.
-
Отредактировать процедуру btnInput_Click в соответствии с приведенным ниже текстом:
Private Sub btnInput_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInput.Click
Dim i As Byte
On Error GoTo Err_Label
MsgBox("Введите 10 чисел", MsgBoxStyle.OKOnly + MsgBoxStyle.Information)
For i = 1 To 10
b(i) = Val(InputBox("Введите " + Str(i) + " число", "Ввод числа"))
Next
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. Для этого запустить программу и попытаться ввести очень большое число.
-
Самостоятельно добавить кнопку в форму Отладка и связать её с процедурой нахождения частного от деления среднего арифметического среди нечетных чисел на минимальное число. Самостоятельно предусмотреть обработку других возможных ошибок выполнения.