我有一个小逻辑问题,我希望有一天能解决!!假设你有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
感谢您的阅读!
由于这个问题被标记为MATLAB,我也会给你一个MATLAB解决方案。基本上,添加和的想法只是一种方法,只需先将变量转换为二进制,这是用logical
完成的。因此,可以使用进行故障检查
arr = logical([a,b,c,d]);
fail = sum(logical(arr))==1 || all(arr(1:2))
其中第一个条件检查已经填充了多少,第二个条件检查a
和b
是否都被设置。
需要注意的是,有些情况同时满足通过和失败条件(例如,设置了所有变量(。上面的解决方案是贪婪的失败。一个通行证贪婪的解决方案将是(如Cris Luengo在评论中提出的(
arr = logical([a,b,c,d]);
fail = sum(logical(arr))==1 || all(arr==[1,1,0,0])
如果你想让你的代码更可读,你可以用一个方法来做逻辑,最简单的方法就是翻译你的逻辑。
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);
}