ü В описании функции указывается тип - void (неопределенный).
ü Аргументы, которые соответствуют возвращаемым переменным, описываются как указатели:
void fun (int k, float * ptf, float z).
ü Вызов функции будет самостоятельным оператором.
ü В качестве фактических аргументов для возвращаемых значений, записываются адреса переменных:
float f;
fun (20 &f, 5.25);
Необходимость использования указателей, а не имен переменных связана с тем, что при вызове функции в стеке (специальная динамическая область памяти для временного хранения промежуточных данных) создаются копии аргументов функции. Все операции функция выполняет с этими копиями. При выходе из функции стек очищается, копии стираются.
Если мы напишем:
void f (int arg1, int arg2, int arg3)
{ arg3 = arg1 + arg2;}
то фактически исполнится следующая операция:
Копия_arg3 = Копия_arg1 + Копия_arg2;
и значение arg3 не изменится.
Если запишем следующим образом:
void f (int arg1, int arg2, int * arg3)
{ * arg3 = arg1 + arg2; }
то будет выполнен запись суммы по адресу, заданной в копии параметра * arg3:
|
|
В результате значение суммы аргументов arg1 и arg2 будет вычислено правильно и сохранено в памяти.
Пример 6.5: Написать программу, которая использует функцию для нахождения наибольшего значения из трех переменных. Результат вернуть через аргументы. Текст программы:
Текст программы:
/* Описание функции fmax */
void fmax(float x, float y, float z, float *max)
{
if (x>y) *max=x;else *max=y;
if (z>*max) *max=z;
}
/* Основная функция main() */
void main()
{
float a,b,c,rez;
scanf("%f %f %f", &a,&b,&c);
fmax(a,b,c,&rez); ) /* вызов функции fmax */
printf("\n rez= %7.1f ",rez);
}
Аргументом функции является одномерный массив.
Описание функции. Возможны три варианта объявления и использования массива:
1) Одномерный массив объявляется с неопределенным количеством элементов, а среди аргументов должна быть переменная, которая указывает количество элементов:
void name_fun (..., float x[], int n,...)
Внутри функции элементы массива записываются как переменная с индексом - x[i].
При вызове функции указывается имя массива и его фактический размер
name_fun (..., a, 10,...);
2) Массив объявляется как указатель на массив. Среди аргументов должна быть переменная, которая указывает количество элементов массива:
void name_fun (float * ptx, int n,...);
Внутри функции элементы массива записываются с помощью указателя *(ptx + i)
При обращении к функции фактический массив можно указать, используя имя или адреса нулевого элемента, а также его размер:
name_fun (..., a, 10,...);
name_fun (..., & a[0], 10,...)
3)Возможен 3-й способ описания массива с указанием фиксированного количества элементов:
name_fun (float a[10],...)
Этот способ имеет недостаток. Функция может работать только с массивами заданной длины.
|
|
Пример 6.6. Задано два массива А [10] и В [20]. Найти в них максимальный, минимальный элементы и сумму всех элементов. Сформировать массив и найти сумму в 1-й функции, найти максимальный и минимальный элементы в 2-й функции. Напечатать элементы массива, сумму, максимальной и минимальной элементы в главной функции.
Текст программы:
/* 1-й функция, формирует массив и находит сумму и возвращает результаты через аргументы*/
void f1(float *x,int n, float *ps)
{
int i;
*ps=0;
for (i=0;i<n;i++)
{
*(x+i)=0.001*rand();
*ps=*ps+*(x+i);
}
}
/*2-й функция, находит максимальный и минимальный элементы и возвращает результаты через аргументы*/
void f2(float *x,int n,
float *pt_max,float *pt_min)
{
int i;
*pt_max=*pt_min=*x;
for (i=0;i<n;i++)
{
if (*(x+i)<*pt_min) *pt_min=*(x+i);
if (*(x+i)>*pt_max) *pt_max=*(x+i);
}
}
/*Основная функция*/
Void main()
{
float a[10], b[20];
float as, amax, amin, bs, bmax, bmin;
int i;
f1(&a[0],10,&as); /* вызов функции f1 для массива а */
for (i=0;i<10;i++)
printf(" %7.1f ", a[i]);
printf("\n");
printf("\n sa= %7.1f ",as);
f2(&a[0],10,&amax,&amin); /*вызов функции f2 для массива а */
printf("\n");
printf("amax= %6.2f amin= %6.2f\n",amax,amin);
f1(&b[0],20,&bs); /* вызов функции f1 для массива b */
for (i=0;i<20;i++)
printf(" %7.1f ", b[i]);
printf("\n");
printf("n sb= %7.1f ",bs);
f2(&b[0],20,&bmax,&bmin); /*вызов функции f2 длямассива b */
printf("\n");
printf("bmax= %6.2f bmin= %6.2f\n",bmax,bmin);
}
Пример 6.7. Найти среднее арифметическое в массиве чисел, размером 20.
Составить функцию, в которой:
• сформировать массив,
• найти среднее арифметическое
• вернуть результат через имя.
В основной программе распечатать массив и результат.
Текст программы:
/* функция формирует массив, находит среднеее арифметическое и возвращает результаты через имя функции */
float form_sr (float x[],int n)
{
int i;
float s=0;
for (i=0;i<n;i++)
{
x[i]=0.01*rand();
s=s+x[i];
}
return s/n;
}
/* основная функция*/
void main()
{
float a[20],sr;
int i;
sr= form_sr(a,10); /* вызов функции */
for (i=0;i<10;i++)
printf(" %7.1f ", a[i]);
printf(" \n ");
printf("sr= %6.2f",sr);
}
Пример 6.8 Заданы три массива F[8], G[12], H[15], элементы которых вычисляются по формулам:
fi=1.7*i*cos(2.5*i)
gj=2.9*j*cos(3.1*j)
hl=3.5*l*cos(5.4*l)
Для каждого массива вычислить среднее значение элементов (sf, sg, sh) и количество элементов, которые больше среднего значения (kf, kg, kh).
У данной задаче рационально использовать функции, которые будут выполнять следующее:
· формирование массива Х из n элементов по формуле:
x[i]=a*i*cos(b*i), i=1..n
· вычисления среднего значения sx:
· подсчет кх – количество x[i]>sx
Текст программы:
/* Описание функции формирования массива.
Функция формирует и печатает массив.
Входные аргументы- размер n и коэффициенты а и b.
Выходной аргумент - массив */
void fmas(float *x, int n, float a, float b)
{
int i;
for(i=0;i<n;i++)
{
*(x+i)=a*i*cos(b*i);
printf("%.3f ",*(x+i));
}
}
/* Описание функции нахождения среднего арифметического.
Функция находит среднее арифметическое и возвращает результат через аргумент.
Входные аргументы – массив и его размер,
возвращаемый – среднее арифметическое */
void f_sr(float *x, int n, float *pt_sx)
{
int i;
float sx=0;
for(i=0;i<n;i++) sx=sx+*(x+i);
sx/=n;
*pt_sx=sx;
}
/* Описание функции нахождения количества элементов, больших среднего. Функция находит количество элементов, которые больше среднего арифметического.
Возвращает результаты через аргументы.
Входные аргументы – массив и его размер,
возвращаемый – количество элементов */
void f_kolelm(float *x, int n, float sx, int *pt_kx)
{
int i, kx=0;
for(i=0;i<n;i++)
if(*(x+i)>sx) kx++;
*pt_kx=kx;
}
/* Основная функция */
Void main()
{
float f[8], g[12], h[15], sf, sg, sh;
int kf, kg, kh;
printf(“Массив f из 8 элементов \n”);
/* вызов функции для массива f */
fmas(&f[0], 8, 1.7, 2.5);
f_sr(&f[0], 8, &sf);
f_kolelm (&f[0], 8, &sf, &kf);
|
|
printf(“sf=%.3f kf=%d\n”,sf,kf);
printf(“Массив g из 12 элементов \n”);
/* вызов функции для массива g */
fmas(&g[0], 12, 2.9, 3.1);
f_sr(&g [0], 12, & sg);
f_kolelm (&g [0], 12, & sg, & kg);
printf(“sg=%.3f kg=%d\n”,sg,kg);
printf(“Массив H из 15 элементов \n”);
/* вызов функции для массива h */
fmas(&h[0], 15, 3.5, 5.4);
f_sr(&h[0], 15, & sh);
f_kolelm (&g [0], 12, & sh, & kh);
printf(“sh=%.3f kh=%d\n”,sh,kh);
}