Описание пользовательских функций
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

       Описать пользовательские функции можно несколькими способами.

       1 способ.

1) Перед функцией void main () записываем прототип (заголовок) функции.

Формат прототипа функции:

 

[static или extern] <тип_результата> <имя-функции> (<описание формальных параметров>);

 

где [static или extern]- необязательный параметр указывающий область видимости функции;

<тип_результата> - для функций не возвращающих значение всегда равен void , для функций возвращающих значение указывается соответствующий тип (int, char, short, long, float, double, long double и т.д.);

<имя-функции> - в соответствии с правилами записи идентификаторов.

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

 

Например,

int print_num(i,j);

void LINE1();

void LINE2(int Len, int y, char ch);

Замечание. При описании прототипа функции всегда в конце указывается символ « ; ».

 

2) После функции void main () (в конце программы) приводится описание объявленной функции по следующему формату:

 

<тип_результата> <имя-функции> (<описание формальных параметров>)

{

<тело функции>;

// return <значение>;

}

где return <значение>; указывается лишь для функций, которые возвращают значение, если функция ничего не возвращает, то return <значение>; не указывается.

       3) В теле функции осуществляется вызов описанной функции.

Например. Дважды вывести строку из 40 звездочек, затем вывести на экран запрашиваемый символ в заданной строке.

#include <iostream.h>

#include <conio.h>

void LINE1(); // Прототип (заголовок) функции

void LINE2(int Len, int y, char ch);

 

void  main()

{

cout <<"Тестирование функции: \ n Первая строка ";

LINE1(); // Вызов функции.

cout <<"Вторая строка";

LINE 1();

LINE 2 ( 20 , 5 , '*');//20 звездочек в 5 строке

int LEN, Y;

char Ch;

cout <<"Введите количество символов и номер строки ";

cin >>LEN>>Y;

cout <<"Введите символ ";

cin >> Ch ;

LINE 2( LEN , Y , C );// LEN символов Ch в строке Y

 

getch ()

} // Конец функции main ()

// Повторяем заголовок функции без символа “;” в конце

void LINE1()

{

int i;

cout <<”\n”;

for (i=1; i<=40; i++) cout<<'*';

cout <<”\n”;

}

// описание второй функции

void LINE2(int Len, int y, char ch)

{ gotoxy(1,y);

for (int i=1; i<=Len; i++)

cout <<ch;

cout << ”\n” ;

}

 

       2 способ.

1) Перед функцией void main() описываем пользовательскую  функцию.

Формат описания функции:

 

[static или extern] <тип_результата> <имя-функции> (<описание формальных параметров>)

{

<тело функции>;

// return <значение>;

}

           

       2) В теле функции осуществляется вызов описанной функции (см. лабораторные работы).

Формальные и фактические параметры

 

Параметры, записанные в скобках прототипа (заголовка) функции или ее описания, называют формальными параметрами (Len , y и ch ). Параметры, записанные при вызове функции, называются фактическими параметрами (LEN, Y, C). Между ними должно быть соответствие:

* по типу, с учётом их совместимости. Например, вместо параметра типа char можно передать не только символ, но и его код типа int. Вместо формального вещественного параметра можно передать целый, но не наоборот;

* по порядку следования. Нарушение этого требования приведёт либо к ошибке компиляции, либо повлияет на результат. Если в нашем примере вызвать функцию LINE2(“*”, 5, 20), то компилятор сообщает о невозможности преобразования char в int. Если же вызвать LINE2 (Y, LEN, ‘-‘), то в строке LEN будет выведено Y символов “-“;

* по количеству параметров. Это требование справедливо, если не используются параметры по умолчанию.

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

 

Передача параметров

 

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

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

* для фактического и формального параметров компилятор отводит разные ячейки памяти;

* при выполнении программы содержимое фактического параметра копируется в формальный параметр, то есть при первом вызове LINE 2 ( 20 , 5 , '*'); Len=20, y=5 и ch= ’*’ , хотя это явно нигде не записывается;

* из первой особенности следует, что если в функции изменить формальный параметр, то это не повлияет на значение переменной, используемой при вызове, то есть фактического параметра. Если бы в функции изменили y (например, там было бы записано y++ ), то значение соответствующей переменной Y в головной функции после второго вызова осталось бы без изменения, т. е. тем, что ввели;

* в качестве фактического параметра, соответствующего параметру-значению может быть выражение соответствующего или совместимого типа. Например, функцию можно вызвать так: LINE2 ( LEN*2, Y+1, ‘*’). Как частный случай можно передавать константу: LINE 2 ( 20 , 5 , '*'); или переменную LINE 2( LEN , Y , C ); При этом её имя, используемое при вызове, не обязательно должно отличаться, как в нашем примере, от имени формального параметра. В головной программе переменную для фактической длины символов можно было бы тоже назвать Len. Но и в этом случае это разные ячейки памяти.

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

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

Рассмотрим ссылочный тип. Ссылочный тип используется следующим образом:

* в заголовке функции параметры записываются как параметры-переменные ссылочного типа, то есть с символом &, например, void SINCOS(float x, float eps, float &y, float &z);

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

* при вызове функции в качестве фактических параметров, указывают простые переменные соответствующего типа объявленные обычным образом, например, SINCOS(Х, Е, Y , Z );

* входные параметры как параметры-значения (х, eps ) используются по тем же правилам;

Замечание. С помощью ссылочного типа для формального (y) и фактического (Y) параметров отводится одна и та же ячейка памяти, которая в пользовательской функции называется y, а при вызове в вызывающей функции main () - Y. Поэтому все изменения параметра y сказываются на изменении параметра Y. Таким образом, происходит передача значения параметра из  пользовательской функции в основную (вызывающую) функцию.

Например. Для x=-0.8, -0.6, -0.4, … , 0.8 найти и вывести на экран значения функций:

в виде следующих пяти столбцов: x , y, cos(x), z, sin(x), в которых показать значения указанных тригонометрических функций, вычисленные как сумма бесконечного ряда с заданной точностью, так и с помощью встроенных функций.

Для решения задачи составим функцию SINCOS, которая вычисляет обе бесконечные суммы с произвольной одинаковой точностью. Поэтому она имеет два входных параметра: аргумент функций (x) и одинаковую точность вычисления бесконечных сумм (eps) и два выходных (y и z), которые в заголовке функции объявляются с помощью ссылочного типа.

void SINCOS(float x, float eps, float &y, float &z);

void main()

{

float x, sn, cs;

cout <<" x   y=cos(x) Cos(Standart)  z=sin(x) Sin(Standart)";

cout <<”\n\n”;

for (x=-0.8; x<0.805; x+=0.2)

{     SINCOS(x,1E-10, cs, sn);

printf ("%5.1f %10.6f %12.6f %10.6f %12.6f\n", x, cs, cos(x), sn, sin(x)) ;

}

getch ();

}

// пользовательская функция

void SINCOS(float x, float eps, float &y, float &z)

{ float k=1, s1=1; y=1;

do

{s1=s1*(-1)*x*x/(k*(k+1));

y+=s1;

k+=2;

}

while (fabs(v1)>eps);

k=2; s1=x; z=x;

do

{ s1=s1*(-1)*x*x/(k*(k+1));

z+=s1;

k+=2;

}

while (fabs(v1)>eps);

}

 

Дата: 2018-12-28, просмотров: 245.