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

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

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

Початок

Введе ння n

a= 5i2 / i+1 s=s+a

Збільшення i на 1

так i<=n?

ні

Вивед

ення cуми s

Кінець

Текст програми:

#include<iostream.h> void main(){

int i,n;

float s,a; //s- сума ряду

s=0;

//a-допоміжна змінна

//обнулення суми

i=1;

 

cout<<"Enter n ="; cin>>n;

do {

a=(float)5*i*i/(i+1); s=s+a; //накопичення суми i=i+1;

} while (i<=n);

cout<< "Summa i=1 to "<<n<<" = "<<s; cin.get();

cin.get();

}

Рисунок 5.4 Блок схема алгоритму програми

Завдання Б. Для прикладу розглянемо функцію

2x,

x 2.5

 

0 x 2.5

y x3 x,

xsin x,

x 0

 

 

аргумент якої змінюється в інтервалі [-π; π] з кроком π/5.

Складемо блок-схему алгоритма (рисунок 5.5).

51

Початок

 

 

 

x=-π

 

 

 

x≤π

ні

 

 

так

 

 

 

x>2.5

ні

x≥0 &&

ні

 

 

x<=2.5

 

так

 

так

 

 

 

 

y=2x

 

y=x3-x

y=xsinx

 

 

Виведен

 

 

 

ня x,y

 

 

 

 

Кінець

 

 

x=x+π/5

 

Рисунок 5.5 Блок-схема алгоритму програми

 

 

Текст програми:

#include<iostream.h>

 

#include<math.h>

 

void main(){

 

float x,y;

 

 

float pi=3.14159;

x>2.5 "<<endl;

cout<<"

|2*x

cout<<"Y=

|x^3-x

0<=x<=2.5 "<<endl;

cout<<"

|x*(sin(x))

x<0 "<<endl;

cout<<"Na vidrizku [-pi;

pi] z krokom pi/5"<<endl;

cout<<"--------------------------------

x

|

y=f(x)

"<<endl;

cout<<"|

|"<<endl;

cout<<"--------------------------------

 

 

 

"<<endl;

52

x=-pi;

while (x<=pi) {

if (x>2.5) y=2*x ; else

if (x>=0&&x<=2.5) y=pow(x,3)-x; else

y=x*sin(x);

cout<<"| "<<x<<"\t| "<<y<<"\t|"<<endl; x=x+pi/5; }

cin.get();

cin.get();

}

Звіт

1.Тема практичної роботи.

2.Мета практичної роботи.

3.Умови завдання.

4.Текст програми.

5.Відповіді на контрольні питання.

6.Висновки.

Контрольні питання

1.Які оператори циклу існують в мові С++?

2.Поясніть як працює оператор while. Який він має формат?

3.Що таке оператор циклу з постумовою? Який вигляд він має?

4.Поясніть алгоритм роботи ітераційного циклу? Який він має формат?

5.Що таке нескінченний цикл? Назвіть приклади.

6.Для чого призначений оператор break?

7.Які дії виконує оператор continue?

53

Практична робота №6

Тема: Програмування з використанням підпрограм в мові С++.

Мета роботи: Оволодіння навиками алгоритмізації і програмування задач з використанням підпрограм користувача різних видів,

оволодіння навиками написання підпрограм і звернення до них, вибору параметрів підпрограм.

Теоретична частина

Визначення функції і звернення до функції.

Функція — це іменована послідовність описів і операторів, що виконує яку-

небудь закінчену дію. Функція може приймати параметри і повертати значення.

Будь-яка програма на C++ складається з функцій, одна з яких повинна мати ім'я main (з неї починається виконання програми). Функція починає виконуватися у момент виклику. Будь-яка функція повинна бути оголошена і визначена. Як і для інших величин, оголошень може бути декілька, а визначення тільки одне.

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

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

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

тип ім’я_функції(специфікація_параметрів)

{тіло_ функції}

Тип функції — це тип результату, який повертає функція. Якщо функція не повертає ніякого результату, то для неї вказується тип void.

Ім'я функції — ідентифікатор, що задається програмістом або main для основної функції.

Специфікації параметрів — це або «порожньо», або список імен формальних параметрів функції з вказівкою типу для кожного з них.

Тіло функції — це або складений оператор, або блок.

54

Тут ми вперше зустрічаємося з поняттям блоку. Ознакою блоку є наявність описів програмних об'єктів (змінних, масивів і так далі), які діють в межах цього

блоку. Блок, як і складений оператор, обмежується фігурними дужками.

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

Зі всякої функції можливе звернення до інших функцій, проте вони завжди є

зовнішніми по відношенню до тієї, що викликає.

Оператором повернення з функції в точку її виклику є оператор return. Він

може використовуватися у функціях в двох формах:

return; або return вираз;

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

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

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

Формат звернення до функції (виклику функції) традиційний:

ім’я_функції(список_фактичних_параметрів)

Проте в С звернення до функції має своєрідне трактування: звернення до функції — це вираз. У цьому виразі круглі дужки грають роль знаку операції, для якої функція і фактичні параметри (аргументи) є операндами. Пріоритет операції

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

Між формальними і фактичними параметрами при виклику функції повинні дотримуватися правила відповідності по послідовності і по типах. Фактичний параметр — це вираз того ж типу, що і у відповідного йому формального параметра.

Стандарт мови С допускає автоматичне перетворення значень фактичних параметрів до типу формальних параметрів. У С++ таке перетворення не передбачене. Тому надалі ми строго слідуватимемо принципу відповідності типів.

55

Необхідно засвоїти ще один найважливіший принцип, що діє в С/С++: передача параметрів при виклику функції відбувається тільки за значенням. Якщо знову проводити аналогію з Паскалем, то це означає, що в С допустимі тільки параметри-

значення (без var).

Тому виконання функції не може змінити значення змінних, вказаних в якості фактичних параметрів.

Правило відповідності по кількості, обов'язкове в Паскалі, в С в деяких випадках може не дотримуватися. Більш того, в С можливі функції із змінним числом параметрів. Прикладом таких функцій є бібліотечні функції printf() і

scanf().

Приклад 6.1.

Потрібно скласти програму знаходження найбільшого значення з трьох величин — max (а,b,c). Для її вирішення можна використовувати допоміжний алгоритм знаходження

максимального значення з двох, оскільки справедлива рівність: max (а, b, c) = max (max (а, b), c).

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

#include <iostream.h> #include<conio.h>

//Визначення допоміжної функції int MAX(int x, int y)

{ if (x>y) return x; else return y; } //Основна функція void main() {

int a,b,c,d; cout<<"Bведіть a,b,c:"; cin>>a>>b>>c; d=MAX(MAX(a,b),c) ;

cout<<"\nmax (a,b,c) = "<<d; getch();

}

Прототип функції.

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

Приклад 6.2.

#include <iostream.h> #include <conio.h>

56

//Прототип функції МАХ int MAX(int, int) ; //Основна функція void main() {

int a,b,c,d; cout<<"Enter a,b,c:"; cin>>a>>b>>c; d=MAX(MAX(a,b) ,c) ;

cout<<"\nmax (a,b,c) = "<<d; getch();

}

//Визначення функції MAX int MAX(int x, int y) { if (x>y) return x;

else return y; }

Тут використаний прототип функції. Прототипом називається попередній опис функції, в якому містяться всі необхідні відомості для правильного звернення до неї: ім'я і тип функції, типи формальних параметрів.

У прототипі імена формальних параметрів вказувати необов'язково (як це зроблено в прикладі 6.2), хоча їх вказівка не є помилковою. Можна було написати і так, як в заголовку визначення функції:

int MAX(int x, int у);

Крапка з комою в кінці прототипу ставиться обов'язково!

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

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

#include <iostream.h> #include <conio.h> //Прототип функції line void line(void); //Основна функція

void main()

{ line (); //Виклик функції line

57

getch();

}

//Визначення функції line void line(void)

{int i;

for(i=0; i<80; i++) cout<<"*"; }

Приклад 6.4. Обчислення найбільшого загального дільника для суми, різниці і добутку двох чисел.

#include <iostream.h> #include<conio.h> #include <math.h>

int NOD2(int,int); void main() {

int a,b,Rez; cout<<"a="; cin>>a; cout<<"b="; cin>>b;

Rez=NOD2(NOD2(a+b,abs(a-b)),a*b); cout<<"NOD ="<<Rez;

getch();}

int NOD2(int M, int N)

{while(M!=N)

{if(M>N) M=M-N;

else N=N-M;

}

return M;

}

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

І в принципі main-функция зовсім не обов'язково повинна мати тип void.

Наприклад, вона може повертати операційній системі ціле значення 1 як ознака благополучного завершення програми і 0 — в «аварійному» випадку. Обробка цих повідомлень буде здійснюватися системними засобами.

58

Використання бібліотечних функцій.

Бібліотечними називаються допоміжні функції, що зберігаються в окремих файлах. Стандартні бібліотеки входять в стандартний комплект системи програмування на С/С++. Крім того, програміст може створювати власні бібліотеки функцій.

Раніше ми вже говорили про те, що для використання стандартних функцій необхідно підключати до програми заголовні файли відповідних бібліотек. Робиться це за допомогою директиви претранслятора #include з вказівкою імені заголовного файлу. Наприклад, #include<stdio.h>. Всі заголовні файли мають розширення h (від англійського header).

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

Розглянемо програму рішення наступної задачі: знаючи декартові координати вершин опуклого чотирикутника, обчислити його площу (рис. 6.1).

Математичне рішення цієї задачі наступне. Позначимо координати вершин чотирикутника так: (х1,у1), (х2,у2), (х3, у3), (х4, у4). Площу чотирикутника можна обчислити як суму площ двох трикутників. У свою чергу, площа кожного трикутника обчислюється за формулою Герона.

Для застосування формули Герона потрібно знайти довжини сторін. Довжина сторони між першою і другою вершинами обчислюється за формулою:

L12 (x1 x2)2 (y1 y2)2

Аналогічно обчислюються довжини інших відрізків.

Рис.6.1

59

Таким чином, для вирішення основного завдання — обчислення площі чотирикутника — потрібний допоміжний алгоритм обчислення площі трикутника,

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

Нижче приведена програма рішення поставленої задачі.

Приклад 6.5.

//Площа опуклого чотирьокутника

#include <iostream.h> #include <math.h> #include <conio.h>

typedef double D; //Перейменування типу double D Line(D,D,D,D); //Прототип функції Line

D Geron(D,D,D,D,D,D); // Прототип функції Geron //Основна функція

void main()

{ D x1,y1,x2,y2,x3,y3,x4,y4,S1234; clrscr();

cout<<"x1= "; cin>>x1; cout<<"y1= "; cin>>y1; cout<<"x2= "; cin>>x2; cout<<"y2= "; cin>>y2; cout<<"x3= "; cin>>x3; cout<<"y3= "; cin>>y3; cout<<"x4= "; cin>>x4; cout<<"y4 = "; cin>>y4;

S1234=Geron(x1,y1,x2,y2,x3,y3)+Geron(x1,y1,x3,y3,x4,y4)

;

cout<<"Площа трикутника="<<S1234; getch();

}

//визначення функції Line D Line(D a,D b,D c,D d) {

return sqrt((a-c)*(a-c)+(b-d)*(b-d));} //визначення функції Geron

D Geron(D a1,D a2,D b1,D b2,D c1,D c2) { D p,ab,bc,ca;

ab=Line(a1,a2,b1,b2); bc=Line(b1,b2,c1,c2) ; ca=Line(c1,c2,a1,a2); p=(ab+bc+ca)/2;

return sqrt(p*(p-ab)*(p-bc)*(p-ca)) ;

}

60