72969

Функции. Правила организации функций

Лекция

Информатика, кибернетика и программирование

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

Русский

2014-12-02

85.5 KB

0 чел.

Тема 7. Функции

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

Функция - это совокупность объявлений и операторов, обычно предназначенных для решения определенной задачи. Каждая функция должна иметь и м я, которое используется для ее объявления, определения и вызова.

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

Правила организации функций

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

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

{

/* Описание локальных переменных */ тип_данных локальная_переменная_1;

тип_данных локальная_переменная_п; /* Тело функции */

}

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

Функции имеют нуль или более формальных параметров, разделенных запятыми, и возвращают значение скалярного типа, типа void (пусто) или указатель. Формальные параметры - это переменные, используемые внутри тела функции и получающие значение при вызове функции путем копирования в них значений соответствующих фактических параметров. При вызове функции фактические значения, задаваемые на входе, должны соответствовать количеству, типу и порядку расположения формальных параметров в описании функции. При выполнении вызова функции происходит замена формальных аргументов на фактические. Первый фактический аргумент соответствует первому формальному аргументу, второй - второму и т. д. Формальные параметры могут быть основного, структурного, совмещающего, адресного типов или типа массив. Если формальный параметр представлен в списке параметров, но не объявлен, то предполагается, что параметр имеет тип int. Несоответствие типов формальных и фактических параметров может привести к серии ошибок, особенно когда несоответствие влечет за собой отличия в размерах.

Список формальных параметров может заканчиваться запятой (,) или запятой с многоточием (,...) - это означает, что число аргументов функции переменно. Однако предполагается, что функция имеет, по крайней мере, столько обязательных аргументов, сколько формальных параметров задано перед последней запятой в списке параметров. Такой функции может быть передано большее число аргументов, но над дополнительными аргументами не производится контроль типов. Если функция имеет переменное число аргументов, то программист отвечает и за определение их числа и за получение их из стека внутри тела функции.

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

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

Функции записываются ДО кнопок, т.е. вне поля, где пишется код для кнопки. Таким образом, они создаются глобально, и их можно применять сколько угодно раз в разных кнопках.

Например, функция, возвращающая куб ее вещественного аргумента:

float cube( float x )

{ return x * x * x ; }

Аргумент х типа float специфицируется вслед за первой открывающей скобкой.

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

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

Примеры организации функций в C++

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

параметров:

float sum (float a, float b)

 { return (a+b); }

Функция sum имеет два формальных параметра - а и b вещественного типа float - и возвращает значение типа float, о чем говорит описатель, стоящий перед именем функции. Возвращаемое оператором return значение равно сумме фактических параметров.

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

void fastcall TForm1::Button1Click(TObject *Sender)

{ float a, x, y;

a = StrToFloat(Edit1->Text);

x = StrToFloat(Edit2->Text);

y = sum(a, x);

Edit3->Text = FloatToStr(y); }

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

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

Текст функции и вызова в основной программе

//----------------------------------------------------------

float calc (float x, float z, float t)

{float y;

y=cos(x)-(tan(z*z)/exp(t))+sqrt(fabs(z+t-x));

return y;}

//----------------------------------------------------------

void fastcall TForm1::Button1Click(TObject *Sender)

{float a=StrToFloat(Edit1->Text), b=StrToFloat(Edit2->Text), c=StrToFloat(Edit3->Text),P;

P=calc(a,b,c);

Edit4->Text=FloatToStr(P);}

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

Преобразуем решение таким образом, чтобы в главной программе остались операторы ввода/вывода данных, а все вычисления по выполнению задания организуем в функциях. Помимо этого преобразования, можно отказаться от использования условия для проверки четности переменной i, используя библиотечную функцию возведения в степень pow(-1, i +1).

Тексты функций и их вызова в основной программе:

//----------------------------------------------------------

float zikl_for (float x)

{ int i, fact, k;

float S = 0;

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

{fact=1;

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

{fact *= k;}

S += pow(-1, i +1) * pow(x, i + 1) / fact ;}

return S; }

//----------------------------------------------------------

float zikl_while (float x)

{ int i = 1, fact, k;

float S = 0;

while( i <= 5)

{ fact = 1;

k = 1;

while(k <= i)

{ fact *= k;

k++; }

S += pow(-1, i +1) * pow(x, i + 1) / fact ;

i++;}

return S; }

//----------------------------------------------------------

float zikl_do(float x)

{ int i = 1, fact, k;

float S = 0;

do { fact = 1;

k = 1;

do { fact *= k;

k++; }

while(k <= i) ;

S += pow(-1, i +1) * pow(x, i + 1) / fact ;

i++; }

while( i <= 5);

return S; }

//----------------------------------------------------------

void fastcall TForm1::Button1Click(TObject *Sender)// for

{ float s, x=StrToFloat(Edit1->Text);

s=zikl_for(x);

Edit2->Text=FloatToStr(s); }

//----------------------------------------------------------

void fastcall TForm1::Button2Click(TObject *Sender)// while

{ float s, x=StrToFloat(Edit1->Text);

s=zikl_while(x);

Edit3->Text=FloatToStr(s); }

//----------------------------------------------------------

void fastcall TForm1::Button3Click(TObject *Sender)// do-while

{ float s, x=StrToFloat(Edit1->Text);

s=zikl_do(x);

Edit4->Text=FloatToStr(s); }

Пример 4. Найти , используя функцию.

//----------------------------------------------------------

float poschitaem(float x, float eps)

{float S=0,k,fact,i,a;

k=1;

do{fact=1;

for(i=1;i<=2*k-1;i++)

{fact*=i;}

a=pow(x,2*k+1)/fact;

S+=a;

k++;}

while(fabs(a)>=eps);

return S;}

//----------------------------------------------------------

void fastcall TForm1::Button1Click(TObject *Sender)

{float x=StrToFloat(Edit1->Text),eps=StrToFloat(Edit2->Text),S;

S=poschitaem(x,eps);

Edit3->Text=FloatToStr(S);}

Пример 5. Найти произведение всех чисел, кратных 5 от 1 до 50 с помощью функции.

//----------------------------------------------------------

int chisla()

{int i,n=1;

for(i=5;i<=50;i+=5)

{n*=i;}

return n;}

//----------------------------------------------------------

void fastcall TForm1::Button1Click(TObject *Sender)

{float N;

N=chisla();

Edit1->Text=IntToStr(N);}

Пример 6. Найти с помощью функции.

//----------------------------------------------------------

float hard_level(float g, float x)

{float N=0,m,i,fact,k,p;

for(m=3;m<=g;m++)

{p=1;

i=1;

while(i<=m-1)

{fact=1;

k=1;

do{fact*=i;

k++;}

while(k<=m);

if(x!=2&&i!=g)

{p*=pow(fabs(i-g),m)*fact/asin(x-2);

i++;}}

S+=cos(m+5)/(g*g+x*x*x)*p;}

return S;}

//----------------------------------------------------------

void fastcall TForm1::Button1Click(TObject *Sender)

{float d=StrToFloat(Edit1->Text), x=StrToFloat(Edit2->Text),Q;

Q=hard_level(d,x);

Edit3->Text=FloatToStr(Q);}

Блок-схема

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

Схема полной программы (для кнопки)

Схема для функции


 

А также другие работы, которые могут Вас заинтересовать

74331. Характеристика передачи ЭЭ переменным током 47.5 KB
  Поэтому повышение напряжения при токах в несколько тысяч ампер возможно только с помощью явления электромагнитной индукции и трансформаторов что создает возможность для последующей эффективной передачи электроэнергии переменным током. Потребление электроэнергии производится на относительно низком напряжения сотни тысячи вольт. Доставка ЭЭ от электростанции к электроприемникам в общем случае осуществляется сетями различного класса номинального напряжения т. представлена принципиальная упрощенная схема передачи и распределения ЭЭ...
74332. Характерные значения удельных (погонных) параметров схем замещения и электрических режимов воздушных и кабельных линий электропередачи и соотношения между ними 496 KB
  Волновые параметры реальной линии волновое сопротивление ZB и коэффициент распространения волны γо определяются через ее удельные погонные отнесенные к 1 км параметры: где β0 коэффициент затухания α0 коэффициент изменения фазы фазовый угол. Удобно определять параметры Побразной схемы замещения линии через удельные погонные сопротивления Zo=RojX0 Ом км и проводимости Yo=g0jb0 См км. При этом равномерную распределенность параметров линии по длине учитывают приближенно с помощью поправочных коэффициентов по формулам Z...
74333. Двухобмоточные силовые тр-ры. Виды, условные обозначения, принципиальные сх., сх. замещения. Моделирование трансформаторов и определение параметров сх. замещения 224 KB
  замещения. замещения. Установим связь схемы замещения трансформатора с его реальными схемнорежимными параметрами. Эта схема в которой магнитная связь между обмотками заменена электрической называется схемой замещения трансформатора.
74334. Понятие пропускной способности электропередачи, факторы её определяющие 32 KB
  Второе ограничение связано с риском нарушения синхронной работы генератора при повышении нагрузки на которых возникает условие для выхода из синхронизма. Это ограничение чаще практикуется по статической устойчивости. При некоторой меньшей длине активным ограничение будет являться ограничение по нагреванию. Заметим что ограничение по нагреванию не зависит от длины ЛЭП.
74335. Компактные, компенсированные электропередачи переменного тока 66 KB
  Компактные компенсированные электропередачи переменного тока. В основу конструкций перспективных компактных воздушных линий электропередач разработанных в нашей стране положена простая идея. Образцы таких распорок уже созданы и составлены проекты будущих компактных воздушных линий электропередач рис. В скобках показаны для сравнения расстояния между фазами для обычных воздушных линий электропередач Расчеты показали что при меньших по сравнению с обычными воздушными линиями электропередач размерами компактные воздушные линии электропередач...
74336. Моделирование (представление) эл нагрузок при расчете рабочих режимов эл.передач и эл.сетей 114.5 KB
  Активные элементы схем замещения электрических сетей и систем нагрузки и генераторы представляются в виде линейных или нелинейных источников. Способы задания нагрузок при расчетах режимов: а постоянный по модулю и фазе ток; б постоянная по модулю мощность; вгпостоянные проводимость или сопротивление; дстатические характеристики нагрузки по напряжению; еслучайный ток Нагрузка задается постоянным по модулю и фазе током рис.Такая форма представления нагрузки принимается при всех расчетах распределительных сетей низкого напряжения...
74337. Статические характеристики электрических нагрузок 75 KB
  Зависимости показывающие изменение активной и реактивной мощности и от частоты f и подведенного напряжения U при медленных изменениях менее 1 сек этих параметров называют статическими характеристиками нагрузки СХН. Полученные при этом СХН называются естественными. Примерный состав нагрузки соответствующий типовым СХН Асинхронные двигатели...
74338. Представление генераторов при расчете установившихся режимов эл.передач ЭЭС. 105 KB
  В расчетах установившихся режимов электрических сетей и систем как правило не учитываются и а генератор представляется источником подключенным к шинам генераторного напряжения. Обычно для генерирующих узлов при фиксированных и не известны модуль и фаза напряжения узла и либо активные и реактивные составляющие напряжения и . Постоянные активная мощность и модуль напряжения В этом случае переменными являются как правило реактивная мощность и фаза напряжения. Задание постоянного модуля напряжения при соответствует реальным...
74339. Моделирование (представление) линии эл.передачи 0,38-220 кВ. характерные данные и основные соотношения между параметрами схем замещения ЛЭП 210.5 KB
  Характерные данные и основные соотношения между параметрами схем замещения ЛЭП. Выше приведена характеристика отдельных элементов схем замещения линий. При расчете симметричных установившихся режимов ЭС схему замещения составляют для одной фазы