测试程序是否正常运行

时间:2019-01-06 11:42:42

标签: c

我有一个程序,它基本上说出用户输入的内容是在内部,外部还是在矩形边缘上,现在我为该程序编写了一个测试,该测试是假设用户是否成功进行测试的测试。是否,我想对xy表中的每个点进行测试,然后最后告诉所有测试是否成功。

我的问题是我不确定如何将其放入基本代码中,以便测试能够正常进行。它是在开头还是结尾(因为程序在告诉用户点的位置之后退出,所以它是开头还是结尾)?我应该为测试做一个数组吗?感谢您对如何在基本代码中编写代码的任何帮助:

1 个答案:

答案 0 :(得分:1)

首先,您应该检查x1 < x2y1 < 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;
}