Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_po_si.doc
Скачиваний:
13
Добавлен:
12.11.2018
Размер:
11.78 Mб
Скачать

Функция для вычисления объема цилиндра.

Функция для вычисления объема цилиндра. Пусть у функции имеются два параметра, значение большего из которых считается радиусом цилиндра, а меньший определяет значение высоты цилиндра.

Пусть g и h - параметры; тогда объем цилиндра равен g*g*h*PI, если g>h, или g*h*h*PI, если g<h, где PI - число .

Текст нестандартного классического определения функции:

Первые две строки — заголовок функции с именем volume; далее - тело функции. Параметры специфицированы как вещественные типа float. Для возврата из функции и передачи результата в точку вызова в теле функции используется оператор

Операторов return в теле функции может быть несколько. Например, для решения той же задачи определим другую функцию (в рекомендуемом современном формате):

Функция для вычисления скалярного произведения векторов.

Функция для вычисления скалярного произведения векторов. Скалярное произведение двух векторов n-мерного линейного пространства вычисляется по формуле

Функция для вычисления указанного произведения может быть определена следующим нестандартным образом:

Приведя второй после volume( ) пример нестандартного определения функции, мы настоятельно рекомендуем читателю использовать только предлагаемую стандартом форму заголовка.

Первый параметр n специфицирован как целая переменная типа int. В спецификации массивов-параметров типа float пределы изменения индексов не указаны, что позволяет при обращении к функции использовать вместо а и b в качестве фактических параметров одномерные массивы такого же типа любых размеров (с любым количеством элементов). Конкретные пределы изменения их индексов задает фактический параметр, заменяющий формальный параметр int n.

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

float Scalar_Product (int n, float a[ ], float b[ ])

Тело функции остается одинаковым при обоих форматах определения заголовка.

Обращение к функции и ее прототип.

Обращение к функции и ее прототип. Как уже говорилось, для обращения к функции используется элементарное (первичное) выражение, называемое "вызов функции":

имя_функцш (список_фактических_параметров)

Значение этого выражения - возвращаемое функцией значение (определяется в теле функции выполненным оператором return). Список фактических параметров (аргументов) – это список выражений, заменяющих формальные параметры функции. Соответствие между формальными и фактическими параметрами устанавливается по порядку их расположения в списках. Если формальных параметров у функции нет, то не должно быть и фактических параметров при обращении к этой функции. Фактические параметры (аргументы) передаются из вызывающей программы в функцию по значению, т.е. вычисляется значение каждого аргумента, и именно оно используется в теле функции вместо заменяемого формального параметра. Примеры вызовов определенных выше функций для вычисления объема цилиндра:

При работе с функциями тип возвращаемого функцией значения определяется только типом результата, указанным в определении функции перед ее именем. Как уже упоминалось, в языке Си ранее было принято, что если в определении функции тип результата опущен, то предполагается, что функция возвращает целочисленное значение. Это же соглашение справедливо и в вызывающей программе, где используется обращение к функции. Если возвращаемое функцией значение отлично от целочисленного, то эту функцию нужно обязательно специальным образом описать до обращения к ней. В версиях языка Си до его стандартизации описание функции имело вид:

тип_результата имя_функции( );

Такое описание не определяет функцию, не указывает количество и типы ее параметров, а только описывает тип возвращаемого значения. Например,

float volume( );...

... z=volume(z-1.0,le-2);

Переменная z получит вещественное значение (объем цилиндра), вычисленное с помощью функции volume(). Если описание float volume(); опустить, то в вызывающей программе функция volume() воспринимается как целочисленная, т.е. результат будет неверен.

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

тип_результата имя_функции (спецификация_формалъных_параметров);

Здесь спецификация формальных параметров представляет собой список типов и, возможно, имен параметров функции.

Прототип функции схож с ее заголовком. Но имеются два существенных отличия. Во-первых, прототип всегда заканчивается признаком конца оператора (символ ";") Во-вторых, в прототипе могут не указываться имена специфицируемых параметров. Прототип может не использоваться только в том случае, когда определение функции находится в том же файле, где размещена вызывающая ее программа, и это определение помещено выше вызывающей программы. Прототипы введенных выше функций могут быть такими:

float w(float, float);

Scalar_Product (int n, float a[ ], float b[ ]);

Имена формальных параметров в прототипе функции w( ) обычно не указаны.

Отметим, что применение прототипа предполагает только стандартную форму записи заголовка функции. Использование прототипа несовместимо со "старомодным" видом заголовка. Мы настоятельно рекомендуем стандартный вид заголовка и применение прототипов.

И прототипы функций, и старомодные описания функций необходимо размещать наряду с определением объектов в теле функций до исполняемых операторов.

Приведем примеры программ, состоящих более чем из одной функции.