1

そこで、ユーザーが 2 つのタプルを入力することになっているポイント印刷クラスを自分で作成しました。つまり、x と y を ^order^ でユーザーに出力します。ここで、order は p1=(x,y) を意味します。

#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>

using namespace std;

class Point2D {
public:
    Point2D();
    Point2D(double a, double b);

    double getx();
    double gety();

    void setx(double a);
    void sety(double b);

    virtual void print();
    virtual void print(int a);

    double angle();

private:
    double x;
    double y;
};

bool operator<( Point2D a , Point2D b );

int main() {

    double my_x=-999;
    double my_y=-999;
    string my_color;
    double my_weight;
    vector<Point2D*> points;

    cout << "Welcome to Point Printer! Please insert the x-and y-coordinates for your points and I will print them in sorted order! Just one rule, the point (0,0) is reserved as the terminating point, so when you are done enter (0,0).\n";

    while(true)
    {
        cout << "x = ";
        cin>>my_x;
        cout << "y = ";
        cin>>my_y;
        if((my_x == 0)&&(my_y==0))
        {
            break;
        }
        points.push_back(new Point2D(my_x, my_y));
    }
    sort(points.begin(), points.end());

    cout << "\n\n";
    cout << "Your points are\n\n";

    for(int i=0;i<points.size();i++)
    {
        cout<<i+1<<": ";
        (*points[i]).print(); cout<<endl; // this is the printing gadget
    }
    for(int i=0; i<points.size(); i++) 
    {
        delete points[i];
    }
    cout << endl << endl;

    return 0;

}

double Point2D::angle()
{
    double Angle = atan2(y,x);
    if(Angle < 0)
    {
        return Angle + 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
    }
    return Angle;
}

bool operator< (Point2D a, Point2D b)
{
    if (a.getx()*a.getx()+a.gety()*a.gety() < b.getx()*b.getx()+b.gety()*b.gety())
    {
        return true;
    }
    else if (a.getx()*a.getx()+a.gety()*a.gety() > b.getx()*b.getx()+b.gety()*b.gety())
    {
        return false;
    }
    if (a.getx()*a.getx()+a.gety()*a.gety() ==b.getx()*b.getx()+b.gety()*b.gety())
    {
        if (a.angle() < b.angle())
        {
            return true;
        }
        else if (a.angle() > b.angle())
        {
            return false;
        }
    }
    return true;
}

Point2D::Point2D() { x = 0; y = 0; return;}

Point2D::Point2D(double a, double b) { x = a; y = b; return;}

double Point2D::getx() { return x;}
double Point2D::gety() { return y;}

void Point2D::setx(double a) { x = a; return; }
void Point2D::sety(double b) { y = b; return; }

void Point2D::print() {
    cout<<"("<<x<<","<<y<<")";
    return;
}

void Point2D::print(int a) {
    print(); cout<<endl;
}

私が問題を抱えているのは、次のいずれかです。

選別

角度()

operator<(Point2D a, Point2D b)

全然違うもの...

具体的には、次の点です。

x = 1
y = 2
x = 2
y = 3
x = 1.1
y = 2.2
x = -10
y = 10
x = -5
y = -3
x = -5
y = 3
x = 5
y = -3
x = 5
y = 3
x = 0
y = 0

正しい順序でソートされていません。

どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

0

問題 (またはその 1 つ) は、比較関数の最後のステートメントです。

return true;

このブロックを見てください:

if (a.getx()*a.getx()+a.gety()*a.gety() ==b.getx()*b.getx()+b.gety()*b.gety())
{
    if (a.angle() < b.angle())
    {
        return true;
    }
    else if (a.angle() > b.angle())
    {
        return false;
    }
}

まず、ここまで来れば、 と の計算(x*x + y*y)が等しいことがわかります。ここで、角度も等しいと仮定しましょう。何が起こるのですか?が より小さくないため、最初のテストは失敗します。が より大きくないため、2 番目のテストは失敗します。次に、trueを返します。言い換えれば、すべての権利によって等しいと見なされるべきであるにもかかわらず、より小さいは true であると言っているので、false を返す必要があります。角度で複数のテストを行う代わりに、 だけでうまくいくはずです。さらに単純化すると、関数は次のようになります。aba.angle()b.angle()a.angle()b.angle()abreturn a.angle() < b.angle();

bool operator<(Point2d a, Point2d b)
{
    double A = a.getx()*a.getx()+a.gety()*a.gety();
    double B = b.getx()*b.getx()+b.gety()*b.gety();

    if (A < B) return true;
    if (A > B) return false;
    return a.angle() < b.angle();
}
于 2013-08-13T06:18:28.907 に答える
0

問題はおそらく、オブジェクトではなくポインターを格納およびソートしていることです。ポイントは、オペレーターではなくアドレスと比較されます。ポイントを次のように変更してみてくださいvector<Point2d>

于 2013-08-13T06:38:09.850 に答える