До операторів вибору відносять оператор умовного переходу
if та
оператор−перемикач switch.
Оператор умовного переходу if
використовується для розгалуження процесу обчислень на два напрямки і має такий
формат запису:
if (вираз) оператор 1;
else
оператор 2;,
де вираз — це вираз, який має логічне значення (true
— «істина» або false — «неправда»).
Реалізується оператор if таким чином: спочатку
обчислюється вираз і, якщо значення виразу не дорівнює нулю («істина»),
виконується оператор 1, в протилежному випадку —оператор 2 і далі
управління передається оператору, що є наступним з умовних операторів if,
наприклад:
if ( i < j ) і++;
else
{ j = i−3;
i++; }
У записі оператора if
друга частина (тобто else)
може бути відсутня і тоді, якщо вираз приймає значення «неправда», виконується
зразу наступний оператор програми, що розташований за умовним. Таку конструкцію
називають “пропуск оператора”.
Коли у будь−якій гілці розгалуження необхідно
виконати декiлька операторів, їх слід розташовувати у блоці, інакше компiлятор
не зможе зрозуміти, де закінчується розгалуження. блок може включати різні
оператори, у тому числі описи та інщi умовні оператори, але не може складатися
з одних описів. Слiд ураховувати, що змінна, яка описана у такому блоці, за
межами блока не існує. Синтаксис C припускає, що у випадку застосування
вкладених умовних операторів кожне else відповідає найближчому до нього
попередньому if.
Наприклад:
if (с > d && (с > r || с = = 0)) d++;
else
{d /= с; с = 0 }
декілька умов слід об’єднати знаками логічних операцій, а
сукупність операцій необхідно розмістити у блоці; обчислення найбільшого
значення серед трьох змінних а, b, с:
if (а > b)
{ if (а > с) max = а;
else max = с; }
else { if (b > c) max = b;
else max = c; } — у
цьому фрагменті програми фігурні дужки можуть бути відсутні, тому що компілятор
відносить частину else до найближчого if; if(p++) ps++; — вираз не використовує операцій відношення.
Оператор−перемикач
switch називають оператором множинного розгалуження. Він використовується для
вибору одного а багатьох варіантів рішення і має таку форму запису:
switch (L)
{
case к.в.1: оператор 1; [break;]
case к.в.2: оператор 2; [break;]
..................................................
case к.в.n: оператор n; [break;]
[default: оператор n+1;]
}
де switch, case, default — службові слова;
break — оператор (необов’язковий) здійснює вихід з оператopa switch;
L — будь−який вираз одного з цілих типів; к.в.1, …, к.в.n —
константні вирази, які неможуть повтoрюватися і не можуть
містити змінних чи викликів функцій; зазвичай, це ціла або символьна константа;
оператор 1; … – будь−які оператори мови C.
У процесі виконання цього оператора спочатку обчислюється значення виразу L, потім це значення порівнюється (послідовно зверху донизу) зі значеннями константних виразів к.в.1, …, к.в.n. У випадку збігу значень L і одного з цих константних виразів та якщо наприкінці гілки розгалуження немає оператора break, виконуються всі оператори,починаючи з відповідної гілки. За наявності оператора break виконується тільки оператор,що знаходиться у відповідній гілці розгалуження, і керування передається оператору, який розташований за межами oпeратора switch. Якщо значення виразу L не збігається з жодним із значень константних виразів, то виконується гілка default і здійснюється вихід з оператора switch. У випадку, коли в операторі switch відсутня гілка default (вона необов’язкова) і значення L не збігається з жодним із значень константних виразів,відбувається вихід з оператора switch.
Наведемо
фрагмент програми з використанням оператора switch:
int
а=2;
switch (а)
{
case 1: func1( );
case 2: func2( );
case 0: …
case 4: func3( );
default: printf ("good bye \n");
}
Тут оператор switch передбачає реалізацію функцій func2(), func3() і default: printf (“good bye \n”);.
Фрагмент програми можна записати по−іншому:
int а=2;
switch (а)
{
case 1: funcl( );
break;
case 2: func2( );
break;
case 0: ...
case 4: func4( );
break;
default: printf
("good bye \n");
}
Оператор−перемикач
приводить до виконання тільки гілки case 2: func2(); break; після
чого здійснюється вихід із switch.
Оператори циклу використовують для здійснення
багаторазового повторення деякої послідовності дій. Кожен цикл складається з
тіла циклу, тобто операторів, що виконуються декілька разів. Один прохід циклу
називається ітерацією. У мові C існують три оператори циклу: while, do while, for.
Оператор циклу з передумовою while
виконується, якщо умова перевіряється до початку циклу, і має вигляд:
while
(вираз−умова) оператор;
де оператор
— тіло циклу, що може бути представлено простим або складеним
оператором.
Реалізується оператор while таким чином: якщо значення виразу−умови не
дорівнює нулю («істина»), то виконується тіло циклу, а в протилежному випадку,
тобто коли значення виразу дорівнює нулю («неправда»), — цикл не працює і
керування передається наступному за циклом while оператору. Цикл з передумовою може
не виконуватися жодного разу.
Як вираз−умова часто використовуються відношення.
Наприклад, наступна послідовність операторів обчислює суму квадратів перших n натуральних чисел:
int і=0, sum=0;
while (і < n) sum += ++і *
і;
Якщо у виразі−умові необхідно порівняти покажчик з
нульовим значенням (з порожнім покажчиком), то наступні записи
оператора while
рівнозначні:
while
(point != NULL) . . .
while
(point) . . .
while
(point != 0) . . .
Оператор while зручно застосовувати у випадках, коли кількість ітерацій заздалегідь не відома.
Оператор циклу з післяумовою do while
звичайно застосовується у випадках, коли тіло циклу виконується хоча б один
раз, і має таку форму запису:
do оператор
while (вираз−умова);
У процесі виконання
оператора do while спочатку здійснюється вхід до тіла циклу і виконується
оператор, що являє собою тіло циклу (цей оператор може бути простим або
складеним); далі перевіряється вираз і,
якщо він правдивий («істина»), — цикл повторюється, а коли вираз помилковий
(«неправда») — здійснюється вихід з циклу.
Оператор циклу з параметром for має
форму запису вигляд:
for
([вир1; вир2; вирЗ]) оператор;,
де вир1
— вираз ініціювання, що використовується для встановлення початкового значення
параметра, це вираз присвоювання;
вир2 — вираз умови, що
визначає умову повторення циклу;
вирЗ — вираз ітерації,
який визначає крок зміни параметра, що керує циклом, після кожного виконання.
Вирази вир1,
вир2 та вирЗ — необов’язкові параметри, які розділяються
символом «;».
Оператор циклу for реалізується таким чином:
·
виконується вираз ініціювання (виконання цієї
нотації може бути здійснено до оператора for);
·
обчислюється вираз−умова;
·
якщо умовний вираз приймає значення «істина»
— виконуються оператори циклу;
·
обчислюється вираз ітерації;
·
знову перевіряється умова;
·
як тільки умова прийме значення 0
(«неправда»), керування передається оператору, що розташований за оператором
циклу for.
Оскільки в операторі for перевірка виразу−умови
відбувається перед циклом, то у випадку помилкової умови цикл може жодного разу
не виконуватися.
Оператор for
може використовувати декілька змінних, що керують циклом, а будь−які
вирази можуть бути відсутніми, наприклад:
int n, у;
for (int к = 0, n = 20; к
<= n; k++, n−−)
y = k * n;
або
int = і;
for (; і < 4; i++)
Останній фрагмент має
два вирази ініціювання і два вирази ітерації. Спочатку відбувається
присвоювання значень змінним k = 0 і n = 20, далі
здійснюється порівняння k <= n і,
якщо ця умова має значення «істина», то буде виконуватися тіло циклу, а потім
вираз k++ і n–, якщо
ж умова не виконується, то цикл припиняє свою роботу.
Операторам циклів с параметром for слід віддати
перевагу при організації циклів з лічильниками.
Приклад
Обчислити значення функції y = ax2−sinx,
якщо а = 10.5; х є
[−1; 2]; hx = 0,5. Скласти програми з
використанням різних операторів циклу.
Розглянемо перший варіант програми з використанням
оператора циклу з передумовою while:
// визначення функції у = ах2 − sinx
// з
використанням оператора циклу while
#include
<iostream.h>
#include
<math.h>
#include
<conio.h>
main
( )
{
float a = 10.5, x, y;
x = −1 ;
while (x <= 2)
{ у = a *pow(x,2) − sin(x); // у = a* x* x− sin(x);
cout << "x= " << x << "
y= " << у << endl;
x += 0.5; }
getch (); //затримка екрану
}
Другий варіант програми
із застосуванням оператора циклу з післяумовою do while має вигляд:
// визначення функції у = ах2
− sinx
// з використанням оператора
циклу do while
#include <iostream.h>
#include <math.h>
#include <conio.h>
main ( )
{ float a(10.5), x(−1), y;
do
{ у = a *pow(x,2) − sin(x);
cout << "х= " << x <<
" у= " << у << endl;
x += 0.5; }
while (x <= 2);
getch (); //затримка
екрану
}
Третій варіант програмної реалізації прикладу з використанням оператора циклу з
параметром for
мае такий вигляд:
//
визначення функції у = ах2 − sinx
// з
використанням оператора циклу for
#include
<iostream.h>
#include
<math.h>
#include
<conio.h>
main ( )
{ float a = 10.5,
x, y;
for (x =
−1; x <= 2; x+= 0.5)
{ у = a *pow(x,2) − sin(x);
cout << "x= " << x << " у= "
<< у << endl; }
getch
();
}
Приклад Обчислити значення функції z при різних значенняx а
і b, якщо х
є [1; 4],hx = 0,5; у є [4; 12], hy = 2.
Розглянемо один з варіантів програмної реалізації цього
прикладу:
// використання операторів do
while и for
#include <iostream.h>
#include <math.h>
#include <conio.h>
main ( )
{ float x, y, z;
int a, b;
сin >> a >> b;
x=1;
cout.precision(4);
do { cout << " x = " << x <<
endl;
for (y = 4; у <= 12; у += 2)
{ if( x < 3) z = pow(a,x) + sqrt(x +
y);
else z = a*exp(x) + log(b + y);
cout << "у = "
<< у << " z = " << z
<< endl; }
x += 0.5;
}
while (х <= 4);
getch ();
}
Функція z, згідно з умовою, залежить від двох аргументів х і у, що змінюються.
У цьому випадку спочатку фіксується значення однієї змінної (наприклад, х) і перебираються всі
значення іншої (тобто у),
потім береться друге значення першої змінної і знову перебираються всі значення
іншої, і так доти, поки не будуть використані всі значення першої змінної.
У програмі присутні два
цикли: зовнішній цикл (do while), у якому змінює свої значення змінна х, і внутрішній (for), де перебираються всі значення змінної у. Обидва ці цикли
можна було б організувати за допомогою яких завгодно операторів циклу.
Процес розгалуження при обчисленні функції за першою або
другою формулами здійснюється умовним оператором if.
До операторів керування відносять оператор безумовного
переходу goto та оператори виходу з циклу.
Синтаксис оператора безумовного перехода goto має
вигляд:
goto мітка;
де мітка
— ім’я, після якого ставляться дві крапки, область діi мітки — функція, в якій вона
визначена.
Слід зауважити, що використання оператора безумовного
переходу goto
вважається негарним стилем програмування.
Мова C передбачає такі засоби виходу з циклу:
·
оператор break
приводить до виходу з циклу (або з операторів if та switch), у
якому він міститься, і переходу до наступного оператора програми
·
оператор continue
здійснює пропуск усіх операторів, що залишилися до кінця циклу, та реалізує
перехід до початку наступної ітерації;
·
функція exit()
реалізує вихід з циклу з завершенням програми. Аргумент цієї функції —
константа цілого типу, що дорівнює 0 у випадку сприятливого завершення
циклу і відмінна від 0 у протилежному випадку. При використанні цієї
функцiї слід включити в код програми директиву #include <stdlib.h>.