Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С++- не книжкой_новое.doc
Скачиваний:
5
Добавлен:
04.11.2018
Размер:
765.44 Кб
Скачать

Int oct (int a)// определение функции

{int sum=0;

while (a>0)

{

if (a%3==0) sum++;

a/=3;

}

return sum;

}

Void main()

{

int n1,n2;

cout <<"Enter n1,n2 ";

cin>>n1>>n2;

for (int i=n1;i<=n2-4;i++)// Проверяем все пары чисел,

//разность между которыми равна 4

if (oct(i)==oct(i+4) && oct(i)>0)// условие, содержащие

//три вызова функции oct

cout <<i<<" "<<i+4<<"\n";

}

Особое место в ряду функций занимают так называемые рекурсивные функции, причем разделают прямую и косвенную рекурсию. Функция называется косвенно рекурсивной в том случае, если она содержит обращение к другой функции, содержащий вызов данной функции. Если же в теле функции имеется вызов самой этой функции, то речь идет о прямой рекурсии, а такую функцию называет рекурсивной. Рекурсивные алгоритмы эффективны в тех задачах, где рекурсия используется в определении данных. Если у задачи есть очевидное итерационное решение, то рекурсии следует избегать. Поэтому серьезное изучение рекурсивных методов нужно проводить, вводя динамические структуры данных. Сейчас же рассмотрим только принципиальные возможности С++ для организации рекурсивных алгоритмов.

Пример 3. Напишите рекурсивную функцию, вычисляющую xn (n-целое, неотрицательное).

# include <iostream.h>

float step(float x, int n)

{ float k;

if (n==0) return 1;

k=x*step(x,n-1); //рекурсивный вызов

return k;

}

Void main()

{

float x;

int n;

cout<<"Enter x,n ";

cin>>x>>n;

cout <<"\nStepen("<<x<<","<<n<<")= "<<step(x,n);

}

Для n=0 функция возвращает значение 1. В противном случае вызывается та же функция с уменьшенным на 1 значением параметра степени. Таким образом, организуется последовательность вычислений xn=x*xn-1, xn-1=x*xn-2…, x2=x*x1, x1=x*x0, x0=1. Обратите внимание, что последовательность рекурсивных обращений к функции прерывается только при вызове функции step(x,0). Таким образом, важным моментом при составлении любой рекурсивной функции является организация выхода их рекурсии. Каждая задача, решаемая рекурсивным образом, при некоторых наборах данных должна иметь элементарное нерекурсивное решение, например, в нашем примере x0=1.

Больше значение в современном программировании играет не только умение создавать собственные функции, но и грамотное использование уже созданных библиотечных функций. Использование любой стандартной библиотечной функции предполагает ее тщательное предварительное изучение с помощью справочника по языку программирования или справочной системы интегрированной среды программирования. В качестве примера рассмотрим некоторые из библиотечных функций языка С для работы со стоками и файлами.

Функции для работы со строками описаны в заголовочном файле string.h. ([7] стр. 501, [8] стр. 167.) Как было отмечено в главе 5 строка в языке С задается как массив символов и строковые функции работают именно с символьными массивами, завершающимися символом ‘\0’, причем вся ответственность за переполнение массивов ложится на плечи программиста. Так как имя массива является указателем-константой на его первый элемент, то параметрами строковых функций чаще всего являются именно указатели-константы на объект типа char (const char *). Рассмотрим описание некоторых функций библиотеки string.h

1.

# include <string.h>

unsigned int strlen(char * str)

Функция strlen() возращает длину строки str. Завершающий нулевой символ не учитывается.

Пример использования функции:

char s[255]; cin.getline(s,255);

cout<< “Длина строки равна ”<<strlen(s);

2.

#include <string.h>