Рис. 9.1, Поток управления в программе lethead1.с (листинг 9.1)
. При определении функции starbar() в программе применяется та же форма, что и при определении main(). Определение начинается с типа, имени и круглых скобок. Далее следует открывающая фигурная скобка, объявление используемых переменных, операторы функции и закрывающая фигурная скобка (рис. 9.2). Обратите внимание, что после этого экземпляра функции starbar() точка с запятой не указана. Отсутствие точки с запятой говорит компилятору о том, что функция starbar() определяется, а не вызывается или прототипируется.
• Функции starbar() и main() в программе находятся в одном файле. Их можно также разнести по двум отдельным файлам. Форму с одним файлом легче компилировать. Два отдельных файла упрощают применение одной функции в разных программах. Если вы помещаете функцию в отдельный файл, то должны поместить в него также необходимые директивы #define и #include. Использование двух и более файлов обсуждается позже, а пока все функции мы будем хранить вместе в одном файле. Закрывающая фигурная скобка main() указывает компилятору, где эта функция заканчивается, а следующий за ней заголовок starbar() сообщает компилятору о том, что starbar() является функцией.
• Переменная count в функции starbar() является локальной. Это означает, что она известна только этой функции. Имя count можно применять в других функциях, включая main(), и это не приведет к конфликту. Просто в программе будут существовать отдельные независимые друг от друга переменные, имеющие одинаковые имена.

Глава 9
Если думать о функции starbar() как о черном ящике, то ее действие заключается в выводе строки звездочек. Она не принимает входные данные, т.к. ей не нужна какая-либо информация от вызывающей функции. Она не предоставляет (т.е. не возвращает) информацию функции main(), поэтому starbar() не имеет возвращаемого значения. Короче говоря, функция starbar() не нуждается в каком-либо обмене данными с вызывающей функцией.
Давайте создадим функцию, для которой такой обмен данным необходим.
Аргументы функции
Показанный ранее заголовок письма выглядел бы намного лучше, если бы текст располагался по центру. Текст можно центрировать, поместив подходящее количест во ведущих пробелов перед выводом собственно текста. Такое поведение аналогично функции starbar(), которая выводила заданное число звездочек, но теперь необходимо выводить определенное количество пробелов. Вместо написания отдельной функции для каждой задачи мы создадим одну, но более универсальную функцию, которая решает обе задачи. Назовем эту новую функцию show_n_char() (имя означает, что символ отображается n раз). Единственное изменение касается того, что вместо использования встроенных значений для отображаемого символа и количества повторений в функции show n char() для этого будут применяться аргументы.
Давайте перейдем к деталям. Предположим, что доступное пространство имеет ширину 40 символов. Строка из звездочек содержит 40 символов, в точности соответствуя по ширине, и вызов show_n_char (' * ', 40) должен выводить эту строку точно так же, как это ранее делала функция starbar(). Что можно сказать о пробелах, используемых для центрирования строки GIGATHINK, INC.? Строка GIGATHINK, INC. имеет ширину 15 символов, поэтому в первой версии программы за заголовком следовали 25 пробелов. Для центрирования строки необходимо начать строку с 12 пробелов, что даст в результате 12 пробелов с одной стороны и 13 пробелов с другой. Таким образом, можно применять вызов show n char (' ', 12).
Помимо аргументов функция show n char() будет довольно похожа на starbar(). Одно отличие заключается в том, что show n char() не добавляет символ новой строки, как это делает starbar(), поскольку в той же строке может понадобиться вы-
Функции 331
вести другой текст. Переделанная версия программы показана в листинге 9.2. Чтобы продемонстрировать работу аргументов, в программе используются различные их формы.
Листинг9.2. Программа lethead2.c

Вот результат выполнения программы:
кккккккккккккккккккккккккккккккккккккккк
GIGATHINK, INC.
101 Megabuck Plaza Megapolis, CA 94904
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Теперь давайте посмотрим, как построить функцию, которая принимает аргументы. После этого мы взглянем, как ею пользоваться.
Определение функции с аргументами: формальные параметры
Читать дальше