Урок №16. Налагодження програми Отже, на попередньому уроці ми знайшли баги



Сторінка1/2
Дата конвертації24.11.2018
Розмір179 Kb.
#68136
ТипУрок
  1   2
Урок № 16. Налагодження програми
Отже, на попередньому уроці ми знайшли баги (від слова Bug - жук) в нашій програмі, тобто недоліки (помилки). Від цих багів потрібно позбутися. Подивимося причину виникнення помилок. Запустіть програму. Нічого не прописуючи в поля натисніть на кнопку. Visual Basic видасть вікно, у якому скаже: “Type mismatch”, тобто помилка в типах. У вікні доступні 3 кнопки:

End - завершити додаток

Debug - показати місце виникнення помилки, щоб ми змогли від неї позбутися

Help - викликати довідку про помилку, яка виникла.
Натисніть Debug. Visual Basic покаже вам причину виникнення помилки:

Жовтим кольором виділений рядок - причина помилки. Якщо навести курсор миші на ім'я змінної, то спливе підказка, у якій Visual Basic повідомить нам її значення. Така можливість доступна лише в режимі Debug. Поточний режим можна довідатися із заголовка вікна Visual Basic. Наприклад:


у режимі проектування інтерфейсу це рядок:

Ім'я_Проекту - Microsoft Visual Basic [design]


при запущеному додатку:

Ім'я_Проекту - Microsoft Visual Basic [run]


у режимі Debug:

Ім'я_Проекту - Microsoft Visual Basic [break]


Наведіть мишкою на txtParam.Text. Visual Basic повідомить про те, що значення текстового поля txtParam.Text = "" (порожні лапки, або по іншому - порожній рядок). Тут можна здогадатися, чому відбувається помилка розбіжності типів. Адже змінна param повинна зберігати дійсне число, а тут ми намагаємося привласнити їй строкове значення - "". Якби param мала тип String, або в txtParam.Text був би рядок - число ("123") - помилка б не виникла. А тут Visual Basic просто не може сам конвертувати рядок “” у число типу Double. Але ми повинні обов’язково знайти можливе рішення помилки. Давайте заглянемо в розділ vbhelprus. Знайдемо там функцію Val. ВАУ! Це саме те, що нам потрібно! Давайте просто змінимо код:
paramA = txtParamA.Text

paramB = txtParamB.Text

param = txtParam.Text
На код:
paramA = Val(txtParamA.Text)

paramB = Val(txtParamB.Text)



param = Val(txtParam.Text)
Тепер помилок розбіжності типів бути не може, оскільки функція Val при будь-якому параметрі поверне число, а сама функція Val ніколи не викликає помилки, хоча ... але це вже на совісті розробників VB :)
Проаналізуємо отриманий результат. Що змінилося після того, як ми уставили функцію Val? Тепер ми знаємо що змінним paramA, paramB і paramC у будь-якому випадку буде присвоєно число. Але от яке число? Адже якщо ми введемо в поля нулі, то і змінні будуть містити нулі! Також, якщо в поля ми введемо !букви!, то змінні також будуть містити нулі. Значить потрібно зробити перевірку на вміст у змінних нулів. Запустіть програму і введіть у поля нулі (або букви) і натисніть кнопку. Visual Basic видасть вікно:

Натискаємо Debug і от що бачимо:

Причина помилка полягає в неможливості ділення на 0, а paramA у нас саме і дорівнює 0. До того ж при нульових коефіцієнтах квадратне рівняння вирішується набагато простіше (наприклад, якщо c=0, то x винесемо за дужку, ну а далі все просто). Позбудемося від цього непорозуміння. Для цього, зробимо після присвоєння значення властивості Text змінним ще одну перевірку - перевірку на вміст нулів у змінних:


If param = 0 Or param = 0 Or param = 0 Then

 MsgBox "Нулі як коефіцієнти не допускаються!", _

 vbCritical

 Exit Sub

End If
Символ "_" використовується в тому випадку, коли ви хочете перенести частину виразу на інший рядок. У даному випадку ми переносимо константу vbCritical.
Тут ми перевіряємо змінні на вміст у них нулів. В принципі, можна було б перевірити не змінні, а самі тектові поля (If Val(txtParam.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)

 lbl.Caption = "Дискримінант: " & D

 lbl1.Caption = "Корінь №1: " & x1

 lbl2.Caption = "Корінь №2: " & x2

ElseIf D = 0 Then

 x1 = paramB / (2 * paramA)

 x2 = x1

 lbl.Caption = "Дискримінант: " & D

 lbl1.Caption = "Корінь №1: " & x1

 lbl2.Caption = "Корінь №2 = Кореневі №1"

ElseIf D < 0 Then

 lbl.Caption = "Дискримінант: " & D

 lbl1.Caption = "Корній немає!"

 lbl2.Caption = ""

 MsgBox "Дискримінант менше нуля! Корній немає!", vbCritical

End If
End Sub


Може бути ви вже помітили, що при кожнім запуску програми, форма з’являється увесь час у різних місцях. Давайте позбудемося від цього, і зробимо так, щоб форма при кожнім запуску з’являлася в центрі екрана. Для цього змінимо властивість StartUpPosition у "2-CenterScreen".
Використання покрокового трасування:
Покрокове трасування - це метод налагодження додатка при якому можна виконувати код по одній команді і стежити за ходом її виконання. Це дуже корисний метод! Таким методом можна знаходити ті помилки, що не може знайти Visual Basic. Такі помилки називаються логічними. Тут я б хотів привести дуже цікавий і повчальний уривок із книги “Програмування в середовищі Visual Basic 5”:
“Перш ніж налагоджувати програму, необхідно переконатися в тому, що вона містить помилки. Тому тестування програми є першим кроком на шляху її налагодження. Одним зі способів тестування програми є її запуск із різними вихідними даними і спостереження за правильністю її функціонування. (чим ми вище і займалися). Цей процес закінчується в тому випадку, коли програма коректно реагує на всі дані, що вводяться. Однак цей спосіб не є ефективним для великих програм. У будь-якому випадку вибір тестових даних для перевірки коректності роботи є досить важливим. Вибір необхідних тестових даних пов’язаний з великими труднощями, тому що треба перевірити всі можливі шляхи виконання програми для того, щоб бути упевненим у відсутності помилок.”
Тестування програм - це більшою мірою мистецтво, чим наука. Не існує яких-небудь правил, що завжди спрацьовують. Якщо програма має великий розмір коду або досить складну структуру і немає впевненості в тому, що вдасться перевірити її по всіх можливих шляхах виконання, то в цьому випадку Вам варто підійти до процесу тестування з погляду здорового глузду. Наприклад, фірма Microsoft не має можливості перевіряти кожну нову версію операційної системи (ОС) на всіх можливих конфігураціях апаратного забезпечення.”
“Ключ до успішного тестування лежить у словосполученні “здоровий глузд”, і в наступній історії буде показана життєва важливість цієї концепції. Одна комунальна компанія використовувала досить складну, але, як вважалося, надійну програму для надсилання рахунків на оплату і прийому квитанцій. У випадку коли компанія не одержувала оплаченої квитанції від користувача, той автоматично позбавлявся наданих йому комунальних послуг. У той день, коли відбулася ця історія, один із клієнтів компанії, ідучи у відпустку, відключив електроенергію. У результаті чого комп’ютер надіслав йому рахунок за електроенергію в розмірі $0.00, яуий, цілком природньо, не міг бути оплачений. Після визначеного числа запитів на оплату комп’ютер вирішив, що той клієнт, якому був надісланий рахунок, не сплатив вчасно ці самі $0.00, - і як наслідок він залишився без електрики!”
“В історії не говориться про реакцію розгніваного клієнта, однак, якщо ця історія відбулася насправді, - то провина програміста, який написав додаток, у тому, що він просто забув вставити перевірку на наявність порожніх рахунків. Цілком очевидно, що він просто не припускав, що подібна ситуація може виникнути. (Хоча, по правді кажучи, багато програмістів використовують в операторах порівняння виразу a > b, замість a >= b).”
“Мораль цієї історії така, що потрібно для перевірки коректності роботи програми використовувати граничні значення, тому що саме такі значення дозволяють знаходити помилки.”
Ось так, шановні читачі. Як бачите програм без помилок не буває. Тепер я думаю вам зрозуміло, чому час від часу приходиться робити переінсталяцію Windows :))).
Ну а тепер повернемося до відлажування (або як жартують програмісти – до рятування програми від лажі ;). На чому ми зупинилися? Ах да, - на покроковому трасуванні і логічних помилках. От саме така логічна помилка залишила клієнта без електроенергії. Для знаходження таких помилок дуже зручно використовувати покрокове трасування.
Як використовувати таке трасування? Потрібно всього навсього в потрібному місці програми поставити крапку останова (брейкпоінт Breakpoint). Дійшовши до такого місця, Visual Basic призупинить виконання програми і переведе вас у режим Debug, де Ви зможете виконувати код покомандно. Давайте поставимо брейкпоінт у нашій програмі, і простежимо хід її виконання. Щоб поставити крапку останова потрібно клікнути на вертикалі ліворуч від коду:

А можна і по іншому. Натисніть правою кнопкою миші на тому рядку коду, де Ви хочете поставити брейкпоінт і в меню вибрати Toggle->Breakpoint. Зауваження: таку крапку не можна ставити на рядку з оголошенням змінної.
Поставте крапку як показано на малюнку і запустіть програму. Введіть наступні дані в якості параметрів: a = 3, b = -6, c = 2. Натисніть на кнопку "Вирішити!". Visual Basic зупинить виконання програми точно на тому рядку, на якому стоїть брейкпоінт. Тепер Visual Basic у режимі Debug. Ви можете переглядати значення змінних, наводячи на них курсор миші і виконувати програму по кроках. Щоб виконати одну команду, потрібно натиснути F8 або Shift+F8. Відмінність цих двох команд полягає в тому, що при натисканні F8 на рядку з викликом процедури Visual Basic ввійде в цю процедуру і Ви зможете продовжити покрокове виконання в цій процедурі до рядка End Sub, де VB поверне вас на те місце, де відбувся виклик. Якщо ж натиснути Shift+F8, то Visual Basic виконає процедуру, але не буде заходити в неї для покрокового трасування.
Тепер протрасуйте програму. Простежте за тим, як змінюються значення змінних при присвоєнні їм значення. Тепер відкрийте вікно Locals Window (меню View->Locals Window). У цьому вікні відображаються значення всіх локальних змінних:

Тут зображені всі наші локальні змінні. Їх 6 штук. “А от що ж таке Me?” - запитаєте Ви. Скоріше за все операційна система Windows Millenium? :) А от і ні, не вгадали, “Me” - це також зарезервоване слово Visual Basic. Воно вказує на поточну форму. У своїй програмі Ви можете звертатися до своєї форми через Me. Наприклад, якщо написати


Me.Hide
то з екрана сховається та форма, у коді якої написаний цей код (вибачте за каламбур).
Також можна помітити значок “+” ліворуч від “Me”. При натисканні на нього відбудеться розкриття списку з усіма дочірніми об'єктами форми. Там же будуть знаходяться всі елементи керування, які поміщені на форму, а також усі глобальні змінні рівня цієї форми.
Зауважте, що вікно Locals - плаваюче, і при подвійному щиглику мишкою по заголовку вікна воно “пристикується” у середовище VB. При черговому подвійному щиглику вікно “відтстикуєтся”.
Дотраcуйте (тобто пройдіть пошагово) програму до кінця. Закрийте її.
Каталог: doc
doc -> Вимоги до оформлення реферату до вступного іспиту в аспірантуру
doc -> Вимоги до оформлення реферату до вступного іспиту в аспірантуру у рефераті мають бути висвітлені найважливіші питання, пов’язані з темою дисертаційної роботи вступника до аспірантури. Назва роботи має
doc -> Основні вимоги до реферату
doc -> Уточнення щодо оформлення документів та питання, які вступники до аспірантури задають найчастіше
doc -> Відділ аспірантури та докторантури Уманського державного педагогічного університету імені Павла Тичини
doc -> Правила прийому на навчання до аспірантури Харківського національного університету мистецтв імені І. П. Котляревського
doc -> Положення про аспірантуру Харківського національного університету мистецтв імені І. П. Котляревського І загальні положення
doc -> Київський національний університет імені Тараса Шевченка
doc -> Програма вступного іспиту до аспірантури зі спеціальності 22. 00. 03 соціальні структури та соціальні відносини Затверджено


Поділіться з Вашими друзьями:
  1   2




База даних захищена авторським правом ©uchika.in.ua 2022
звернутися до адміністрації

    Головна сторінка