Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
09.04.2015
Размер:
232.96 Кб
Скачать

2.2.Функции, возвращающие значение

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

#include<stdio.h>

#include<conio.h>

float Sum (float *X, int N); //прототип функции Sum

Void main ()

{

int i;

float A[10], B[15];

float s1,s2;

clrscr();

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

{

printf("A[%d]=", i );

scanf("%f", &A[i]);

}

printf("**************\n");

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

{

printf("B[%d]=", i );

scanf("%f", &B[i]);

}

printf("**************\n");

s1 = Sum (A, 9); //вызов функции Sum и формирование s1

printf("s1 = %7.2f \n",s1);

s2 = Sum (B,14); //вызов функции Sum и формирование s2

printf("s2 = %7.2f \n",s2);

getch();

}

float Sum(float *X, int N) //заголовок функции Sum

{//начало тела функции Sum

float s;

int k;

s =0;

or (k =0; k <=N; k++)

s += X[k];

return s;

} // конец тела функции Sum

Что изменилось в этой программе?

  • Во-первых, уменьшилось количество формальных параметров, их осталось два: float *Xи int N.

  • Во-вторых, в теле функции появилась новая локальная переменная, которая используется для накопления суммы элементов массива.

  • В-третьих, появился оператор return s;, который пересылает (возвращает) в точку вызова значениеs. А где эти точки вызова? Всего их две в операторах:s1 = Sum (A, 9); иs2 = Sum (B,14);. Первая – этоSum (A, 9). При выполнении этого выражения осуществляется переход к функцииSum, замена формальных параметров фактическими, а после завершения выполнения функции вместо выраженияSum (A, 9)подставляется (возвращается) значениеs. В результатеs1 становиться равным сумме элементов массиваА. Аналогично происходит и с точкой вызоваSum (B,14).

  • В четвертых, в прототипе функции появился тип возвращаемого значения (float): float Sum (float *X, int N); , что означает, что функцияSum должна возвращать значение и это значение должно быть типаfloat.

Ну а что собственно дало нам использование функции, возвращающей значение? Ну, во-первых, уменьшилось количество формальных параметров, что само по себе неплохо. Во- вторых, обращение к функции стало более наглядным (в операторе s1 = Sum (A, 9); явно видно, что вычисляетсяs1, в отличие от оператора Sum (&s1, A, 9);). А, в-третьих, дело вкуса программиста, какую из форм записи ему он будет использовать для собственных функций, но знать он должен и ту и другую форму.

А теперь давайте несколько улучшим нашу программу. Во-первых, текст функции перепишем в следующем виде:

Void Sum(float *s,float *X, int n)

{int k;

*s =0;

for (k =0; k < N; k++)

*s += X[k];

}

В этом тексте Nколичество элементов в массиве, а не последний номер, как было в предыдущем тексте. Допустим, что мы планируем часто использовать эту функцию в разных программах, и не хотим каждый раз набирать текст этой функции для новой программы, а желаем хранить этот текст в собственной библиотеке. Для этого в директории С:\ВORLANDCсоздадим свою директориюMY_PROGRи сохраним файл с текстом нашей функции с именемFSUM.CPP. Это позволит нам включать в текст наших программ функциюSum оператором#includeC:\ВORLANDC\MY_PROGR\FSUM.CPPЭтот оператор включает весь текст, содержащийся в файлеFSUM.CPP, т. е. текст всей программы собирается из двух файлов: исходного иFSUM.CPP, а затем производится компиляция. Поскольку в файлеFSUM.CPP содержится текст функцииSum, то прототип этой функции писать не нужно. Кроме того сделаем массивыА иВ динамическими и объявим переменные:Naколичество элементов массиваАиNb - количество элементов массиваВ.Тогда текст нашей улучшенной программы может иметь такой вид:

#include<stdio.h>

#include<conio.h>

#include “C:\BORLANDC\MY_PROGR\FSUM.CPP”// включение // функции FSUM.CPP из собственной библиотеки

Соседние файлы в папке attachments_05-09-2012_18-55-54