Функция возвращает одно или несколько значений через аргументы

 

ü В описании функции указывается тип - 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);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: