►Использование отладочной печати...128
Добавление команд вывода в ключевых точках помогает понять, что происходит в программе, и называется методом отладочной печати ( иногда именуемым WRITE ). Метод WRITE появился во времена, когда программы писались на языке FORTRAN, в котором вывод осуществляется с помощью команды WRITE.
_________________
128 стр. Часть 2. Становимся функциональными программистами
Приведённая ниже "дефектная" программа наглядно демонстрирует применение отладочных команд. Эта программа должна считывать последовательность чисел с клавиатуры и выводить их среднее арифметическое значение. Однако она не делает этого, поскольку содержит две ошибки, одна из которых вызывает аварийный останов, а вторая приводит к неправильному результату.
«Данная программа имеется на прилагаемом компакт-диске под именем ErrorProgram1.срр.»
[Диск]
/* ErrorProgram — эта программа усредняла бы ряд чисел, если бы не содержала как минимум одну фатальную ошибку */
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std ;
int main( int nNumberOfArgs , char* pszArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale (LC_ALL,".1251");
cout << "Эта программа содержит ошибки!\n" ;
int nSum ;
int nNums ;
/* Суммируем ряд чисел, пока пользователь не введёт отрицательное число, после чего выводим среднее */
nNums = 0 ;
while ( true )
{
/* Ввод очередного числа */
int nValue ;
cout << "Введите следующее число:" ;
cin >> nValue ;
cout << endl ;
/* Если это число отрицательное... */
if ( nValue < 0 )
{
/* ...то вывести среднее значение */
cout << "Среднее равно: "
<< nSum / nNums
<< endl ;
break ;
}
/* Введеённое число не отрицательно — добавляем его к накапливаемой сумме */
nSum += nValue ;
}
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
129 стр. Глава 10. Отладка программ на С++
После ввода этой программы создайте выполнимый файл ( клавиша <F9> ). Запустите эту программу и введите числа 1, 2 и 3, а затем -1. Вы ожидаете увидеть, что их среднее равно двум? Вместо этого очевидного результата будет выдано довольно непривлекательное сообщение об ошибке, показанное на рис. 10.1.
«Рис. 10.1 может отличаться в зависимости от используемых операционной системы и компилятора.»
[Помни!]
Рис. 10.1. Первоначальная версия программы содержит как минимум одну ошибку
Выявление "жучка" № 1...130
Очень сложно разобраться, в чём именно проблема, по столь неинформативному сообщению. Но в некоторых операционных системах попроще вы получите сообщение ( поверьте на слово ), в котором будет туманный намёк относительно деления на нуль. Впрочем, мы и сами можем догадаться о том, что проблема где-то рядом, поскольку ошибка произошла после того, как мы ввели отрицательное число, но до того, как на экран был выведен результат. Давайте ещё раз посмотрим на так и не выполнившуюся инструкцию:
cout << "Среднее равно: "
<< nSum / nNums