C++计算输入和保存点的结构与原点之间的距离,根据距离打印出列表

Posted

技术标签:

【中文标题】C++计算输入和保存点的结构与原点之间的距离,根据距离打印出列表【英文标题】:C++ calculate distance between structure of inputed and saved points and the origin, print out list according on distance 【发布时间】:2016-11-08 12:44:34 【问题描述】:

在这个任务中,一个简化版本的障碍物应该由一个假想的传感器系统检测到的点来建模,该传感器系统放置在一个二维局部笛卡尔坐标系的原点。 车辆前方的任意许多这样的障碍物/点应该可以存储在列表中。该列表应按与原点的欧几里得距离排序(参见下面的示例)。 (提示:编写一个函数计算两个障碍物/点 P1 和 P2 的欧几里得距离 d,坐标为 (x1,y1) 和 (x2,y2),公式为:d=√(x1−x2)2+(y1− y2)2 为了简单地识别它们,每个障碍物/点应存储一个字符串(“A”,“B”,......在上面的示例中),距离及其坐标(xi,yi)。 (提示:给出结构的类型定义,将这四个数据作为结构的组件/变量。) 在函数 main 的循环中,应该可以输入任意许多这样的障碍物/点并将其存储在列表中。然后输出按距离排序的列表。除了每个输出中的字符串、距离和坐标之外,还应计算和输出最近的障碍物/点的字符串(参见下面的示例)。 (提示:编写一个进一步的函数,其中所有障碍/点的列表作为第一个,一个障碍/点作为第二个参数,计算最近的另一个障碍/点并将其作为指针返回。注意障碍/点不会返回并输出到自身的距离为0,并且至少需要存在两个障碍物/点;否则返回空指针nullptr。)

我能够创建结构函数、距离函数和列表,遗憾的是我无法对其进行排序并使用函数距离来计算实际距离。

希望有人可以帮助我!

#include<iostream>
#include<cmath>

using namespace std;

double distanceCalculate(double x1, double x2, double y1, double y2)

    double x = x1-x2;
    double y = y1-y2;
    double dist;
    dist = pow(x, 2) + pow(y , 2);
    dist = sqrt(dist);
    return dist;


struct point

    char name [1];
    double x, y, origin_distance ;
    struct point *next;
;

int main(void)

    int choice;
    struct point *head = nullptr, *newElement, *p ;
    do
    
        cout << "0 end"<< endl;
        cout <<"1 input point"<< endl;
        cout <<"2 print list of points" << endl;
        cin >> choice;
        switch(choice)

        
        case 1:
            newElement = new point;
            if (newElement == nullptr)
                cerr << "Not enough free memory " << endl;
            else
            
                cout<< "Please enter point's name: ";
                cin>> newElement ->name;
                cout << "Please input value x:";
                cin >> newElement->x;
                cout <<"Please input value y:";
                cin >> newElement->y;
                newElement ->next = head;
                head = newElement;
            
            break;
        case 2:
            cout<< "Print list of points"<< endl;
            cout<< "name.\t x.\t y.\t" << endl;
            p=head;
            while (p!= nullptr)
            
                cout<< p->name<<"\t"<< p->x<<"\t" << p->y << "\t" << endl;
                p=p->next;
            
            break;


        
     while (choice !=0);
    return 0;

【问题讨论】:

char name[1]非常糟糕。在 C++ 中,字符数组必须以 '\0' 终止。您还没有为此分配空间。使用 `strings 代替。 我不允许使用数组,我可以创建一个应该保存点的结构.. @Oana - 您正在使用数组来存储名称。该数组太短,无法容纳除空终止符以外的任何内容。你应该使用 std::string 类型。 正在使用数组作为您的点名称。这就是问题所在,如果您愿意,请使用char name。但不要使用char name[1] @NathanielJohnson 紧随其后的平方运算将解决这个问题。我什至会说,在这里使用abs 调用是浪费和糟糕的代码。 【参考方案1】:

我注意到的第一件事是您混合了点和(链接)列表节点的定义。更典型的实现会看到您定义 2 种类型 - 一种用于点,另一种用于列表节点。 也许是这样的:

typedef struct point

 double x, y;
;
typedef struct listNode

  point data;
  listNode *next;
;

但是,阅读您的问题 - 定义能够表示列表的类型似乎不是您任务的一部分。因此,您不妨将其留给 std 库。我已经做到了,使用 std::vector 作为容器来保存点列表。

您现在不仅需要关心定义一个数据类型来保存二维点,而且您还可以轻松地进行排序,基本上是免费的。您定义一个返回 true 或 false 的函数,具体取决于一个元素是否应该出现在下一个元素之前。

您的距离函数看起来没有问题,但我会避免在平方时使用 pow 函数 - 我只是使用 x*x + y*y

使用std::vector 类型的另一个优点是您可以使用标准数组表示法访问它包含的元素。考虑到这一点,要显示离原点最近和最远的点,您可以对列表进行排序,然后简单地显示 pointList[0]pointList[numElements-1]

这是一个粗略的实现:

#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <algorithm>

typedef struct vec2_t

    double x;
    double y;
 *pVec2;

typedef std::vector<vec2_t> vecVectors;
typedef vecVectors::iterator vecVectorsIter;

double distBetween(vec2_t &p1, vec2_t &p2)

    double dx = p1.x - p2.x, dy = p1.y - p2.y;
    return sqrt( dx*dx + dy*dy);

bool orderPointAsc(vec2_t &p1, vec2_t &p2)

    vec2_t origin = 0.0,0.0;
    return (distBetween(origin,p1) < distBetween(origin,p2));


int main()

    vecVectors pointList;
    vec2_t origin = 0.0, 0.0;
    int i, n=10;

    vec2_t tmp;
    for (i=0; i<n; i++)
    
        tmp.x = 100 * (rand() % 0xFFFF) / 65535.0;
        tmp.y = 100 * (rand() % 0xFFFF) / 65535.0;
        pointList.push_back(tmp);
        printf("%d. - <%5.02f, %5.02f> - dist from origin: %0.02f\n", i, tmp.x, tmp.y, distBetween(origin, tmp));
    
    printf("Sorting...\n");
    std::sort(pointList.begin(), pointList.end(), orderPointAsc);
    for (vecVectorsIter iter = pointList.begin(); iter!=pointList.end(); iter++)
    
        printf("<%5.02f, %5.02f> - %5.02f\n", (*iter).x, (*iter).y, distBetween(origin, (*iter)) );
    

    return 0;

样本输出

0. - < 0.06, 28.18> - dist from origin: 28.18
1. - < 9.67, 40.44> - dist from origin: 41.58
2. - <29.25, 23.99> - dist from origin: 37.83
3. - <17.51, 44.80> - dist from origin: 48.10
4. - <41.14, 37.33> - dist from origin: 55.55
5. - < 8.71, 42.95> - dist from origin: 43.82
6. - <35.52, 25.68> - dist from origin: 43.83
7. - <15.20,  0.75> - dist from origin: 15.22
8. - < 4.57, 18.22> - dist from origin: 18.79
9. - < 7.37,  8.29> - dist from origin: 11.09
Sorting...
< 7.37,  8.29> - 11.09
<15.20,  0.75> - 15.22
< 4.57, 18.22> - 18.79
< 0.06, 28.18> - 28.18
<29.25, 23.99> - 37.83
< 9.67, 40.44> - 41.58
< 8.71, 42.95> - 43.82
<35.52, 25.68> - 43.83
<17.51, 44.80> - 48.10
<41.14, 37.33> - 55.55

【讨论】:

我更新了我的问题并写了一个更好的家庭作业描述。不幸的是,我是编程和 C++ 的新手,这就是为什么我犯了这么多错误,在我的代码中我应该使用指针,并在主函数之外创建函数,我可以在其中使用例如计算距离和创建一个列表点数.. 我已经包含了一个用于计算距离的函数——它执行与您相同的任务。我没有使用过指针,因为我不知道它们的用途是必需的。不过,代码确实演示了一种方法来创建点列表,获取它们与原点的单独距离,最后根据该距离对点列表进行排序。您需要使用用户输入,而不是 rand() 作为点位置。

以上是关于C++计算输入和保存点的结构与原点之间的距离,根据距离打印出列表的主要内容,如果未能解决你的问题,请参考以下文章

Java构造重载求点与原点点与固定点点与点的距离

c语言编写点到原点的距离以及与x轴正方向的角度

计算大型数据集的地理点之间的距离

5-7 点到原点的距离(多态)

Python 计算三维空间某点距离原点的欧式距离

java 写出两点之间的距离