Функции 2 Алтайский государственный университет Математический факультет Кафедра
40980-09_functions_2.ppt
- Количество слайдов: 40
Функции 2 Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013
2 План Лекция 9 План Пара заданий для самопроверки Функции Подпрограмма как алгоритмическая структура Функции в языке Си Передача параметров Возврат значений Примеры функций Функции: что еще? Игнорирование возвращаемого значения Тип функции по умолчанию Неопределенное значение функции Тип и аргументы функции main() Функции с переменным числом параметров Функции и структура программы Программа из одного файла Программа из многих файлов Области видимости переменных
Несколько заданий для самопроверки Задание «Найди ошибку» Задание «Вызовы функций»
4 Несколько заданий для самопроверки Задание 1а Найдите ошибку int g(void){ printf(“Внутри функции g()”); int h(){ printf(“Внутри функции h()”); } } Описания функций не могут вкладываться друг в друга
5 Задание 1б Найдите ошибку int sum(int x, int y){ int result; result = x + y; } Несколько заданий для самопроверки Нет return result;
6 Задание 1в Найдите ошибку int sum(int n){ if (n == 0) return 0; else n + pow(2,n); } Несколько заданий для самопроверки Не хватает return
7 Задание 1г Найдите ошибку void f(float a){ float a; printf(“%f”, a); } Несколько заданий для самопроверки Повторное описание уже объявленной переменной
8 Задание 1д Найдите ошибку void product(void){ int a, b, c, result; printf(“Введите три целых числа: ”); scanf(“%d%d%d”,&a, &b, &c); result = a*b*c; printf(“Результат равен %d”, result); return result; } Несколько заданий для самопроверки Не нужен return, т.к. функция не имеет возвращаемого значения
9 Задание 2 Что выведет программа? #include
Примеры функций Максимум двух чисел Простое ли число?
11 Функции Функции: пример 1 Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования Функция: формальные параметры int Max ( int a, int b ) { if ( a > b ) return a ; else return b ; } return - вернуть результат функции тип результата
12 Функции Функции: пример 2 Задача: составить функцию, которая определяет, верно ли, что заданное число – простое. Особенности: ответ – логическое значение: «да» (1) или «нет» (0) результат функции можно использовать как логическую величину в условиях (if, while) Алгоритм: считаем число делителей в интервале от 2 до N-1, если оно не равно нулю – число составное. count = 0; for (i = 2; i < N; i ++) if ( N % i == 0) count ++; if ( count == 0 ) // число N простое} else // число N составное
13 Функции 13 Функция: пример 2 int Prime ( int N ) { int count = 0, i; for (i = 2; i*i <= N; i++) if (N % i == 0) count ++; return (count == 0); } if (count == 0) return 1; else return 0;
14 Функции Функции: пример 2 #include
15 Функции Упражнения 1. Описать функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования. Пример: Введите число: 100 сумма чисел от 1 до 100 = 5050 2. Составить функцию, которая определяет, сколько зерен попросил положить на N-ую клетку изобретатель шахмат (на 1-ую – 1 зерно, на 2-ую – 2 зерна, на 3-ю – 4 зерна, …) Пример: Введите номер клетки: 28 На 28-ой клетке 134217728 зерен.
16 Функции Упражнения 3. Составить функцию, которая определяет наибольший общий делитель двух натуральных и привести пример ее использования. Пример: Введите два числа: 14 21 НОД(14,21)=7 4. Составить функцию, которая вычисляет функцию синус как сумму ряда (с точностью 0.001) Пример: Введите угол в градусах: 45 sin(45) = 0.707
17 Функции Упражнения 5. Составить функцию, которая определяет, верно ли, что сумма его цифр – четное число. Пример: Введите число: 136 Сумма цифр четная. 6. Составить функцию, которая определяет, верно ли, что в заданном числе все цифры образуют возрастающую последовательность. Пример: Введите число: 258 Верно. Введите число: 528 Неверно. Введите число: 245 Сумма цифр нечетная.
Функции: что еще? Игнорирование возвращаемого значения Тип функции по умолчанию Неопределенное значение функции Тип и аргументы функции main() Функции с переменным числом параметров
19 Функции: что еще? Функции: что еще? При вызове функции можно игнорировать возвращаемое значение, вызывая ее как процедуру #include
20 Функции: что еще? Функции: что еще? Если при описании функции не указан тип возвращаемого значения, то подразумевается int #include
21 Функции: что еще? Функции: что еще? Если при описании функции не использован return для возврата значения, то значение функции не определено #include
22 Функции: что еще? Функции: что еще? Функция main() может иметь тип int или void Возвращаемое значение в main() – код завершения процесса в ОС 0 – нет ошибок >0 – код ошибки #include
23 Функции: что еще? Функции: что еще? Функция main() может иметь параметры int argc количество параметров командной строки char *argv[] массив строк – значений параметров #include
24 Функции: что еще? Функции: что еще? Функции могут иметь переменное количество параметров #include
Функции и структура программы Программа из одного файла Программа из многих файлов Области видимости переменных
26 Функции и структура программы Функции и структура программы Функции в одном файле
27 Функции и структура программы Функции и структура программы Программа из нескольких файлов int mul(int a, int b) { return a+b; } second.c
28 Функции и структура программы Области видимости переменных Переменные доступны только в той области видимости, где они описаны (за исключением описанных как static) vars.c Глобальная область видимости Переменная локальна, область видимости – тело функции Переменная локальна, область видимости – блок Переменная yourVariable доступна внутри функции main() Переменная hisVariable доступна только внутри блока { … }
Рекурсивные функции Рекурсия: в математике и программировании Общий вид рекурсии Задача о ханойских башнях Цена рекурсии
30 Организация курса Рекурсия в математике Рекурсия – метод определения множества объектов через себя, с использованием ранее заданных частных определений. Факториал n! = n(n – 1)! при n>0 и n! = 1 при n=0 Числа Фибоначчи: F1 = F2 = 1, Fn = Fn– 1+Fn– 2, при n>2
31 Рекурсивные функции Рекурсия в программировании Рекурсия – вызов функции из нее самой напрямую или через другие функции #include
32 Рекурсивные функции Общий вид рекурсии Если (простейший случай) тогда Решить напрямую Иначе Делать рекурсивный вызов до появления простейшего случая
33 Рекурсивные функции Задача о ханойских башнях В одном буддийском монастыре монахи уже тысячу лет занимаются перекладыванием колец. Они располагают тремя пирамидами, на которых надеты кольца разных размеров. В начальном состоянии 64 кольца были надеты на первую пирамиду и упорядочены по размеру. Монахи должны переложить все кольца с первой пирамиды на вторую, выполняя единственное условие — кольцо нельзя положить на кольцо меньшего размера. При перекладывании можно использовать все три пирамиды. Монахи перекладывают одно кольцо за одну секунду. Как только они закончат свою работу, наступит конец света.
34 Рекурсивные функции Задача о ханойских башнях Рекурсивное решение Итак, нам необходимо перенести n дисков со стержня (a) на стержень (c). Если есть функция перенесения n –1 диска, тогда задача легко разрешима. Вначале перенесем n –1 диск со стержня (a) на стержень (b) Применяя рекурсивный вызов той же функции, затем перенесем n-ый диск со стержня (a) на стержень (c) И, наконец, перенесем n –1 диск со стержня (b) на стержень (c). Конец света
35 Рекурсивные функции Задача о ханойских башнях Рекурсивное решение void Step(int n, char a, char b, char c) // n - количество колец; // a, b, c - башни; { // т. к. на каждом шаге количество колец // будет уменьшаться на один, // это условие будет условием выхода из рекурсии if (n <= 0) return; Step(n-1, a, c, b); printf("диск %d с %c на %c \n", n, a, b); Step(n-1, c, b, a); }
36 Организация курса Цена рекурсии Использование рекурсии может сократить размер исходного кода программы и сделать код более элегантным и понятным. Однако рекурсия имеет и свои недостатки…
37 Организация курса Цена рекурсии Пример – вычисление чисел Фибоначчи long F( int n ) { if( n <= 1 ) return n; else return F( n - 1 ) + F( n - 2 ); } F(3) вычисляется трижды!
38 Организация курса Цена рекурсии При рекурсивном вызове функции запоминается ее состояние, чтобы после окончания рекурсивного вызова можно было продолжить ее вычисление Состояние функции – совокупность значений всех локальных переменных функции Значения локальных переменных запоминаются в стэке (специальной области памяти) Стэк имеет ограниченный размер и не позволяет глубокие рекурсии
39 Организация курса Рекурсия Рекурсия всегда(!) может быть заменена итеративным алгоритмом При использовании итеративного алгоритма, как правило, необходимо самостоятельно имитировать работу стэка
40 Вопросы и ответы Вопросы? Функции Примеры функций Функции: что еще? Игнорирование возвращаемого значения Тип функции по умолчанию Неопределенное значение функции Тип и аргументы функции main() Функции с переменным числом параметров Функции и структура программы Программа из одного файла Программа из многих файлов Области видимости переменных