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

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

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

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

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));

}

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