Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 Курс / Практика / metodichka_u_praktika.doc
Скачиваний:
3
Добавлен:
30.05.2020
Размер:
2.15 Mб
Скачать

Return вираження;

8.2. Передача параметрів

При роботі поважно дотримувати наступне правило: при оголошенні і виклику функції параметри повинні відповідати по кількості, порядку дотримання і типам. Функція може не мати параметрів, в цьому випадку після імені функції обов'язково ставляться круглі дужки. Існує три основні способи передачі параметрів: передача за значенням, засланню або покажчику.

Передача параметрів за значенням

У момент звернення до функції в пам'яті створюються тимчасові змінні з іменами, вказаними в списку параметрів. У тимчасові змінні копіюються значення фактичних параметрів.

Передача параметрів по засланню

При передачі параметрів по засланню передається не значення відповідної змінної, а її адреса. Для вказівки на даний спосіб передачі після імені параметра ставиться символ «&».

Передача параметрів по покажчику

На відміну від передачі по засланню адреса змінної передається у функцію не з використанням операції разадресации (&), а операцією непрямої адресації (*).

8.3. Перевантаження функцій і покажчик на функцію

У С++ допустиме використання декількох функцій з однаковим ім'ям, але різним числом або типами параметрів. Така властивість називається перевантаженням функцій. Переобтяжені функції розрізняються компілятором по типах і числі параметрів.

Оскільки ім'я функції є покажчиком на початок функції в оперативній пам'яті, то можна оголошувати покажчики на функції для подальшого їх використання в програмі.

При оголошенні покажчик повинен повертати того ж типа і мати такі ж аргументи, як і функція, на яку він вказуватиме. Наприклад, покажчик на функцію

double в(double x, int n);

матиме вигляд:

double (*fun)(double, int);

8.4. Приклад виконання роботи

Умова. Вивести на екран таблицю значень функції Y(x)= і її розкладання в ряд S(x)= з точністю ??= 0.001. Вивести число ітерацій, необхідне для досягнення заданої точності.

#include <iostream.h>

#include <math.h>

#include <iomanip.h>

typedef double (*uf)(double, double, int &);

void tabl(double, double, double, double, uf);

double в(double, double, int &);

double s(double, double, int &);

int main()

{

cout << setw(8) <<"x"<< setw(15) <<"y(x) "<< setw(10) << "k" << endl;

tabl(0.1,0.8,0.1,0.001,y);

cout << endl;

cout << setw(8) <<"x"<< setw(15) <<"s(x) "<< setw(10) << "k" <<endl ;

tabl(0.1,0.8,0.1,0.001,s);

return 0;

}

void tabl(double а, double b, double h, double eps, uf fun)

{

int k=0;

double sum;

for (double x=a; x<b+h/2; x+=h)

{

sum=fun(x,eps,k);

cout << setw(8) << x << setw(15) << sum << setw(10) << до << endl;

}

}

double в(double x, double eps, int &k)

{

return sin(x);

}

double s(double x, double eps, int &k)

{

double а,c,sum;

sum=a=c=x;

k=1;

while (fabs(c) >eps)

{

з = pow(x,2)/(2*k*(2*k+1));

а *= -c;

sum += а;

k++;

}

return sum;

}

8.5. Індивідуальні завдання

Вивести на екран таблицю значень функції Y(x) і її розкладання в ряд S(x) з точністю 0,1 таблиць. 8.1. Вивести число ітерацій, необхідне для досягнення заданої точності. Обчислення S(x) і Y(x) оформити у вигляді функцій.

Таблиця 8.1

а

b

S(x)

?

Y(x)

1

2

3

4

5

6

1

–0,9

0,9

10–4

2

0,1

0,9

10–5

3

–0,9

0,9

10–3

Закінчення таблицею. 8.1

1

2

3

4

5

6

4

–3

3

10–4

5

–1

1

10–3

6

–0,9

0,9

10–3

7

–0,5

0,5

10–5

8

–0,3

0,4

10–4

9

–2

2

10–4

10

–0,5

0,5

10–3

11

–1

1,3

10–5

12

1

2,5

10–5

13

–1,5

1,5

10–4

14

–0,8

0,9

10–4

15

–2,5

1,3

10–4

Робота №9

Програмування з використанням рекурсії

9.1. Поняття рекурсії

Вирішити завдання рекурсивно – це означає розкласти її на підзадачі, які потім аналогічним чином (тобто рекурсивно) розбиваються на ще менші підзадачі. На певному рівні підзадачі стають настільки простими, що можуть бути вирішені тривіально.

У рекурсивному алгоритмі поважно передбачити спосіб його зупинки, тобто ввести умову, при якій рекурсивне звернення до функції припиняється.

9.2. Приклад виконання роботи

Умова 1. Написати програму для обчислення двома методами. Один метод обчислює суму без використання рекурсії, інший ( з використанням рекурсії.

#include <iostream.h>

#include <math.h>

double sum(int);

double sumr(int);

int main ()

{

int n;

cout << "vvedite n "; cin >> n;

cout << "s (ne rekurs) = " << sum(n) << endl;

cout << "s (rekurs) = " << sumr(n) << endl;

return 0;

}

double sum(int n)

{

for (double s=0, int i=1; i<=n; i++) s += (pow(i+1,2))/i;

return s;

}

double sumr(int n)

{

if (n==1) return 4;

else return sumr(n-1)+pow(n+1,2)/n;

}

Умова 2. Знайти max (a1 ..., an), розбивши завдання на елементарні підзадачі: max(max (max (a1...an–2), an–1), an) . .

int maxr2(int i)

{

if (i==0) return а[0];

else {

int mx=maxr2(i-1);

if (а[i]>mx) return а[i];

else return mx;

}

}

Умова 3. Завдання про Ханойську башту. Є три стержні s1, s2, s3. На першому з них нанизані n дисків різних діаметрів, створюючих правильну піраміду, – чим вище розташований диск, тим менше його діаметр. Потрібно перемістити всю башту на другий стержень, причому диски можна переносити поодинці, не можна поміщати диск на диск меншого діаметру, для проміжного зберігання можна використовувати третій диск.

void hanr(int n, int s1, int s2, int s3)

{

if (n>0) {