- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.7. Константы
- •1.6. Преобразование типов
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
4.2. Рекурсия
Рекурсивной называется функция, которая обращается к себе самой прямо или косвенно. В такой функции обязательно должно быть условие завершения, иначе рекурсия будет бесконечна. После выполнения этого условия, значение функции будет «всплывать», пока управление не будет возвращено в место вызова.
Листинг 4.4. Рекурсия.
#include <iostream>
using namespace std;
//Рекурсивное вычисление факториала.
int factorial (int val)
{
return !val ? 1 : val * factorial( val-1 );
}
//Рекурсивное возведение в степень.
double power (double val, int deg)
{
return !deg ? 1 : val * power( val, deg-1 );
}
int main (void)
{
int ival;
cin >> ival;
cout << factorial(ival) << endl;
double dval;
cin >> dval;
cout << power(dval, ival) << endl;
return 0;
}
Рекурсивные функции могут определять бесконечное вычисление без явных повторений, однако использовать такие функций следует при явном наличии рекурсии в алгоритме или представлении данных.
4.3. Указатели и ссылки
4.3.1. Передаваемые параметры
Параметрами функции могут быть не только копии каких-либо объектов, но и сами эти объекты. Подобный механизм реализуется посредством параметров – указателей и параметров – ссылок. Типичным примером является передача функции массива в качестве параметра. Для больших массивов копирование значений всех элементов весьма трудоемко и неэффективно. Вместо этого, массив передается через указатель на его первый элемент и значение количества его элементов или указатель на последний.
Листинг 4.5. Указатели, как передаваемые параметры.
#include <iostream>
#include <cstring>
using namespace std;
//функция удаления последнего элемента из строки
//как из стека с возвращением удаляемого символа;
char pop (char *str)
{
int length = strlen(str);
char poped = *(str + length — 1); //сохранение последнего элемента;
*(str + length - 1) = *(str + length); //удаление последнего элемента;
return poped;
}
int main (void)
{
char *str = new char[20]; //резервирование памяти под строку;
cin >> str;
cout << pop(str) << endl; //удаление последнего символа;
cout << str << endl;
return 0;
}
Другим примером использования параметров – указателей является передача структур.
4.3.2. Возвращаемые значения
Указатели и ссылки могут использоваться не только для передачи значений в функцию, но и для их возвращения.
Листинг 4.6. Указатели, как возвращаемые значения.
#include <iostream>
#include <cstring>
using namespace std;
//функция удаления последнего элемента из строки
//как из стека с возвращением полученной строки;
char* pop (char *str)
{
int length = strlen(str);
*(str + length - 1) = *(str + length); //удаление последнего элемента;
return str;
}
int main (void)
{
char *str = new char[20]; //резервирование памяти под строку;
cin >> str;
cout << pop(str) << endl; //удаление последнего символа;
return 0;
}
Еще один примечательный способ использования ссылок или указателей демонстрирует следующий листинг, приведенный для варианта с ссылками. Здесь возвращаемое функцией значение является ссылкой, в связи с чем над самим вызовом могут выполняться различные операции.
Листинг 4.7. Возвращение из функции адреса.
#include <iostream>
using namespace std;
int x = 10;
int & x_seter(void)
{
return x;
}
int main (void)
{
x_seter()++;
cout << x << endl;
return 0;
}
