Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
glinskiymetodichka-s.doc
Скачиваний:
18
Добавлен:
15.08.2019
Размер:
2.7 Mб
Скачать

§ 8. Розгалуження

1. Складена команда. Під час написання програми може виникнути потреба трактувати декілька команд як одну. Така команда називається складеною. Складена команда - це конструкція такого вигляду:

{

<команда 1>;

. . .

<команда N>;

}

Перед закриваючою дужкою ";" ставити обов'язково. Піс­ля дужки символ ";" записувати не обов'язково.

Зауваження 1. Запис ;; називається порожньою командою. Як­що у складеній команді поставити символ ";" після закри­ваючої дужки, то компілятор це розглядатиме як порожню команду, що не впливає на результат виконання програми.

Надалі під командою будемо розуміти порожню, просту або складену команду.

2. Кома як команда. Кому як команду використовують то­ді, коли необхідно інтерпретувати декілька виразів або ко­манд як одне ціле. Вона має вигляд

вираз 1, вираз 2

або

команда 1,команда 2

Дія команди. Послідовно обчислюються значення виразу 1 (виконується команда 1) та виразу 2 (команда 2).

Цю команду зручно використовувати у командах циклу, умовних командах тощо. Наприклад, if (k+=2, k<7)...

Тут спочатку значення змінної k буде збільшено на 2, а потім це значення порівнюватиметься із числом 7. Результат команди - True, якщо значення змінної k менше, ніж 7, у про­тилежному випадку - false.

3. Логічні вирази та логічні операції. Логічний вираз -

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

  1. ! - не,

  2. && - і,

  3. || - або.

Логічні вирази обчислюються з урахуванням пріоритету логічних операцій (1 - найвищий). Однакові логічні операції виконуються послідовно зліва направо. Для зміни порядку виконання логічних операцій, як і для звичайних арифметич­них, використовують круглі дужки.

У табл. 7 наведені означення логічних операцій.

Логічним виразом може бути ціле число. Якщо воно не дорівнює нулю, то значення логічного виразу – True, якщо це число 0 — false.

Приклад 1. Розглянемо деякі логічні вирази та їхні зна­чення. Нехай а = 1, b = 7, тоді:

4. Побітові логічні операції та операції зсуву. Одиницею виміру пам'яті комп'ютера є байт. Кожний байт складається із восьми бітів. У кожному біті можна розмістити одне з двох чисел: 0 та 1. У одному байті можна зобразити ціле число з діапазону від 0 до 255. Щоб занести значення деякого даного у пам'ять комп'ютера, необхідно це дане перетворити у двій­ковий код. Зазвичай відповідні програми це роблять авто­матично. Однак інколи на практиці, наприклад, під час створення графічних зображень чи в задачах архівування даних, виникає потреба порівнювати не значення двох даних, а їхні біти. Для цього у мові С++ є побітові логічні операції (див. табл. 8): & (І), | (АБО), ^ (виключне АБО), ~ (НЕ).

Приклад 2. Нехай b1 =00110011, b2 = 11110101. Тоді

B1 & b2 = 00110001, b1 І b2 = 11110111, b1 ^ b2 =11000110, ~b1 = 11001100.

Кожний байт можна зобразити у вигляді послідовності з восьми нулів та одиниць. Для того, щоб зсунути біти послідовності вправо чи вліво на деяку фіксовану кількість, вико­ристовують спеціальні операції зсуву >> та <<. Під час зсуву па порожні місця дописують нулі. Наприклад, нехай b = 00100101, c — 10110010, тоді під час виконання команд

b = b << 2; с = с >> 1;

змінна b набуде значення 10010100, аc- 01011001.

Зауваження 2. Під час зсуву цифр цілого числа на п позицій вліво відбувається множення цього числа на 2n, а на п позицій вправо - ділення на 2n.

Зауваження 3. Подібно до команд присвоєння з арифметич­ними операціями можна використовувати команди присвоєння з логічними побітовими операціями: &=, |=, ~= та команди присвоєння з побітовим зсувом: >>=, <<+.

5. Команда розгалуження if (якщо). Команда розгалу­ження if має дві форми: повну та коротку. Повна така:

if (< логічний вираз>) <команда 1>; else <команда 2>;

Дія команди. Обчислюється значення логічного виразу. Якщо це значення істинне, то виконується команда 1, у про­тилежному випадку - команда 2. Команда 1 та команда 2 можуть бути порожніми, простими або складеними.

Приклад 3. Нехай х = 9. Унаслідок виконання команд

іf (х > 7) у = роw(х, 2); else у = sqrt(х);

іi (х <= 5) z = ехр(х);

else z = ++х;

отримаємо у = 81, z = 10, х = 10. Розглянемо команди

іf (х) у = х - 10;

іf (у) у += 2;

else y = 15;

Спочатку у дорівнюватиме 0 (оскільки х ≠ 0), а потім змінна у набуде значення 15.

Приклад 4. Проаналізуємо команди

Задача 1 (про обчислення складеної функції). Обчислити і вивести на екран значення складеної функції у у деякій жданій користувачем точці х, якщо

Коротка команда розгалуження if має вигляд

if (<логічний вираз>) <команда 1>;

Дія команди. Обчислюється значення логічного виразу. Якщо воно істинне, то виконується команда 1, інакше вико­нується команда, яка записана після команди if.

Приклад 5. Нехай а = 7. Розглянемо команди

Оскільки значення виразу а > 7 - false, то відразу викону­ватиметься друга команда if. Значення виразу а <= 9 - True, тому z = (а + 1) / 2 = (7 + 1) / 2 = 4, а значення а = 7 + 1 = 8, отже, у = 4 + 8 = 12, а = 8.

6. Команда ?. Команда ? є аналогом команди розгалужен­им if. Нагальний вигляд команди ? такий:

логічний вираз> ? <команда або вираз 1> : <команда або вираз 2>

Дія команди. Обчислюється значення логічного виразу. Якщо воно істинне, то виконується команда 1 або обчислю­ється вираз 1, інакше - команда або вираз 2.

Задача 2 (про два числа). Ввести два цілі числа. Знайти більше з них.

// Визначення більшого числа

#include <iostream.h>

#include <conio.h> void main()

{

clrscr();

int x,y;

cout«"Vvedit x,y\n"; cin»x»y;

cout« "Max =";

x > у ? cout«x : cout«y;

getch();

Команда ? у разі потреби трактується компілятором як вираз, тому її зручно використовувати у директивах препро-цесора, наприклад

#define abs(х) > 0 ? (х); - (х);

Приклад 6. Нехай с = 10. Тоді після виконання команди х = (с == 3) ? 2 * с : с - 2;

отримаємо х = 8, оскільки с не дорівнює 3, і тому тут обчис­люється значення виразу 2.

7. Команда вибору (switch). Команда вибору має вигляд

switch (<вираз>);

{

саsе <ознака 1> : <команда 1>; bгеак;

саsе <ознака N> : <команда N> bгеак;

default: <команда N+1>;

}

Вираз та ознаки мають бути цілочисельні. Оскільки транс­лятор мови С++ може розглядати значення змінних типу char і enum як цілі дані, то на місці виразу та ознак можуть бути сталі цілого, символьного або перераховного типів. На місці ко-

манд 1 - N може бути одна команда, декілька або не бути кодної команди. Команда bгеак не є обов'язковою і записується у разі потреби. Вона слугує для виходу з команди switch.

Складова частина default: <команда N+1> також може бути відсутня - тоді матимемо коротку форму команди вибору switch

Дія команди. Якщо значення виразу збігається зі значен­ням ознаки п, то виконується команда з номером п і розгля­дається наступний за нею рядок саsе і т.д. Для того, щоб при­пинити дію команди switch, наприклад, після виконання ко­манди п (тобто щоб вийти з цієї команди), записують команду bгеак;. Якщо значення виразу не збігається із жодною з ознак, то виконується команда N+1 або, у випадку короткої форми, наступна команда після команди switch.

Задача 3 (про квитки). Нехай населені пункти позначені номерами від 1 до 8. Вартість одного квитка до конкретного пункту к визначається так:

Скільки коштуватимуть m квитків до населеного пункту, номер k якого вводять з клавіатури?

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

clrscr();

int k, m; float cina;

cout « "Уведіть номер к населеного пункту i кількість квитків m ";

cin » k » m; switch (k)

{

case 1 : cina = 22; break;

case 2:

case 3:

case 4: cina = 25; break;

case 5:

case 6: cina - 30; break;

case 7:

case 8: cina = 35; break;

default:

cout « "Дані введено неправильно \п";

cina = 0;

}

cout << m << “ квитків до пункту“ << k << “коштують”;

cout << cina*m << “грн”;

getc();

}

Якщо під час виконання програми дані ввести так: 3 5, то на екрані матимемо:

5 квитків до пункту 3 коштують 125 грн.

8. Команда безумовного переходу goto. Ця команда змі­нює послідовність виконання інших команд шляхом переходу до виконання команди, що має позначку (мітку). Команда пе­реходу має вигляд

goto <позначка>;

Позначка може розміщуватись перед довільною командою у програмі. Вона відокремлюється від команди двокрапкою (:), а саме:

<позначка> : <команда>;

Позначкою може бути лише ідентифікатор, тобто набір допустимих символів, який починається з букви або символу підкреслення (_).

Задача 4 (про квадратне рівняння). Ввести декілька наборів коефіцієнтів квадратного рівняння ах2 + Ьх + с = 0 і вивести повідомлення: матиме рівняння дійсні корені чи ні?

// Програма Квадратне рівняння

#include <iostream.h>

#include <conio.h>

#include <math.h>

void main()

{

clrscr();

float a, b, c, d;

vvid : cout « "\n Уведіть коефіцієнти рівняння \n";

сіn » a » b » c;

if (a = = 0) goto finish; //Якщо a=0, то перейти до позначки finish

d = pow(b, 2) - 4 * a * c; // Інакше обчислити дискримінант

if (d >= 0) cout « "Це рівняння має корені";

else // Якщо дискримінант від'ємний, то

{

cout « "Дані введено неправильно \n"; // виводимо відповідні

cout«"Рівняння дійсних розв'язків не має"; // повідомлення

goto vvid; // Перейти до позначки vvid

}

finish : getch();

}

Зауваження 4. Використовувати команду goto варто лише у виняткових випадках, оскільки вона змінює природну послідов­ність виконання команд і робить програму важкозрозумілою.

9. Перерахований тип утворюють із перерахування іменованих сталих цілого типу так:

enum <назва типу> = {<стала 1> = <значення 1>, … , <стала N> = <значення N >};

або так:

enum <назва типу> = {<стала 1>, ..., <стала N>}:

В останньому випадку сталій 1 автоматично буде присво­єно значення 0, сталій 2 — значення 1 и т. д.

Деякі сталі у списку можна ініціалізувати. Неініціалізо-паним сталим автоматично буде присвоєно значення на оди­ницю більше від значення попередньої сталої зі списку.

Приклад 7. Опишемо два перераховані типи (дні тижня та кольори):

enum week = {mon, tue, wed, the, fri, sat, sun};

enum colors = {red = 1, green, yellow = 6, white};

У списку week стала mon дорівнюватиме 0, tue = 1, ..., sun = 6. У списку colors стала red дорівнює 1, green відповідно 2, yellow - 6, а стала white - 7 (на одиницю більше від yellow).

Задача 5 (про розклад на день). Скласти програму, яка б виводила на екран розклад роботи на тиждень.

#include <iostream.h> // Програма Розклад на день

#include <conio.h>

void main()

{

clrscr();

enum svet {mon, tue, wed, the, fri, sat, sun}; int day;

cout « "Розклад занять на тиждень\n \n";

for (day = mon; day <= sun; day++)

switch (day)

{

case mon : cout « "Понеділок\t Зустріч акціонерів. \n"; break;

case tue: cout « "Вівторок\t Відрядження\n"; break;

case wed : cout« "Середа\t Відрядження\n"; break;

case the: cout « "Четвер\t Відрядження\n"; break;

case fri: cout« "П'ятниця\t Здати звіт. Зайти в банк\n"; break;

case sat: cout « "Субота\t їдемо на рибалку\n"; break;

case sun : cout « "Неділя\t Відвідати батьків. Ввечері йдемо у театр\n";

}

getch();

}

Вправи

1. Чи істиннийі складений логічний вираз х <= 8 && х > 3, якщо:

а) х = 0 (відповідь: ні); б) х = 2;

в)х- 10; г)х = 5; д) х = 15?

2. Якого значення (true чи false) набуде вираз х <= 2 || х > 5, якщо:

а) х = 0 (відповідь: true); б) х = 2;

в) х = 10; г) х = 5; д) х = 15?

3. Запишіть логічний вираз для визначення, чи деяка точка х нале­жить відрізку:

а) [0; 3) (відповідь: х >= 0 && х < 3); б) (-6; б]; в) [10; 20];

г)[2;14] або [20;25]; д) [4;10] і [8; 12].

  1. Запишіть умову того, що число а: а) парне; б) ділиться без остачі на 3; в) не ділиться без остачі на 3; г) ділиться на 3 і на 5; д) ділиться на 3 або на 5.

  2. Складіть логічні вирази для перевірки, чи є точка (ас; у): а) у другій чверті (відповідь: х < 0 && у > 0 ); б) на координатних осях; в) у другій або третій чверті; г) у квадраті зі стороною, що дорівнює 1, побу­дованому на координатних осях у першій чверті; д) у крузі одиничного радіуса з центром у початку координат (підказка: умови належності точ­ки кругу така: х2 + у2 < 1).

  3. Модифікуйте програму Обчислення виразу так, щоб вивести резуль­тати у файл.

  4. Модифікуйте програму Обчислення виразу так, щоб користувач міг вибирати, куди виводити результати: на екран чи у файл.

Вказівка. Використайте, наприклад, команди

cout « "Виведення результатів: 1 - на екран, 2-у файл";

сіn »n;

if (n == 1) <виводимо результати на екран>;

else <виводимо результати у файл>;

  1. Складіть логічний вираз для пошуку у бібліотеці деякої книжки за трьома параметрами: видавництво - «Деол», рік видання - 2003, автор - Новосад.

  2. Модифікуйте програму Квадратне рівняння так, щоб можна було розв'язати декілька рівнянь. Наприклад, вводити коефіцієнти доти, доки значення коефіцієнта а не дорівнюватиме нулю.

  1. Складіть програму для розв'язування рівняння ах + Ь = 0. Передбачте випадки а) а — 0 і b = 0; б) а = 0, b ≠ 0; в) а ≠ 0.

  2. Розв'яжіть задачу № 3 з розділу "Задачі" вашого варіанта. Пе­редбачте виведення результатів на екран і у файл.

  3. Розв'яжіть задачу № 4 вашого варіанта. Передбачте виведення результатів а) на екран; б) у файл.

  4. Розв'яжіть задачу № 4 наступного варіанта. Виведіть результати виконання програми у файл.

Розв'яжіть задачу № 5 свого варіанта. Виведіть результати ви­конання програми на екран.

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