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

C _Учебник_МОНУ

.pdf
Скачиваний:
199
Добавлен:
12.05.2015
Размер:
11.12 Mб
Скачать

Програмування базових алгоритмів

89

#include "Unit1.h"

#pragma package(smart_init) #pragma resource "*.dfm"

#include <math.h> // Долучення математичної бібліотеки

TForm1 *Form1; //----------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)

{

}

//----------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender) // “Розв‟язок” {float y, x=StrToFloat(Edit1->Text); // Ввведення x з Edit1 y=(0.2*x*x-x)/((sqrt(3)+x)*(1+2*x))+2*pow(x-1,3)/(pow(sin(x),2)+1);

Edit2->Text=FloatToStr(y);

// Виведення y в Edit2

}

 

//----------------------------------------------------------

 

void __fastcall TForm1::Button2Click(TObject *Sender) // “Очищення”

{ Edit1->Clear(); Edit2->Clear();

// Очищує вікна Edit1 та Edit2

Edit1->SetFocus();

// Встановлює курсор (фокус) в Edit1

}

 

//----------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender) // “Вихід” { Close();

}

4) Перед запуском на виконання програмний проект слід зберегти в

окремій теці командою File / SaveAll (чи то через ярлик , чи клавішами <Shift>+<Ctrl>+<S>). Унаслідок цих дій почергово з‟являться два діалогових вікна, в яких слід у власно створеному новому каталозі зберегти і Unit і Project.

5) Для запуску проекту слід виконати команду меню Run / Run чи то натиснути на клавіатурі кнопку <F9>. Має з‟явитися форма проекту, зображена на стор. 82 (це означає що, що програму написано без фізичних помилок). Якщо в перебігу створювання програми було припущено помилок, то рядок з помилкою висвітиться червоним кольором, а повідомлення компілятора, розташоване під вікном редактора коду, повідомить, якої саме помилки було припущено.

Приклади повідомлень щодо можливих помилок (детальніше про помилки див. розд. 15):

statement missing; – попередній оператор не завершено крапкою з комою (;); undefined symbol “X” – є невідомий символ, тобто для X не визначено тип; call to undefined function „sin‟ – виклик невизначеної функції, тобто не до-

лучено бібліотеку математичних функцій;

compound statement missing } – відсутня операторна дужка }.

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

90

Розділ 4

Приклад 4.2 Розробити схему алгоритму і програмний проект для обчис-

 

 

 

 

x arctg b2

b m і

 

 

 

 

 

 

 

 

 

лення y 3

sin 2 mp

;

p cos e

 

b x

 

lg

 

x b

 

2 . Зна-

 

 

 

 

bx p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чення m=7.4 задати як константу, а значення змінної b ввести за допомогою компонента Edit.

Розв‟язок. Блок-схема розв‟язування задачі і робочий вигляд форми мають вигляд:

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

Початок

m=7.4

Введення b

x arctg b2 b m

p cos e b x lg x b 2

sin 2 mp y 3

bx p

Виведення

х, p, y

Кінець

#include <math.h> // Математична бібліотека

//--------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender) // “Розв‟язок”

{const float m=7.4; float b, x, p, y;

b=StrToFloat(Edit1->Text); x=atan(b*b+sqrt(b+m)); p=cos(pow(exp(fabs(b-x))- log10(fabs(x-b)),2)); y=pow(pow(sin(m*p-M_PI),2)/(b*x+p),1./3); Edit2->Text=FloatToStr(x);

Edit3->Text=FloatToStr(p);

Edit4->Text=FloatToStr(y);

}

//---------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender) // “Очищення” { Edit1->Clear(); Edit2->Clear();

Edit3->Clear(); Edit4->Clear();

}

//----------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender) // “Вихід” { Close();

}

Програмування базових алгоритмів

 

 

 

 

 

 

 

91

Приклад 4.3 Розробити схему алгоритму і створити програмний проект в

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

3 1.5a

 

3

 

x

 

 

 

 

 

 

 

 

 

ax

 

 

 

sin

x

arctg

 

 

 

 

 

С++ Builder для обчислення y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

, де х, а − довільні

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

 

 

e

lg3 0.5 x2

3

 

2

 

 

 

 

 

 

ln

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

змінні, які ввести з форми.

Розв‟язок. Блок-схема розв‟язування задачі і робочий вигляд форми мають вигляд:

Початок

Введення x, а

Обчислення y

Виведення y

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

Кінець

#include <math.h>

void __fastcall TForm1::Button1Click(TObject *Sender)

{double a, x, y; x=StrToFloat(Edit1->Text); a=StrToFloat(Edit2->Text); y=pow(pow(sin(pow(x, 1.5*a)), 3) +

pow(atan(sqrt(fabs(x + sqrt(a*x)))), 3), 4) / (log(fabs(x) + exp(sqrt(pow(log10(pow(0.5* x*x, 3)), 3)))) + x*x);

Edit3->Text=FloatToStr(y);

}

Приклад 4.4 Обчислити роботу електричного струму на ділянці кола за

формулою A U 2 t, де опір R = 12 Ом, час t = 7 с, а значення напруги U ввести

R

з клавіатури.

Текст програмного коду:

void __fastcall TForm1::Button1Click(TObject *Sender)

{float R=12, A, t=7, U;

//Введення значення напруги U

U=StrToFloat(Edit1->Text);

//Обчислення роботи електричного струму

A=pow(U,2)/R *t;

//Виведення результату

Edit2->Text=FloatToStr(A);

}

92

 

 

Розділ 4

 

 

 

 

Приклад 4.5

Обчислити ємність конденсатора за формулою C

0 S

,

 

 

 

 

d

 

де

0

8.85 10 12

Ф/м, 2.8 Ф/м, S – площа кожної пластини конденсатора,

 

 

 

 

 

d – відстань між пластинами, значення яких увести з клавіатури.

Текст програмного коду:

void __fastcall TForm1::Button1Click(TObject *Sender)

{const double E0=8.85e-12, E=2.8; double d, S, C;

//Уведення d – відстані між пластинами d=StrToFloat(Edit1->Text);

//Уведення S – площі пластини конденсатора

S=StrToFloat(Edit2->Text);

//Обчислення ємності конденсатора

C=(E0*E*S)/d;

//Виведення результату

Edit3->Text=FloatToStr(С);

}

Приклад 4.6 Обчислити ослаблення T-образного резисторного атенюатора за формулою

A 20 lg (1 a R1/ R2) b R3 R1,

C

для якої значення опорів R1, R2, R3, Z1, Z2 увести з клавіатури, а частотні коефіцієнти обчислити за формулами:

a 1

Z1

;

b 1

Z 2

;

C Z1 Z 2.

R1

R2

 

 

 

 

 

Текст програмного коду:

void __fastcall TForm1::Button1Click(TObject *Sender)

{float R1,R2,R3,Z1,Z2, a,b,C,A; R1=StrToFloat(Edit1->Text); R2=StrToFloat(Edit2->Text); R3=StrToFloat(Edit3->Text); Z1=StrToFloat(Edit4->Text); Z2=StrToFloat(Edit5->Text);

//Обчислення частотних коефіцієнтів a, b, C a=1+(Z1/R1);

b=1+(Z2/R2);

C=Z1+Z2;

//Обчислення затухання

A= 20*log10(((1+a*R1/R2)*b*R3+R1)/C); // Виведення результату

Edit6->Text = FloatToStr(A);

}

Програмування базових алгоритмів

93

Приклад 4.7 Створити проект для обчислення опору електричного кола, яке складається з двох поєднаних опорів, у два варіанти: 1) за паралельного з‟єднання опорів та 2) за послідовного з‟єднання опорів в електричному колі.

Розв‟язок. Нагадаємо, що формула для обчислення опору електричного

кола за паралельного з‟єднання опорів має вигляд R r1 r2 , а за послідовного r1 r2

з‟єднання опорів – R =r1 + r2.

Обчислення для двох випадків сформуємо у програмі у двох окремих командних кнопках:

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

// Обчислити для паралельного з‟єднання

void __fastcall TForm1::Button1Click(TObject *Sender)

{float r1, r2, R; r1=StrToFloat(Edit1->Text); r2=StrToFloat(Edit2->Text);

R=r1*r2/(r1+r2); Edit3->Text=FloatToStr(R);

}

// Обчислити для послідовного з‟єднання

void __fastcall TForm1::Button2Click(TObject *Sender)

{ float R, r1=StrToFloat(Edit1->Text), r2=StrToFloat(Edit2->Text); R=r1+r2;

Edit3->Text=FloatToStr(R);

}

Приклад 4.8 Створити програмний проект для обчислення величини прибутку по банківським вкладам залежно від процентної ставки (% річних) і терміна зберігання (кількість днів), значення яких задаються користувачем.

94

Розділ 4

Текст програмного коду:

void __fastcall TForm1::Button1Click(TObject *Sender)

 

 

 

{ float stavka, t, sum, pr;

 

 

 

 

stavka=StrToFloat(Edit1->Text);

// Процентна ставка

 

 

 

t=StrToFloat(Edit2->Text);

// Термін (кількість днів) вкладу

sum=StrToFloat(Edit3->Text);

// Сума вкладу

 

 

 

pr=sum*stavka/365/100*t;

// Прибуток по вкладу

 

 

 

sum=sum+pr;

 

 

 

 

Edit4->Text=FormatFloat("0.00",pr);

 

 

 

Edit5->Text=FormatFloat("0.00",sum);

 

 

 

}

 

 

 

 

Приклади лінійних програм у консольному режимі С++ Builder

 

 

 

 

функцій: y sin 4 a2 b2 ,

 

 

 

Приклад 4.9 Обчислити значення

a

b t ,

t b2 k 2 , де b = 2, k = 1.2, причому значення b задати як константу, а значення k – ввести з клавіатури.

Розв‟язок. Для виведення повідомлення використовуватимемо функцію puts(); для введення даних з клавіатури – функцію scanf(), а для виведення результатів − функції printf() та cout.

Вікно консольного додатка з текстом програми обчислення:

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

Програмування базових алгоритмів

95

Результати роботи програми у консольному додатку:

Зауважимо, що не рекомендується в одній програмі змішувати функції введення-виведення, які надійшли з С (scanf, printf), з потоковим введеннямвиведенням (cin, cout), яке поширене у С++.

Приклад 4.10 Створити консольний програмний проект для обчислення сили струму електричного кола залежно від значень опору та напруги, які введе користувач.

Текст програмного коду:

#include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h>

//-----------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{float U, R, I;

cout << " Voltage U= " ; cin >> U;

cout << " Resistence R= " ; cin >> R;

I = U/R;

cout << "Result Current I= " << I << " Amper"<< endl;

getch(); return 0;

}

Результати роботи консольного додатка:

Voltage U= 24

Resistence R= 48

Result Current I= 0.5 Amper

96

Розділ 4

4.3

Програмування розгалужених алгоритмів

4.3.1

Розгалужені алгоритми

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

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

Для програмної реалізації таких обчислень слід використовувати оператори передавання керування, котрі дозволяють змінювати порядок виконування операторів програми. У мові С++ для цього передбачено інструкції: безумовного переходу – goto, умовного переходу – if та вибору варіанта – switch. Для записування умови переходу слід використовувати логічні (булеві) вирази.

4.3.2 Оператор безумовного переходу goto

Оператор goto (перейти до) дозволяє передавати керування у будь-яку точку коду (програми), котру позначено спеціальною міткою.

Синтаксис оператора goto: goto <мітка>;

Мітку записують перед оператором, на який слід передати керування, і відокремлюють від цього оператора символом двокрапки (:). Мітки в мові С++ не оголошують. У якості мітки може застосовуватись сполучення будь-яких латинських літер та цифр, але розпочинатися мітка повинна з літери, наприклад: start, М1, a, second.

Застосовувати цей оператор слід вельми обережно і помірковано, особливо при переході всередину блока чи циклу, оскільки це може призвести до непередбачуваних помилок. Тому в С++ оператор goto застосовується рідко і вважається застарілим. А застосування структурного і об‟єктно-орієнтованого підходів до програмування дозволяє повністю відмовитись від застосування операторів goto. Однак на практиці часто трапляються випадки, коли цей оператор значно спрощує код програми (див. приклад програми 4.25 у п. 4.3.8).

4.3.3 Операції відношення та логічні операції

Операції відношень (<, >, <=, >=, = = (дорівнює), != (не дорівнює)) по-

рівнюють два вирази і видають значення 1 (true – істина – “так”) або 0 (false – хибність – “ні”). Типом результату є int (чи bool).

tr набуде значення 1, а змінна

 

Програмування базових алгоритмів

97

Наприклад:

 

 

 

x < y

/* вираз 1 */

x >= y

/* вираз 4 */

y > x

/* вираз 2 */

x = = y

/* вираз 5 */

x <= y

/* вираз 3 */

x != y

/* вираз 6 */

Якщо x, y є однакові, то вирази 3, 4 та 5 мають значення 1, а вирази 1, 2 і 6 – значення 0.

Умову для перевірки певної цілої змінної k на ненульове значення if(k!=0) можна записати простіше – як if(k), оскільки ненульове значення розцінюється як true. Тоді умову if(k= =0) можна записати як if(!k).

Варто зауважити, що у С++ результатом логічного виразу може бути і цілочисельне арифметичне значення. При цьому значення 0 розцінюється як false, а кожне ненульове значення – як true. Розглянемо приклади:

int tr = (105<=109); int fal = (109>105);

Унаслідок виконання цих операторів змінна fal – 0.

Логічні змінні можуть набувати значень: true (істина) чи false (хибність). Вельми часто ці значення позначають цифрами 1 та 0 (1 – істина, 0 – хибність). Логічний тип ще називають булевим, від прізвища англійського математика Джорджа Буля, засновника математичної логіки. При оголошенні змінних булевого типу їх позначають як bool, наприклад: bool m;

Логічна операція – дія, яка виконується над логічними змінними, її результат є 1 (true) або 0 (false). Логічні операції обчислюють кожен операнд з огляду на його еквівалентність нулю.

Базові логічні операції:

|| логічне додавання (операція “АБО”, диз‟юнкція), результатом виконання якого є значення 1 (true), якщо хоча б один з операндів має ненульове значення. Якщо перший операнд має ненульове значення, то другий операнд вже не обчислюється;

&& логічне множення (операція “І”, кон‟юнкція), результатом виконання якого є 1, якщо обидва операнди мають ненульові значення, у решті випадків результат – 0. Якщо значення першого операнда дорівнює 0, то другий операнд не обчислюється;

! логічне заперечення (операція “НЕ”, інверсія) виконується над однією логічною змінною, результатом чого є значення true (1), якщо початковим значенням було false (0), і false (0), – якщо початковим значенням було true (1), наприклад:

bool w, q = true;

w = !q;

// Змінна w набуде значення false

int t, z = 0;

 

t = !z;

// Змінна t набуде значення 1

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

98

Розділ 4

операцій до булевих значень наведено в табл. 4.1. Операнди логічних операцій можуть бути цілого, дійсного типу чи типу вказівника, при цьому в кожній операції можуть брати участь операнди різних типів. Операнди логічних виразів обчислюються зліва направо. Якщо значення першого операнда вистачає, щоб визначити результат операції, то другий операнд не обчислюється. Логічні операції не спричинюють стандартних арифметичних перетворень. Вони оцінюють кожен операнд з огляду на його еквівалентність нулю. Результатом логічної операції є 0 чи 1.

 

 

 

 

Таблиця 4.1

 

 

Булеві операції

 

 

 

 

 

 

 

A

B

A || B

A && B

! A

 

 

 

 

 

0

0

0

0

1

 

 

 

 

 

0

1

1

0

1

 

 

 

 

 

1

0

1

0

0

 

 

 

 

 

1

1

1

1

0

Логічні побітові операції виконуються над цілими числами і опрацьовують число побітово. До цих операцій належать: побітове логічне заперечення (~), побітове логічне множення “І” (&), побітове логічне додавання “АБО” (|), побітове логічне “виключне АБО” (^) (табл. 4.2). Операнди логічних операцій мають бути будь-якого цілого типу.

 

 

 

 

 

 

 

Таблиця 4.2

 

Логічні побітові операції

 

 

 

 

 

 

 

 

 

 

Позначення

Операція

 

Приклади

 

 

 

 

 

 

~

інверсія, НЕ

~X

~1011 =

0100

&

І

X & Y

1011

& 1010

= 1010

|

АБО

X | Y

1011

| 1010

= 1011

^

виключне АБО

X ^ Y

1011

^ 1010

= 0001

<<

зсув ліворуч

X << 2

1011

<<

2

=

1100

>>

зсув праворуч

Y >> 2

1011

>>

2

=

0010

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

Операція побітового логічного заперечення “НЕ” (~) інвертує кожен біт операнда: 0 – на 1, 1 – на 0, тобто продукує двійкове доповнення свого операнда (~10102 = 01012), наприклад:

short x = 987;

unsigned short y = 0xAAAA;

y = ~y;

// У результаті y = 0x 5555 (шістнадцяткове).

if (!(x < y));

// Результат виразу 0 (false).

Операція побітового логічного множення “І” (&) порівнює кожен біт першого операнда з відповідним бітом другого операнда і, якщо обидва порівнюваних біти є одиницями, то відповідний біт результату встановлюється в 1, інакше – в 0. Наприклад, 10102 & 10012 = 10002.

Операція побітового логічного додавання “АБО” (|) порівнює кожен біт першого операнда з відповідним бітом другого операнда, і, якщо хоча б один

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]