Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Лекция №12. Функции и их параметры. РекурсияСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Цель – получить представление об особенностях разработки и использования пользовательских функций.
Кроме стандартных функций, расположенных в заголовочных файлах, которые подключаются к программе с помощью оператора #include<имя.h>, языки С/С++ позволяют пользователю формировать свои собственные функции. Эти функции целесообразно создавать, если при решении задач возникает необходимость проводить вычисления по одним и тем же алгоритмам многократно. Применение функций позволяет разделить программу на простые, легко контролируемые части, а также скрыть несущественные для других частей программы детали ее реализации. Таким образом, функция - это логически завершенный и оформленный в соответствии с требованиями языка фрагмент программы. Функции размещаются в программе в любом порядке и считаются глобальными для всей программы. При использовании функций необходимо различать описание функции и оператор вызова функции. Структура функции похожа на структуру программы main. Описание функции содержит заголовок функции, объявления переменных и операторы: тип_функции имя_функции (список формальных_параметров) { объявления переменных; оператор1; …; операторN; } Здесь: тип_функции - тип возвращаемого в основную программу результата; имя_функции - уникальное имя, соответствующее по смыслу операции, которую выполняет функция (например, max - определение максимального из двух чисел); список_формальных_параметров - перечень формальных параметров и их типов. Формальные параметры - это наименования переменных, через которые передается информация из основной программы в функцию. Для вызова функции достаточно указать ее имя со списком фактических параметров в любом выражении вызывающей программы: имя_функции (список_фактических_параметров); Здесь: список_фактических_параметров - перечень фактических параметров. Фактические параметры - это наименования переменных, значения которых при обращении к функции, присваиваются соответствующим формальным параметрам. Для возвращения вычисленного значения в основную программу в функциях используется оператор return(результат); Рассмотрим примеры использования функций в программах.
Пример 12.1 - Функция show не содержит параметров и не возвращает значение в основную программу. #include <iostream.h> #include <conio.h> void show (void) {cout<<"Функция show"<<endl; } void main (void) { clrscr(); cout<<"BЫ3OB функции show"<<endl; show(); соut<<"Возврат в основную программу"<<endl; getch();} Пример 12.2 - Функция max содержит формальные параметры и не возвращает значение в основную программу. #include <iostream.h> #include <conio.h> void max (float x, float у) //х, у - формальные параметры {if (x>y) cout<<x<<">"<<y<<endl; else cout<<y<<">"<<x<<endl;} void main (void) { clrscr(); float a, b; cout<<”введите a и b “<<endl; cin>>a>>b; max (a,b); getch();} Пример 12.3 - Функция max содержит формальные параметры и возвращает значение в основную программу. Возвращаемое значение имеет тип float. #include <iostream.h> #include <conio.h> float max (float x, float y) { float result; if (x>y) result=x; else result=y; return (result);} void main (void) {clrscr(); float a, b; cout<<”введите a и b “<<endl; cin>>a>>b; соut<<”Наибольшее из двух чисел "<<а<<" и "<<b<<":" <<max (a, b) <<endl; cout<<"Haибoльшee из двух чисел 2.71 и 3.14:" <<max(2.71,3.14)<<endl; getch();} В приведенных примерах описание функции предшествовало обращению к ней. В противном случае в начало программы нужно поместить прототип функции – т.е. объект, который содержит информацию об имени функции, типе возвращаемого значения, количестве и типе формальных параметров, например, float max (float, float); Значения формальных параметров функции могут использоваться по умолчанию. Например, #include <iostream.h> void show (int a=l, int b=2, int c=3) { cout<<a<<" "<<b<<" "<<c<<endl;} void main (void) show (); show (4); show (5,6); Взаголовке функции show происходит присваивание значений формальным параметрам a, b и с. При первом обращении к функции фактические параметры отсутствуют, при втором - указывается значение для параметра а, при третьем - значения для параметров а и b. Из примера видно, если опущено значение одного параметра, то опускаются значения и всех последующих параметров. В результате работы программы на экран будет выведено: 123 423 563. Таким образом, если при вызове функции отсутствуют значения каких-то фактических параметров, то функция использует вместо них значения формальных параметров, назначенных пользователем по умолчанию. С целью улучшения наглядности и удобочитаемости пользовательских программ используется перегрузка функций, которая позволяет использовать одно и то же имя для нескольких функций, решающих одну и ту же задачу, но имеющих разное количество и разные типы формальных параметров. Для того чтобы осуществить перегрузку функций, в программе просто описываются функции с одинаковыми именами. При решении программы компилятор самостоятельно, без каких-либо дополнительных указаний определяет нужную функцию на основании списка фактических параметров в операторе вызова функции. Рассмотрим пример использования перегрузки функций в программе. #include <iostream.h> int sum(int a, int b) { return(a+b);} float sum (float a, int b, int c) {return (a+b+c);} void main (void) {cout<<sum(2, 3) <<endl; cout<<sum (2.5,3,4) <<endl;} В примере определены две функции sum с разным количеством и типами формальных параметров. В результате работы программы сначала осуществляется обращение к первой функции sum, которая складывает два значения (2+3=5) типа int. Затем происходит обращение ко второй функции sum, которая складывает три значения (2.5+3+4=9.5) и возвращает в основную программу результат типа float. Одной из особенностей использования функций в программах является объявление локальных и глобальных переменных. Локальные переменные объявляются внутри функции точно так же, как и внутри главной функции main. Локальные переменные действуют только внутри функции, в которой они объявлены. Глобальные переменные объявляются в начале программы вне какой-либо функции. Глобальные переменные доступны для любой функции в программе. Если локальная и глобальная переменные имеют одинаковые имена, то переменная в функции воспринимается компилятором С/C++ как локальная переменная. Если внутри функции нужно использовать глобальную переменную, совпадающую по имени с локальной переменной, то в этом случае нужно воспользоваться глобальным оператором разрешения: :: имя_переменной Например, #include <iostream.h> int xg=l; //объявление глобальной переменной void show (int xg) { cout<<"Локальная переменная xg: "<<xg<<endl; cout<<Глобальная переменная xg: "<<::xg<<endl;} void main (void) { int y=0; show(y); } В результате работы программы на экран дисплея будет выведено: Локальная переменная xg:0 Глобальная переменная хg:1 Поскольку значения глобальных переменных могут быть легко изменены любой функцией, их использование в программах не рекомендуется. При решении вычислительных задач часто используются рекурсивные функции (функции, вызывающие сами себя). Рекурсивные функции, которые прямо вызывают сами себя, называются включительно рекурсивными. Если две функции вызывают друг друга, они называются взаимно рекурсивными. Решение рекурсивной задачи обычно разбивается на несколько этапов. Одним из этапов является решение базовой задачи, т.е. простейшей задачи, для которой написана вызываемая функция. Если задача оказывается более сложной, чем базовая, она делится на две подзадачи: выделение базовой задачи и всего остального. При этом часть, не являющейся базовой задачей должна быть проще, чем исходная задача, иначе рекурсия не сможет завершиться. Процесс продолжается до тех пор, пока не сведется к решению базовой задачи [6-8]. Каждый вызов рекурсивной функции называется рекурсивным вызовом или шагом рекурсии. Целесообразно использовать рекурсию для вычисления факториала, возведения в степень, вычисления числа Фибоначчи и др. В качестве примера рассмотрим рекурсивное вычисление факториала. По определению факториала: n!=n*(n-1)*(n-2)*…*2*1, причем 0!=1, 1!=1. Рекурсивное решение заключается в многократном вызове функции вычисления факториала из самой функции. Например, при вычислении 5! вычисление 1! – базовая задача, а также признак завершения рекурсии. Таким образом, 1!=1 – возвращает 1 2!=2*1!= 2*1=2 – возвращает 2 3!=3*2!=3*2=6 – возвращает 6 4!=4*3!=4*6=24 – возвращает 24 5!=5*4!=5*24=120 – возвращает 120
|
||||
Последнее изменение этой страницы: 2016-09-20; просмотров: 459; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.234.146 (0.009 с.) |