Умова з присвоюванням

Перепишемо попередню програму, скоротивши її на один рядок і продемонструвавши аспекти, що стосуються пріоритету операцій. Одержана конструкція може видатися незвичайною, але вона часто викоритовується не тільки в С++, а також в С.

 

#include <iostream>

using namespace std;

#include <conio.h> //для getche()

int main()

{

int chcount=0; //число непробільних символів

int wdcount=1; //число пробілів

char ch=’a’; //ch повинна мати певне значення

cout<<”Vvedit rjadok: “;

while((ch!=getche())!=’\r’)

{if(ch==’ ‘) //якщо символ є пробілом

wdcount++;

else

chcount++;

}

cout<<”\nSliv “<<wdcount<<endl<<”Bukw “<<(chcount-1)<<endl;

return 0;

}

 

Значення, що повертається функцією getche(), присвоюється змінній ch, як і раніше, але сама операція присвоювання знаходиться всередині умови циклу while. Присвоєне значення порівнюється з ‘\r’ для того, щоб вияснити, продовжити виконання циклу чи ні. Ця конструкція працює правильно, тому що операція присвоєння значення сама одержує це значення. Якщо, наприклад, функція getche() повертає символ ‘a’, то при цьому не тільки відбувається присвоювання значення змінній, але й сам вираз

(ch=getche())

одержує значення ‘a’, яке бере участь в перевірці.

Той факт, що операції присвоювання мають власне значення, використовується в множинному присвоюванні, такому як:

x=y=z=0;

Подібні конструкції є цілком коректними в С++, в результаті такого присвоювання всі три змінні – x, y, z – дістають значення 0.

Зовнішні круглі дужки у виразі

(ch!=getche())

необхідні, оскільки операція присвоювання = має більш низький пріоритет, ніж операція відношення !=.

Таким чином, оператор while в нашій програмі виконує багато корисних дій. Він не тільки перевіряє, чи є значення змінної ch символом ‘\r’, але ще одержує символ з клавіатури і присвоює його змінній ch/

 

Вкладені розгалуження if...else

Далі приведена програма, яка містить вкладені розгалуження if...else. Вона імітує частину «ігрового» алгоритму переміщення в різних напрямах – на північ, південь, захід, схід, починаючи рух з точки (10,10)

#include <iostream>

using namespace std;

#include <conio.h>

int main()

{char dir=’a’;

int x=10,y=10;

cout<<”Natysnit Enter dlia vyhodu \n”;

while (dir!=’\r’) // доки не натиснута клавіша Enter

{cout<<”\n Koordynaty “<<x<<” , “<<y;

cout<<”Vvedit napriamok (n,s,e,w) “;

dir =getche();

if (dir==’n’)

y--;

else

if (dir==’s’)

y++;

else

if (dir==’e’)

x++;

else

if (dir==’w’)

x--;

}

return 0;

}

 

Дана програма демонструє використання вкладених розгалужень. Так, оператор if знаходиться всередині оператора if...else, який в свою чергу теж є частиною розгалуження if...else. Якщо перша умова не виконується, то перевіряється друга умова аж доки не будуть перевірені всі умови.

Інколи виникають складності при встановленні відповідності між else та if – тобто плутанина в тому, до якого саме if відноситься даний блок else. Дотримуємося такого правила: else зв’язаний з останнім оператором if, який не має свого власного блоку else. Якщо ж потрібно зв’язати else з іншим if-ом, то з цією метою використовуються фігурні дужки.

 

Оператор switch

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

#include <iostream>

using namespace std;

int main()

{int speed;

cout<<”Vvedit chyslo 33, 45, 78 “;

cin>>speed;

switch(speed)

{case 33:

cout<<”Maxi single\n”;

break;

case 45:

cout<<”Single\n”;

break;

case 78:

cout<<”Old format\n”;

break;

}

return 0;

}

 

Програма друкує одне з повідомлень залежно від того, яке з трьох чисел - 33, 45, 78 введе користувач.

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

Дана змінна може бути тільки цілого або символьного типу.