Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МЕТОДИЧКА_С++_Ч1

.pdf
Скачиваний:
30
Добавлен:
15.02.2015
Размер:
955.7 Кб
Скачать

У цій програмі використовуються функції з трьох стандартних бібліотек із заголовними файлами 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