Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ_ИКТ Программирование по С++ (1 семестр) _Хотов.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5.83 Mб
Скачать

Обнаружение ошибки

Как уже говорилось выше, большинство синтаксических ошибок обнаружи­вается компилятором или выявляется сразу же после первых запусков про­граммы. Их нетрудно обнаружить и исправить. Как правило, трудности вы­зывает обнаружение семантических ошибок. О них обычно и идет речь, когда говорят об отладке.

После того как очевидные ошибки устранены, и программа при запуске не сообщает об ошибках, могут возникнуть следующие ситуации:

  1. Программа не дает никаких результатов. Это происходит чаще всего в результате зацикливания или ожидания какого-то события, которое по разным причинам не может наступить.

  2. Программа дает неверные результаты. Самый распространенный вари­ант, возникающий из-за ошибок в алгоритме или из-за ошибок в коди­ровании алгоритма.

  3. Программа дает правдоподобные результаты. Это самый опасный слу­чай, поскольку получаемые значения можно принять за верные резуль­таты и передать в эксплуатацию ошибочную программу.

4. Программа работает правильно. Почти фантастика. Рассмотрим подробнее каждую ситуацию.

Программа не дает результатов

В этой ситуации надо, прежде всего, добиться все-таки от программы хоть какой-то выдачи. Это достигается добавлением в программу функций выво­да printf(), fprintf о, puts() или других функций, выводящих промежу­точные значения всех или наиболее важных переменных. Они образуют так называемую отладочную печать. Это название появилось в эпоху телетай­пов, когда результаты выводились на бумажную ленту. Сейчас отладочные сведения выводятся на экран дисплея или записываются в файл, но слово "печать" осталось в лексиконе программистов, означая выдачу результатов на какое-нибудь устройство вывода.

Что входит в отладочную печать? Прежде всего, надо распечатать исходные данные, чтобы убедиться, что ввод происходит правильно. Затем надо про­верить начало и окончание каждого цикла, распечатав начальные значения цикла и значения, полученные по окончании цикла. Печать внутри цикла обычно не делается, она будет выполняться при каждом повторении цикла и приведет к огромной выдаче, в которой будет трудно что-либо понять.

Отладочная печать ставится перед разветвлениями, а также в начало каждой ветви, чтобы убедиться в правильном прохождении условных операторов.

Очень много ошибок возникает при передаче аргументов в функции. Ком­пилятор работает с каждой функцией отдельно, у него нет сведений о дру­гих функциях, и он не может проверить правильность фактических пара­метров. Поэтому отладочная печать ставится в начале каждой функции, чтобы проверить правильность полученных ею аргументов. Кроме того, нужно распечатывать значение, возвращенное функцией, чтобы убедиться в точности ее работы.

После беглого просмотра результатов отладочной печати уже можно уви­деть, какие участки кода программа проходит без задержек, а какие приво­дят к зацикливанию. Например, распечатав в следующем цикле значения к и а. count (), можно обнаружить, что переменная к меняется в цикле два раза, уменьшаясь и увеличиваясь на единицу:

while (k < a.sizeOH

if (a.count() < current){

s += a.deposit(abonent(k)).value; }else{

s += a.deposit(abonent(—k)).value;

}

k++;

}

В результате переменная к не увеличивается и программа зацикливается.

Получив отладочную печать и внеся необходимые исправления в програм­му, мы переходим от первой ситуации к одной из следующих ситуаций.