Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы по информатике1.docx
Скачиваний:
1
Добавлен:
15.04.2019
Размер:
99.25 Кб
Скачать

33 Билет. Передача параметров-функций в подпрограмму.

Передача имени функции как параметра в другую функцию? вроде то..

Для того, чтобы функцию использовать как подпрограмму необходимо описать тип этой функции.

double (*fun) (double,double);

тип функции, возвращающей результат типа double и имеем два параметра типа double.

Если описание функции сложное то можно использовать typedef для улучшения читаемости программы:

typedef double (*pfun) (double,double);

теперь тип pfun можно использовать для описания параметров функции также как и стандартные типы для описания переменных.

например

void fun1 (pfun2,int x, double y) , здесь fun2 - имя функции типа pfun является параметром функции а x,y - простые переменные int и double.

Пример. Печать таблиц значения функции, на примере вычисления с точностью eps функции гиперболического косинуса cosh для аргумента x изменяемого в заданных пределах xn, xk с заданным шагом dx :

#include <stdio.h>

#include <math.h>

typedef double (*Tfun) (double, double);

// прототип функции pritn_tab и cosh

void print_tab ( Tfun ff, const double xn, const double xk, const double dx, const double eps);

double cosh (const double x, const double eps);

// oсновная программа

int main () {

double xn, xk, dx, eps;

printf (''enter xn ,xk, dx, eps \n'');

scanf (''%lf%lf",&xn,&xk,&dx,&eps);

print_tab (cosh, xn, xk, dx, eps);

return 0; }

// опр функции print_tab

void print_tab (Tfun ff, const double xn, const double xk, const double dx, const double eps) {

print ("------------------------------------\n");

print ("| x | y |\n");

print ("------------------------------------\n");

for (double x=xn; x<= xk; x=x+dx );

print ("| %9.2f | %14.bg | \n",x,ff(x,eps)|;

print ("------------------------------------- \n");

}

\\ Определение функции cosh :

{double cosh (const double x, const double eps);

const int max_iter = 500;double ch=1, y= ch;

for (int n = 0 ; fabs (ch)>eps; n++)

{ch *=x*x/ (2*n+1)/ (2*n+2); y+=ch;

if (n> max_iter) {printf " ряд расход. \n")l

return 0;};}

return y;

}

сам в шоке с того что написал. понятия не имею что надо а что не надо в этих программах.

34 Билет. Рекурсивные функции. Примеры.

Рекурсивные функции.

Ограниченный объект или явление, внутри которого содержится подобный ему объект или явление.

В математике существует рекурсивное определение, а в информатике - рекурсивные функции.

В программе функцию называют рекурсивной если она обращается к самой себе на прямую или через серию других подпрограмм ( такие функции называются косвенно рекурсивными).

Если функция вызывает саму себя то в стеке сохраняется копия значений её параметров как при вызове обычной функции, и управление передается первому оператору тела функции.

При следующем обращении к самой себе параметры снова сохраняются в стеке, и так до тех пор, пока значение параметров не станет таким, что вычисление алгоритма пойдет не по рекурсивной ветви.

Пример. Функция принимает в себя число, а потом печатает и декрементирует его, пока оно не закончится.

#include <iostream>

#include <cstdlib>

using namespace std;

void function(int n)

{ cout << n <<endl;

n--;

if(n > 0) function(n); }

int main()

{

function(9);

system("PAUSE");

return 0;

}

пример взят с какого то сайта так что не уверен стоит ли его демонстрировать в ответе на билет.

еще один пример

Примеры реализаций рекурсивных функций для вычисления факториала.

int factorial(int n) {

if ( n <= 1 ) {

return 1;

}

return n * factorial(n - 1);