使用qsort输出有序列表

Using qsort to output ordered list

我的 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

这些是虚构的棒球运动员的名字(和击球得分?)。程序应该输出选手的名字,他们的平均分,然后根据他们的平均分给他们分配第 1、2、3 等名次。这是我目前所拥有的:

我注释掉了一些 "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 的例子(我可以 post),但它与这个程序并没有真正的关系(在我看来)。这些程序对于像我这样的新手来说已经有点大和复杂了,所以,我在实现 qsort 时遇到了麻烦。

我可以在我的程序中添加什么来对最后 "for loop" 列表进行排序?

我会尽快回答任何问题。

您可以通过以下方式执行比较功能:

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,一个简单但相当难看的修复方法是将 struct Scores 中的 string 成员替换为 string*,然后根据需要更新剩余代码(qsort 部分不会必须改变)。