Подпрограммы Функции
Определить функцию можно с помощью ключевого слова function:
<тип> function имя (параметры) {
тело;
}
Тип - это тип возвращаемого значения. В скобках после имени функции указываются параметры, для каждого параметра обязательно указывается его тип. В теле функции должен быть оператор return, возвращающий значение указанного при объявлении функции типа.
Если функция не возвращает значения, то ее тип void:
Чтобы функции могли быть вызваны в функции main(), нужно объявить их до функции main. Но это не всегда удобно, учитывая, что код некоторых функций может быть очень длинным. Поэтому мы можем использовать так называемое предварительное объявление функции - это когда вы описываете прототип функции (тип возвращаемого значения, имя, параметры), но не пишете сам код функции. А после функции main() можно будет полно-
стью описать наши функции. Предварительное объявление дает компилятору понять, что мы не забыли о функции и что она будет объявлена далее в коде программы.
Вызов функции всегда является выражением, однако размещение такого выражения в тексте программы зависит от типа возвращаемого функцией значения. Если в качестве типа возвращаемого значения указан тип void, то функция является функцией без возвращаемого результата. Такая функция не может входить ни в какие выражения, требующие значения, а должна вызываться в виде отдельного выражения-оператора:
имя функции (список фактических параметров);
Например, следующая функция возвращает значение типа void:
void print(int gg, int mm, int dd)
{
printf("\n год: %d",gg); printf(",\t месяц: %d,",mm); printf (",\t день: %d.*', dd);
}
Обращение к ней print(1966, 11, 22); приведет к такому выводу на экран:
год: 1966, месяц: 11, день: 22,
Может оказаться полезной и функция, которая не только не возвращает никакого значения (имеет возвращаемое значение типа void), но и не имеет параметров. Например, такая:
#include <stdio.h> void Real_Time (void)
{
printf("\n Текущее время: %s", TIME____
" (час: мин: сек.)");
}
При обращении Real_Time ();
в результате выполнения функции будет выведено на экран дисплея сообщение:
Текущее время: 14:16:25 (час: мин: сек.)
Указатели в параметрах функций
Схема передачи параметров по значениям не оставляет никаких надежд на возможность непосредственно изменить фактический параметр за счет выполнения операторов тела функции. И это действительно так.
Объект вызывающей программы, использованный в качестве фактического параметра, не может быть изменен из тела функции. Однако существует косвенная возможность изменять значения объектов вызывающей программы действиями в вызванной функции. Эту возможность обеспечивает аппарат указателей. С помощью указателя в вызываемую функцию можно передать адрес любого объекта из вызывающей программы. С помощью выполняемого в тексте функции разыменования указателя мы получаем доступ к адресуемому указателем объекту из вызывающей программы.
Тем самым, не изменяя самого параметра (указатель-параметр постоянно содержит только адрес одного и того же объекта), можно изменять объект вызывающей программы.
Тем самым, не изменяя самого параметра (указатель-пара- метр постоянно содержит только адрес одного и того же объекта), можно изменять объект вызывающей программы.
Продемонстрируем изложенную схему на простом примере:
include <stdio.h>
void positive(int * m) /* Определение функции */
{
m = *m > 0? *m: —*m;
>
void main()
{
int k=-3; positive(&k); printf("\nk=%d", k);
}
Результат выполнения программы:
k=3
Параметр функции positive() - указатель типа int *. При обращении к ней из основной программы main() в качестве фактического параметра используется адрес &к переменной типа int. Внутри функции значение аргумента (т.е. адрес &к) "записывается" в участок памяти, выделенный для указателя int *m. Разыменование *m обеспечивает доступ к тому участку памяти, на который в этот момент "смотрит" указатель m. Тем самым в выражении *
*m = *m>0? *m:- *m
все действия выполняются над значениями той переменной основной программы (int к), адрес которой (&к) использован в качестве фактического параметра.
Вычисление среднего арифметического
Данный пример вычисляет среднеквадратическое отклонение. Для его вычисления мы создали функцию calculateSD(), поэтому данный пример будет демонстрировать передачу массива данных функции и работу с ним в функции
Передача данных функции
Сложение двух матриц с использованием многомерных массивов