Информатика |
Глава 9. Основные приемы программирования | назад оглавление вперед |
9.2. Типы ошибок в программе. Исправление ошибок
Если программа
только что составлена, то в очень редких случаях она не содержит ошибок. Нужно
заранее настраиваться на то, что в программе есть ошибки, и их нужно найти и
исправить.
Можно выделить
три типа ошибок:
GO ТО 500 а оператора с номером 500 в программе нет.
При выполнении такого оператора машина выдает соответствующее сообщение об ошибке.
Однако, как правило, сразу за дисплеем найти ошибки не удается. В этом случае нужно сесть за стол (выключить машину) и применить очень действенный метод проверки работы вашей программы, который называется: выполнение программы вручную. Для этого нужно представить себе, что вы — машина, и, начав с первого оператора программы, выполнять оператор за оператором, пока не будет обнаружена причина неправильной работы программы. Нужно выполнять эту работу методично и терпеливо, отключив свой интеллект, не делая правдоподобных догадок и не перескакивая через несколько операторов.
Конечно, лица, имеющие опыт составления программ и работы на ЭВМ, обычно выполняют эту работу до первого выхода на машину. Тем, кто только приступает к изучению программирования, требуется некоторое время, чтобы уяснить, как машина воспринимает и выполняет операторы программы. И в первых своих программах новички делают ошибки, которые они сами обнаружить не в состоянии. Они могут, поверить в ошибки, только если машина не выполняет составленную ими программу или выполняет ее неправильно.
Чтобы имитировать работу ЭВМ, нужно хорошо понимать, как она работает. Представим себе, что мы остановили выполнение программы и заглянули внутрь ЭВМ. Что бы мы там “увидели”?
1. В памяти записана программа в той форме, в которой мы ее ввели.
2. В другом участке памяти располагаются переменные, которые были созданы к настоящему моменту. Каждая переменная занимает свое место в памяти (ячейку памяти) и имеет значение.
3. В памяти хранится еще одна специальная переменная, в которой находится номер выполняемой в данный момент строки (оператора). То есть машина “знает”, в каком месте программы она находится. После выполнения очередного оператора значение этой специальной переменной, которая имеет название указатель программы, изменяется. Если выполняемым оператором был оператор PRINT, по которому что-то появилось на экране, или оператор присваивания, по которому в ячейку памяти помещено значение, то после его выполнения значение указателя программы заменяется на следующий (в порядке возрастания) номер в последовательности операторов и машина начнет выполнять оператор с этим следующим номером.
При выполнении оператора GO TO ничего не высвечивается и не изменяются значения переменных, просто значение указателя программы заменяется на тот номер, который указан в операторе GO TO .
Оператор IF выполняется так же, как GO TO, если условие выполняется (имеет значение да). Если условие не выполняется (имеет значение нет), то в указателе программы появляется номер следующего оператора в программе.
По оператору STOP прекращается выполнение программы.
Имитируя работу машины, мы должны иметь:
Для нас памятью (подобной памяти ЭВМ) будет лист бумаги, на котором в отведенных местах записана эта необходимая информация.
При выполнении программы вручную удобно пользоваться следующей таблицей. Назовем ее таблицей выполнения программы.
Таблица 9.3. Таблица выполнения программы
Номер выполняемого оператора |
|
Переменные и их текущие значения |
|
Дисплей |
Программа |
|
|
В верхней строке этой таблицы записывается текущее значение указателя программы, т. е. номер выполняемого оператора. При изменении этого значения старый номер зачеркиваем и рядом пишем новый. В следующей строке будем записывать имя той переменной, которая впервые встретилась при выполнении программы, и ее значение.
Если значение переменной изменяется, то старое значение зачеркнем и рядом напишем новое. В основной части таблицы справа располагаем выполняемую программу, а слева выписываем то, что в соответствии с операторами PRINT должно появляться на экране.
Выполняя программу вручную, нужно на время забыть “цель” программы и выполнять оператор с номером 20 только потому, что такое значение имеет указатель программы.
Как же найти ошибку в программе, выполняя ее вручную? Для этого нужно переключаться из состояния “робота”, в котором вы находитесь, выполняя очередной оператор, в состояние человека, обладающего интеллектом. Сначала вы — “робот” и выполняете оператор точно так, как это делает машина, потом опять становитесь человеком и спрашиваете: “Тот ли получен результат, которого я ожидал?” Если — да, то продолжаете выполнение программы. Если — нет, нужно думать, почему программа работает неправильно.
Рассмотрим пример. Предположим, что мы хотим напечатать таблицу умножения для числа 12, т. е. получить на экране:
ТАБЛИЦА УМНОЖЕНИЯ НА 12
1*12=12
2*12=24
. . . . .
12*
12= 144
Для этого мы написали программу
10 PRINT
“ТАБЛИЦА УМНОЖЕНИЯ НА 12"
20 Р=1
30 Р=Р+1
40 IF Р<=12 GO
ТО 30
50 PRINT P; ”*12=”;
P*12
60 STOP
Ввели эту программу и после ее выполнения получили на экране:
ТАБЛИЦА УМНОЖЕНИЯ НА 12
13*12 = 156
Мы видим, что получен не тот результат, который мы ожидали.
Для проверки работы программы выполним её вручную. Составим таблицу выполнения.
Таблица 9.4
Номер
выполняемого оператора |
|
Переменные
и их текущие значения P : |
|
Дисплей
|
Программа |
Выполняя. программу, в некоторый момент осознаем, что Р изменяется, а на экране ничего не появляется (действительно, оператор печати расположен после цикла!). Правильная программа выглядит следующим образом:
10 PRINT
“ ТАБЛИЦА УМНОЖЕНИЯ НА 12"
20 PRINT
30 Р=1
40 PRINT P; “*12=”;
P*12
50 Р=Р+1
60 IF Р<=12 GO
TO 40
70 STOP
Однако описанный метод проверки работы программы не дает результата, если вы не знаете языка Basic. Допустим, вы считаете, что * означает сложение. Тогда, например, если Р = 4, и вы выполняете вручную оператор Т=Р*Р, то Т будет иметь у вас значение 8, тогда как при выполнении этого оператора машиной Т будет присвоено значение 16. Таким образом, если результат работы программы не совпадает с ожидаемым, а выполнение программы вручную дает ожидаемый результат, то вам нужно повторить основы языка Basic.