Функции. Описание функции. Описание данных. Примеры определения функций. Современный стиль записи прототипа

Страницы работы

Фрагмент текста работы

Современный стиль языка Си предполагает следующий формат определения функции:

возвращаемый_тип имя_функции(тип параметр_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);//прототип функции

Похожие материалы

Информация о работе