Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

тело_функции

Здесь тип_функции – тип возвращаемого функцией значения, в том числе void, если функция не возвращает никакого значения. Тип функции может быть любым кроме массива и функции. Имя_функции – идентификатор. Спецификация_формальных_параметров может отсутствовать (но скобки обязательны) или представлять собой список спецификаций для каждого параметра, имеющий вид:

тип имя_параметра

или

тип имя_параметра= умалчиваемое значение.

Тело_функции - это блок или составной оператор, заключенный в скобки {}. Очень важным оператором тела функции является оператор возврата в точку вызова

return выражение;

или

return;.

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

Обращение к функции (вызов функции) – это выражение вида

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

При обращении к функции формальные параметры заменяются фактическими, причем соблюдается строгое соответствие параметров по типам. Именно поэтому необходимо определить или хотя бы объявить функцию до ее вызова. Объявление функции (прототип) совпадает с заголовком определения функции после которого ставится;. В списке формальных параметров в этом случае могут отсутствовать имена параметров.

Приведем несколько примеров.

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

# include <iostream.h>

 

int max (int n, int m) // определение функции нахождения максимума

{return n<m?m:n;}

 

int cube(int); //прототип функции вычисления куба целого числа

 

void main (void)

{

int i,j,m;

cin >>i>>j;

m=cube(max(i,j));// вложенные вызовы функций – m – куб

// максимального из двух чисел

cout<<“\nmax=”<<m);

}

 

int cube(int x)// Определение функции вычисления

//куба целого числа

{return x*x*x;}

 

Пример 2. Определить функцию, подсчитывающую количество нулей в троичной записи натурального числа. Найти все пары натуральных чисел в диапазоне [n1,n2], разность между которыми равна 4 и в троичной записи которых равное число нулей. Например, такой парой является пара 6(203) и 10(1013) (в троичной записи по одному нулю).

# include <iostream.h>

 

int oct (int a)// определение функции

{int sum=0;

while (a>0)

{

if (a%3==0) sum++;

a/=3;

}

return sum;

}

void main()

{

int n1,n2;

cout <<"Enter n1,n2 ";

cin>>n1>>n2;

for (int i=n1;i<=n2-4;i++)// Проверяем все пары чисел,

//разность между которыми равна 4

if (oct(i)==oct(i+4) && oct(i)>0)// условие, содержащие

//три вызова функции oct

cout <<i<<" "<<i+4<<"\n";

}

 

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

Пример 3. Напишите рекурсивную функцию, вычисляющую xn (n-целое, неотрицательное).

# include <iostream.h>

 

float step(float x, int n)

{ float k;

if (n==0) return 1;

k=x*step(x,n-1); //рекурсивный вызов

return k;

}

 

void main()

{

float x;

int n;

cout<<"Enter x,n ";

cin>>x>>n;

cout <<"\nStepen("<<x<<","<<n<<")= "<<step(x,n);

}

Для n=0 функция возвращает значение 1. В противном случае вызывается та же функция с уменьшенным на 1 значением параметра степени. Таким образом, организуется последовательность вычислений xn = x * xn -1, xn -1= x * xn -2…, x 2= x * x 1, x 1= x * x 0, x 0=1. Обратите внимание, что последовательность рекурсивных обращений к функции прерывается только при вызове функции step(x,0). Таким образом, важным моментом при составлении любой рекурсивной функции является организация выхода их рекурсии. Каждая задача, решаемая рекурсивным образом, при некоторых наборах данных должна иметь элементарное нерекурсивное решение, например, в нашем примере x0=1.

 

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

Функции для работы со строками описаны в заголовочном файле string.h. ([7] стр. 501, [8] стр. 167.) Как было отмечено в главе 5 строка в языке С задается как массив символов и строковые функции работают именно с символьными массивами, завершающимися символом ‘\0’, причем вся ответственность за переполнение массивов ложится на плечи программиста. Так как имя массива является указателем-константой на его первый элемент, то параметрами строковых функций чаще всего являются именно указатели-константы на объект типа char (const char *). Рассмотрим описание некоторых функций библиотеки string.h




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 419; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.