Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
М.у. л.р. Программирование на VB 2005.docx
Скачиваний:
29
Добавлен:
09.11.2018
Размер:
1.76 Mб
Скачать

Выполнение лабораторной работы

  1. Выполнить запуск Visual Basic 2005.

  2. Создать новый проект с именем Otladka .

  3. Создать форму с именем FormOtl.

  4. Изменить имя формы (свойство Name) на FormOtl, изменить имя окна формы (свойство Text) на “Отладка программ и обработка ошибок”. Самостоятельно определить значения свойствам: стиль обрамления (свойство FormBorderStyle), цвет фона формы (свойство BackColor), размеры формы, положение на экране.

  5. В окне конструктора форм разместить в форме две кнопки (элемент Button). Задать имя первой кнопке btnInput (свойство Name), надпись на кнопке – Ввод чисел (свойство Text), имя второй кнопки – btnSum, надпись на кнопке - Сумма чисел.

  6. С событием Click кнопки btnInput связать процедуру ввода чисел в одномерный массив. Для этого следует дважды щелкнуть мышью по кнопке Ввод чисел. В открывшемся окне редактора кода появилась заготовка процедуры btnInput_Click.

  7. Познакомиться с имеющимися в редакторе кода средствами, позволяющими предотвратить возникновение синтаксической ошибки. Для этого:

  • ввести строку:

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

  1. Проверить правильность работы процедуры btnInput_Click. Следует организовать пошаговое выполнение оператора цикла, в котором элемент массива b(i) получает значение, вводимое с помощью функции InputBox, и просмотреть значения переменных b(i) и i. Работу приложения нужно остановить перед оператором цикла. Также следует сформировать список переменных, значение которых будем просматривать во время отладки. Для этого выполнить следующие действия:

    1. Установить точку останова в первой строке оператора For, щелкнув по полосе индикатора (серая полоса слева) в строке For i=1 To 10. Строка закрасилась красным цветом, на полоске индикатора появилась красная точка.

    2. Вывести панель инструментов Debug, выполнив из меню команду View\Toolbars\Debug.

    3. Нажать кнопку (Start Debugging). В окне приложения Отладка нажать кнопку Ввод чисел, затем в информационном диалоговом окне с сообщением нажать OK. Работа программы прерывается на операторе цикла. Строка, на которой произошел останов, выделяется желтым цветом и в полосе индикатора помечается маркером .

    4. Выделить в тексте процедуры b(i) и выполнить команду контекстного меню Add Watch. На экране появилось окно Watch 1, в которое добавилась переменная b(i).

    5. Аналогично добавить в окно Watch переменную i.

    6. Нажать кнопку (Step into) или клавишу F11. Наблюдать, как маркер перешел на следующую строчку. Повторно выполнить команду Step into и в окно Ввод числа ввести любое числовое значение, например 7, нажать OK. Тело цикла выполнилось один раз.

    7. Если окно Watch отсутствует на экране, открыть его, нажав кнопку (Watch Window). В окне Watch наблюдать, что на этом шаге выполнения оператора цикла переменная i получила значение 1, а переменная b(i) – введенное значение (7).

    8. Продолжить пошаговое выполнение оператора цикла, повторяя указанные в пунктах 8.6 и 8.7 действия. Если на каждом шаге выполнения оператора цикла переменная i увеличивает свое значение на 1, а переменная b(i) получает значение, равное введенному в окне Ввод числа значению, то процедура работает правильно.

    9. Завершить работу приложения, нажав кнопку (Stop Debugging).

    10. Снять точку останова, щелкнув по маркеру точки останова (красная точка на полоске индикатора).

  1. Очистить окно Watch, выбрав команду Clear Watch.

  2. Перейти в окно конструктора форм.

  3. С событием 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

  1. Запустить программу на выполнение (кнопка (Start)). В окне Отладка нажать кнопку Ввод чисел и ввести числа 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел. В результате работы процедуры btnSum_Click сумма чисел почему-то равна 0.

  2. Выполнить отладку процедуры 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.

  1. Внести исправления в модуль формы:

  • выделить строку с объявлением массива в процедуре btnSum_Click и переместить ее в буфер обмена (команда Cut);

  • вставить (команда Paste) строку из буфера обмена в секцию FormOtl Declarations;

  • выделить строку с объявлением массива в процедуре btnSum_Click и удалить (клавиша Delete).

  1. Проверить правильность работы процедуры btnSum_Click. Для этого запустить программу на выполнение, в окне Отладка нажать кнопку Ввод чисел и ввести числа: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Затем нажать кнопку Сумма чисел, и после прерывания работы программы выполнить пошаговое выполнение процедуры до конца. Наблюдать за значениями переменных Sum, i, b(i) в окне Watch. Если сумма чисел равна 55, процедура работает правильно. Завершить работу программы.

  2. Самостоятельно разработать процедуру нахождения произведения чисел (элементов массива b), добавить кнопку с именем btnPr в форму. Связать разработанную процедуру c событием Click кнопки btnPr. Выполнить отладку процедуры.

  3. Добавить в модуль формы процедуру нахождения среднего арифметического элементов массива, значение которых являются четными числами.

Для этого:

  • добавить в форму кнопку с именем 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

  1. При попытке выполнить программу выведется сообщение об ошибке: «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.

  2. Ввести большие числа 11111, 22222, 33333, 44444 и т.д. При вводе числа большего 32767 программа завершается аварийно, так как возникает ошибка выполнения – An unhandled exception of type ‘OverflowException was unhandled’, т.е. ошибка переполнения. Цветом выделяется строка с оператором, выполнение которого привело к возникновению ошибки. Это строка, в которой вызывается функция InputBox для ввода значения в элемент массива b(i). Так как тип элементов массива Short, то вводимое значение не должно превышать 32767. Если требуется работать с большими по значению целыми числами, нужно выбрать тип Integer или Long.

  3. Перейти из режима отладки в режим конструктора. Для этого нажать кнопку (End) и в секции FormOtl Declarations изменить тип элементов массива b(10) Short на Long. Запустить программу и повторить ввод больших чисел. Затем проверить работу процедур нахождение суммы чисел и среднего арифметического четных чисел. В случае возникновения ошибки OverflowException (переполнение), изменить тип переменной, при работе с которой произошло переполнение.

  4. Ввести числа 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, а какой-нибудь целочисленный тип данных, то произошло бы переполнение. Следует предусмотреть в алгоритме процедуры обработку ошибок выполнения.

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

  1. Добавить процедуру Function в модуль формы. Для этого следует в конец файла с кодом программы, между строками End Sub и End Class ввести следующий текст.

  2. Ввести текст процедуры:

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), выдает предупредительное сообщение и возвращает числовое значение, определяющее дальнейшее действие программы.

  1. Отредактировать процедуру 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, передаст управление нужному оператору, тем самым, продолжив выполнение программы. И только в случае обнаружения нераспознанной ранее ошибки работа программы будет завершена.

  1. Проверить работу функции Obr_Err. Для этого запустить программу и попытаться ввести очень большое число.

  2. Самостоятельно добавить кнопку в форму Отладка и связать её с процедурой нахождения частного от деления среднего арифметического среди нечетных чисел на минимальное число. Самостоятельно предусмотреть обработку других возможных ошибок выполнения.