Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

#Define enter printf("Пожалуйста,

введите значение температуры: ")

#define CONVERT(temp) (5.0 / 9.0) * (temp - 32) main()

{

float climate; ENTER;

scanf("%f", &climate); printf("это соответствует %f по

шкале Цельсия\n", CONVERT(climate));

}

  • В литературе также используется термин макроподстановка. (Прим.перев.)

Рис. 7.10. Определение выражения как макроса

Во второй директиве #define определяется макрос CONVERT, который требует передачи ему одного зна- чения. Аргумент, принимаемый макросом CONVERT, подставляется в выражение (5.0 / 9.0) * (temp - 32) на место слова temp. Вызов макроса осуществляется способом, аналогичным вызову функции, с использо- ванием в качестве аргумента значения, которое мы хотим преобразовать (рис.7.10). Если в ответ на за- прос введено значение212, происходит вызов CONVERT в функции printf() и расчет значения выражения (5.0 / 9.0) * (212 - 32).

Использование макросов имеет те же преимущества, что и использование констант. Например, если вы захотите заменить стандартный запрос ввода данных, это делается простым внесением изменений в мак- роопределение ENTER в начале программы. Если вы сделали ошибку в формуле перевода температуры, вам придется отредактировать только одну строку программы, а не все места, где встречается имя макро- определения.

Проектирование программы

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

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

С другой стороны, если вы написали длинную программу, поместив все ее инструкции в main(), и оказа- лось, что где-то закралась ошибка, обнаружить ее будет весьма непросто. Если же программа разделена на функции, вы можете начать диагностику с вопроса: «Какая функция с наибольшей вероятностью явля- ется источником проблемы?» и искать ошибку в отдельных частях программы, начав с наиболее вероятно- го места ее нахождения.

Автоматические или внешние переменные?

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

Хотя использование внешних переменных кажется более простым, их применение может привести к труд- но обнаруживаемым ошибкам выполнения и получению неправильных результатов. Поскольку внешняя переменная может использоваться всеми функциями программы, то любая из них может изменить значе- ние этой переменной. Если в результате выполнения программы были получены неправильные значения, вам придется исследовать весь текст на предмет поиска ошибки. Безобидная на вид инструкция, затеряв- шаяся где-нибудь в редко используемой функции, может катастрофически изменить значение перемен- ной.

Использование автоматических переменных и передача значений в качестве аргументов позволит вам бо- лее успешно управлять ходом программы. Значение автоматической переменной может изменить только функция, в которой она определена. Если результат работы программы оказался неправильным, вам дос- таточно ввести дополнительные функции printf() для отображения значения каждой локальной перемен- ной. Это легко позволит вам определить местонахождение ошибочных инструкций.