
- •«Технология программирования» методические указания
- •Самара 2007
- •Содержание
- •Введение
- •1.2.1 Состав языка
- •1.2.2 Алфавит языка
- •1.2.3 Идентификаторы
- •1.2.4 Ключевые (служебные) слова
- •1.2.5 Знаки операций
- •1.2.6 Константы
- •1.2.7 Комментарии
- •1.3.1 Концепция типа данных
- •1.3.2 Основные типы данных
- •1.3.3 Структура программы
- •1.4 Переменные и выражения
- •1.4.1 Переменные
- •1.4.2 Операции
- •1.4.3 Выражения
- •2. Программа выполнения работы
- •2.1 Задача 1.1. Расчет по формуле
- •2.3 Отладка программы
- •2.4 Описание переменных
- •2.5 Задача 1.2. Временной интервал
- •3. Содержание отчета
- •4. Контрольные вопросы
- •5. Задания
- •Библиографический список
- •Приложение 1. Спецификации формата для функций семейства printf
- •Модификаторы формата
- •Приложение 2. Арифметические преобразования типов
- •Приложение 3. Правила оформления текстов программ
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.
Надо сказать, что при использовании классов также можно задавать любую форму представления информации, но мы пока не будем вдаваться в подобные детали. Мы не рекомендуем начинающим изучать на этом семинаре теоретический материал по классам ввода/вывода, поскольку для их полного понимания требуется освоить большой объем материала. Всему свое время!
Для каждой программы необходимо выбрать один наиболее удобный способ вывода (либо с помощью функций, либо с помощью классов), поскольку смешивать оба варианта не рекомендуется.
СОВЕТ: Используйте функции ввода/вывода в тех программах, где требуется тщательное форматирование результатов, а классы – в остальных случаях.
Рассмотрим в более общем виде очень важный для дальнейшей работы вопрос – описание переменных.