我的程序应该像这样工作:
我将给你一个我想在最后得到的输入和输出的例子:
输入:
2
B 6 8
A 9 12
D 3 4
输出:
D 3 4
B 6 8
A 9 12
这是我的代码:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class Klasa {
string name;
int x,y;
double rr,leng;
Klasa* TabOb;//table of objects
int t;//number of points
public:
Klasa(){}
Klasa(string name, int x,int y) {
this->name = name;
this->x = x;
this->y = y;
this->leng = Leng();
}
double Leng(){
double rr, sq;
rr = x*x + y*y;
sq = sqrt(rr);
return sq;
}
int getX() { return x; }
int getY(){ return y; }
string getName() { return name; }
double getLength(){ return leng; }
int compare(const void * a, const void * b)
{
int _a = *(int*)a;
int _b = *(int*)b;
if (_a < _b) return -1;
else if (_a == _b) return 0;
else return 1;
}
void InputData(){
cin >> t;
TabOb = new Klasa[t];
for (int i = 0; i < t; i++){
string name;
int x, y;
cin >> name;
cin >> x;
cin >> y;
Klasa abc(name, x, y);
TabOb[i] = abc;
}
qsort(TabOb, t, sizeof(int), compare);
for (int i = 0; i < t; i++){
cout << TabOb[i].getName() << " " << TabOb[i].getX() << " " << TabOb[i].getY() << " " << TabOb[i].getLength() << endl;
}
}
}wy;
int main() {
wy.InputData();
return 0;
}
答案 0 :(得分:1)
如果您必须使用qsort
,则必须进行以下更改:
int compare(const void * a, const void * b)
{
Klasa* obj1 = (Klasa*)a;
Klasa* obj2 = (Klasa*)b;
if (obj1->x < obj2->x)
return -1;
else
if (obj1->x == obj2->x)
return 0;
return 1;
}
//...
qsort(TabOb, t, sizeof(Klasa), compare);
qsort
的第三个参数是您要比较的项目的大小。此外,比较函数期望Klasa*
,而不是int&#39; s,所以你的演员都是错误的。关于这一点最糟糕的部分是编译器没有对你说什么,演员阵容不正确。这就是为什么在C ++中应该使用std::sort
。
我的比较很简单,因此请更改您需要比较的内容,因为我并不完全理解您在Klasa对象中想要比较的内容。
要与qsort
进行比较,请使用std::sort
:
#include <algorithm>
//...
bool compare(Klasa& obj1, Klasa& obj2
{
return obj1.x < obj2.x;
}
//...
TabOb = new Klasa[t];
std::sort(TabOb, TabObj + t, compare);
compare
函数接受两个Klasa对象,如果obj1要在排序中的obj2之前发生,则返回true
。否则返回false
。我做了一个简单的排序标准,因此请更改compare
以符合您的要求。
请注意,没有类型转换,并且比较要么返回true
或false
,要么返回1,0和-1。在C ++程序中使用qsort
不是必需的,不应该推荐IMO。相反,如果你正在编写C ++,总是更喜欢std::sort
。如果您正在撰写C
代码,那么这是一个不同的故事,因为您别无选择,只能使用qsort
。
此外,您的代码有内存泄漏。您可以在代码中使用std::vector
代替new[]
来缓解此问题。
答案 1 :(得分:0)
在比较函数中,您将参数转换为整数,而它们应该是klasa
类型。在比较函数中,您必须计算点与原点之间的距离,这将是排序标准。 / p>
int compare(const void * a, const void * b)
{
Klasa j = *(Klasa*)a;
Klasa k = *(Klasa*)b;
int temp1=sqrt(pow((double) j.getX(),2)+pow((double) j.getY(),2));
int temp2=sqrt(pow((double) k.getX(),2)+pow((double) k.getY(),2));
if (temp1 < temp2) return -1;
else if (temp1 == temp2) return 0;
else return 1;
}
然后您应该将快速排序称为
qsort(TabOb, t, sizeof(Klasa), compare);
因为类型又是klasa
而不是int
最后你必须把你的比较功能放在你的课堂之外。