Більшість додатків повинна діяти по-різному залежно від ситуації або введених користувачем даних. Щоб дозволити додатку реагувати по-іншому, потрібні умовні оператори, що виконують різні сегменти коду в різних ситуаціях.
На сьогоднішньому зайнятті.
■ Як змусити програму поводитися по-різному в певних умовах.
■ Як неодноразово виконати розділ коду в циклі.
■ Як краще контролювати потік виконання в циклі.

 

юе виконання з використанням унції if. .else

[ы, які ви бачили і створювали досі, мали послідовний поженив - зверху вниз. Усі рядки виконувалися, і жодна не ігнорова- послідовне виконання усіх рядків коду рідко використовується в притиск, програма повинна множити два числа, якщо користувач натискає, або підсумовувати їх, якщо він натискає іншу клавішу, про помітити на мал. 6.1, не усі ділянки коду виконуються при кожному запу- ьзователь натискає клавішу <м>, виконується код, що множить два числа, ят щось інше, виконується код підсумовування.  Ні при якій ситуації обоє ьности кода не виконуються.

 6.1

Рис. 6.1. Приклад умовного виконання коду на основі користувацького введення

Умовне програмування з використанням конструкції if. .else

Умовне виконання коду реалізоване в мові C   на базі конструкції if ... else, синтаксис який виглядає таким чином:

if (умовний вираз)

Зробити щось, коли умовний вираз повертає true;

else // Необов'язково

Зробити щось інше, коли умовне вираження повертає false;

Таким чином, конструкція if ... else, що дозволяє програмі множити, якщо користувач натискає клавішу <м>, і додавати інакше, виглядає таким чином:

if (UserSelection == 'm')

Result = Numl * Num2; // множення

else

Result = Numl   Num2; // сума

ПРИМІТКА   У мові C++   результат true вираження по суті означає, що воно повернуло не значення false, яке є нулем. Таким чином, будь-яке вираження, що повертає будь-яке ненульове число, позитивне або негативне, по суті розглядається як повертаюче значення true, коли воно використовується в умовному вираженні.

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

ЛІСТИНГ 6.1. Множення або складання двох цілих чисел на основі призначеного для користувача введення

 

1: #include 
2: using namespace std;
3:
4: int main()
5: {
6:    cout << "Enter two integers: " << endl;
7:    int Numl = 0, Num2 = 0;
8:    cin >> Numl;
9:    cin >> Num2;
10:
11:   cout << "Enter VmV to multiply, anything else to add: ";
12:   char UserSelection = *\0’;
13:   cin >> UserSelection;
14:
15:   int Result = 0;
16:   if (UserSelection == 'm')
17:   Result = Numl * Num2;
18:   else
19 
20    Result = Numl + Num2;
21:   cout << "Result is: " << Result << endl;
22:
23:   return 0;
24: }

Результат

Enter two integers:
25
56
Enter 'm' to multiply, anything else to add: m Result is: 1400

Слідуючий запуск:

Enter two integers:
25
56
Enter 'm' to multiply, anything else to add: a Result is: 81

Аналіз

Зверніть увагу на використання оператора if в рядку 15 і оператора else в рядку 17. У рядку 15 ми інструктуємо компілятор виконати множення, якщо що йде за оператором if вираження (UserSelection == 'm') істинне (повертає значення true), або виконувати складання, якщо вираження неправдиве (повертає значення false). Вираження (UserSelection == 'm') повертає значення true, коли користувач вводить символ 'пГ (з урахуванням регістра), і значення false у будь-якому іншому випадку. Таким чином, ця проста програма моделює блок-схему на мал. 6. 1 і демонструє, як ваше застосування може поводитися по-іншому при іншій ситуації.

ПРИМІТКА   Частина else конструкції if. .else є необов'язковою і може не використовуватися в тих ситуаціях, коли інакше не треба робити нічого.

УВАГА!  Якби рядок 15 в лістингу 6.1 виглядала так:

16:   if (UserSelection == 'm');

то конструкція if була б безглузда, оскільки вона завершилася б в тому ж рядку порожнім оператором (крапка з комою). Будьте уважні і уникайте такої ситуації, оскільки ви не отримаєте від компілятора повідомлення про помилку, якщо за оператором if не послідує частина else.

Деякі хороші компілятори в такій ситуації попереджають про це повідомленням "empty control statement" (порожній оператор, що управляє).

Умовне виконання декількох операторів

Якщо ви хочете виконати декілька операторів залежно від умов, необхідно укласти їх у блок операторів. По суті, це фігурні дужки ({...}), включаючі декілька операторів, які виконуватимуться як блок. Розглянемо приклад:

if (умова)

{

// блок за істинної умови

Оператор 1;

Оператор 2;

}

else

{

// блок за неправдивої умови

Оператор 3;

Оператор 4;

Такі блоки називаються також складеними операторам (compound statement).

На зайнятті 4, "Масиви і рядки", пояснювалася небезпека використання статичних масивів і перетину їх меж. Найчастіше ця проблема проявляється в символьних масивах. При записі рядка в символьний масив або при його копіюванні важливо перевіряти, чи є масив досить великим, щоб містити усі символи. Лістинг 6.2 демонструє виконання такої перевірки, що дозволяє уникнути переповнювання буфера.

ЛІСТИНГ 6.2. Перевірка місткості перед копіюванням рядка в символьний масив

#include 
#include  
using namespace std;
int main()
{
   char Buffer[20] = {'\0'};
   cout << "Enter a line of text: " << endl; 
   string LineEntered; 
   getline (cin, LineEntered);
   if (LineEntered.length() < 20)
   {
       strcpy_s(Buffer, LineEntered.c_str());
       cout << "Buffer contains: " << Buffer << endl;
   }
      return 0;
 }

Результат
Enter a line of text:
This fits buffer!
Buffer contains: This fits buffer!

Аналіз

Зверніть увагу, як в рядку 12 перевіряються довжини рядка і буфера перед копіюванням. Цікавою в цій перевірці є також присутність блоку операторів в рядках 13-16 (що називається також ставним оператором).

УВАГА!

У кінці рядка if (умова) НЕМАЄ крапки з комою. Це зроблено навмисно і гарантує, що оператор після оператора if виконається у разі істинності умови.

Наступний фрагмент коду цілком коректний:

if (умова) ; оператор;

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

Вкладені оператори if

Нерідкі ситуації, коли необхідно перевірити декілька різних умов, деякі з яких залежать від результату оцінки попередньої умови. Мова C   дозволяє вкладати оператори if для виконання таких вимог.

Вкладені оператори if мають наступний синтаксис:

if (умова 1)

{

     ЗробитиДещо1 ;

     if (умова2)

         ЗробитиДещо2;

     else

        ЗробитиДещоІнше2 ;

}

else

     ЗробитиДещоІнше1;

Рахуйте додаток, подібний до представленого в лістингу 6.1, де користувач, натискаючи клавішу <d> чи <ш>, може вказати додатку, чи слід поділити або помножити значення. Далі, ділення має бути дозволене, тільки якщо дільник відрізняється від нуля. Тому на додаток до перевірки команди, що вводиться користувачем, слід перевірити, чи не є дільник нулем, коли користувач вимагає ділення. Для цього в лістингу 6.3 використовується вкладена конструкція if.

ЛІСТИНГ 6.3. Використання вкладених операторів if у додатку множення або ділення чисел

1: #include 
2: using namespace std;
3:
4: int main()
5: {
6:    cout << "Enter two numbers: " << endl;
7:    float Numl = 0, Num2 = 0;
8:    cin >> Numl;
9:    cin >> Num2;
10:
11:   cout << "Enter ' d' to divide, anything else to multiply: ";
12:   char UserSelection = '\0';
13:   cin >> UserSelection;
14:
15:   if (UserSelection == 'd')
16:   {
17:      cout << "You want division!" << endl;
18:      if (Num2 != 0)
19:      {
20:         cout << "No div-by-zero, proceeding to calculate"
                 << endl;
21:         cout << Numl << " / " << Num2 << " = " << Numl / Num2
                 << endl;
22:      }
23:      else
24:         cout << "Division by zero is not allowed" << endl;
25:    }
26:    else
27:    {
28:         cout << "You want multiplication!" << endl;
29:         cout << Numl << " x " << Num2 << " = " << Numl * Num2
                 << endl;
30:    }
31:
32: return 0;
33: }

Результат
Enter two numbers:
45
9
Enter 'd' to divide, anything else to multiply: m You want multiplication!
45 x 9 = 405

Наступний запуск:
Enter two numbers:
22
7
Enter 'd' to divide, anything else to multiply: d You want division!
No div-by-zero, proceeding to calculate 22 / 7 = 3.14286

Останній запуск:
Enter two numbers:
365
0

Enter 'сГ to divide, anything else to multiply: d You want division!
Division by zero is not allowed