任何人都可以告诉我它为什么不适用于输入0 0 0 0 0 0
?
struct pPoint
{
float x, y;
};
struct line
{
pPoint x1, x2, x3;
};
bool judge(line& x)
{
if (x.x1.x == x.x2.x == x.x3.x)
return true;
else
{
if (x.x1.y == x.x2.y == x.x3.y)
return true;
else
{
float a = (x.x1.y - x.x2.y) / (x.x1.x - x.x2.x);
float b = x.x1.y - x.x1.x*a;
if (x.x3.y == a*x.x3.x + b)
return true;
return false;
}
}
}
int main()
{
line x;
cin >> x.x1.x >> x.x1.y >> x.x2.x >> x.x2.y >> x.x3.x >> x.x3.y;
cout << (judge(x) ? "YES" : "NO") << "\n";
return 0;
}
检查3点是否共线,它是否正常工作,但是输入
0 0 0 0 0 0
它说NO
或崩溃,它适用于1 1 1 1 1 1
等。
当我调试它时,它只是在判断时跳过if
。
答案 0 :(得分:4)
它不起作用,因为在这一行:
if (x.x1.x == x.x2.x == x.x3.x)
你首先将int编译为int x.x1.x == x.x2.x
,然后你用bool编译int
bool == x.x3.x.
您必须将这些点与其他点进行比较:
if (x.x1.x == x.x2.x && x.x2.x == x.x3.x && x.x1.x == x.x2.x )
如果你到处改变它应该有效;)
答案 1 :(得分:0)
a == b == c
无法正常工作。它实际上可写入:(a == b) == c
,因为==
的关联性为left-to-right
。第一个(a == b)
等于true
a=b=c=0
,c = 0
,true != c
,这就是整个表达失败的原因。请改用if ((a == b) && (a == c))
。
它在a = b = c = 1
时起作用,因为(a == b) = true
和c = 1
,而布尔值true
也等于1
,所以表达式成功了。
答案 2 :(得分:0)
if (x.x1.y == x.x2.y == x.x3.y)
此设计无法满足您的预期效果。
x.x1.y == x.x2.y == x.x3.y
与x.x1.y == (x.x2.y == x.x3.y)
和x.x1.y == (x.x2.y == x.x3.y ? 1 : 0)
if (x.x1.x == x.x2.x && x.x2.x == x.x3.x && x.x1.x == x.x2.x )
是你需要的。