Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_Линейные программы (МУ к занятию).doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
985.6 Кб
Скачать

2.3 Отладка программы

Запустите программу на выполнение несколько раз, задавая различные значения температуры. Не забудьте, что число, имеющее дробную часть, при вводе следует записывать с точкой, а не с запятой. Можно задавать и целые числа – они будут автоматически преобразованы в вещественную форму.

Как вы можете видеть, результат выполнения программы со стабильностью, достойной лучшего применения, оказывается равным нулю! Это происходит из-за способа вычисления выражения. Давайте вновь обратимся к оператору 4. Константы 5 и 9 имеют целый тип, поэтому результат их деления также целочисленный. Округления при этом не происходит, дробная часть всегда отбрасывается. Естественно, что результат дальнейших вычислений не может быть ничем, кроме нуля. Исправить эту ошибку просто – достаточно записать хотя бы одну из констант в виде вещественного числа, например:

cels = 5. / 9 * (fahr - 32); // 5

Вещественная константа «5.» по умолчанию имеет тип double, и при выполнении деления происходит автоматическое преобразование к этому же типу другой константы, а затем и результата вычитания.

Можно записать это выражение и по-другому, просто изменив порядок действий:

cels = 5 * (fahr - 32) /9; //5

В этом случае будет выполнено преобразование констант к типу float, как к наиболее длинному из участвующих в выражении. Теперь программа работает верно и выдает в результате, например, следующее:

Введите температуру по Фаренгейту

451

По Фаренгейту: 451, в градусах Цельсия: 232.778

Обратите внимание, что на экран наряду с результатом вычислений мы вывели и исходные данные. Это правильная привычка, и надеемся, что вы тоже будете ей следовать.

СОВЕТ: Начинающие часто тратят время на поиск ошибки в алгоритме, не удостоверившись, что программа работает с правильными данными. Рекомендуется для контроля выводить ис­ходные данные сразу же после ввода, чтобы исключить ошибки.

Попробуйте при вводе температуры задать нецифровые символы и проинтерпре­тировать полученный результат.

Как видите, даже в таком простом примере можно допустить ошибки! В данном случае заметить их легко, но так происходит далеко не всегда, поэтому запомните важное правило: надо всегда заранее знать, что должна выдать программа. Добить­ся этого можно разными способами, например, вычислением результатов в уме, на бумаге или с помощью калькулятора, а в более сложных случаях – расчетами по аль­тернативной или упрощенной методике. Это убережет вас от многих часов, бесплод­но и безрадостно проведенных за компьютером. Не поленимся повторить еще раз:

ВНИМАНИЕ: Перед запуском программы необходимо иметь тестовые примеры, содержащие исходные данные и ожидаемые результаты. Количество этих примеров зависит от алгоритма.

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

Давайте теперь напишем ту же программу вторым способом, с использованием функций библиотеки C++, унаследованных из языка С. Этот способ также приме­няется достаточно часто, потому что в использовании этих функций есть свои пре­имущества. Когда вы их оцените, то сможете выбирать для каждой программы наи­более подходящий способ ввода-вывода.

#include <stdio.h>

int main(){ // 1

float fahr, cels; // 2

printf("\n Введите температуру по Фаренгейту\n"); // 3

scanf ("%f", &fahr); // 4

cels = 5 * (fahr - 32) /9; // 5

printf(" По Фаренгейту: %6.2f, в градусах Цельсия: %6.2f\n", fahr, cels); // 6

return 0: // 7

}

Как видите, к программе подключается другой заголовочный файл – <stdio.h>. Он содержит описание функций, констант и других элементов, относящихся ко вводу-выводу «в стиле С».

Рассмотрим отличия этой программы от предыдущей.

Функция printf в операторе 3 выполняет вывод переданного ей в качестве пара­метра строкового литерала, то есть последовательности любых символов в кавыч­ках, на стандартное устройство вывода (дисплей). Символы \n называются управляющей последовательностью. Есть разные управляющие последовательности, все они начинаются с обратной косой черты. Эта последовательность задает переход на следующую строку.

Для ввода исходных данных в операторе 4 используется функция scanf. В ней тре­буется указать формат вводимых значений, а также адреса переменных, которым они будут присвоены. Параметры любой функции перечисляются через запятую. В первом параметре функции scanf в виде строкового литерала задается спецификация формата вводимой величины, соответствующая типу переменной. Спецификация %f соответствует типу float7. В качестве второго параметра функ­ции передается адрес переменной, по которому будет помещено вводимое значе­ние. Операция взятия адреса обозначается &.

Для вывода результата в операторе 6 применяется уже знакомая нам функция printf. Теперь в ней три параметра. Первый, имеющий вид строкового литерала, задает вид и формат выводимой информации. Второй и третий параметры пред­ставляют собой имена переменных. Все символы литерала, кроме спецификаций формата %f и управляющей последовательности \n, выводятся на дисплей без из­менений. При выводе форматные спецификации будут заменены конкретными значениями переменных fahr и cels.

Формат вывода чисел можно уточнить при помощи так называемых модификато­ров формата — чисел, которые записаны перед спецификацией. Первое число за­дает минимальное количество позиций, отводимых под выводимую величину, вто­рое – сколько из этих позиций отводится под дробную часть величины. Необходимо учитывать, что десятичная точка тоже занимает одну позицию. Если заданного количества позиций окажется недостаточно для размещения числа, компилятор простит нам этот промах и автоматически выделит поле достаточной длины. На наш взгляд, в данном случае первый вариант программы (с использованием классов) более прост и нагляден, а также лучше защищен от ошибок кодирования.

1 Приведем еще две наиболее употребительные спецификации: для величин целого типа в деся­тичной системе счисления, 81 f – для величин типа double. Более полный список спецификаций см. в Учебнике на с. 387.

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

Надо сказать, что при использовании классов также можно задавать любую форму представления информации, но мы пока не будем вдаваться в подобные детали. Мы не рекомендуем начинающим изучать на этом семинаре теоретический мате­риал по классам ввода/вывода, поскольку для их полного понимания требуется освоить большой объем материала. Всему свое время!

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

СОВЕТ: Используйте функции ввода/вывода в тех программах, где требуется тщательное формати­рование результатов, а классы – в остальных случаях.

Рассмотрим в более общем виде очень важный для дальнейшей работы вопрос – описание переменных.