Программирование в matlab с логическими условиями - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть небольшая логическая проблема, которую я хотел бы решить когда-нибудь !!Допустим, у вас есть 4 переменные, я назову их a, b, c и d.Теперь на основе некоторой логики даны следующие условия.

Программа передает:

  • , если заполнены оба a и c
  • , если заполнены оба a и d

  • если заполнены оба b и c

  • если заполнены оба b и d

  • если заполнены оба c и d

сбой программы:

  • если заполнен только a
  • если заполнен только b
  • если только cзаполнено
  • , если заполнено только d
  • , если заполнены оба a и b

Так что, если вы заполните одну переменную, вы будете вынуждены заполнить больше.Если вы не заполняете ни одну переменную, никаких действий не требуется.

Для простоты я сказал, что 1 равно заполнено, а 0 равно не заполнено.Мой кусок кода не работает правильно, потому что, если я скажу, что заполнен только d, это вернет, что это нормально.Но это не должно работать, так как только d - сбой.

Есть идеи, что я мог сделать?Может быть, мое мышление об этом не правильно?Имейте в виду, что 0 и 1 просто для простоты, поэтому добавление суммы не поможет!

Вот мой код:

a = 0; 
b = 0; 
c = 0; 
d = 1; 

if a ~=0 || b ~=0 || c ~=0 || d ~=0
    if ~(a~=0 || b~=0 && c~=0 || d~=0 ) 
       works = 1;
    else
       no = 1;
    end
end 

Спасибо за чтение!

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Поскольку вопрос помечен MATLAB, я также дам вам решение MATLAB.По сути, ваша идея добавления суммы - это просто путь, просто сначала преобразуйте переменные в двоичные, что делается с помощью logical.Таким образом, проверка на неудачу может быть выполнена с помощью

arr = logical([a,b,c,d]);
fail = sum(logical(arr))==1 || all(arr(1:2))

, где первое условие проверяет, сколько было заполнено, а второе проверяет, установлены ли оба значения a и b.

Следует отметить, что существуют случаи, которые удовлетворяют как условиям прохождения, так и неудачи (например, все установленные переменные).Решение, приведенное выше, является неудачным.Проходное жадное решение будет (как предложено Крисом Луенго в комментариях)

arr = logical([a,b,c,d]);
fail = sum(logical(arr))==1 || all(arr==[1,1,0,0])
0 голосов
/ 10 декабря 2018

Если вы хотите, чтобы ваш код был более читабельным, вы можете использовать метод для выполнения логики, а самый простой способ сделать это - просто перевести вашу логику.

public static boolean isParamFilled(boolean a, boolean b, boolean c, boolean d) {
    if ((a || b) && (c || d)) return true;
    if (c && d) return true;
    int ia = a ? 1 : 0;
    int ib = b ? 1 : 0;
    int ic = c ? 1 : 0;
    int id = d ? 1 : 0;
    // Only one of the 4 parameters is filled.
    if (ia + ib + ic + id == 1) return true;
    if (a && b) return false;
    // default value
    return false;
}

public static void main(String...args) {
    boolean a = false; 
    boolean b = false; 
    boolean c = false; 
    boolean d = true; 

    booledan worked = isParamFilled(a, b, c, d);
}
...