return(0);
}
}
Необходимо отметить здесь несколько моментов.
Первый : самым главным является то, что мы должны описать тип функции! Переменная answerимеет тип double, следовательно, сама функция power()тоже должна быть типа double, так как ей присваивается величина, возвращаемая оператором return. Почему, спросите вы, мы не описывали тип функции раньше? Дело в том, что по умолчанию в языке Си функция имеет тип int(для большинства функций это так), если не указано что-то иное.
Второй : мы хотели показать, что не забыли те новые операции присваивания, которые ввели в гл. 8.
Третий : в соответствии с алгебраическими правилами возведение в отрицательную степень было преобразовано в деление. Это внесло опасность деления на нуль, но в данном случае мы предусмотрели выдачу сообщения об ошибке и возврат значения 0, чтобы работа программы не прекращалась.
Мы можем воспользоваться тем же драйвером при условии, что тип функции power( )там тоже описан.
/* проверка возведения в степень*/
main( )
{
double x;
double power( ); /* это пример oписания функции */
x = power(2.0, 3);
printf(" %.0f \n", x);x = power(-3.0, 3);
printf(" %.0f\n" , x);x = power(4.0, -2);
printf(" %.4f\n", x);x = power(5.0, 10);
print f ("%.0f \n", x);
}
На этот раз результаты работы программы выглядят вполне удовлетворительно.
8
-27
0.0625
9765625
Данный пример побуждает нас ввести следующий короткий раздел.
Тип функции определяется типом возвращаемого ею значения, а не типом ее аргументов. Если указание типа отсутствует, то по умолчанию считается, что функция имеет тип int. Если значения функции не принадлежат типу int, то необходимо указать ее тип в двух местах.
1. Описать тип функции в ее определении:
char pun(ch, n) /* функция возвращает символ */
int n;
char ch;
float raft(num) /* функция возвращает величину типа float */
int num;
2. Описать тип функции также в вызывающей программе. Описание функции должно быть приведено наряду с описаниями переменных программы; необходимо только указать скобки (но не аргументы) для идентификации данного объекта как функции.
main( )
{
char rch, pun( );
float raft;
}
Запомните!Если функция возвращает величину не типа int, указывайте тип функции там, где она определяется, и там, где она используется.
1. Форма записи
Типичное определение функции имеет следующий вид:
имя (список аргументов)
описание аргументов
тело функции
Наличие списка аргументов и описаний не является обязательным. Переменные, отличные от аргументов, описываются внутри тела, которое заключается в фигурные скобки.
Пример:
diff(x, у) /* имя функции и список аргументов */
ini x, у; /* описание аргументов */
{ /* начало тела функции */
int z; /* описание локальной переменной */
z = х - у;return(z);
} /* конец тела функции */
II. Передача значений функции:
Аргументы используются для передачи значений из вызывающей программы и функцию. Если значения переменных аи bбудут 5 и 2, то при вызове
с = diff(а,b);
осуществляется передача этих значений переменным хи у. Значения 5 и 2 называют ся фактическими аргументами, а переменные хи у, указанные в описании функции: diff( )- формальными аргументами.
Использование ключевого слова returnпозволяет передавать в вызывающую программу одно значение из вызываемой функции. В нашем примере переменной с присваивается значение переменной z, равное 3.
Обычно выполнение функции не оказывает никакого влияния на значения переменных вызывающей программы. Чтобы иметь возможность непосредственно изменять значения переменных вызывающей программы, необходимо использовать указатели в качестве аргументов. Это может оказаться необходимым в случае, если в вызывающую программу требуется передать более чем одно значение.
III. Тип функции
Функции должны иметь тот же тип, что и значения, которые они возвращают в качестве результатов. По умолчанию предполагается, что функции имеют тип int. Если функция имеет другой тип, он должен быть указан и в вызывающей программе, и в самом определении функции.
Пример
main( )
Читать дальше