Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программированиние в Ф И.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
353 Кб
Скачать
☆

11. Функции, определяемые пользователем.

Использование в программе прикладной функции требует, вообще говоря, выполнения трех действий:

- объявления прототипа функции;

- определения самой функции, т. е. выполняемых ею действий;

- вызова этой функции в одной или нескольких точках программы.

Если в программе используется некоторая прикладная функция, то в начале программы должен быть указан прототип этой функции, чтобы компилятор заранее получил информацию об ее свойствах.

Прототип функции имеет следующий формат:

тип_возвращаемого_значения имя_функции (тип_аргумента_1,

тип_аргумента_2,...);

Примеры прототипов:

int Search(char*,float); // функция требует 2 аргумента

// типов char* и float и возвращает int

void Print(int); // функция требует 1 аргумент типа int

// и ничего не возвращает

char* Letter(void); // функция не требует аргументов

// и возвращает char*

В программе должно содержаться определение функции. Это определение может находиться в любом месте программы – как до главной функции Main(), так и после нее.

Если определение функции находится до главной функции Main(), прототип этой функции указывать необязательно. Если тип функции не указывается, по умолчанию тип функции определяется как int.

Определение начинается с заголовка, фактически повторяющего прототип, но с указанием формальных имен аргументов функции; за заголовком в фигурных скобках перечисляются предложения языка, составляющие тело функции. Если функция возвращает какое-либо значение, ее имени должен быть присвоен тип возвращаемого значения, а ее текст должен заканчиваться оператором return:

float Add(float a1, float a2)

{float b;

b=a1+a2;

return b;

}

Если функция не возвращает никакого значения, ее текст не должен заканчиваться оператором return, а сама функция должна возвращать тип void.

Вызов функции производится в теле главной функции Main() или в теле других функций, при этом место формальных аргументов функции занимают фактические значения переменных. Например:

float x=3.14, y=8.87, z;

z=Sum(x,y);

12. Три способа передачи параметров в функцию

В языке C++ предусмотрены три способа передачи параметров в вызываемую функцию:

по значению, когда в функцию передается числовое значение параметра;

по адресу, когда в функцию передается не значение параметра, а его адрес, что особенно удобно для передачи в качестве параметров массивов и структур;

по ссылке, когда в функцию также передается адрес параметра, однако действуют особые правила использования этого адреса в вызываемой функции.

Пример передачи в функцию скалярного значения и возврата скалярного результата. Пусть у нас определена функция AddF (float, float), осуществляющая сложение двух вещественных чисел, причем переменной AddF присваивается значение суммы (классическое определение функции):

float AddF(float a, float b)

{

return a+b;

}

Программный фрагмент с вызовом этой функции может иметь, например, такой вид:

float x = 3.14; //Определим первое слагаемое

float y = 2.71; //Определим второе слагаемое

float z; //Объявим переменную для результата

z = Sum(x,y); //Собственно вызов функции

Рассмотрим теперь передачу в функцию адреса, при этом в качестве параметра в функцию могут передаваться как скалярные величины, так и массивы. Определим функцию

AddA (float, float, float*), осуществляющую сложение двух вещественных чисел, причем значение суммы будет передаваться по адресу третьего параметра:

/* Определение функции AddA(float, float, float*) */

void AddA(float A, float B, float* Z) // Заголовок функции

{ *z = a+b; // Значение суммы передается по адресу z

}

/* Фрагмент программы с вызовом функции AddA() */

float x = 3.14; //Определим первое слагаемое

float y = 2.71; //Определим второе слагаемое

float z; //Объявим переменную для результата

z = AddA(x,y,&Z); //Собственно вызов функции

Определим функцию Sub(int*,int*,int*)осуществляющую вычисление минимального элемента min массива A и вычисление элементов массива B=A-min:

void Sub(int A[10],int B[10],int* min) // Имя массива А – это

//указатель (адрес) на первый элемент массива

{ int i;

*min=A[0];

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

if(A[i]<*min)

*min=A[i];

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

B[i]=A[i]-*min;

}

/* Фрагмент программы с вызовом функции Sub(int*,int*,int*), */

int H[10],m; //Массив с данными

int G[10]; //Вычисляемый массив

Sub(H,G,&m); //Вызов функции

При передаче параметра по ссылке в функцию также передается адрес параметра, однако в дальнейшем все действия производятся не как с адресом, а как со значением параметра. Это снижает вероятность “описок “ при создании кодов большого объема.

Определим функцию SumS(int, int, int& ), осуществляющую сложение двух целых чисел, причем значение суммы будет передаваться по ссылке на третий параметр:

/* Определение функции SumS(int ,int ,int& ) */

void SumS(int x, int y, int& z) //Заголовок функции

{ z = x+y; // Значение суммы передается по ссылке на z

}

/* Фрагмент программы с вызовом функции SumS() */

int i = 1; // Определим первое слагаемое

int j = 10; // Определим второе слагаемое

int k; // Объявим переменную для результата

Sum(i,j,k); // Вызов функции

Задание 4.

Какая информация появится на экране дисплея после выполнения данной

программы:

#include<stdio.h>