Информатика
Глава 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

Номер выполняемого оператора 10 20 30 40 30

Переменные и их текущие значения P : 1 2 3

Дисплей

 

Программа
10 PRINT “ТАБЛИЦА УМНОЖЕНИЯ НА 12”
20 P=1
30 P=P+1
40 IF P<=12 GO TO 30
50 PRINT P; “*12=”; P*12
60 STOP

Выполняя. программу, в некоторый момент осознаем, что Р изменяется, а на экране ничего не появляется (действительно, оператор печати расположен после цикла!). Правильная программа выглядит следующим образом:

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.


назад оглавление вперед