C _Учебник_МОНУ
.pdfПрограмування базових алгоритмів |
109 |
Приклади консольних програм з умовним оператором Приклад 4.18 Увести значення року та перевірити, чи є він високосним.
Текст програми:
#include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h> #pragma argsused
//-----------------------------------------------------------
int main(int argc, char* argv[])
{int year, r;
cout << " Уведіть рік= " ; cin >> year;
r = year % 4; // Остача від ділення year на 4
if( r ) cout << " Рік не високосний " ; else cout << " Рік високосний " ; getch(); return 0;
}
Результати виконання програми:
Уведіть рік= 2008 Рік високосний
Уведіть рік= 2010 Рік не високосний
Приклад 4.19 Увести ненульове ціле число і визначити його знак (вивести “Додатне” чи “Від‟ємне”).
Текст програми:
#include <iostream.h> #include <conio.h>
int main(int argc, char* argv[])
{int x;
cout << "Увести ненульове число:" ; cin >> x;
if(x>0) cout << "Додатне" << endl; else cout << "Від’ємне" << endl;
getch(); return 0;
}
Результати виконання програми:
Увести число: 5 Додатне
Увести число: -15 Від’ємне
110 |
Розділ 4 |
Приклад 4.20 Написати програму для перевірки знання року заснування Одеси. У разі помилкової відповіді користувача програма має вивести правильну відповідь.
Текст програми:
#include <iostream.h> #include <conio.h>
int main(int argc, char* argv[])
{int year;
cout << "Уведіть рік заснування Одеси= " ; cin >> year ;
if(year==1794) cout << "Відповідь є правильна "<<endl;
else cout<<"Ви помилились. Одесу було засновано 1794 року"; getch();
return 0;
}
Результати виконання програми:
Уведіть рік заснування Одеси=1790 Ви помилились. Одесу було засновано 1794 року
Уведіть рік заснування Одеси=1794 Відповідь є правильна
Приклад 4.21 Ввести число і обчислити, якщо це можливо, значення вира-
зу y |
|
3 |
|
. |
|
|
|
||
|
|
2 |
||
x 7 |
Розв‟язок. Обчислити значення цього виразу можливо, якщо, по-перше, під коренем розташовано невід‟ємне число і, по-друге, знаменник не дорівнює
0, тобто якщо виконуються дві умови: x 7 0 та x 7 2 0 .
Текст програми:
#include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h> #pragma argsused
int main(int argc, char* argv[])
{float x, y;
cout << "Уведіть число:" ;
cin >> x;
if(x – 7 >= 0 && sqrt(x – 7) – 2 != 0)
{y = 3/(sqrt(x – 7) – 2); cout << " y= " << y << endl;
}
else cout<<"Обчислити неможливо"<<endl; getch();
return 0;
}
Програмування базових алгоритмів |
111 |
Результати виконання програми:
Уведіть число: 15 y=3.62132
Уведіть число: 5 Обчислити неможливо
Приклад 4.22 Написати програму для перевірки знання таблиці множення, тобто множення двох випадкових одноцифрових чисел.
Розв‟язок. Після кожної відповіді відбувається перевірка її правильності та виводиться відповідне повідомлення.
Текст основної програми:
#include <iostream.h> #include <conio.h>
int main(int argc, char* argv[])
{ int x,y,p,ans;// Співмножники, добуток та відповідь
time_t t; |
// Поточний час для ініціалізації генератора випадкових чисел |
||
// Ініціалізація генератора випадкових чисел (див. докладніше підрозд. 3.7) |
|||
srand((unsigned)time(&t)); |
// або randomize(); |
||
x=rand()%10+1; |
y=rand()%10+1; |
p=x*y;
cout << "Скільки буде " << x <<" x "<< y << endl; cin >> ans ;
if(p==ans)cout<<"Відповідь є правильна"<<endl;
else cout << "Ви помилились. "<< x <<" x "<< y << " = " << p; getch();
return 0;
}
Результати виконання програми:
Скільки буде 6 x 9
56
Ви помилились. 6 x 9 = 54
Скільки буде 6 x 3
18
Відповідь є правильна
4.3.7 Тернарна умовна операція ?:
У мові С++ є одна тернарна операція, яка має три операнди, це – умовна операція, котра має такий формат:
<умова> ? < oперанд1> : < oперанд2>;
Якщо умова має ненульове значення, результатом буде значення oперанда1, інакше – значення oперанда2. Зауважимо, що обчислюється лише один з операндів, а не обидва. Наприклад:
j = (i < 0) ? (–i) : (i);
112 |
Розділ 4 |
У результаті j набуде абсолютного значення i, оскільки, якщо i є менше за 0, то j присвоїться –i, а якщо i є більше чи дорівнює нулю, то j присвоїться i.
Для визначення більшого з двох чисел – x та y – слід записати оператор: max = (x > y) ? x : y;
Тип результату залежить від типів операнда1 і операнда2:
якщо операнд1 чи операнд2 має цілий чи дійсний тип (зауважимо, що їхні типи можуть відрізнятися), то виконуються звичайні арифметичні перетворення. Типом результату є тип операнда після перетворення;
якщо операнд1 чи операнд2 має один і той самий тип структури, об‟єднання чи вказівника, то тип результату буде тим самим типом структури, об‟єднання чи вказівника;
якщо обидва операнди мають тип void, то результат матиме тип void;
якщо один операнд є вказівником на об‟єкт будь-якого типу, а другий
операнд є вказівником на void, то вказівник на об‟єкт перетворюється на вказівник на void, котрий і буде типом результату;
якщо один операнд є вказівником, а другий – константним виразом зі значенням 0, то типом результату буде тип вказівника.
Умовна операція ?: за своєю дією є схожою до оператора if-else, однак слід зважати, що вона використовується лише у виразах і передає значення одного з операндів. Наприклад, оператор
if( z ) res = x; else res = y;
можна записати за допомогою умовної операції так z ? (res = x) : (res = y) ;
або ясніше для сприйняття res = z ? x : y ;
Окрім того, зауважимо, що таку конструкцію можна записати і за допомогою логічних операцій && та ||
z && (res = x); z || (res = y);
але таку заміну більшість людей сприймають важко і неоднозначно. Розглянемо на прикладі, як застосовувати умовну операцію ?:, і побачимо,
що її результат є ясніший для сприйняття, аніж рівноцінний оператор if-else.
Приклад 4.23 Увести два числа і обрати з них більше. Текст програмного коду:
#include <iostream.h> #include <conio.h> int main()
{ int x, y, z; |
// Оголошуємо три змінні |
cout << "Enter two numbers:\n"; |
|
cin >> x >> y; |
// Вводимо з клавіатури два числа |
if(x>y) z=x; // Якщо перше число є більше за друге, присвоюємо його змінній z, else z=y; // інакше – присвоюємо змінній z друге число
Програмування базових алгоритмів |
113 |
|
cout << "\n \nResalt 1: " << z; // Виводимо z |
|
|
z = (x > y) ? x : y; |
// Тернарна операція |
|
cout << "\nResalt 2: " << z << "\n"; getch();
return 0;
}
Результати роботи консольног о додатка:
Enter two numbers. 15 8
Resalt 1: 15
Resalt 2: 15
Наведена у програмі тернарна операція читається як: “Якщо x більше за y, повернути значення x. Інакше – повернути значення y”. Значення, яке повертається, присвоюється змінній z і виводиться на екран. Вочевидь, що тут умовна операція є скороченим еквівалентом команди if-else.
Однак бувають ситуації, коли операцию ?: неможна замінити конструкцією if-then-else, наприклад, якщо організувати попередню програму так:
#include |
<iostream.h> |
|
#include <conio.h> |
|
|
int main() |
|
|
{ int x, y; |
// Оголошуємо дві змінні |
|
cout << "Enter two numbers:\n"; |
||
cin >> x >> y; |
// Вводимо з клавіатури два числа |
|
int z = (x > y) ? x : y; |
// Тернарна операція |
cout << "\n max = " << z << "\n"; getch();
return 0;
}
Тут змінна z ініціалізується на момент оголошення результатом роботи тернарної операції. Подібного ефекту не вдалося б досягти простим привласненням в тому чи іншому випадку.
4.3.8 Оператор вибору варіантів switch
Формат оператора вибору варіантів switch:
switch (<вираз>)
{case <значення-мітка_1> : {<послідовність операторів>; break;}
. . . . . . . . . . . .
case <значення-мітка_n> : {<послідовність операторів>; break;} [ default: <послідовність операторів>; ]
}
Спочатку обчислюється вираз у дужках. Вираз повинен мати цілий чи то символьний тип. Значення виразу порівнюється зі значеннями міток після клю-
114 |
Розділ 4 |
чових слів case. Якщо значення виразу збіглося зі значенням якоїсь мітки, то виконується відповідна послідовність операторів, позначена цією міткою і записана після двокрапки, допоки не зустрінеться оператор break. Якщо значення виразу не збіглося з жодною міткою, то виконуються оператори, які слідують за ключовим словом default. Мітка default є необов'язковою конструкцією оператора switch, на що вказують квадратні дужки [] у форматі. Оператор break здійснює вихід із switch. Якщо оператор break є відсутній наприкінці операторів відповідного case, то буде почергово виконано всі оператори до наступного break чи то до кінця switch для всіх гілок case незалежно від значення їхніх міток.
Розглянемо роботу оператора switch на прикладі функції, яка за числом виводить назву дня тижня.
//------------ Кнопка “Назва дня тижня”---------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{AnsiString s;
int n=StrToInt(Edit1->Text); switch (n)
{case 1: {s="понеділок"; break; } case 2: {s="вівторок"; break; }
case 3: {s="середа"; |
break; } |
case 4: {s="четвер"; |
break; } |
case 5: {s="п’ятниця"; |
break; } |
case 6: {s="субота"; |
break; } |
case 7: {s="неділя"; |
break; } |
default: |
|
s="Помилка! Введіть число від 1 до 7";
}
Edit2->Text = s;
}
Приклади створювання проектів програм з розгалуженою структурою, організованих за допомогою оператора switch
Приклад 4.24 Написати програму для переведення ваги з фунтів у кілограми, зважаючи на те, що у різних країнах фунт має різні значення.
Текст програми:
void __fastcall TForm1::FormCreate(TObject *Sender)
{RadioGroup1->Columns=3; // кількість колонок у RadioGroup1
// Формування елементів RadioGroup1 при створенні форми
RadioGroup1->Items->Add("Австрія (1фунт=0.56001кг)"); RadioGroup1->Items->Add("Англія (1фунт=0.453592кг)");
RadioGroup1->Items->Add("Германія (1фунт=0.5кг)"); RadioGroup1->Items->Add("Данія (1фунт=0.5кг)"); RadioGroup1->Items->Add("Ісландія (1фунт=0.5кг)");
RadioGroup1->Items->Add("Італія (1фунт=0.31762кг)");
|
|
Програмування базових алгоритмів |
115 |
||
RadioGroup1->Items->Add("Іспанія (1фунт=0.451кг)"); |
|
||||
RadioGroup1->Items->Add("Португалія (1фунт=0.459кг)"); |
|
||||
RadioGroup1->Items->Add("Росія (1фунт=0.4059кг)"); |
|
||||
RadioGroup1->Items->Add("Україна (1фунт=0.4059кг)"); |
|
||||
RadioGroup1->Items->Add("Франція (1фунт=0.489505кг)"); |
|
||||
RadioGroup1->Items->Add("Швеція (1фунт=0.425076кг)"); |
|
||||
RadioGroup1->ItemIndex=0; // Детальніше про компонент див. стор. 106 |
|
||||
} |
|
|
|
|
|
//------------ |
Кнопка “Обчислити” --------------------------- |
|
|
||
void __fastcall TForm1::Button1Click(TObject *Sender) |
|
||||
{ float |
funt, kg, k; // Вага у фунтах, кілограмах і коефіцієнт переведення |
|
|||
switch |
(RadioGroup1->ItemIndex) |
|
|||
{ case |
0: k=0.56001; break; |
// Австрія |
|
||
case |
1: k=0.453592;break; |
// Англія |
|
||
case |
2: |
|
|
// Германія |
|
case |
3: |
|
|
// Данія |
|
case |
4: k=0.5; |
break; |
// Ісландія |
|
|
case |
5: k=0.31762; break; |
// Італія |
|
||
case |
6: k=0.451; |
break; |
// Іспанія |
|
|
case |
7: k=0.459; |
break; |
// Португалія |
|
|
case |
8: |
|
|
// Росія |
|
case |
9: k=0.4059; |
break; |
// Україна |
|
|
case |
10: k=0.489505; |
break; |
// Франція |
|
|
case |
11: k=0.425076; |
break; |
// Швеція |
|
}
funt=StrToFloat(Edit1->Text); kg=k*funt;
Label1->Caption = Edit1->Text + " фунти(и/ів) - це " + FloatToStrF(kg, ffFixed, 6, 3) + " кг";
}
116 |
Розділ 4 |
x2 a 1 |
за k 1; |
|||
|
за k 2; |
|||
x 1 / a |
||||
Приклад 4.25 Обчислити значення функції L ex a a x |
за |
k 3; |
||
|
|
|
||
lg |
x a |
|
за |
k 4 |
|
|
|
|
|
для всіх значень параметра k. |
|
|
Виведення всіх чотирьох значень функції L організуємо до компонента Memo – багаторядкове текстове вікно для введення чи виведення значень даних програми. У вікні компонентів C++ Builder він має позначення
Основні властивості компонента Memo:
Name – ім‟я компонента у програмі;
Lines – вікно для введення чи редагування початкових даних програми;
Lines->Count – кількість заповнених рядків;
ScrollBars – лінійки прокручування вікна.
Розв‟язок. Робочий вигляд форми та схема алгоритму:
Початок
k = 1
a, x
1 k 4
L= x2 a 1 |
2 |
3 |
|
L= lg |
|
x a |
|
|
|||||
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
L= x 1 / a |
|
L= ex a ax |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
L
k = k + 1
Так
k<=4
Ні
Кінець
Програмування базових алгоритмів |
117 |
||
Текст програми: |
|
|
|
#include <math.h> |
|
|
|
void __fastcall TForm1::Button1Click(TObject *Sender) |
|
||
{ Memo1->Clear(); |
Memo1->Lines->Add("Результати:"); |
|
|
float x, a, L; |
int k = 1; |
|
|
a = StrToFloat(Edit1->Text); |
|
|
|
x = StrToFloat(Edit2->Text); |
|
|
|
M1: switch (k) |
|
|
|
{ case 1: |
L = pow(x, 2 + a) + 1; |
break; |
|
case 2: |
L = (x + 1) / a; |
break; |
|
case 3: L = exp(x – a) – pow(a, x); break; |
|
||
case 4: |
L = log10(fabs(x – a)); break; |
|
}
Memo1->Lines->Add("L" + IntToStr(k) + " = " + FloatToStr(L)); k++;
if(k<=4) goto M1;
}
Використання оператора
if(k<=4) goto M1;
у цій програмі організовує чотириразове повторення виконання групи операторів, починаючи від мітки M1, що фактично утворює псевдоцикл.
Приклад 4.26 Увести значення х та обчислити значення
sin e |
|
a c |
|
x2 b |
за |
x a; |
||||||
|
|
|||||||||||
|
|
|||||||||||
|
|
|
|
|
|
c |
|
a x b; |
||||
|
|
5.3b |
|
|
за |
|||||||
|
|
|||||||||||
y 3 a |
|
|
|
|||||||||
cos2 |
|
a b |
|
sin x2 |
за |
x b |
||||||
|
|
|
для одного з трьох варіантів параметрів:
1)a = –3,7; b = 5,6; c = ecos x ;
2)a = 0,81; b = –2,4; c = tg bx ;
3)a = 2,5; b = 0,6; c = ctg bx .
Розв‟язок. Робочий вигляд форми і схема алгоритму:
118 |
|
|
|
|
|
Розділ 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
Початок |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
x, n |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
1 |
|
n |
Інакше |
Кінець |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a = –3.7 |
|
|
a = 0.81 |
|
|
|
|
a = 2.5 |
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b = 5.6 |
|
|
b = –2.4 |
|
|
|
|
b = 0.6 |
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c = ecos x |
|
|
c = tg |
bx |
|
|
|
|
|
c = ctg |
bx |
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Так |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
x<a |
y sin e |
|
a c |
|
x2 b |
|
k = 1 |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
Ні |
Так |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
a x b |
|
|
|
|
|
|
|
|
|
|
|
|
|
k = 2 |
|
|||||||||
|
|
|
|
|
|
|
|
|
y 3 |
|
a |
|
5.3b |
|
|
c |
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
Ні |
Так |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
x b |
|
y cos2 a b sin x2 |
|
k = 3 |
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
Ні |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
y, k |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
Кінець |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Текст програми:
#include <math.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{float x, y, a, b, c;
x = StrToFloat(Edit1->Text);
int k, n = StrToInt(Edit2->Text);
Memo1->Clear(); Memo1->Lines->Add("Результати:"); switch (n)
{case 1: { a=-3.7; b=5.6; c=exp(cos(x)); break;} case 2: { a=0.81; b=-2.4; c=tan(fabs(b*x)); break;} case 3: { a=2.5; b=0.6; c=1/tan(fabs(b*x)); break;} default:{ Memo1->Clear();
ShowMessage("Введіть номер 1, 2 чи 3"); return; }
}
if(x<a) { y=sin(exp(fabs(a+c)))+pow(x,2+b); k=1;} if(x>=a && x<b) { y=pow(a+fabs(5.3*b),1./3)+c; k=2;} if(x>=b) { y=pow(cos(a+b),2)+sin(x*x); k=3;} Memo1->Lines->Add(IntToStr(n)+"-й варіант: y=" +
FloatToStr(y)+" умова №"+IntToStr(k));
}