Этапы разработки программы. Разработка или выбор алгоритма решения поставленной задачи. Оформление документации на программу, страница 28

п.12.2.Определение функции (описание).

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

Синтаксис: [<тип возвращаемого значения>] <имя функции> ([<список формальных параметров>]) <тело функции>

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

Тело функции — это составной оператор или блок.

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

Формальные параметры.

Объявление формальных параметров имеет тот же синтаксис, что и объявление обычных переменных. Формальные параметры могут иметь базовый тип, быть структурой, объединением, массивом или указателем. Указание первой или единственной размерности для массива необязательно, т.к. при передачи массива в качестве параметра передается адрес первого элемента массива, а сами элементы не копируются. Поэтому для параметра массива следующие объявления будут эквивалентны:

1) char s[20] 2) char з 3) char з

1) float matr[10][20] 2) float matr [][20]

Фактические параметры.

Фактические параметры указываются в вызове функции. Синтаксис вызова:

<имя функции> ([список фактических параметров>])

При вызове функции управление передается на первый оператор функции. Выполнение функции завершается при выполнении оператора возврата return (при этом если за ним следует выражение, его значение вычисляется, приводится к типу, объявленному для функции, и возвращается в вызывающую функцию) или при его отсутствии по достижению последней закрывающейся фигурной скобки (при этом возвращаемое функцией значение не определено).

Список фактических параметров — это набор выражений, разделенных запятой.

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

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

1. Если параметр имеет тип float - он преобразуется к типу double.

2. Если параметр имеет тип char - он преобразуется к типу int.

3. Если параметр имеет тип массив - он преобразуется к типу указателя на тип элементов массива.

В языке Си параметры передаются по значению и по ссылке.

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

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

Замечание: Массивы и функции в Си передаются по ссылке.

Примеры проектирования функций.

1. Функция возвращает одно значение.

Пример1:

Вычислить: n! / (m! * (n — m))

Напишем определение функции вычисления k!.

int fact (int k)

{

int i, f=1

for (i = 1; i <= k; i ++)

return (f);

}

Пример 2:

Вычислить: (max (а) + max (b)) / max (с), где а, b, с — массивы.

Напишем определение функции для нахождения максимального элемента.

float max (float * vect, int kol)

(

int i, m = vect[0];

for (i=0; i <kol; i++)

if (vect[ i ] > m) m=vect[ i ];

return (m);

}

Пример 3:

Определить функцию, возвращающую количество четных (нечетных) цифр в значении данного типа |п1.

а — заданное число

pr = 0 — количество четных цифр

pr = 1 — количество нечетных цифр

int kol (int a, int pr )

{

intk, ai;

for (k=0, ai=a; ai! 0; i+=(ai%2==pr)? 1: О, ai /=10)

return (k);

}

Пример4:

Даны две строки. Определить порядковый номер символа, начиная с которого строка t входит в строку s.