- •Основи організації програм Структура алгоритмічних мов програмування
- •Базові поняття мови програмування
- •Структура програми
- •Основи введення-виведення інформації
- •Керування порядком обчислень Оператори
- •Оператори реалізації послідовного процесу
- •Оператори розгалуження
- •Оператори циклу.
- •Правила оформлення програм
Оператори розгалуження
При написанні програми не вдається обмежитися тільки операторами присвоєння. Для більшості реальних алгоритмів характерна широка розгалуженість обчислювального процесу, коли в залежності від конкретних вхідних даних або проміжкових результатів доводиться застосовувати різні правила обробки даних.
Для задання розгалужень у програмах служать так звані оператори вибору, які у мовах програмування, зазвичай, представляються у двох формах – як умовний оператор, або як оператор багатоваріантного вибору.
Умовний оператор. Використовується для кодування розгалуження, коли вибір напрямку подальших дій визначається у залежності від виконання або невиконання певної умови. У мовах програмування цей оператор ще називають оператором 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;
}