我有一个程序,它基本上说出用户输入的内容是在内部,外部还是在矩形边缘上,现在我为该程序编写了一个测试,该测试是假设用户是否成功进行测试的测试。是否,我想对xy表中的每个点进行测试,然后最后告诉所有测试是否成功。
我的问题是我不确定如何将其放入基本代码中,以便测试能够正常进行。它是在开头还是结尾(因为程序在告诉用户点的位置之后退出,所以它是开头还是结尾)?我应该为测试做一个数组吗?感谢您对如何在基本代码中编写代码的任何帮助:
答案 0 :(得分:1)
首先,您应该检查x1 < x2
和y1 < y2
并根据需要交换坐标,以使点(x1,y1)在左下角,而点(x2,y2)在右上角。>
然后使用
检查点是否在框外if(x < x1 || x > x2 || y < y1 || y > y2) {
// outside the box
}
然后使用
检查点是否在方框内
else if(x > x1 && x < x2 && y > y1 && y < y2) {
// inside the box
}
这留给了
else {
// on the box boundary
}
奇怪的是,该函数通过将它们用作局部变量来覆盖传递的所有参数。因此,函数返回时坐标将丢失。最好在调用函数之前输入数据,或者将指针传递到将包含数据的变量。
这是一种方法,尽管可以通过多种方法来改进代码。使用double
类型的一个困难是浮点数编码的不精确性。请注意,该代码避免使用==
相等性测试。在此示例中,这可能不是问题,但是,如果已经计算了该点,并且理论上应该精确地位于框的边界上,则测试可能无法检测到该点。
#include <stdio.h>
enum { INSIDE, OUTSIDE, EDGE };
int throw_at_rectangle(double x, double y, double x1, double y1, double x2, double y2)
{
if(x < x1 || x > x2 || y < y1 || y > y2) {
// outside the box
return OUTSIDE;
}
if(x > x1 && x < x2 && y > y1 && y < y2) {
// inside the box
return INSIDE;
}
// on the box boundary
return EDGE;
}
int main(void) {
double x1, y1;
double x2, y2;
double x, y;
double temp;
// First corner (bottom left) of the rectangle
printf("Choose x and y for the first corner that the rectangle should start:\n");
scanf("%lf%lf", &x1, &y1);
// Opposite corner(top right) that should make the rectangle possible
printf("Choose x and y for the second corner that the rectangle should end:\n");
scanf("%lf%lf", &x2, &y2);
// The position of the point that should be checked
printf("Choose the x and y that should be checked:\n");
scanf("%lf%lf", &x, &y);
if(x1 > x2) {
temp = x1;
x1 = x2;
x2 = temp;
}
if(y1 > y2) {
temp = y1;
y1 = y2;
y2 = temp;
}
switch(throw_at_rectangle(x, y, x1, y1, x2, y2)) {
case OUTSIDE:
puts("outside the box");
break;
case INSIDE:
puts("inside the box");
break;
default:
puts("on the boundary");
}
return 0;
}