Выбрать главу

►Использование отладочной печати...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