Сложени услови¶
У приручнику Увод у програмирање у програмском језику C# погледајте поглавља 3.3 и 3.4 (стране 47-56).
Подсетимо се, логички тип података се у програмима означава са bool, а променљиве логичког типа могу имати вредност true или false. Изрази чија је вредност логичког типа се краће називају логички изрази.
Логички изрази који се најчешће појављују у програмима се добијају као резултат поређења. Овакве изразе смо и до сада користили као услове у if наредбама, то су изрази попут (a < b), (x <= y), (m != n) итд.
Као што знамо, логички изрази могу да се граде и применом логичких оператора (негације, конјункције и дисјункције) на мање логичке изразе. Коришћењем ових оператора можемо, на пример, овако да формулишемо услов да бар један од датих бројева a и b припада затвореном интервалу [0, 100] и искористимо га у наредби гранања:
if (a >= 0 && a <= 100 || b >= 0 && b <= 100)
Console.WriteLine("Bar jedan od brojeva a i b je u intervalu [0, 100].");
else
Console.WriteLine("Ni jedan od brojeva a i b nije u intervalu [0, 100].");
Приоритет оператора && и || је такав да нам у овом услову нису потребне помоћне заграде. Поновимо, оператор && је вишег приоритета него ||, а сваки логички оператор па и || је вишег приоритета него релацијски оператори >=, <=, <, >, ==, !=.
Ако хоћемо да проверимо да ли је цео број x позитиван и при томе дељив бар једним од бројева 2 и 3, треба да користимо додатне заграде за наметање редоследа рачунања који нам одговара:
if (x > 0 && (x % 2 == 0 || x % 3 == 0))
...
Заграде могу да се пишу и онда када не мењају редослед израчунавања. Додавање заграда може да повећа читљивост кода и помогне онима који желе да разумеју наш програм а нису сигурни у приоритет појединих оператора. Заграде свакако треба додати и кадa сами нисмо сигурни у приоритет оператора. Према томе, нема ничег погрешног ни у писању
if ((a >= 0 && a <= 100) || (b >= 0 && b <= 100))
...
или чак
if (((a >= 0) && (a <= 100)) || ((b >= 0) && (b <= 100)))
...
Још један начин да формирамо сложени услов је да користимо логичке променљиве и да одређени сложени услов градимо постепено, у више наредби. На пример, услов да ли је бар један од бројева a и b у интервалу [0, 100] може да се формира и овако:
bool barJedanUIntervalu = false;
barJedanUIntervalu = barJedanUIntervalu || a >= 0 && a <= 100;
barJedanUIntervalu = barJedanUIntervalu || b >= 0 && b <= 100;
if (barJedanUIntervalu)
...
што се може нешто краће написати и овако:
bool barJedanUIntervalu = false;
barJedanUIntervalu ||= a >= 0 && a <= 100;
barJedanUIntervalu ||= b >= 0 && b <= 100;
if (barJedanUIntervalu)
...
Такође, можемо да користимо и if наредбе:
bool barJedanUIntervalu = false;
if (a >= 0 && a <= 100)
barJedanUIntervalu = true;
if (b >= 0 && b <= 100)
barJedanUIntervalu = true;
if (barJedanUIntervalu)
...
Почетна вредност логичке променљиве је у свакој варијанти кода једнака false зато што рачунамо дисјункцију неких подизраза и довољно је да било који од тих подизраза буде тачан да би променљива добила вредност true. Другим речима, користимо особину дисјункције да је \(\bot \lor x = x\) за било које \(x\) (у програмерском запису: false || x == x), то јест да је \(\bot\) (не-те, односно false) неутрални елемент за операцију дисјункције.
Покушајте најпре да решите квиз који следи, а затим и задатке у којима треба користити сложене услове и/или логичке променљиве.