Направления программирования. История создания языка Си. Особенности языка, страница 20

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++)