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

Блок-схема

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

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

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


 

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

40606. Построение диаграмм вариантов использования 70.24 KB
  Краткие сведения о диаграмме вариантов использования. Диаграмма вариантов использования является самым общим представлением функциональных требований к системе. Для последующего проектирования системы требуются более конкретные детали которые описываются в документе называемом сценарием варианта использования или потоком событий flowofevents.
40607. Построение диаграмм классов 196.48 KB
  Повторить общие сведения о диаграммах классов Построить диаграмму классов Сформировать отчет по практической работе №7 После того как мы определились с функциональными требованиями к системе и её границами начнём анализировать предметную область с целью построения диаграммы классов. Основные элементы диаграммы классов Основными элементами являются классы и связи между ними. Ассоциация ssocition представляет собой отношения между экземплярами классов.
40608. Построение диаграмм состояний 263.95 KB
  Повторить общие сведения о диаграммах состояний Построить диаграмму состояний Сформировать отчет по практической работе №8 Диаграмма состояний определяет последовательность состояний объектавызванных последовательностью событий. Порядок построения диаграммы Создайте диаграмму состояний для объектов класса Заказ. Соответствующая диаграмма состояний представлена на рисунке: Сохраните диаграмму.
40609. Представление конкретной модели ИС в виде DFD диаграмм 254 KB
  Шаг 1: Создание новой модели В меню File выбрать NewПоявится диалоговое окно BPwin В поле Nme напечатать Банкомат Проверить что в группе Type выбрано Dtflow DFD Нажать OKПоявился пустой прямоугольник контекстного действия. Напечатать:Банкоматзатем нажать OK. Нажать OK. Шаг 4: Рисование внешней ссылки На инструментальной панели BPwin нажать кнопку Externl Reference.
40610. Разработка диаграмм по методу Баркера 44 KB
  Печатать накладные на отпущенные товары. Следить за наличием товаров на складе. Выделим все существительные в этих предложениях это будут потенциальные кандидаты на сущности и атрибуты и проанализируем их непонятные термины будем выделять знаком вопроса: Написать сущностиСразу возникает очевидная связь между сущностями покупатели могут покупать много товаров и товары могут продаваться многим покупателям . Причем каждый товар может храниться на нескольких складах и быть проданным с любого склада.
40611. Визначення жанрово-стильових особливостей медійного продукту Д. Гордона, пошук спільних та відмінних ознак медійного продукту Дмитра Гордона 428.5 KB
  В ходе работы на примере конкретного медийного продукта доказано, что авторская журналистика придерживается своим жанрово стилистическим особенностям. Особое внимание уделено анализу программы «В гостях у Дмитрия Гордона».
40613. Технология внедрения CASE-средств 118.11 KB
  CSEсредство любое программное средство автоматизирующее ту или иную совокупность процессов жизненного цикла ПО и обладающее следующими основными характерными особенностями: мощные графические средства для описания и документирования ИС обеспечивающие удобный интерфейс с разработчиком и развивающие его творческие возможности; интеграция отдельных компонент CSEсредств обеспечивающая управляемость процессом разработки ИС; использование специальным образом организованного хранилища проектных метаданных репозитория. Процесс...
40614. Управление требованиями к системе. Оценка затрат на разработку ПО 23.18 KB
  Средства управления требованиями Перед тем как управлять требованиями разберемся что такое требование и что такое управление требованиями и зачем это нужно. Требование это любое условие которому должна соответствовать разрабатываемая система или программное средство. Требованием может быть возможность которой система должна обладать и ограничение которому система должна удовлетворять. В соответствии с Глоссарием терминов программной инженерии IEEE являющимся общепринятым международным стандартным глоссарием требование это:Условия...