Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
_________________
128 стр. Часть 2. Становимся функциональными программистами
Приведённая ниже "дефектная" программа наглядно демонстрирует применение отладочных команд. Эта программа должна считывать последовательность чисел с клавиатуры и выводить их среднее арифметическое значение. Однако она не делает этого, поскольку содержит две ошибки, одна из которых вызывает аварийный останов, а вторая приводит к неправильному результату.
«Данная программа имеется на прилагаемом компакт-диске под именемErrorProgram1.срр. »
[ Диск ]
/* ErrorProgram — эта программа усредняла бы ряд чисел, если бы не содержала как минимум одну фатальную ошибку */
#include
#include
#include
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. Отладка программ на С++
После ввода этой программы создайте выполнимый файл ( клавиша ). Запустите эту программу и введите числа 1, 2 и 3, а затем -1. Вы ожидаете увидеть, что их среднее равно двум? Вместо этого очевидного результата будет выдано довольно непривлекательное сообщение об ошибке, показанное на рис. 10.1.
«Рис. 10.1 может отличаться в зависимости от используемых операционной системы и компилятора.»
[ Помни! ]
Рис. 10.1. Первоначальная версия программы содержит как минимум одну ошибку
Выявление "жучка" № 1...130
Очень сложно разобраться, в чём именно проблема, по столь неинформативному сообщению. Но в некоторых операционных системах попроще вы получите сообщение ( поверьте на слово ), в котором будет туманный намёк относительно деления на нуль. Впрочем, мы и сами можем догадаться о том, что проблема где-то рядом, поскольку ошибка произошла после того, как мы ввели отрицательное число, но до того, как на экран был выведен результат. Давайте ещё раз посмотрим на так и не выполнившуюся инструкцию:
cout << "Среднее равно: "
<< nSum / nNums
<< 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
#include
#include
using namespace std ;
int main ( int nNumberofArgs , char* pszArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale (LC_ALL,".1251");
cout << " Эта программа содержит ошибки!"
<< endl ;
/* Суммируем ряд чисел, пока пользователь не введёт отрицательное число, после чего выводим среднее */
Читать дальшеИнтервал:
Закладка: