Лекция-08-09.ppt
- Количество слайдов: 21
Тема Функции и структура программы Лекция 23. 09. 13 г. 1
Функции и модульность программы Ø Модульность в языках программирования — принцип, согласно которому программное средство (ПС) – программа, библиотека, web-приложение и др. разделяется на отдельные сущности, называемые модулями. Модульность позволяет упростить задачи проектирования ПС и распределения процесса разработки ПС между группами разработчиков, а также позволяет реализовать методологию повторного использования кода. Ø При разбиении ПС на модули для каждого модуля указывается реализуемая им функциональность, а также связи с другими модулями. Роль модулей могут играть структуры данных, библиотеки функций, классы, сервисы и другие программные единицы, реализующие некоторую функциональность и предоставляющие интерфейс к ней. Ø В языке С модульность поддерживается функциями, препроцессоными командами, многофайловой структурой программы и заголовочными файлами. Лекция 23. 09. 13 г. 2
Функции и модульность программы Функции разбивают большие вычислительные задачи на более мелкие и позволяют инкапсулировать ( «упрятать» в оболочку) детали реализации некоторой функциональности, предоставив пользователям ( «клиентам» ) формат обращения к этой функциональности (интерфейс). Это делает программу в целом более ясной и облегчает внесение в нее изменений. Пример: функция, преобразующая символьное изображение числа, записанное в строке, в само число. //atoi_. c #include
Определение функции Для того, чтобы использовать функцию, ее необходимо определить, т. е. описать её интерфейс (объяснить, как функцией можно воспользоваться) и привести программный код, раскрывающий, как функция работает (записать реализацию функции на языке программирования). Определение любой функции имеет следующую форму: тип_возвращ_знач имя_функции(список_объявлений_арг) { объявления и операторы } Различные части этого определения могут отсутствовать, но обязательными являются: имя_функции, пара круглых скобок и пара фигурных скобок, т. е. «минимальная» функция определяется так: fun(){} Это – «пустышка» , которая не принимает никаких аргументов и ничего не делает (имеет пустое «тело» ). Подобные функции могут использоваться в качестве «заглушек» при разработке программ. v. Если при объявлении функции не указан тип возвращаемого значения, то по умолчанию подразумевается тип int. Лекция 23. 09. 13 г. 4
Функции и программы Ø Любая программа является набором определений o типов, o переменных и o функций. Ø Функции обмениваются данными посредством передачи аргументов и возвращения значений, а также через внешние переменные. Ø Функции могут следовать друг за другом в файле исходного кода в любом порядке, и текст программы можно разбивать на любое количество файлов, но при этом запрещается разбивать текст функции между файлами. Ø Функция не может быть определена внутри другой функции Ø В результате своей работы функция может возвратить в вызывающую ее функцию результат – некоторое значение, тип которого объявлен перед именем функции. Для этого в теле функции должен присутствовать хотя бы один оператор возврата вида: return выражение; Вызывающая функция может игнорировать (т. е. не использовать) возвращаемое значение. Ø Существует еще одна форма оператора возврата: return; В этом случае в вызывающую функцию ничего не передается, а при определении функции в качестве типа возвращаемого значения указывается void. Ø Тело функции может не содержать оператора возврата return ; при этом возврат из функции происходит при достижении конца блока (закрывающей скобки } ). Лекция 23. 09. 13 г. 5
Аргументы передаются по значению Все аргументы в функцию передаются по значению, т. е. функция получает значения своих аргументов в виде временных переменных, а не оригиналов. Следовательно, все действия функции со своими аргументами никак не отражаются на переменных, переданных функции при вызове. Исправить это положение можно с помощью указателей. Пример: функция, производящая «обмен значениями» двух переменных. //Ex 026_err. c – Err!!! #include
Функция main Программа может использовать любое количество функций при одном условии: в программе обязательно должна присутствовать в точности одна функция с именем main ( «главная» функция), т. к. запуск программы на выполнение операционной системой производится всегда через эту функцию (т. е. main начинает выполняться первой). Функция main всегда имеет тип возвращаемого значения int, через это значение ОС уведомляется об успешности или не успешности завершения программы (т. н. «код завершения» ). А т. к. int подразумевается «по умолчанию» , то тип возвращаемого значения для main часто не указывают. Существует две формы main: üбез аргументов – main() и üс аргументами – main(int argc, char *argv[]) Вторая форма main позволяет при вызове программы из командной строки передать в нее произвольное количество строковых аргументов (об этом позже). Лекция 23. 09. 13 г. 7
Пример программы с модульной структурой Разработать программу нахождения корня нелинейного уравнения f(x)=0 методом деления отрезка пополам: Даны: отрезок [a, b], на котором предположительно находится корень; точность определения нуля функции – epsy и точность определения корня – epsx. Лекция 23. 09. 13 г. 8
Программа нахождения корня //Ex 020_2013. c - корень нелинейного уравнения #include
Создание отдельных модулей Разместим каждую из функций – fun() и bisec() в отдельных файлах и создадим для них заголовочные (интерфейсные) файлы: // fun. c #include
Создание отдельных модулей // bisec. h double bisec(double, double); // bisec. c #include
Программа с использованием отдельных модулей //Ex 021_2013. c - корень нелинейного уравнения #include
Модульная структура программы Итог: спроектирована программа, состоящая из 5 модулей: fun. h fun. c bisec. h Ex 021_2013. c Командная строка для компиляции такой программы: gcc Ex 021_2013. c bisec. c fun. c -o Ex 021_2013 Лекция 23. 09. 13 г. 13
Рекурсия — процесс повторения чего-либо самоподобным способом. Например, вложенные отражения, производимые двумя точно параллельными другу зеркалами, являются одной из форм бесконечной рекурсии. Наиболее общее применение рекурсия находит в математике и информатике. Здесь она является методом определения функций, при котором определяемая функция применена в теле своего же собственного определения. При этом бесконечный набор случаев (значений функции) описывается с помощью конечного выражения, которое для некоторых случаев может ссылаться на другие случаи, если при этом не возникает циклов или бесконечной цепи ссылок. Фактически это способ определения множества объектов через самого себя с использованием ранее заданных частных определений. Лекция 23. 09. 13 г. 14
Примеры рекурсии в математике Ø Факториал целого неотрицательного числа n определяется так : n! = n * (n-1)! , 0! = 1. Ø Числа Фибоначчи: Fn = Fn-1 + Fn-2, F 1 = F 2 = 1. Ø Практически все геометрические фракталы задаются в форме бесконечной рекурсии, например, треугольник Серпинского: Лекция 23. 09. 13 г. 15
Рекурсия в программировании В программировании рекурсия — вызов функции из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Преимущество рекурсивного определения объекта заключается в том, что такое конечное определение теоретически способно описывать бесконечно большое число объектов. С помощью рекурсивной программы возможно описать бесконечное вычисление, причём без явных повторений частей программы. // генератор чисел Фибоначчи #include
Рекурсия в программировании Классический пример рекурсии – вычисление факториала целого числа: // рекурсия (факториал) #include
Задача о Ханойской башне Рисунок ниже иллюстрирует древнюю игру, известную под названием Ханойской башни. Игра начинается, когда n дисков разного диаметра расположены по возрастанию диаметров на одном из трех стержней. Цель игры — по одному перенести диски, чтобы они в конечном счете были расположены в том же порядке на другом стержне. Не разрешается класть диск большего диаметра на диск меньшего диаметра. Разработать алгоритм, который проделывает эту процедуру за 2 n-1 операций, где под операцией подразумевается перемещение диска с одного стержня на другой. 8 1 7 2 4 A 5 A 3 B 6 B 11 9 10 C C 12 A B C 14 13 15 A B Лекция 23. 09. 13 г. C C 18
Задача о Ханойской башне Ниже приведена рекурсивная функция mov, решающая задачу. #include
Пример косвенной рекурсии Написать программу, которая определяет – четно ли количество единиц в двоичном представлении заданного числа n. Если да – то программа выдает 1, в противном случае – 0. Лекция 23. 09. 13 г. 20
Пример косвенной рекурсии //Ex 010_2013. c - косвенная рекурсия #include


