1) char s[20] 2) char s 3) char * s
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 ++)
f *=i;
return (f);
}
Пример 2:
Вычислить: (max (a) + max (b)) / max (c) , где a , b , c – массивы.
Напишем определение функции для нахождения максимального элемента.
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:
Определить функцию, возвращающую количество четных (нечетных) цифр в значении данного типа int.
a – заданное число
pr = 0 – количество четных цифр
pr = 1 –количество нечетных цифр
int kol (int a, int pr )
{
int k, ai;
for (k=0, ai=a; ai!=0; i+=(ai%2==pr) ? 1 : 0, ai /=10)
;
return (k);
}
Пример 4:
Даны две строки. Определить порядковый номер символа, начиная с которого строка t входит в строку s.
int index ( char s [ ], char [ ])
{
int i, j, k;
for (i=0; s[ i ]!=’ \0 ‘; i++)
{
for (j=i, k=0; t[ k ]!=’ \0 ‘&& t[ k ]==s[ j ]; j++, k++)
if (t[ k ]==’ \0 ‘) return (i);
}
return (-1);
}
2. Функция возвращает более одного данного.
а) Результат – скалярные переменные.
Пример:
Даны две переменные. Требуется обменять их значения.
void swop (float *a, float *b)
{
float *c; Вызов функции swop:
*c=*a; float a, b;
*a=*b; swop (&a, &b);
*b=*c;
} б) Результат функции – массив. В этом случае соответствующий параметр объявляется как массив или как указатель.
Пример:
Определить функцию ввода одномерного массива.
void vvod (int kol, double *vect )
{
int i;
for ( i=0; i<kol; i++)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.