Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1й курс / Konspekt_lektsiy_Informatika_5

.pdf
Скачиваний:
4
Добавлен:
12.06.2023
Размер:
296.78 Кб
Скачать

1

Тема №6. ПРОГРАММИРОВАНИЕ НА С++. ФУНКЦИИ 6.1. Структура функции

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

Функция – это поименованный набор операторов, решающих определенную задачу. Функция может принимать параметры и возвращать значение.

Параметры функции – это данные, передаваемые в функцию для обработки, т.е. исходные данные.

Значение функции – это результат, который функция вычисляет (возвраща-

ет).

В С++ программа состоит из одной(main) или нескольких функций. Обращение к функции называютвызовом. Перед вызовом функция должны быть обязательно описана. Описание функции располагается перед функциейmain и

состоит из заголовка и тела функции:

тип имя_функции(список_параметров) //Заголовок функции

{

операторы_функции; //Тело функции

}

Заголовок функции содержит:

тип – тип возвращаемого функцией значения (если функция не возвращает значения, то тип void);

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

(аргументов), которые отделяются друг от друга запятыми.

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

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

Для вызова функции необходимо указать ее имя и в круглых скобках, через запятую перечислить имена переменных (или их значения), которые являются аргументами функции, если таковые имеются:

имя_функции(список_параметров);

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

При запуске программы первой выполняется функцияmain. Если среди операторов функции main встречается вызов функции, то управление передается операторам функции. Когда все операторы функции будут выполнены, управление возвращается оператору, следующему за вызовом функции.

Ó Ефименко К.Н.

2

6.1.1. Передача параметров в функцию

Список_параметров, указанный в заголовке функции называетсяфор-

мальными параметрами.

Список_параметров, указанный в операторе вызова функции называется

фактическими параметрами.

//Описание функции

тип имя_функции(формальные_параметры)

{

//Тело функции

}

//Основная функция программы

тип main( )

{

//Вызов функции

имя_функции(фактические_параметры);

}

Количество, типы и порядок следования формальных и фактических пара- метров должны совпадать.

Формальные параметры функции являются локальными переменными.

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

Передача параметров выполняется следующим образом:

·вычисляются значения выражений (при необходимости), стоящих на месте фактических параметров;

·в памяти выделяется место под формальные параметры, в соответствии с их типами;

·формальным параметрам присваиваются значения фактических пара-

метров;

·выполняется проверка типов и при необходимости выполняется их преобразование, при несоответствии типов выдается диагностическое сообщение.

Передача параметров в функцию может осуществляться двумя способами:

по значению или по адресу.

Формальными параметрами по значению обычно задаются исходные дан-

ные, необходимые для работы функции. При передаче данных по значению функция работает с копиями фактических параметров(аргументов), и доступа к исходным значениям аргументов в функции, откуда произошел вызов, у нее нет.

Таким образом, данные, переданные по значению, функция изменить не может.

Формальные параметры по значению в заголовке функции описываются как обычные переменные:

тип имя_перем1, тип имя_перем2…

Ó Ефименко К.Н.

3

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

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

#define Pi 3.14159

//Описание функции

void function (float DEG)

//DEG – формальный параметр по значению

{

float RAD; //RAD – величина угла в радианах

RAD= DEG*Pi/180;

cout<<"Угол равный "<<DEG<<" градусам "; cout<<"соответствует "<<RAD<<" радиан"<<endl;

}

//Основная функция int main()

{

int deg;

cout<<"\nВведите величину угла в градусах = "; cin>>deg;

//Вызовы функции

//с фактическим параметром заданным переменной deg function(deg);

//с фактическим параметром заданным числовым значением function(90);

}

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

чений переменных в вызывающую функцию.

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

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

тип *имя_указателя1, тип *имя_ указателя2…

При вызове функции в позициях параметров по адресу должны стоять толь-

Ó Ефименко К.Н.

4

ко адреса переменных, содержащих соответствующие фактические параметры.

&имя_переменной1, &имя_ переменной2…

(& – операция взятия адреса; * – операция разадресации).

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

Пример 6.2. Для задаваемого в радианах угла α вычислить величину смежного с ним угла. Значения углов выводить в градусной мере.

Функция degree выполняет перевод из радианной меры угла в градусную и имеет 4 формальных параметра. Аргумент rad – параметр по значению (исходные данные для функции), определяющий величину угла в радианах. Аргументы deg, min, sec, – параметры по адресу (результаты возвращаемые функцией), в которых будет храниться градусная мера угла.

#define Pi 3.14159

//Описание функции

void degree(float rad,

int *deg, int *min, int *sec)

//rad – параметр по значению

//deg, min, sec – параметры по адресу (указатели)

{

*deg=floor(rad*180/PI); *min=floor((rad*180/PI-(*deg))*60); *sec=floor(((rad*180/PI-(*deg))*60-(*min))*60);

}

//Основная функция int main()

{

float RAD;

int DEG,MIN,SEC;

cout<<"\nВведите угол А в радианах = "; cin>>RAD; cout<<endl;

//1-й вызов функции

degree(RAD, &DEG, &MIN, &SEC);

cout<<"Угол A равен "<<DEG<<" градусов, "; cout<<MIN<<" минут, "<<SEC<<" секунд"<<endl;

//2-й вызов функции

degree(Pi-RAD, &DEG, &MIN, &SEC); cout<<"Смежный к углу A угол равен "<<DEG

<<" градусов, "; cout<<MIN<<" минут, "<<SEC<<" секунд"<<endl;

}

Примечание. Функция floor – выполняет округление до ближайшего меньшего целого числа.

Ó Ефименко К.Н.

5

Пример 6.3 (лабораторная работа 5.1).

интервала xnxxk с шагом Dx вычислить значение функции f(x) заданной графически. Вычисление значения f(x) оформить в виде функции.

Исходные данные передавать в функцию в виде параметра по зна-

чению. Возврат результата работы функции реализовать в виде переда-

чи параметра по адресу.

Аналитическая запись функции y=f(x) имеет следующий вид:

ì- 2x - 4,

если x £ -2

ï

 

 

 

 

 

4 - x2 , если - 2 < x < 0

ï-

 

y = í

 

 

 

если 0 £ x £ 2

ï- 2,

 

ï

0.5 x

,

если x > 2

î- 2

 

 

Для всех значений x из заданного

x2+y2=4

y=–20.5x

Постановка задачи

1.Исходные данные: хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения:

1)4–x2 ≥ 0 – не проверять.

4.Блок-схема алгоритма основной программы и подпрограммы.

Основная функция (будет одинаковой для всех вариантов заданий)

НАЧАЛО

Ввод хn, xk, Dx

X = xn

+

_

 

X ≤ xk

func1(X, &Y)

КОНЕЦ Вывод X, Y

X = X + Dx

Ó Ефименко К.Н.

6

Функция

void func1(float x, float *y)

 

 

 

 

 

 

Начало1

 

 

 

Примечание. Тело функции

 

 

 

 

 

 

 

 

будет полностью соответствовать

 

x

 

 

 

программе из лабораторной

 

 

 

 

 

 

 

 

работы 3.1

+

 

x ≤ –2

_

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

_

 

 

 

y = -2x-4

 

+

 

 

x < 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

_

 

 

 

y = - 4 - x2

 

+

 

 

 

 

x > 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y = -20.5x

 

y = -2

 

 

 

 

 

 

 

 

 

 

 

 

y

5. Текст программы:

Конец1

 

#include <math.h>

 

//Описание функции

void func1(float x, float *y)

//x,y – формальные параметры функции

//x – параметр по значению (исходные данные для функции)

//y – параметр по адресу (результат, возвращаемый функцией)

{if (x<=-2) *y=-2*x-4;

else if (x<0) *y=-sqrt(4-x*x);

else if (x>2) *y=-pow(2,0.5*x); else *y=-2;

}

//Основная функция int main()

{float xn, xk, dx, X, Y; cout<<"Input Xn="; cin>>xn; cout<<"Input Xk="; cin>>xk; cout<<"Input dX="; cin>>dx; X=xn;

while (X<=xk)

{//X,Y – фактические параметры функции func1() func1(X, &Y); //Вызов функции при текущем значении X

cout<<"X="<<X<<"\t Y="<<Y<<"\n"; X+=dx;

}

}

Ó Ефименко К.Н.

7

6.1.2. Возврат результата с помощью оператора return

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

return (выражение);

Оператор работает следующим образом:

·вычисляется значение выражения, указанного после return и преобразуется к типу возвращаемого функцией значения;

·выполнение функции завершается, а вычисленное значение передается в вызывающую функцию;

·операторы, следующие в функции за операторомreturn, игнориру-

ются;

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

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

Оператор return может отсутствовать:

·в функциях типа void;

·если возврат происходит перед закрывающейся фигурной скобкой;

·в функции main.

Функция может содержать несколько операторов return.

Пример 6.4. Составить программу, которая вычисляет углы прямоугольного треугольника, если известны его катеты a и b.

Для решения задачи используется функция gradus, которая выполняет перевод из радианов в градусы. Функция имеет один аргумент radian – параметр по значению и возвращает результат оператором return значение аргумента в градусах.

#define Pi 3.14159

//Описание функции

float gradus(float radian)

//radian–параметр по значению

{

float deg;

deg= radian*180/Pi; Вычисление результата return(deg); //Возврат результата

}

int main()

{float a,b,alfa,betta; cout<<"a="; cin>>a; cout<<"b="; cin>>b;

alfa=gradus(atan(b/a)); //Вызов функции betta=90-alfa;

Ó Ефименко К.Н.

8

cout<<"alfa="<<alfa<<endl;

cout<<"betta="<<betta<<endl;

}

Результат работы программы:

Пример 6.5 (лабораторная работа 5.2). Вычислить значения функции y = f(x)

ìsin(ax),

если х <1

ï

 

 

если 1 £ x £ 3

y = ía /(x + a),

ï

 

 

 

x2 | a |,

если x > 3

ï

î

 

 

 

соответствующие каждому значению х из заданного интервалаxn x xk с шагом Dx.

Вычисление значения f(x) оформить в виде функции. Исходные данные (a, x) передавать в функцию в виде параметра по значению. Для возврата результата работы функции (y) использовать оператор return.

Постановка задачи

1.Исходные данные: a, хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения:

1)x+a≠0 – проверять;

2)x2|a|³0 – не проверять (всегда истинно).

4.Блок-схема алгоритма основной программы и подпрограммы.

Основная функция

 

 

НАЧАЛО

(будет одинаковой

 

 

 

 

 

для всех вариантов заданий)

 

 

Ввод хn,xk,Dx,A

 

 

 

 

 

 

 

 

 

 

 

X = xn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Y = func2(X,A)

 

 

 

 

 

+

_

 

 

 

 

Y ¹ -1000

 

Вывод X, Y

 

 

 

 

Error!

 

 

 

 

 

 

 

 

X = X + Dx

 

 

 

 

 

 

 

 

 

 

 

 

+

X ≤ xk

_

 

 

 

 

 

 

 

 

 

 

 

КОНЕЦ

Ó Ефименко К.Н.

9

Примечание. Тело функции будет соответствовать программе из лабораторной работы 4.1, где вместо вывода сообщений о невыполнении ограничений, будет стоять оператор у=-1000 (присваивание результату заведомо невозможного в задаче значения, а, следовательно, признак того, что вычислить у нельзя).

Функция

 

 

 

 

 

 

 

float func2(float x, float a)

 

Начало2

 

 

 

 

 

 

x, a

 

 

 

+

 

x < 1

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

y = sin(ax)

 

 

x > 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y =

x 2 | a |

 

+

x+a≠0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y = a/(x+a)

y = -1000

y

Конец2

5. Текст программы:

#include <cstdlib> #include <math.h> #include <stdio.h> using namespace std;

//Описание функции

float func2(float x, float a)

//x,а – формальные параметры функции

//x,a – параметры по значению (исходные данные для функции)

{float y;

if (x<1) y=sin(a*x);

else if (x>5) y=sqrt(x*x*fabs(a));

else if (x+a!=0) y=a/(x+a); else y=-1000;

return y; //результат, возвращаемый функцией

}

Ó Ефименко К.Н.

10

//Основная функция int main()

{float xn, xk, dx, A, X, Y; printf("Input xn = "); scanf("%f",&xn); printf("Input xk = "); scanf("%f",&xk); printf("Input dx = "); scanf("%f",&dx); printf("Input a = "); scanf("%f",&A); X=xn;

do

{

//X, А – фактические параметры функции func2() Y=func2(X, A); //Вызов функции при текущем значении X

if (Y!=-1000) //проверка вычислено значение у или нет? printf("x=%4.1f\t y=%5.2f \n",X,Y);

else

printf("x=%4.1f\t y=Error!\n",X); X+=dx; }

while (X<=xk); system("PAUSE"); return EXIT_SUCCESS;

}

Результат работы программы:

Примечание. Переменные x, a, y являются локальными для функции func2(). Переменные X, A, Y являются локальными для основной функции. Други-

ми словами – это разные переменные.

Ó Ефименко К.Н.

Соседние файлы в папке 1й курс