2. Оператори розгалуження

Умовний оператор if. else

Умовний оператор реалізує структуру вибору. Він має такий вигляд:

if (умова) оператор1[ else оператор 2]

Якщо умова оцінюється як істинна (ненульова), виконується onepator1, якщо як помилкова (нульова), виконується onepator2. Найпростіший приклад:

if (а &btb) max_ab = a; else max_ab = b;

Як було сказано вище, замість одиночного оператора завжди можна підставити блок з декількох операторів, укладений у фігурні дужки. Іншими словами, можлива наступна синтаксична форма:

У разі, коли при помилковості умови не потрібно виконувати жодних дій, а потрібно лише пропустити оператори блоку if, ключове слово else та відповідний йому оператор (блок) можуть бути відсутніми, як у наступному прикладі:

if (а &bt b) temp = а; а = b; b = temp; > //. Продовження програми.

У цьому фрагменті програми, якщо > b, то значення a і b змінюються місцями, інакше блок не виконується і все залишається, як є. У відповідності до правила суперпозиції можна будувати вкладені структури if. else, наприклад:

if (a > b) if (a > с) max_abc = а; else max abc = с; else if (b > с) max_abc = b; else max_abc = с;

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

max_abc = с;a; else if (b &ct c) max_abc = b;

До якого з двох перших if належить це else? За задуманою нами логікою – до першого, проте компілятор вважає інакше; він дозволяє подібні неоднозначності, ставлячи спірне else у відповідність найближчому if, тобто у цьому випадку другому. В результаті все працює неправильно. Щоб усунути неоднозначність, потрібно застосувати операторні дужки:

max_abc = с; > else if (b > с) max abc = b;

Про умови в операторі if

Умова оператора if може бути як завгодно складним виразом. Можна було б сказати, що це вираз має бути "логічним", але в мові С (не в С++, а в С) немає логічного типу даних, тому умова для більшої спільності зробили цілого типу. Як уже говорилося, вираз вважається хибним. (false), якщо його значенням є нуль, і істинним (true), якщо значення ненульове.У С++ введено логічний тип даних bool. якщо вони використовуються в умові. Ось кілька прикладів умов оператора if:

if (x) DoSomething(); //Якщо х не дорівнює нулю, то виконується функція DoSomething().

if (!x) DoAnotherThing(); //Якщо х дорівнює нулю, то виконується функція DoAnotherThing().

if (b = = с) DoAnotherThing(); /*Якщо b дорівнює з (логічне порівняння), то виконується функція DoA-notherThing().*/

if (b! = с) DoSomething (); //Якщо b не дорівнює с, то виконується функція DoSomething().

if ((key = getch()) = = 'q') DoQuit(); /*Зберегти код клавіші в key і, якщо він дорівнює 'q', виконати функцію DoQuit().*/

При записі умови використовуються логічні операції (записанів порядку зменшення пріоритету):

! - Логічне НЕ (інверсія); – більше; >= – більше чи одно; = = – одно; != – логічне І; && - Логічне І; - логічне АБО.

! - логічне НЕ (інверсія, заперечення), дає в результаті false (0), якщо операнд true (≠ 0) або 1 якщо операнд false (0). Операнди у цій операції можуть мати тип bool, int, речовий. Приклад:

В результаті: х буде надано значення false (0). Операції відношення ( , > , = =. ! =) Порівнюють перший операнд з другим. Операнди можуть бути арифметичного типу (int, float, double) або покажчиками. Результатом операції є значення true або false (будь-яке значення, що не дорівнює нулю, інтерпретується як true). Операції порівняння на рівність та нерівність мають менший пріоритет, ніж решта операцій порівняння. 4>Приклад:

a= =0; логічне значення цього виразу true, якщо а дорівнює 0, інакше false. a=0; логічне значення цього виразу завжди false.

Логічні операції && (І) та (АБО). Операнди логічних операцій І (&&) та АБО ( ) можуть мати арифметичний тип або бути покажчиками, при цьому операнди в кожній операції можуть бути різних типів. Перетворення типів немає, кожен операнд оцінюється з погляду його еквівалентності нулю (операнд, рівний нулю, сприймається як false, не рівний нулю – як true). Результатом логічної операції є true чи false. Результат операції логічне І має значення true тільки якщо обидва операнди мають значення true. Результат операції логічне АБО має значенняtrue, якщо хоча б один із операндів має значення true. Логічні операції виконуються зліва направо. Якщо значення першого операнда достатньо, щоб визначити результат операції, другий операнд не обчислюється. Приклади:

a>b && c b c b)&(c іint key; printf(RUS("\nВиберіть команду (F, M or Q): ")); // Вивести підказку. key = getch( );// Прочитати символ. key = toupper(key);// Перетворити у верхній регістр. // блок визначення команди. if (key == 'F') printf( RUS("\nВибрано команду \"F\" - означає Файл.\n")); else if (key == 'M') printf(RUS("\nВибрано команду \"M\" – означає повідомлення.\n")); else if (key == 'Q') printf(RUS("\nВибрано команду \"Q\" – означає Вихід.\n")); else printf(RUS("\nНеправильна клавіша!"));

Умови операторів if містять перевірку коду натиснутої клавіші рівності одному з допустимих символів. Якщо код клавіші не відповідає жодній команді, виводиться повідомлення про помилку. Для подібних випадків в С існує спеціальна, зручніша, конструкція вибору switch. Виглядає вона так:

switch (вираз) case константний_вираз: група_операторів case константний_вираз: група_операторів [default: група операторів] >Спочатку проводиться оцінка виразу в операторі switch. Отримане значення послідовно порівнюється з кожним з константних виразів, і при збігу значень управління передається на відповідну групу операторів. Якщо значення виразу не підходить ні під один із варіантів, керування передається на групу операторів з міткою default або на наступний після блоку switch оператор, якщо група default відсутня. Групатут зовсім не повинна бути блоком, тобто укладати її в операторні дужки не потрібно. І ще одна особливість, про яку слід пам'ятати при написанні структур switch. Якщо знайдена мітка case, що збігається зі значенням виразу, що перевіряється, то виконується група_операторів даного case. Однак справа на цьому не закінчується, оскільки, якщо не вжити жодних додаткових заходів, управління "провалиться" нижче, на наступну по порядку мітку case і т.д., і в результаті будуть виконані всі оператори до кінця блоку switch. Якщо це небажано (як найчастіше і буває), в кінці групи_операторів case потрібно поставити оператор break, він перериває виконання блоку з міткою, що збіглася, і передає управління оператору, безпосередньо наступному за блоком switch. Для ілюстрації ми перепишемо попередній приклад "меню", оформивши його у вигляді закінченої програми, і продемонструємо попутно ще один керуючий оператор С. Демонстрація структури switch:

int key; loop: //тут можна додати програму, що виконується щоразу //після вибору команд F, M or Q printf(RUS("\nВиберіть команду (F , M або Q): ")); key = getche(); // Прочитати клавішу. // Визначення команди. switch (key) case 'f': case 'F': printf(RUS("\nВибрано команду \"Файл\".\n"));break; case 'm': case 'M': printf (RUS("\nВибрано команду \"Message\".\n"));break; case 'q': case 'Q': printf(RUS("\nВибрано команду \"Quit\".\n")); printf(RUS("Натисніть будь-яку клавішу для завершення програми . \n")); getch() ; return 0; // Повернення до Windows. default: printf(RUS("\nНеправильна клавіша!")); > goto loop; // Перехід на початок програми на мітку loop

Ми організували у програмі найпростіший "нескінченний" цикл, який постійно просить користувача ввестикоманду - до тих пір, поки не буде натиснута клавіша "Q". У цьому випадку відбувається повернення в операційну систему. Читання команди проводиться функцією getche(). На відміну від getch() відображає введений символ на екрані. Для реалізації циклу ми використовували оператор goto, виконання якого призводить до передачі управління на мітку, вказану в операторі. дійшовши до кінця функції main(), управління повертається до її початку і все повторюється знову.

Результат роботи програми:

значення