Современный стиль языка Си предполагает следующий формат определения функции:
возвращаемый_тип имя_функции(тип параметр_1, …,тип параметр_n)
{
описание данных;
оператор_1;
...
оператор_m;
return (выражение);
}
Совокупность предложений в фигурных скобках часто называют телом функции. Встретив определение функции, компилятор создает самостоятельную секцию кода программы, которая на этапе компоновки объединяется с другими функциями. Синтаксис языка Си запрещает внутри определения функции помещать определение еще одной функции.
Поле «возвращаемый_тип» задает тип возвращаемого функцией значения (char, int, float и т.д.). Если оно отсутствует, то считается, что функция возвращает значение типа int. Если функция не возвращает никакого значения, то в поле «возвращаемый_тип» записывается ключевое слово void (пустой).
После имени функции в скобках помещаются аргументы (или параметры), передаваемые в функцию, они содержат любую комбинацию типов и имен. Это поле в определении функции называется списком формальных аргументов (или параметров).
Поле «список аргументов» - не обязательная часть в определении функции. Если в функцию не передаются никакие аргументы, то это поле – пустое или содержит ключевое слово void.
Примеры определения функций:
int mul(int a, int b)
{
return a*b;
}
void output(float x)
{
printf(“Значение x=%f\n”, x);
}
int input() //или int input(void)
{
int i;
puts(“Введите целое число: ”);
scanf(“%d”, &i);
return i;
}
Определения функций могут размещаться в различных частях программы, в том числе и в различных файлах. Поэтому может возникнуть ситуация, когда вызывается функция, определение которой находится ниже (по тексту) в программе. Это вызывает сбой в работе компилятора.
Стандарт языка Си требует, чтобы функции были объявлены до первой ссылки на них. Это «предварительное» объявление называемое прототипом функции, извещает компилятор о типе возвращаемого значения, количестве и типе аргументов. Используя прототип, компилятор может выполнить тщательный контроль числа аргументов и соответствие их типов в вызовах функции и ее определении.
Современный стиль записи прототипа имеет следующий формат:
возвращаемый_тип имя_функции(тип параметр_1, …, тип параметр_n);
Сравнивая формат прототипа с определением функции, можно сделать вывод о том, что прототип точно повторяет первую строку определения функции. Примеры прототипов для рассматриваемых ранее функций:
int mul(int a, int b);
void output(float x);
int input(); //или int input(void);
Следует отметить, что определение функции будет одновременно являться ее прототипом при условии, что функция определяется до того, как будет вызвана. В таком случае прототип можно не записывать в текст программы. Однако лучше всего соблюдать следующее правило: всегда записывать прототипы функций, используемых в программе, вне зависимости от того, где (по тексту) находятся определения функций.
Прототипы функций обычно размещаются в начале программы после директив препроцессора. Общеупотребительная практика – помещение прототипов функций в заголовочный файл, подключаемый директивой #include к тексту программы.
Пример оформления программы с использованием прототипа:
#include <stdio.h>
int sqr(int x); //прототип
main()
{
int t=10;
printf(“Квадрат числа %d равен %d\n”, t, sqr(t));
return 0;
}
int sqr(int x) //определение функции
{
x=x*x;
return x;
}
Рассмотрим пример разработки простой программы с использованием функций. Предположим, что программа должна вводить три целых числа с клавиатуры, вычислять их среднее значение и выводить на экран результат. Оформим процедуру расчета среднего значения в виде функции. Возможная реализация функции average (по англ. среднее):
/*Определение функции average*/
int average(int num1, int num2, int num3)
{
int sum;
sum=num1+num2+num3;
return sum/3;
}
Для ввода чисел с клавиатуры мы решаем использовать более безопасную комбинацию функций gets()/atoi() вместо непредсказуемой scanf(). Так как придется запрашивать ввод числа несколько раз, то представляется разумным организовать процедуру чтения в виде отдельной функции, назвав ее, например, read:
/*Определение функции read*/
int read()
{
char buffer[10]; //буфер для ввода строки
gets (buffer); //чтение строки с клавиатуры
return atoi(buffer);//преобразование строки в целое число
}
И, наконец, вся программа, выполняющая указанные действия:
/*avgnum.cpp. Программа вычисления среднего значения*/
#include <stdio.h>
#include <stdlib.h> //здесь находится прототип atoi()
int average(int num1, int num2, int num3);//прототип функции
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.