
МЕТОДИЧКА_С++_Ч1
.pdfУ цій програмі використовуються функції з трьох стандартних бібліотек із заголовними файлами iostream.h, math.h і conio.h. З першими двома ми вже зустрічалися раніше. Третя бібліотека (файл conio.h) містить функції,
призначені для управління виводом на екран в символьному режимі. Вона є аналогом модуля CRT в Турбо Паскалі. У програмі з цієї бібліотеки використовується функція clrscr() — очищення екрану.
Ще одним новим елементом в приведеній програмі є рядок
typedef double D;
Службове слово typedef є специфікатор типу, що дозволяє визначати синоніми для позначення типів. В результаті в даній програмі замість довгого слова double для позначення того ж самого типу можна вживати одну букву D. Даний опис діє глобально і розповсюджується як на основну, так і на допоміжні функції.
У функції Geron є звернення до функції Line, а в основній функції — звернення тільки до функції Geron. Для компілятора важливо, щоб перед викликаючою функцією був присутній або прототип, або визначення викликаємої функції. Тому якщо з даної програми прибрати прототип функції Line, то помилки не буде. Але якщо одночасно з цим поміняти місцями визначення функцій Line і Geron, то компілятор видасть повідомлення про помилку.
Рекурсивні визначення функцій.
В мовах С/С++ допускається рекурсивне визначення функцій. Проілюструємо визначення рекурсивної функції на класичному прикладі обчислення факторіалу цілого позитивного числа.
long Factor(int n) {
if (n<0) return 0;
if (n==0) return 1;
return n*Factor(n-1);
}
У випадку якщо при виклику функції буде заданий негативний аргумент, вона поверне нульове значення — ознаку невірного звернення.
61
Передача значень через глобальні змінні. Областю дії опису програмного об'єкту називається частина програми, в межах якої діє (враховується) цей опис.
Якщо змінна описана в середині деякого блоку, то вона локалізована в цьому блоці і з других блоків, зовнішніх по відношенню до даного, «невидима».
Якщо опис змінною знаходиться поза блоком і передує йому в тексті програми,
то цей опис діє усередині блоку і називається глобальним. Глобальна змінна
«видна» з блоку. Наприклад:
double х; |
} |
int func1 () {int у;... |
void main() { float у;...}
Змінна х є глобальною по відношенню до функцій func1, main і, отже,
може в них використовуватися.
У функціях func1 і main є локальні змінні з однаковим ім'ям у. Проте це різні величини, ніяк не зв'язані один з одним. Оскільки змінна х є загальною для обох функцій, то вони можуть взаємодіяти через х один з одним.
При зверненні до функції передача значень можлива як через параметри, так і через глобальні змінні. Використовуючи цей механізм, в програмах на С можна реалізовувати функції, що працюють подібно до процедур в Паскалі. У наступній програмі вирішується завдання отримання найбільшого з трьох значень, яка раніше розглядалася.
Приклад 6.6.
int z; //Опис глобальної змінної void MAX(int x, int y)
{if (x>y) z=x; else z=y;} #include <iostream.h> #include<conio.h>
void main()
{int a,b,c; cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"c="; cin>>c; MAX(a,b); MAX(z,c);
cout<<"max="<<z;
getch();
}
62
Результат виконання функції MAX заноситься в глобальну змінну z, яка
«видна» також і з основної функції. Тому при другому зверненні ця змінна грає одночасно роль аргументу і результату. Тут оператор звернення до функції виглядає подібно до звернення до процедури в Паскалі, а глобальна змінна z грає роль var-
параметра.
Класи пам'яті. Під всяку змінну, яка використовується в програмі, повинне бути виділене місце в пам'яті ЕОМ. Виділення пам'яті може відбуватися або на стадії компіляції (компоновки) програми, або під час її виконання. Існують 4 класи пам'яті, що виділяється під змінні:
Автоматична (ключове слово auto );
Зовнішня (extern);
Статична (static);
Регістрова (register).
Під глобальні змінні виділяється місце в зовнішній пам'яті (не потрібно думати,
що мова йде про магнітну пам'ять; це оперативна пам'ять класу extern). Глобальну змінну можна оголосити або поза програмними блоками, або усередині блоку з ключовим словом extern.
Зазвичай це робиться в тих випадках, коли програмний модуль зберігається в окремому файлі і, отже, окремо компілюється.
Нехай, наприклад, основна і допоміжна функції зберігаються в різних файлах.
Приклад 6.7.
Файл 1: |
Файл 2: |
. . . |
void func() |
int var |
|
void main () {var=5; |
{ |
func() ; |
extern int var; |
cout<<var; |
var=10*var; |
} |
} |
|
|
Тут обмін значеннями між основною і допоміжною функцією func()
відбувається через загальну глобальну змінну var, для якої під час компіляції виділяється місце в зовнішньому розділі пам'яті. В результаті виконання даної програми на екран виведеться число 50.
63
Локальні змінні, оголошені всередині блоків, розподіляються в автоматичній пам'яті, що працює за принципом стеку. Виділення пам'яті відбувається при вході виконання програми в блок, а при виході з блоку пам'ять звільняється. Ключове слово auto писати необов'язково (мається на увазі за умовчанням).
Статична пам'ять виділяється під змінні, локалізовані в середині блоку, але на відміну від автоматичної пам'яті не звільняється при виході з блоку. Таким чином,
при повторному входженні в блок статична змінна зберігає своє колишнє значення.
Приклад оголошення статичної змінної:
f()
{static int schet=10; ...}
Ініціалізація статичної змінної відбувається тільки при першому входженні в блок. Якщо ініціалізація явно не вказана, то змінній автоматично привласнюється нульове початкове значення. Статичні змінні можна використовувати, наприклад,
для організації лічильника числа входжень в блок.
Регістрова пам'ять виділяється під локальні змінні. Регістри процесора — найшвидший і найменший вид пам'яті. Вони задіяні при виконанні практично всіх операцій в програмі. Тому можливість розпоряджатися регістровою пам'яттю краще залишити за компілятором.
Нарешті розглянемо приклад, в якому використовуються різні способи опису змінних.
Приклад 6.8. |
//описана зовнішня змінна var |
int var |
main ()
{extern int var; // та сама зовнішня змінна var
. . . |
|
|
} |
() |
|
func1 |
|
|
{extern int var1;//нова зовнішня змінна var1 |
||
. . . |
|
//зовнішня var тут теж видима |
} |
() |
|
func2 |
//тут змінна var видима, а змінна |
|
{... |
|
|
} |
|
// var1 не видима |
int var1; |
//глобально описана змінна var1 |
|
func3 |
() |
//тут var — локальна змінна , |
{ int |
var; |
64

. . . |
//видима зовнішня змінна var1 |
|
} |
() |
|
func4 |
//тут var1 — локальна змінна, |
|
{auto |
int var1; |
|
. . . |
|
//видима зовнішня глобальна var |
} |
|
|
Послідовність виконання роботи
1.Уважно ознайомтеся з теоретичним матеріалом щодо виконання практичної роботи.
2.Вивчити :
правила запису підпрограм різних видів і способів звернення до них;
способи передачі параметрів в підпрограму;
правила запису програм, які використовують підпрограми різних видів;
порядок виконання програм, які використовують підпрограми.
3.Розробити алгоритм рішення у відповідності з завданням.
4.Скласти програму рішення задачі.
5.Оформити звіт по практичній роботі. Звіт повинен містити: тему, мету,
постановку задачі, алгоритм програми, текст програми і результати роботи програми.
Завдання до практичної роботи
Скласти програму обчислення функції, y=f(x,y), використовуючи звернення до підпрограми. Вигляд функції z та функції, до якої звертаючись за допомогою підпрограми, задано в таблиці 6.1.
Таблиця 6.1. Варіанти індивідуальних завдань.
вар. |
Вид функції |
Підпрограма-функція |
№ |
|
|
1. |
z |
log2 |
x logb y |
|
|
|
|
logu |
v |
lnv |
|
|
logb2 2 (x y) |
|
|
|
|
lnu |
|
||||||
|
|
|
|
|
|
|
|
|
||||
2. |
z xe |
2x |
(1 ax a |
2 |
x |
2 |
) |
p cy |
|
|||
|
|
|
|
|
|
|
65

Продовження таблиці 6.1.
вар. |
Вид функції |
№ |
|
|
|
|
|
|
x2 |
|
|
x2 |
|
|
|
|
|
x2 |
|
||||||||||||||||||||||||
3. |
z |
|
|
|
|
|
|
|
tg |
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
||||||||||||||
2 |
|
2 |
|
2 |
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
4. |
z |
|
|
|
|
|
|
a2 b2 c2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
3 |
|
n2 |
m2 k2 |
|
|
|
|
||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
z |
ln(1 a |
|
|
|
|
|
|
|
|
|
|
|
|
) |
|
|
|
|
|
|||||||||||||||||||
5. |
|
|
1 a2 |
|
|
|
|
||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
2.78 b 1 b2 |
|
|
|
|
||||||||||||||||||||||||||||||
6. |
z |
|
|
|
|
|
|
|
|
ex (1 cos2a) |
|
|
|
|
|||||||||||||||||||||||||
1 cos2 |
2b cos4 2c |
||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
arctg |
x a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
7. |
z |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lna |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
1 3 |
|
sin |
x b |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lnb |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
8. |
z |
|
|
|
xlog3 x ylog5 y |
|
|||||||||||||||||||||||||||||||||
|
|
|
alogb a bloga b |
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
9. |
z |
|
|
|
|
|
|
|
|
|
|
|
|
ln2 (a x2 ) |
|||||||||||||||||||||||||
b2 ln2 (a x) ln4 (a x2 ) |
|||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
z |
|
|
|
|
a lna |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
10. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
5 |
|
(b lnb)3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
11. |
z |
x lna |
sin |
x lna |
|
||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
ln2 x |
|
|
|
|
|
|
|
|
|
|
ln2 |
x |
12.z y2 a2 ln(x2 a2 )
sin y |
sin x |
13.z ln2 (ax 1) ln2 (bx 1)
2sin x |
2cosx |
Підпрограма-функція
q x2
2
r 2 2 2
y x1 x2
y cos2x
p u v lnv
log |
|
v |
lnv |
|
u |
lnu |
|||
|
|
y ln2 (u v2 )
t u lnu
t u lnv ln2 u
r u2 b2 sinu
p ln2 (ux 1)
66

Приклад виконання завдання:
Скласти програму обчислення z |
Sh2a Sh(a b) |
|
, використовуючи процедуру |
|
|
|
|
||
|
Sha |
Sh(a2 b2 ) |
Sh ex e x .
2
Програмна реалізація:
#include <iostream.h> #include <math.h> #include <conio.h> //Прототип функції sh float sh(float) ; //Основна функція void main() {
float a,b,z,t1,t2,t3; cout<<"Enter a= "; cin>>a; cout<<"\nEnter b= "; cin>>b;
t1=sh(a); t2=sh(a-b); t3=sh(a*a-b*b);
z=(t1*t1+t2)/(t1+sqrt(t3)); cout<<"\n z = "<<z; getch();
}
//Визначення функції sh float sh(float x) { float r; r=(exp(x)-exp(-x))/2.0; return r;
}
Звіт
1.Тема практичної роботи.
2.Мета практичної роботи.
3.Умови завдання.
4.Намалюваний алгоритм у вигляді блок-схеми програми.
5.Текст програми.
6.Відповіді на контрольні питання.
7.Висновки.
67
Контрольні питання
1.Як визначаються функції в мові С++?
2.Для чого використовується оператор return? Які форми цього оператори ви знаєте?
3.Як викликається функція в мові С++?
4.Що таке формальні і фактичні параметри?
5.Який результат виконання цієї програми?
#include <iostream.h> void mul(int,int); int S;
void main() { int a=2,b=3; mul(a,b); a=2*S; mul(a,b); cout<<S; cin.get();}
void mul(int x,int y) {S=x*y;}
6.Як можна скористатися бібліотечними функціями в мові С++?
7.Які класи пам’яті використовуються при написанні програм С++?
68