【发布时间】:2014-11-29 20:30:10
【问题描述】:
我的程序应该是这样工作的:
- 输入您要创建的点数。
- 为每个点写下:名称、x 位置、y 位置
- 程序应该计算从点到原点的长度(0,0),它在函数 Leng() 中计算
- 所有参数都保存在对象 abc 中
- 然后我创建对象表 TabOb
- 我想对我的点进行排序,从点和原点之间的最小长度 (0,0) 到点和原点之间的最大长度。我想使用 stdlib.h 中的 qsort 函数执行此操作 我有一个创建比较函数的想法,它可以帮助我做到这一点,但我不知道具体如何。有人可以帮我吗?
我会给你一个我想在最后得到的输入和输出的例子:
输入:
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;
}
【问题讨论】:
-
为什么不使用
std::sort? -
另外,我会问你——我给你两个 TabOj 对象。在排序时,您告诉我(以及最终排序)哪个项目在另一个项目之前的标准是什么?不管是什么,这就是你的代码。此外,
std::sort使这变得更加简单,因为您没有做 void* 的东西和所有其他非类型安全的编码。 -
另外,我不明白你在
compare函数中在做什么。您正在对Klasa对象进行排序,但由于某种原因,当它应该转换为 Klasa* 时,您将类型转换为 int*。这看起来不正确。这就是为什么使用 std::sort 会强制您使用正确的类型,而不是像现在这样对 int* 进行虚假强制转换。