Титул фирменного бланка выглядел бы несколько лучше, если бы текст был сдвинут к центру. Мы сможем поместить текст в центре, если напечатаем нужное число пробелов перед выводом требуемой строки. Воспользуемся некоторой функцией для печати пробелов. Наша функция space( )(давайте назовем ее так) будет очень напоминать функцию starbar( ), за исключением того, что на этот раз между функцией main( )и функцией space( )должна быть установлена связь, так как необходимо сообщить последней функции о требуемом числе пробелов.
Рассмотрим это более конкретно. В строке, состоящей из звездочек, 65 символов, а в строке MEGATHINK, INC. - 15. Поэтому в нашем первом варианте программы вслед за этим сообщением шло 50 пробелов. Чтобы сместить текст к центру, нужно сначала напечатать 25 пробелов, а потом текст, в результате чего слева и справа от данной фразы окажется по 25 пробелов. Следовательно, необходимо иметь возможность передать величину "25" функции, печатающей пробелы. Мы применяем тот же способ, что и при передаче символа '*' функции putchar( ): используем аргумент. Тогда запись space(25)будет означать, что необходимо напечатать 25 пробелов. 25 - это аргумент. Мы будем вызывать функцию space( )три раза: один раз для каждой строки адреса. Вот как выглядит эта программа:
/* титул фирменного бланка2 */
#define NAME "MEGATHINK, INC."
#define ADDRESS "10 Megabuck Plaza"
#define PLACE "Mcgapolis, CA 94904"
main( )
{
int spaces;
starbar( );
space(25); /* space( ) использует в качестве аргумента константу*/
printf("%s\n", NAME);
spaces = (65 - strlen(ADDRESS))/2;
/* мы заставляем программу вычислять, сколько пропустить пробелов */
space(spaces); /* аргументом является переменная */
printf("%s\n", ADDRESS);
space((65 - strlen(PLACE))/2); /* аргументом является выражение */
printf(" %s \n", PLACE);
starbar( );
}
/* определение функции starbar( ) */
#include
#define LIMIT 65
starbar( )
{
int count;
for (count = 1;count <= LIMIT;count++) putchar('*');
putchar('\n');
}
/* определение функции space( ) */
space(number)
int number; /* аргумент описывается перед фигурной скобкой */
{
int count /* дополнительная переменная описывается
после фигурной скобки */
for (count = 1;count <= number;count++)
putchar(' ');
}
РИС. 9.3. Программа, печатающая титул фирменного бланка.
Обратите внимание на то, как мы экспериментировали при вы зовах функции space( ):мы задавали аргумент тремя различными способами. Являются ли все они работоспособными? Да - и вот доказательство.
*********************************************************************
MEGATHINK, INC.
10 Megabuck Plaza
Megapolis, CA 94904
*********************************************************************
Рассмотрим сначала, как определить функцию с одним аргументом, после чего перейдем к вопросу о том, как она используется.
Определение функции с аргументом: формальные аргументы
Определение нашей функции начинается с двух строк:
space(number)
int number;
Первая строка информирует компилятор о том, что у функции space( )имеется аргумент и что его имя number. Вторая строка - описание, указывающее компилятору, что аргумент numberимеет тип int. Обратите внимание: аргумент описывается перед фигурной скобкой, которая отмечает начало тела функции. Вообще говоря, вы можете объединить эти две строки в одну:
space(int number;)
Независимо от формы записи переменная numberназывается "формальным" аргументом. Фактически это новая переменная, и в памяти компьютера для нее должна быть выделена отдельная ячейка. Посмотрим, как можно пользоваться этой функцией.
Вызов функции с аргументом: фактические аргументы
Задача в данном случае состоит в том, чтобы присвоить некоторую величину формальному аргументу number. После того как эта переменная получит свое значение, программа сможет выполнить свою задачу. Мы присваиваем переменной numberзначение фактического аргумента при вызове функции. Рассмотрим наш первый случай использования функции space( ):
space(25);
Фактический аргумент здесь 25, и эта величина присваивается формальному аргументу - переменной number, т. е. вызов функции оказывает следующее действие:
number = 25;
Короче говоря, формальный аргумент - переменная в вызываемой программе, а фактический аргумент - конкретное значение, присвоенное этой переменной вызывающей программой. Как было показано в нашем примере, фактический аргумент может быть константой, переменной или даже более сложным выражением. Независимо от типа фактического аргумента он вначале вычисляется, а затем его величина (в данном случае некоторое целое число) передается функции. Рассмотрим, например, наше последнее обращение к функции space( ).
Читать дальше