使用qsort输出有序列表

时间:2015-03-03 21:49:04

标签: c++ qsort

我在C ++课程中有一项任务是从文本文件中获取信息:

Scores.txt

PhredrickTheGreat     5.7 5.3 5.1 5.0 4.7 4.8 
RobbieTheRock         3.1 4.9 4.1 3.7 4.6 3.9 
CannonBallKelly       4.1 5.3 4.9 4.4 3.9 5.4 
MartyTheMissile       5.1 5.7 5.6 5.5 4.4 5.3 
BillieBomb            5.9 4.8 5.5 5.0 5.7 5.7 
JackKnifeJake         5.1 4.7 4.1 3.1 4.6 5.0 
Splash                5.1 5.1 4.9 3.4 5.5 5.3 
MillyTheMalard        4.9 4.3 5.2 4.5 4.6 4.9 
HoraceTheDivingHorse  6.0 6.0 5.7 5.8 5.9 5.9 
FishTank              4.3 5.2 5.9 5.3 4.3 6.0

这些是虚构的棒球运动员的名字(以及击球得分?)。程序应该输出玩家的名字,他们的平均分数,然后根据他们的平均分数分配他们的第一,第二,第三等地方。这就是我到目前为止所拥有的:

enter image description here

我评论了几个" couts,"所以你可以忽略这些。

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

struct Scores
{
    float Score;
    string Name;
};

float calculateAverage(float RawData){ return RawData / 6.0;}

int main()
{
    string Name;
    string Score;
    float RawScores = 0;
    float Average;

    Scores ComScores[10];

    ifstream playerData("Scores.txt");
    for(int i = 0; i < 10; i++)
    {
        playerData >> Name; // Read in a name
        //cout << left << setw(25) << Name << " ";
        ComScores[i].Name = Name;

        for(int j = 0; j < 6; j++) // Read in Six Scores
        {
            playerData >> Score;
            RawScores += atof(Score.c_str());
            //cout << Score << " ";
        }
        Average = calculateAverage(RawScores);
        ComScores[i].Score = Average;
    RawScores = 0;
    //cout << " Ave: " << fixed << setprecision(2) << Average <<endl;
    }

    cout << "Place      Name               Score\n";
    cout << "-------------------------------------\n";



    for(int i=0; i < 10; i++)
    {
        if (i < 9){
            cout << " " << i+1 << " " << setw(25) << ComScores[i].Name << " " << setw(8) << ComScores[i].Score << endl;
        }
        else{cout << i+1 << " " << setw(25) << ComScores[i].Name << " " << setw(8) << ComScores[i].Score << endl;}
    }

    cout << "\n";
    cin.get();
    return 0;
}

正如你所看到的,我差不多完成了我只需要用qsort命令这些地方。我的教授给了我们一个使用qsort(我可以发布)的例子,但它与这个程序没有关系(在我看来)。对于像我这样的新手来说,程序已经有点大而复杂了,所以,我在实现qsort方面遇到了麻烦。

我可以添加哪些内容来排序最后一个&#34; for循环&#34;订购清单?

我会尽快回答任何问题。

1 个答案:

答案 0 :(得分:1)

这是一种可以进行比较功能的方法:

int score_cmp(const void* a, const void* b)
{
    const Scores* sa = (const Scores*)a;
    const Scores* sb = (const Scores*)b;

    if (sa->Score > sb->Score)
        return -1;
    else if (sb->Score > sa->Score)
        return 1;
    else
        return 0;
}

你可以这样打电话给qsort

qsort((void*)ComScores, 10, sizeof(Scores), score_cmp);

也就是说,一旦你理解它应该如何工作,你应该尝试自己重写它,这不是很难,这是一个很好的练习。

但是请注意,正如@PaulMcKenzie指出的那样,使用非平凡类型调用qsort是未定义的行为。 如果你必须使用qsort,一个简单但相当丑陋的修复方法是用string替换struct Scores中的string*成员,然后根据需要更新剩余的代码(qsort部分不会必须改变。)