Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

76.5, 73.5, 71.0, 73.6, 70.1, 73.5, 77.6, 85.3,

88.5, 91.7, 95.9, 99.2, 98.2, 100.6, 106.3, 112.4,

110.2, 103.6, 94.9, 91.7, 88.4, 85.2, 85.4, 87.7

На этот раз результаты таковы:

Максимальная температура: 112.4

Минимальная температура: 0.0

Средняя температура: 89.2

Ой, что-то не так. Крепкий мороз (0,0°F соответствует примерно 18°C) в Люббоке в июле — это же просто конец света! Вы видите ошибку? Поскольку переменная

low_temp
была инициализирована значением
0.0
, она останется равной нулю, если все значения температуры окажутся отрицательными.

ПОПРОБУЙТЕ

Выполните эту программу. Убедитесь, что она действительно выдает такие результаты. Попробуйте ее “сломать” (т.е. вынудить выдать неправильные результаты), введя другой набор данных. Сколько данных вам для этого может потребоваться?

К сожалению, в этой программе ошибок намного больше. Что произойдет, если все значения температуры окажутся отрицательными? Инициализация переменной

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

Такие ошибки типичны; они не создают никаких проблем при компиляции и не приводят к неправильным ответам при разумных условиях. Однако мы забыли указать, что означают разумные условия. Вот как должна выглядеть исправленная программа.

int main

{

double temp = 0;

double sum = 0;

double high_temp = –1000; // инициализация невозможно низким
значением

double low_temp = 1000; // инициализация невозможно высоким
значением

int no_of_temps = 0;

while (cin>>temp) { // считываем температуру

++no_of_temps; // подсчитываем количество данных

sum += temp; // вычисляем сумму

if (temp > high_temp) high_temp = temp; // находим максимум

if (temp < low_temp) low_temp = temp; // находим минимум

}

cout << "Максимальная температура: " << high_temp<< endl;

cout << "Минимальная температура: " << low_temp << endl;

cout << "Средняя температура:" << sum/temps.size << endl;

}

Эта программа работает? Почему вы уверены в этом? Вы сможете дать точное определение слова “работает”? Откуда взялись числа

1000
и
–1000
. Помните о “магических” константах (см. раздел 5.5.1). Указывать числа
1000
и
1000
как литеральные константы в тексте программы — плохой стиль, но может быть, и эти числа неверны? Существуют ли места, где температура опускается ниже —1000°F (–573°C)? Существуют ли места, где температура поднимается выше 1000°F (538°C)?

ПОПРОБУЙТЕ

Просмотрите программу. Используя достоверные источники информации, введите разумные значения для констант

min_temp
(минимальная температура) и
max_temp
(максимальная температура). Эти значения определят пределы применимости вашей программы.

5.8. Оценка

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

–34.56
. Очевидно, что ответ неверен. Почему? Потому что ни одна фигура не может иметь отрицательную площадь.
Итак, вы исправляете ошибку и получаете ответ
21.65685
. Этот результат правильный? Ответить на этот вопрос труднее, потому что мы обычно не помним формулу для вычисления площади шестиугольников. Итак, чтобы не опозориться перед пользователями и не поставить им программу, выдающую глупые результаты, необходимо проверить, что ответ правильный. В данном случае это просто. Шестиугольник похож на квадрат. Набросав на бумаге рисунок, легко убедиться, что площадь шестиугольника близка к площади квадрата 3x3. Площадь этого квадрата равна 9. Итак, ответ 21.65685 не может быть правильным! Переделаем программу и получим ответ 10.3923. Это уже похоже на правду!

В данном случае мы ничего не делали с шестиугольниками. Дело в том, что даже имея представление о правильном ответе, даже таком довольно точном, мы не имеем права считать результат приемлемым. Всегда следует ответить на следующие вопросы.

1. Является ли данный ответ разумным для данной задачи?

Можно даже задать более общий (и более трудный) вопрос.

2. Как распознать разумный результат?

Обратите внимание на то, что мы не спрашиваем: “Каков точный ответ?” или “Каков правильный ответ?” Этот ответ нам даст сама программа. Нам лишь хочется, чтобы ответ не был глупым. Только в том случае, если ответ является разумным, имеет смысл продолжать работать над программой.

Оценка — это замечательное искусство, сочетающее в себе здравый смысл и очень простую арифметику. Некоторые люди легко выполняют оценку умозрительно, но мы предпочитаем “рисовать каракули на обратной стороне конверта”, поскольку в противном случае легко сделать ошибку. Итак, здесь мы называем оценкой неформальный набор приемов, или прикидку (guesstimation), сочетающую в себе интуитивную догадку и примерную оценку.

ПОПРОБУЙТЕ

Длины сторон нашего правильного шестиугольника равны 2 см. Получили ли мы правильный ответ? Просто выполните прикидочные вычисления. Возьмите лист бумаги и набросайте эскиз. Не считайте это занятием ниже своего достоинства. Многие знаменитые ученые восхищали людей своими способностями получать примерный ответ с помощью карандаша и клочка бумаги (или салфетки). Эта способность — на самом деле простая привычка — поможет сэкономить массу времени и избежать ошибок.

Часто оценка связана с предварительным анализом данных, необходимых для вычисления, но не имеющихся в наличии. Представьте, что вы протестировали программу, оценивающую время путешествия из одного города в другой. Правдоподобно ли, что из Нью-Йорка в Денвер можно доехать на автомобиле за 15 часов 33 минуты? А из Лондона в Ниццу? Почему да и почему нет? На каких данных основана ваша догадка об ответах на эти вопросы? Часто на помощь приходит быстрый поиск в веб. Например, 2000 миль — это вполне правдоподобная оценка расстояния между Нью-Йорком и Денвером. По этой причине было бы трудно (да и не законно) поддерживать среднюю скорость, равную 130 миль/ч, чтобы добраться из Нью-Йорка в Денвер за 15 часов (15*130 ненамного меньше 2000). Можете проверить сами: мы переоценили и расстояние, и среднюю скорость, но наша оценка правдоподобности ответа вполне обоснована.

ПОПРОБУЙТЕ

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

5.9. Отладка

Написанная (вчерне?) программа всегда содержит ошибки. Небольшие программы случайно компилируются и выполняются правильно при первой же попытке. Но если это происходит с любой не тривиальной программой, то это очень и очень подозрительно. Если программа правильно выполнилась с первой попытки, идите к друзьям и празднуйте, поскольку это происходит не каждый год.

Поделиться:
Популярные книги

Звезда сомнительного счастья

Шах Ольга
Фантастика:
фэнтези
6.00
рейтинг книги
Звезда сомнительного счастья

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

Легат

Прокофьев Роман Юрьевич
6. Стеллар
Фантастика:
боевая фантастика
рпг
6.73
рейтинг книги
Легат

Младший сын князя

Ткачев Андрей Сергеевич
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Младший сын князя

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

Энфис 4

Кронос Александр
4. Эрра
Фантастика:
городское фэнтези
рпг
аниме
5.00
рейтинг книги
Энфис 4

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Чехов книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Чехов книга 3

Двойня для босса. Стерильные чувства

Лесневская Вероника
Любовные романы:
современные любовные романы
6.90
рейтинг книги
Двойня для босса. Стерильные чувства

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Инцел на службе демоницы 1 и 2: Секса будет много

Блум М.
Инцел на службе демоницы
Фантастика:
фэнтези
5.25
рейтинг книги
Инцел на службе демоницы 1 и 2: Секса будет много