Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

11.7. Как упростить взаимоисключающие условия?

В: Как упростить взаимоисключающие условия?

Подскажите аналог опреации `XOR`.

О:

Взаимоисключающие условия — это условия, выполнение одного из которых исключает выполнение всех остальных.

Например, значение переменной может быть либо равно нулю, либо не равно нулю. На основе этих взаимоисключающих состояний можно написать взаимоисключающие условия:

if varname=0:
    "Переменная равна нулю"
else
    "Переменная не равна нулю"
end

Иногда у нас возникает задача посложнее. Есть две переменные, и условие должно выполняться лишь в том случае, если одна переменная равна нулю, а вторая не равна. Тут кажется всё просто:

if (varname1=0 and varname2<>0) or (varname1<>0 and varname2=0):
    "Условие выполняется"
end

Но несмотря на то, что всё вроде бы просто, мы уже усложнили условие до трёх операций. Если у нас будет три переменные, и лишь одна из них должна быть равна нулю, а две другие не равны, для выполнения условия, число логических операций возрастает до девяти. И т.д. Как упростить условие так, чтобы не пришлось городить такую кучу логических операций?

На самом деле всё не так уж сложно. Нам необходимо использовать переменную-маркер для фиксации числа выполненных условий. И если значение данной переменной будет отлично от единицы, наше взаимоисключающее условие так же можно считать не выполненным.

marker=0
if varname1=0: marker+=1
if varname2=0: marker+=1
if varname3=0: marker+=1
if varname4=0: marker+=1
if varname5=0: marker+=1
if varname6=0: marker+=1
if varname7=0: marker+=1
if marker<>1:
    "Условие не выполнено. Больше одной переменной не равно нулю, либо все они равны нулю"
else
    "Условие выполнено. Лишь одна из всех этих переменных равна нулю"
end