c++ - C++中结构的奇怪行为

标签 c++ struct

我正在解决 uva 在线判断 (http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1204) 的问题 10263(铁路),但我的代码得到了错误的答案。 在与一位 friend (他也解决了问题并被接受)讨论后,他看了看我的代码,它与他的非常相似(例如,所有的几何函数都是相同的,因为我们正在作为一个团队进行培训ICPC 并使用相同的代码库)。

因此,在我开始一次尝试一个更改以查看问题出在哪里之后,我发现了这种奇怪的行为。

我的初始代码(得到错误答案)是这个:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <limits>
#define EPS 1e-9
using namespace std;

struct point {
    double x, y;
    point(double _x, double _y) { x = _x, y = _y; } //EDITED
    point() { x = 0.0, y = 0.0; }
};

double dist(point p1, point p2) {
    return hypot(p1.x - p2.x, p1.y - p2.y); 
}

double distToLine(point p, point A, point B, point *c) {
    double scale = (double) ((p.x - A.x) * (B.x - A.x) + (p.y - A.y) * (B.y - A.y)) / ((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
    c->x = A.x + scale * (B.x - A.x);
    c->y = A.y + scale * (B.y - A.y);
    return dist(p, *c); 
}

double distToLineSegment(point p, point A, point B, point* c) {
    if ((B.x-A.x) * (p.x-A.x) + (B.y-A.y) * (p.y-A.y) < EPS) {
        c->x = A.x; c->y = A.y;
        return dist(p, A); 
    }
    if ((A.x-B.x) * (p.x-B.x) + (A.y-B.y) * (p.y-B.y) < EPS) {
        c->x = B.x; c->y = B.y; 
        return dist(p, B); 
    } 
    return distToLine(p, A, B, c); 
}

int main() {
    int Mx, My;
    while (cin >> Mx) {
        int N, x, y;
        cin >> My >> N;

        point A, B, aux, res, M(Mx, My);
        double dres = numeric_limits<double>::infinity(), d;

        cin >> x >> y;
        A = point(x,y);

        for (int i=0; i<N; i++) {
            cin >> x >> y;
            B = point(x,y);

            d = distToLineSegment(M, A, B, &aux);
            if (d < dres) {
                dres = d;
                res = aux;
            }
            A = B;
        }


        printf("%.4f\n%.4f\n",res.x,res.y);
    }
}

现在,更改此行后:

int Mx, My;
    while (cin >> Mx) {
        int N, x, y;
        cin >> My >> N;

        point A, B, aux, res, M(Mx, My);

point M;
    while (cin >> M.x) {
        int N, x, y;
        cin >> M.y >> N;

        point A, B, aux, res;

我的解决方案被接受了。 谁能帮我理解读取 int 值然后创建点的问题是什么?在什么可能的原因下这段代码会“行为不端”并生成与另一个不同的答案? 另外,关于为什么“M”是唯一的问题有什么想法吗? (我一直像以前一样读“A”和“B”,这不影响答案,只是我读“M”的方式必须改变)。

任何能帮助我理解正在发生的事情的提示都将不胜感激!


编辑: “改回错误版本”时构造函数写错了,抱歉。

最佳答案

区别在于 @jhonchen902 在评论中建议:问题指定输出必须是小数点后四位的 float 。

在您的第一个版本中,您使用整数。

关于c++ - C++中结构的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17697490/

相关文章:

c++ - 显示 QMessageBox 时如何防止双槽调用?

c++ - 如何在 Windows 上将 UTF-8 字符串打印到 std::cout?

c++ - Visual Studio 反汇编 : losing breakpoints

c++ - 无法为 C++ 方法添加性能探针

c - Struct 内部指针数组的大小

c++ - SDL卡住(黑屏)

C++ 接受任何结构输入参数

c - 在 C 中打印字符指针的问题

c - c中的结构和标记 union

c - 无论如何我可以比较使用指针制作的结构的结构?