Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 (8).doc
Скачиваний:
22
Добавлен:
12.05.2015
Размер:
571.39 Кб
Скачать

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

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

Для задання розгалужень у програмах служать так звані оператори вибору, які у мовах програмування, зазвичай, представляються у двох формах – як умовний оператор, або як оператор багатоваріантного вибору.

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

Формат умовного оператора для мови C/C++:

if (вираз) оператор1;

[else оператор2;].

Тут if (якщо) і else (інакше) є службовими словами. Механізм реалізації оператора IF: якщо задана умова істинна, то виконується оператор_1, якщо ж умова хибна, то виконується або оператор_2 (якщо він є), або керування передається на наступний за IF оператор програми.

Зазвичай, в алгоритмічних мовах програмування підтримується дві форми умовного оператора - повна і скорочена, які відповідають базовим алгоритмічним конструкціям повної (рис. 3, а) та неповної (рис. 3, б)альтернативи.

а) повна альтернатива

б) неповна альтернатива

Рис. 3. Блок-схеми умовних операторів

Наприклад,

if (y!=0) f=5*(y+3)/y; //неповна альтернатива

if (y>=x) max=y; //повна альтернатива

else max=x.

Щоб програма легше сприймалася, оператор IF часто записують так:

if (вираз) або if (вираз)

оператор1; оператор1;

else оператор2; else

оператор2;

Наприклад, програма для визначення, чи є введене число парним.

#include <stdio.h>

using namespace std;

int main ()

{ int num;

printf ("\n Input number:");

scanf ("%d", &num);

if (num % 2 == 0) printf ("\n even");

else printf ("\n not even");

system(”pause”);

return 0;

}

У С/C++ логічне значення істина (TRUE) представляється ненульовим значенням, а хибність (FALSE) – нулем. Тому тип умови необов'язково обмежувати виразами відношення та логічними виразами - головне, щоб результат обчислення умовного виразу можна було інтерпретувати як значення TRUE або FALSE. Наприклад,

int a, b;

cout << " Input two numbers: "; cin >> a >> b;

if (b) cout << a/b << endl;

else cout << "Divise zero" << endl;

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

Як видно із формату оператора IF, синтаксис мови програмування допускає наявність лише одного оператора у його гілках. Тому, за необхідності, групу операторів обов'язково треба об'єднувати у операторний блок. Інакше виникає логічна помилка, коли компілятор помилок не видає, але програма працює неправильно. Наприклад,

if (d>=0)

{ x1=(-b-sqrt(d))/(2*a);

x2=(-b+sqrt(d))/(2*a);

cout<< “\nx1=”<<x1<<“x2=”<<x2;

}

else cout<<“\n No solution”;

Допускається вкладеність оператора IF. Наприклад,

if (x>5)

if (y) f=x/sin(y);

else printf ('Неприпустиме значення параметра Y');

else f=x*y;

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

if(c)

{ if(d) statement1;

if(f) statement2;

else statement3; // пов'язане з if(f)

}

else statement4; // пов'язане з if(c).

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

Приклад. Написати фрагмент коду, який для дійсного x обчислює значення f(x) та присвоює його дійсній змінній y.

Перепишемо формулу обчислення f(x) у еквівалентному вигляді:

Безпосередньо за формулою запишемо такий фрагмент коду:

if (x<=-5) y=0;

if (-5<x && x<3) y=2*x;

if (3<=x && x<=7) y=x;

if (7<x) y=x+2;

Цей код є правильним, але неоптимальним за кількістю виконуваних операцій. Якщо значенням змінної x є -9, то обчислюються всі чотири умови, хоча з математичної точки зору зрозуміло, що за істинності умови x<=-5 решта умов хибні. Отже, модифікуємо фрагмент коду наступним чином:

if (x<=-5) y=0;

else if (-5<x && x<3) y=2*x;

else if (3<=x && x<=7) y=x;

else if (7<x) y=x+2;

Тепер за значення -9 обчислюється тільки перша умова.

Нехай значенням змінної x є 0.1. Тоді вираз x<=-5 є хибним, і обчислюється вираз -5<x && x<3. Але x<=-5 є хибним, тому -5<x є істинним. Отже значенням виразу -5<x && x<3 є значення x<3. Міркуючи так само далі, отримуємо ще один варіант:

if (x<=-5) y=0;

else if (x<3) y=2*x; // тут -5<x є істинним

else if (x<=7) y=x; // тут 3<=x є істинним

else y=x+2; // тут 7<x є істинним

Умовний вираз. Деякі мови програмування, зокрема, С++ і Java, дозволяють використовувати умовний вираз наступного формату:

умова ? вираз_1 : вираз_2.

Механізм його реалізації : якщо умова істина, то виконується вираз_1, інакше - вираз_2. Наприклад,

x>=y ? max=x : max=y;

grade >= 60 ? cout <<“Зачет \n” : cout <<“Незачет \n”;

cout << (grade >= 60 ? “Зачет” : “Незачет”) << endl;

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

У мовах С/C++, Java оператором багатоваріантного вибору є оператор switch (у Pascal – оператор case). У C/C++ він має наступний формат:

switch (вираз)

{ case мітка_1 : оператори_1;

...

case мітка_n : оператори_n;

[ default : оператори_n+1; ]

};

Тут слова switch, case, default є зарезервованими. Вони означають відповідно «перемикач», «випадок», «за відсутності». Вираз у дужках після слова switch називається перемикачем (або селектором варіантів, або селектором вибору).

Виконання оператора багатоваріантного вибору полягає в обчисленні керуючого виразу (перемикача) і переході до групи операторів, помічених case-міткою, що дорівнює значенню цього керуючого виразу. Якщо значення перемикача не збіглося з жодною міткою варіанту, то виконуються дії, задані в гілці default (за її наявності). Якщо гілки default немає, виконання оператора закінчується.

Особливості реалізації оператора switch:

  • селектор варіантів (вираз в switch) є виразом цілого типу, або такого, який однозначно приводиться до цілого; мітки варіантів — константними значеннями того самого типу, що й у селектора;

  • усі case-мітки повинні бути унікальними;

  • якщо деякий варіант не містить оператора break, то після операторів цього варіанту виконуються оператори, задані в подальших варіантах — до найближчого break або до кінця оператора.

Наприклад,

switch (ch) // вибір елемента меню

{ case 'A': Add(); break;

case 'D': Delete(); break;

case 'Q': q= true; break;

default: cout <<"error"<< endl;

}

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