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);}

Блок-схема

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

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

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


 

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

23386. Определение коэффициента поверхностного натяжения жидкости 276 KB
  Нехаенко Определение коэффициента поверхностного натяжения жидкости Методические указания к выполнению лабораторной работы № 3 по курсу молекулярной физики. Каждая молекула жидкости в течение некоторого времени колеблется около определённого положения равновесия после чего скачком переходит в новое положение отстоящее от исходного на расстоянии порядка межатомного. На молекулу жидкости со стороны окружающих её молекул действуют силы взаимного притяжения которые с расстоянием быстро убывают. Выделим внутри жидкости какуюлибо молекулу А...
23387. Экспериментальное определение момента инерции маятника Максвелла 433 KB
  Определение момента инерции маятника Максвелла Методические указания к выполнению лабораторной работы № 4 по курсу механики молекулярной физики и термодинамики. Целью данной работы является экспериментальное определение момента инерции маятника Максвелла. Момент инерции тела относительно заданной оси и угловая скорость позволяют вычислить кинетическую энергию вращательного движения этого тела: 5 Экспериментальное...
23388. Определение логарифмического декремента затухания и коэффициента затухания колебательной системы 246 KB
  Во всех реальных колебательных системах энергия колебаний расходуется на работу против сил сопротивления и сил внутреннего трения что является причиной затухания свободных колебаний. Тогда основное уравнение динамики поступательного движения колебательной системы в проекции на ось ОХ имеет вид: или 1 1 дифференциальное уравнение свободных затухающих колебаний где где коэффициент затухания. Решением дифференциального...
23389. ПОВЕРКА ЭЛЕКРОННОГО АВТОМАТЧЕСКОГО ПОТЕНЦИОМЕТРА КАЛИБРАТОРОМ ИКСУ-2000 68.86 KB
  Уравнение равновесия компенсационной схемы: Ext=RбmRпрIввRмIнв Rпр=RRшRп RRшRп; m доля приведенного сопротивления; Iвв ток верхней ветви; Iнв ток нижней ветви; Схема работы ИКСУ2000 В режиме измерений: ЭКРАН Микропроцессорный модуль Цифровая величина Аналоговая величина АЦП ПЭВМ В режиме воспроизведения: Выходные клеммы клавиатура Аналоговая величина АЦП Цифровая величина Микропроцессорный модуль ПЭВМ.
23390. ПОВЕРКА ЭЛЕКТРОННОГО АВТОМАТИЧЕСКОГО ПОТЕНЦИОМЕТРА 69.27 KB
  max=[Δ1;2max EkEн]100 Vприв.max=[E2E1max EkEн]100 γprmax=11.596 εprmax=6.
23391. Исследование метрологических характеристик средств измерений 171 KB
  Относительная погрешность = 05. № Показания приборов Сопротивление R Показания Абсолютная погрешность Относительная погрешность Прямой R' Обратный R'' Прямой Δ' Обратный Δ'' Прямой δ' Обратный δ'' 1 120 6752 6699 6696 053 056 000785 0008294 2 120 6752 6703 6704 049 048 0007257 0007109 3 120 6752 6696 6703 056 049 0008294 0007257 4 120 6752 6699 6704 053 048 000785 0007109 5 120 6752 6699 6705 053 047 000785 0006961 6 120 6752 6698 6704 054 048 0007998 0007109 7 120 6752 6701 6703 051 049 0007553...
23392. ПОВЕРКА ЭЛЕКТРОННОГО АВТОМАТИЧЕСКОГО ПОТЕНЦИОМЕТРА 72.92 KB
  max=[Δ1;2max EkEн]100 Vприв.max=[E2E1max EkEн]100 K=05 Условие: .
23393. Поверка электронного автоматического потенциометра калибратором измерителем ИКСУ-2000 67.73 KB
  Показания образцового прибораСо оС Показания поверяемого прибораСп оС Абсолютная погрешность поверяемого прибора Δ оС Относительная погрешность поверяемого прибора δ Приведённая погрешность поверяемого прибора δpr 0 05 05 025 40 38 2 5 1 80 78 2 25 1 120 1185 15 125 075 160 159 1 0625 05 200 1995 05 025 025 160 1595 05 03125 025 120 119 1 0833333 05 80 785 15 1875 075 40 39 1 25 05 0 05 05 025 Δ=CоСп δ= Δ Со100 δpr= Δ 200100 K=05; δprmax=1 Прибор не удовлетворяет классу точности Δ=fCo δ=fCo...
23394. Поверка автоматического электронного моста 284.18 KB
  моста Ом Абсолютная вариация V Ом прямой ход Rt1 обратный ход Rt2 прямой ход1 обратный ход2 0 46 4561 4556 039 044 005 40 5316 5278 5277 038 039 001 80 60463 5996 5995 0503 0513 001 120 6752 6697 6695 055 057 002 160 7452 7383 7395 069 057 012 200 8143 8075 808 068 063 005 1= Rt Rt1 2= Rt Rt2 ...