Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Листинг 6.20. Программа power .с
Управляющие операторы С: циклы 237
Ниже показан пример выполнения этой программы:
Введите число и положительную целую степень, в которую
число будет возведено. Для завершения программы введите q.
1.2 12
1.2 в степени 12 равно 8.9161
Введите следующую пару чисел или q для завершения.
2
16
2 в степени 16 равно 65536
Введите следующую пару чисел или q для завершения.
q
Надеемся, что вы оценили это упражнение -- до свидания!
Анализ программы
Программа main() представляет собой пример драйвера — короткой программы, предназначенной для тестирования функции.
Цикл while является обобщением формы, используемой ранее. Ввод 1.2 12 приводит к успешному чтению функцией scanf() двух значений и возвращению 2, после чего цикл продолжается. Поскольку scanf() игнорирует пробельные символы, входные данные можно разносить по нескольким строкам, как демонстрируется в показанном выводе, но ввод q дает возвращаемое значение 0, потому что символ q не может быть прочитан, учитывая указанный спецификатор %lf. Это приводит к тому, что scanf() возвращает 0, тем самым прекращая выполнение цикла. Аналогично, ввод 2.8 q вызвал бы возврат функцией scanf() значения 1, что также бы обеспечило завершение цикла.
Теперь рассмотрим все детали, связанные с функцией. Функция power() появляется в программе трижды. Первый раз она встречается в следующей конструкции:
double power(double n, int p); // прототип ANSI
Этот оператор сообщает, или объявляет, что в программе будет применяться функция по имени power(). Первое ключевое слово double отражает, что power() возвращает значение типа double. Компилятор должен знать вид значения, возвращаемого power(), чтобы определить, сколько байтов данных следует ожидать и как их интерпретировать; это и является причиной объявления функции. Конструкция double n, int р внутри круглых скобок означает, что функция power() принимает два аргумента. Первый аргумент должен быть значением типа double, а второй — значением типа int.
Второй раз функция появляется в следующем операторе:
xpow = power(х,exp); // вызов функции
В этом месте программа вызывает функцию и передает ей два значения. Функция вычисляет значение х в степени ехр и возвращает результат в вызывающую программу, где возвращаемое значение присваивается переменной xpow.
Третий раз рассматриваемая функция встречается в заголовке определения функции:
double power(double n, int p) // определение функции
Здесь функция power() принимает два аргумента, double и int, представленные переменными пир. Обратите внимание, что в определении функции точка с запятой после power() отсутствует, но в объявлении функции она имеется. После заголовка следует код, который указывает, что делает функция power().
238 Глава 6
Вспомните, что в функции используется цикл for для вычисления значения n в степени р, которое затем присваивается переменной pow. Следующая строка делает это значение pow возвращаемым значением функции:
return pow; // возвратить значение pow
Использование функций с возвращаемыми значениями
Объявление, вызов и определение функции, а также применение ключевого слова return — все это базовые элементы в определении и использовании функции с возвращаемым значением.
К настоящему времени у вас могли накопиться вопросы. Например, если вы обязаны объявлять функции до применения их возвращаемых значений, то каким образом получилось воспользоваться возвращаемым значением функции scanf() без ее объявления? Почему вы должны объявить функцию power() отдельно, если в ее определении указано, что она возвращает тип double?
Рассмотрим сначала второй вопрос. Компилятор должен знать, какой тип возвращает функция power(), когда он впервые сталкивается с ней в программе. К этому моменту компилятор еще не встретил определение power(), поэтому ему пока не известно, что в определении данной функции указан возвращаемый тип double. Чтобы помочь компилятору, вы используете предварительное объявление. Это объявление информирует компилятор о том, что функция power() объявлена где-то в другом месте, и она будет возвращать тип double. Если поместить определение функции power() раньше функции main() внутри файла, то предварительное объявление можно не указывать, т.к. компилятор будет располагать всеми сведениями о функции power() до достижения функции main(). Тем не менее, это не стандартный стиль программирования на С. Поскольку функция main() обычно предоставляет базовую структуру для программы, лучше размещать ее код первой. Кроме того, функции часто определяются в отдельных файлах, и в этих случаях предварительные объявления обязательны.
А почему мы не объявили функцию scanf() ? На самом деле мы сделали это. В заголовочном файле stdio.h содержатся объявления scanf(), printf() и других функций ввода-вывода. В объявлении функции scanf() указано, что она возвращает значение типа int.
Ключевые понятия
Цикл представляет собой мощный инструмент программирования. При написании цикла вы должны обращать особое внимание на следующие три аспекта.
• Четкое определение условия прекращения цикла.
• Обеспечение инициализации значений, задействованных в условии проверки цикла, перед первым их использованием.
• Обеспечение в цикле действий по обновлению условия проверки на каждой итерации.
Условия проверки обрабатываются пугем их числовой оценки. Результат, равный О, трактуется как ложное значение, а любое другое числовое значение — как истинное. Выражения с операциями отношений часто выступают в качестве условий проверки и являются чуть более специфичными. Результатом такого выражения будет 1, если оно истинно, и 0, если ложно, что соответствует значениям, разрешенным для нового типа Bool.
Управляющие операторы С: циклы 239
Массивы состоят из расположенных рядом ячеек памяти со значениями одного и того же типа. Вы должны помнить, что нумерация элементов массива начинается с О, поэтому последний элемент массива имеет индекс на единицу меньше количества элементов. В С не выполняется проверка допустимости значений индексов, так что ответственность за это возлагается целиком на вас.
Использование функций включает три отдельных шага.
1. Объявление функции посредством ее прототипа.
2. Выполнение функции внутри программы путем ее вызова.
3. Определение функции.
Прототип позволяет компилятору проверять, корректно ли применяется функция, а определение функции указывает, как она должна работать. Прототип и определение функции являются примерами современного стиля программирования, предусматривающего разделение элемента программы на интерфейс и реализацию. Интерфейс описывает, как используется средство, что и делает прототип, а реализация далее расписывает конкретные действия, чем занимается определение функции.
Читать дальшеИнтервал:
Закладка: