Урок №27. Диалоговая отладка программ.
Простейший метод отладки программы — это вывод отладочной информации. Рассмотрим этот способ на примере.
Программисту нужно было написать программу, которая вычисляет корни квадратного уравнения ах2 +Ьх + с = 0. Он поспешил и написал программу так:
from math import sqrt
print("Введите a, b, c: ")
a = float(input())
b = float(input())
c = float(input())
D = b*b - 4*a*a
x1 = (-b+sqrt(D))/2*a
x2 = (-b-sqrt(D))/2*a
print("x1=", x1, " x2=", x2, sep="")
Для вычисления квадратного корня здесь используется стандартная функция sqrt. Оказалось, что программа в некоторых случаях работает верно (например, при а = 1,b = 2 и с = 1), а в других случаях — неверно (например, при а = 1, b = -5 и с = 6).
Для того чтобы найти ошибку, нужно определить её возможные причины. В нашем случае есть три варианта:
- неверно вводятся данные;
- неверно вычисляется дискриминант D = b -4ас;
- неверно вычисляются корни

Добавим в программу две дополнительные команды для вывода отладочной информации:
- выведем значения коэффициентов а, b и с сразу после ввода;
- выведем вычисленное значение дискриминанта.
Значения корней уравнения уже и так выводятся в конце работы программы.
a = float(input())
b = float(input())
c = float(input())
print(a, b, c)
D = b*b - 4*a*a
print("D=", D)
...
При вводе коэффициентов 1, -5 и 6 программа выводит:
1
-5
6
D=21.0
х1=4.791288. х2=0.208712
По первой строке видим, что ввод выполнен правильно — именно такие числа мы вводили. А вот значение дискриминанта, вычисленного программой, отличается от того, что мы ожидаем получить: D = (-5)2 — 4*1*6 = 1. Поэтому нужно искать ошибку в выражении для вычисления D.
Если исправить эту ошибку (сделайте это самостоятельно), мы увидим, что дискриминант считается правильно, а корни уравнения — нет (при а = 1, b= -5 и с = 6 мы должны получить х1 = 3 и х2 = 2). Поэтому останется исправить ошибки в строках, где вычисляются корни.
Современные среды программирования, в том числе КуМир, АЛ ГО и PascalABC.NET, содержат встроенный отладчик, который позволяет:
- выполнять программу в пошаговом режиме;
- после выполнения очередной команды просматривать значения переменных в памяти;
- устанавливать точки останова, где программа должна остановиться и перейти в пошаговый режим.