Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глинський С++.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.26 Mб
Скачать

Тема 7. Розгалуження

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

Складена команда - це конструкція такого вигляду:

{

<команда 1>;

<команда N>;

}

Перед закриваючою дужкою “;” ставити обов’язково. Після дужки - не обов’язково.

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

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

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

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

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

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

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

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

!— не,

&& — і,

||— або.

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

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

Таблиця 7. Логічні операції

Вираз

Значення

Вираз

Значення

! true

false

! false

true

true && true

true

true || true

true

true && false

false

true || false

true

false && true

false

false || true

true

false && false

false

false || false

false

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

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

Вираз

Значення

Вираз

Значення

a == b

false

a > =3 && a <= 2

true

! (a == b)

true

a >= 0 && b <= 4

false

a >= b

false

b < 9 || b > 15

true

a != b

true

!(a < 1 || b >=10)

true

a + 6 == b

true

a !=b || a+15 > b && b < 0

true

a < (b = 1)

false

(a != b || a + 15 < b) && b < 0

false

2

true

0

false

b

true

!b

false

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

Таблиця 8. Побітові логічні операції

B1

B2

B1&B2

B|| B2

B1 ^ B2

~ B1

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Приклад 2. Нехай b1 = 00110011,

b2 = 11110101. Тоді

b1 &b2 = 00110001, b1||b2 = 11110111,

b1 ^ b2 = 11000110, ~ b1 = 11001100.

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

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

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

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

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

Таблица Примеры использования побитовых операторов

Выражение

 Значение 

Пояснение

5 & 3

1

В двоичном представлении число 5 имеет вид 101, а число 3 представляется как 011. Побитовое сравнение чисел 101 и 011 с помощью побитового И & дает 001, что в десятичной системе соответствует числу 1.

5 | 3

7

Применение оператора побитового ИЛИ |  для сравнения чисел 101 и 011 дает 111, что в десятичной системе соответствует числу 7.

5 ^ 3

6

Применение оператора побитового исключающего ИЛИ ^  для сравнения чисел 101 и 011 дает 110, что в десятичной системе соответствует числу 6.

~5

-6

После применения операции побитового инвертирования ~ к числу 5 требует особых пояснений. На самом деле в 8-битовом представлении число 5 имеет вид 00000101. В предыдущих случаях нулевые старшие разряды роли не играли, поэтому они явно не указывались. При инвертировании наличие старших нулевых битов важно. Инвертирование дает 11111010. Это не что иное, как представление  в двоичном машинном коде числа -6. Последнее читатель может проверить самостоятельно.

5 >> 2

1

После сдвига вправо на две позиции для числа 5(двоичный код 101) получаем 001. В десятичной системе это число 1.

5 << 2

20

После сдвига влево на две позиции для числа 5(двоичный код 101) получаем 00100. В десятичной системе это число 20.

Звертаємо увагу на особливості застосування операції побітового зсуву до відємнихчисел.

Наприклад, результатом виразу -6 >> 5 є число -1. Справа в тому, що в бінарному коді 11111010 для числа -6 при зсуві вправо на 5 позицій за умови збереження значення став біта знака отримуємо код 11111111. Це код числа -1.

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

Уявімо, що число задається 8 бітами.

Якщо скористатися командним 1 << 6, отримаємо в якості результату значення 26 = 64.

Дійсно, десяткове число 1 в двійковій системі в 8-бітовому представленні задається як 00000001. після зсуву вліво на 6 позицій отримуємо 01000000, що в десятковій системі відповідає числу 64.

Однак якщо скористатися командою 1 << 7, отримаємо в якості результату -128.

Пояснюється це наступним обставиною

Після зсуву вліво на 7 позицій з числа 00000001, отримуємо число 10000000.

Це від‘ємне число, про що свідчить старший одиничний біт.

Здійснюючи перевідцього числа в десяткову систему, спочатку інвертуємо бінарний код і отримуємо 01111111. Це код числа 127. Щоб отримати кінцеве значення, необхідно додати до цього результату 1 і додати мінус - в результаті приходимо до значення -128.

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

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

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

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

if (х > 7) у = pow(x, 2); else у = sqrt(x);

if (х <= 5) z = ехр(х); else z = ++x;

отримаємо у = 81, x = 10, z = 10.

Після цього виконання команд

if (x) у = x -10; // оскільки х ≠ 0(х=10), у=0

if (у) у+= 2; else у = 15; // змінна у набуде значення 15

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

if (0) cout<< "Hello!"; — виведення на екран не буде

if (5) cout << "Hello! "; — буде виведене слово Hello!

if (!5) cout <<"Hello!"; — виведення не буде

if (!0) cout <<"Hello! "; — буде виведене слово Hello!

if (log(1)) cout << "Hello! "; - виведення нe буде lg1=0

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

// Обчислення виразу

#include <iostream>

#include <cmath>

#include <conio.h>

int main()

{

float x, y;

std::cout << "Vvedit x\n";

std::cin >>x;

if (x < 0) y = tan(fabs(x)); else

if (0 <= x && x < 5) y = pow(x, 3); else y = log(x) / log(5);

std::cout <<"\n у = " << y;

getch();

}

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

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

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

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

if (а > 7)

{

у = а++; z = а + 5;

}

іf (а <= 9) z= ++а /2; у = z + а;

Оскільки значення виразу а > 7 - false, то відразу виконується друга команда if.

Значення виразу а <= 9 - true,

тому z = (а +1) / 2 = (7 + 1) / 2 = 4,

значення а = 7 + 1 = 8,

отже, у = 4 + 8 = 12, а = 8.