Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C. Тема 1. Раздел 11

.pdf
Скачиваний:
17
Добавлен:
21.03.2016
Размер:
1.2 Mб
Скачать

Необходимо указать тип возвращаемого значения функции

В теле функции должно быть не менее одного return с указанием возвращаемого значения

Все пути завершения работы функции должны заканчиваться оператором return с указанием возвращаемого значения

Для возврата нескольких значений используйте передачу параметров по ссылке

Для создания математических функций

sin, cos, sqrt – должны возвращать результат вычислений

Для инициализации различных элементов памяти

Сложных структур

Массивов

Для нетривиального получения данных

В операциях ввода/вывода

В сложных расчётах

Для возврата кода завершения

0 – ошибки нет, всё хорошо

Не 0 – есть ошибка, нужно смотреть таблицу кодов ошибок

Пример: HRESULT

Дополнительная информация по HRESULT http://msdn.microsoft.com/en-us/library/bb401631.aspx

#include <stdio.h> #include <stdarg.h>

double average( int first, ... ) { int count = 0, sum = 0, i = first; va_list marker;

va_start( marker, first ); // Инициализация маркера while( i != -1 ) {

sum += i; count++;

i = va_arg( marker, int); // Извлечение аргумента

}

va_end( marker ); // Сброс маркера return( sum ? ((double)sum / count) : 0 );

}

void main() {

// -1 - метка окончания

printf( "%f\n", average( 1, 2, 10, -1 ) );

}

Часть 4

Локальное переменные – это переменные, определённые внутри функции

При использовании одного и того же имени для переменных в двух различных функциях, компилятор считает их разными переменными

Формальные параметры можно считать локальными переменными

Выделение памяти в стеке при вызове функции

Инициализация

Для формальных параметров данные берутся из фактических параметров

Обычные локальные переменные следует инициализировать внутри функции самостоятельно

Использование внутри функции

Уничтожение при очистке стека во время возврата из функции

Следствие

Не следует возвращать из функции указатели на локальные переменные, размещённые в стеке

Часть 5

Рекурсия – это вызов функции из этой же самой функции

Виды рекурсии

Непосредственная (простая) – прямой вызов функции в ней самой

Сложная (косвенная) – вызов через другие функции (сложная рекурсия)

Глубина рекурсии – количество вложенных вызовов

Удобно для реализации некоторых алгоритмов

Факториал

Числа Фибоначчи

Поиск наибольшего общего делителя двух чисел методом Евклида

Алгоритмы работы с деревьями

Приводит к активному расходованию стека

При большой глубине рекурсии стек может переполниться

Часть 6

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]