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

            << endl ;

«Кстати говоря, хотя это и единственное деление, использованное нами в программе, это ещё не означает, что ошибка именно в нём. Компилятор может сгенерировать команду деления в результате обработки некоторой иной инструкции, написанной программистом. Кроме того, делений хватает и в стандартной библиотеке С++.»

[Советы]

Давайте посмотрим, чему равно значение nNums перед выполнением деления, изменив код следующим образом:

    while ( true )

    {

           cout << "nNums = " << nNums << endl ;

           /* Остальная часть программы остаётся неизменной */

_________________

130 стр. Часть 2. Становимся функциональными программистами

Такое дополнение нашей программы приводит к следующему выводу на экран:

    Эта программа содержит ошибки!

    nNums = 0

    Введите следующее число: 1

    nNums = 0

    Введите следующее число: 2

    nNums = 0

    Введите следующее число: 3

    nNums = 0

    Введите следующее число:

Как видите, nNums инициализировано нулевым значением, но оно не увеличивается в процессе ввода новых чисел. Это неверно, и именно в этом состоит ошибка в программе. Очевидно, что количество введённых чисел nNums должно увеличиваться, чего можно легко достичь, заменив цикл while циклом for:

        for ( int nNums = 0 ; ; nNums++ )

Выявление "жучка" № 2...131 

Теперь, когда найдена и исправлена ошибка № 1, можно запустить программу, введя числа, заставившие её в прошлый раз аварийно завершиться. На этот раз сообщение об ошибке не появится и программа вернёт нулевой код выхода, но будет работать не так, как ожидалось. Вместо так горячо ожидаемой двойки будет выведено какое-то нелепое число.

    Эта программа содержит ошибки:

    Введите следующее число: 1

    Введите следующее число: 2

    Введите следующее число: 3

    Введите следующее число: -1

    Среднее равно: 229523

Очевидно, какая-то из переменных — nNums или nSum ( а возможно, и обе ) содержит неверное значение. Для того чтобы исправить ошибку, необходимо узнать, какая именно из этих переменных содержит неверную информацию. Не помешало бы также знать, что содержится в переменной nValue, поскольку она используется для подсчёта суммы в nSum.

Для этого воспользуемся методом отладочной печати. Чтобы узнать значения nValue, nSum и nNums, перепишите тело цикла for так, как показано в следующем листинге ( версия программы имеется на прилагаемом компакт-диске в файле с именем ErrorProgram2.срр ).

      /* 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 << " Эта программа содержит ошибки!"

                    << endl ;

            /* Суммируем ряд чисел, пока пользователь не введёт отрицательное число, после чего выводим среднее */

            int nSum ;

            for ( int nNums = 0 ; ; nNums++ )

_________________

131 стр. Глава 10. Отладка программ на С++

            {

               /* Ввод следующего числа */

               int nValue ;

               cout << "Введите следующее число:" ;

               cin >> nValue ;

               cout << endl ;