Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod_pract_OTP-2004-ukr.doc
Скачиваний:
2
Добавлен:
17.11.2019
Размер:
964.1 Кб
Скачать

4 Розв’язання задач із використанням функцій

4.1 Мета роботи

Вивчити і освоїти засоби складання функцій і звернення до них при розв’язанні задач на мові С++.

4.2 Підготовка до роботи

Вивчити правила складання функцій. Необхідно знати засоби організації взаємодії основної програми (функції main) і функції, що визначається користувачем [1, с. 97–112; 2, ç. 67–77; конспект лекцій].

Функція в C++ – це логічна самостійна частина, що має окреме ім’я програми, складається з нуля (в протилежному випадку) або більше операторів, об'єднаних в виконуємий модуль для розв’язання певної задачі. Стандарт мови обумовлює такий формат визначення функції:

[тип] им’я_функції (список формальних параметрів.|void)

{

[опис даних]

[оператори тіла функції]

[return] [вираз]

},

де специфікація тип задає тип значення функції, що обертається. Якщо зазначення типу буде відсутнє, то вважається, що функція повертає значення int. Якщо замість типу є ключове слово void, то вважається, що функція не повертає у викликаючу програму жодного значення. Особливий випадок, коли використовується тип void* – родовий покажчик. В цьому випадку результатом роботи функції є покажчик.

Ім’я_функції – ідентифікатор довільного вигляду, що є покажчиком на функцію, значення якого дорівнює адресі точки входу в функцію.

Список формальних параметрів – це послідовність оголошень формальних параметрів, поділених комами. В C++ допускається використання функцій без формальних параметрів. Такий випадок виникає, коли у функцію не передаються жодні аргументи. Тоді поле формальних параметрів може бути порожнім, або містити ключове слово void. Допускається визначення формальних параметрів за замовчанням (див. нижче.).

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

Опис даних і оператори тіла функції є послідовністю операторів, що забезпечують розв’язання функціональної задачі.

Оператор return – необ’язковий оператор, що забезпечує вихід з функції.

Якщо оператор return використовується спільно з вираженням, то вихід із функції супроводжується передачею обчисленого значення в точку виклика. Тип результату має співпадати або бути сумісним з типом функції. За відсутності оператора return вихід із функції відбувається після виконання останнього оператора в тілі функції.

4.3 Область існування й видимість змінних. Класи пам’яті.

Якщо клас пам'яті в операторах оголошення не зазначений, то компілятор визначає його автоматично в залежності від місця його використання. Так змінна, проголошена всередині функції, інтерпретується компілятором як автоматична (локальна auto), видимість якої залежить від версії, а час існування обмежений часом тривалості функції. Автоматичні змінні, проголошені для версії С++5, видимі від місця оголошення до кінцевого оператора (заключної фігурної дужки), а для версій 3.11.. 4.5 видимість змінних визначається від місця оголошення в складеному операторі до кінцевого оператора (заключної фігурної дужки складеного оператора).

Змінна, певна до функції main (проголошена поза тілом функцій) інтерпретується компілятором як extern (зовнішня), і доступна будь–якій функції програми даного файлу. При цьому, якщо в програмі водночас присутня локальна і глобальна змінна з одним і тим же ім'ям, то діє правило локалізації ідентифікаторів. Згідно цьому правилу в функції, де визначена локальна змінна, буде недосяжна глобальна змінна з тим же ім'ям.

В залежності від явного або неявного оголошення класу пам'яті static (статична) компілятор С++ реагує по–різному. При явному оголошенні змінних з префіксом static вони містяться в сегменті даних і час їхнього існування обмежений часом виконання програми. При цьому, якщо ці змінні проголошені поза функціями, то вони є глобальними і доступні будь–якій функції у межах файлу, де було вироблене оголошення, і недосяжні з інших файлів проекту програми. При оголошенні змінних всередині функцій вони також містяться в сегменті даних з тим же часом «життя», що і глобальні, але по суті вони залишаються локальними і доступні лише всередині функції.

В С++ 5 версії введені більш жорсткі обмеження на область існування змінних. Наприклад, якщо змінна проголошена всередині дужок циклу for, то область існування проголошеної змінної обмежена цим операторним блоком, а для версій нижче С++ 5 область існування простирається від оголошення цієї змінної до кінця файлу. Цей факт призводить до необхідності зміни вхідного тексту програми.

4.4. Організація взаємодії функцій у программі

Як було визначено вище, елементарною одиницею програми на мові C є функція. Функція визначена для розв’язання певної задачі різноманітного ступеня складності. Функції, призначені для розв’язання складних задач, можуть в свою чергу містити звернення до довільного числа функцій, призначених для розв’язання менш складних задач. Таким чином, розв’язання задачі на мові C припускає її функціональну декомпозицію, коли функції більш високого рівня забезпечують даними і сприймають результат функцій більш низького рівня.

В C++ визначено декілька засобів передачі параметрів функції і отримання результатів обчислення функції, що викликається середою. Існує чотири засоби передачі параметрів функції: виклик функції з передачею значень; виклик функції з передачею адрес змінних; виклик функції з використанням механізму посилань під час передачі параметрів; шляхом глобальних параметрів.

Виклик функції з передачею значень. Цей засіб передачі параметрів забезпечує передачу копій змінних в стек, що утворюється під час активізації функції. При цьому забезпечується захист самих змінних від їхньої зміни в функції. Наприклад:

#include<iostream. h>

int sum (int, int);

void mane (void)

{int a, b, c;

cin >> a >> b;

c=sum (a, b);//передача параметрів значень

cout << c << endl;

}

int sum (int d, int l)

{

int f;

f=d+l;

return f;//результат передається в крапку виклику

}

Виклик функції з передачею адрес. Цей засіб передачі параметрів забезпечує передачу в стек адрес що передаються даними. Це дозволяє функції працювати безпосередньо з даними.

#include<iostream. h>

sum (int, int, int*);

void main ()

{int a, b, c=0;

cin>>a>>b;

sum (a, b, &c);

cout<<c<<endl;

}

void sum (intd, intl, int*f)

{*f=d+l}

Виклик функцій з використанням механізму посилань. Цей засіб забезпечує доступ до параметрів, що передаються шляхом визначення їхнього альтернативного імені. Наприклад :

#include<iostream. h>

void sum (int, int, int&);

void main ()

{int a, b, c=0;

cin >> a >> b;

sum (a, b, c);

cout << c << endl;

}

void sum (int d, int l, int &f)

{

f=d+l;

}

Виклик функції з передачею даних шляхом глобальних параметрів. Цей засіб забезпечує передачу вхідних даних в функцію і повернення результату обчислень шляхом використання глобальних параметрів. Наприклад :

#include <iostream. h>

int a, b, c;

sum ();

main ()

{

cin >> a >> b;

sum ();

cout<<c<<endl;

}

sum ()

{c=a+b;//a, b, c – глобальні змінні

}

Виклик функції з передачею аргументів за замовчанням. В мові С++ можливе передавання значень аргументів функції за замовчанням. Цей засіб передавання значень параметрів використовується в тому випадку, коли необхідно передати тільки частину значень параметрів, а не всіх. Оголошення значень функції за замовчанням відбувається шляхом вказівки значень аргументів в прототипі функції шляхом оператора привласнення.

#include<iostream. h>

float ur (float x, float a=0., float b=0., float c=0.);

int main ()

{float a=1., b=2., c=3., x=0. 5, y;

y=ur (x, a, b, c);

cout<<”введені всі аргументи”<<"\n";

cout<<y<<"\n";

y=ur (x, a, b);

cout<<”введені x, a і b”<<"\n";

cout<<y<<"\n";

y=ur (x);

cout<<”введено x”<<"\n";

cout<<y<<"\n";

cin>>a;

}

float ur (float x, float a, float b, float c)

{

return a*x*x+b*x+c;

}

На екрані дисплею ми отримаємо такі результати роботи наведеної вище програми:

Введені всі аргументи

4.25

Введені x, a і b

1.25

Введено x

0

Функції inline. В мові С++ знайшли широке застосування вбудовані функції (inline). Ці функції вбудовуються, в місцях виклику цих функцій, в робочий код програми на етапі компіляції, що забезпечує економію часу, яка витрачається на виклик функції.

Визначення вбудованих функцій відрізняється від описаних вище тільки наявністю зарезервованого слова «inline» перед ідентифікатором типу функції, при її описанні.

Слід знати: не всі функції, що вбудовуються, компілятор справді визначить як вбудовані.

#include<iostream. h>

inline float ur (float x, float a=0., float b=0., float c=0.);

int main ()

{float a=1., b=2., c=3., x=0. 5, y;

y=ur (x, a, b, c);

cout<<'введені всі аргументи'<<"\n";

cout<<y<<"\n";

y=ur (x, a, b);

cout<<”введені x, a і b”<<"\n";

cout<<y<<"\n";

y=ur (x);

cout<<”введено x”<<"\n";

cout<<y<<"\n";

cin>>a;

return 0;

}

inline float ur (float x, float a, float b, float c)

{

return a*x*x+b*x+c;

}

В мові C++ допустима рекурсія. Рекурсія – це засіб організації обчислювального процесу, при якому процедура або функція може обертатися сама до собе:

#include<iostream. h>

#include<stdio. h>

#define b=16

int n=6;

int a [6];

int i, j, l, r=6;

void swap (int*, int*);

void quicksort (int, int);

void part (int, int, int&, int&);

void main ()

{

for (int k=1; k<=n; k++) {

cout<<''введіть а [‘'<<k<<'’] вхідного масиву\n'’;

cin>>a [k];

}

quicksort (1, n);

for (k=1; k<=n; k++) {

printf (‘'a [%d]=%d\n'’, k, a [k]);}

cin>>k;

}

void swap (int* p, int* q)

{

int prom;

prom=*p; *p=*q; *q=prom;

}

void quicksort (int l, int r)

{int i, j;

i=l; j=r;

{part (l, r, i, j);

if (i<r) quicksort (i, r);

if (j>l) quicksort (l, j);

}

}

void part (int l, int r, int &i, int &j)

{

int x;//i, j;

i=l; j=r; x= (l+r)/2;

do{

while (a [i] <a [x]) i++;

while (a [j] >a [x]) j – –;

if (i<=j)

{swap (&a [i], &a [j]);

i++; j – –;}

} while (i<j);

}

4.5 Варіанти індивідуальних завдань до лабораторної роботи 4

1. Обчислити

F=

2. Обчислити

Y= де , ,

,

3. Обчислити

Z=

якщо , де a=2. 5, b=4. 8, c=4. 2.

4. Обчислити

де ; ; ; ;,

якщо

5. Обчислити

A= , де , , ,

якщо .

6. Обчислити

B= , де , , , ,

якщо .

7. Обчислити

, де , x= (0.34; 0.56; 1; 3), y= (0.76; 0.12; 2; 4)

якщо

8. Обчислити

, де a=6. 1; b=4. 3; c= (6; 7.6; 9.5)

якщо .

9. Обчислити

, де , x= (0.1; 0.12; 4), y= (3.2; 8.39; 3),

якщо .

10. Обчислити

, де ; ; ;,

якщо .

11. Обчислити

, де ; ; ;,

якщо .

12. Обчислити

, де ; ; ;,

якщо .

13. Обчислити

y= , де ; ; ;,

де .

14. Обчислити найменші значення кожної з трьох функцій

; ; ; якщо .

15. Обчислити

, де ; ; ;,

якщо .

16. Обчислити значення індексів, відповідних найбільшому елементу кожної з трьох довільно заданих матриць A[5][5], B[5][5], C[5][5].

17. Обчислити номер i, для якого кожна з функцій

, , визначена на дискретній множині ( ), набуває найменшого значення.

18. Обчислити номери i, для кожного з яких функцій

,

визначені на дискретній множині (c= (0.1; 0.3; 0.5; 0.9), , ) набувають найбільшого значення.

19. Обчислити найбільші значення кожної з трьох функцій

, , ,

на дискретній множині ( ; ; ).

20. Обчислити

де ; ; c= (6; 7.6; 9.5),

якщо .

21. Визначити середні значення елементів, розташованих нижче побічної діагоналі матриць F[5][5], G[5][5], S[5][5].

22. Обчислити

, де ; ; ;

де .

23. Обчислити

, де , x= (0.1; 0.5; 4), y= (2.2; 8.39; 3),

якщо .

24. Обчислити

Z=

якщо , де a=1. 5, b=3. 5, c=2. 2.

25. Обчислити

, де ; ; ;,

якщо .

26.Обчислити

Z=

якщо y(x)=x5*sin2(1/x), де a=1.5 ,b=2.8 ,c=4.2.

27. Обчислити

, де x1=ln(2.3); x2=sin(1.2); x3=1; ,

якщо .

28. Обчислити

B= , де a , ha=1, b=2.8 , c=3.2 ,

якщо f(x)=3x2+arctg x .

29. Обчислити

, де , x=(0.5;0.12;4) , y=(3.2;8.39; 3),

якщо .

30. Обчислити

y =f(x1)+f(x2)/f(x3) , де x1=a2+5; x2=3.14; x3=0; ,

якщо f(x)= .

4.6 Контрольні запитання та завдання

1. Назвіть основні правила складання функцій.

2. Пояснити призначення оператора return.

3. Які типи функцій підтримуються мовою C++?

4. Яке місце розташування функції по відношенню до основної програми.

5. Які типи формальних і фактичних параметрів підтримуються мовою C++?