因为标题说我正在尝试为我制作的网站创建一个排行榜。我的c ++程序的目标是为每个玩家分数点,然后显示从最高到最低的点,显示与其得分相关的名称。我需要帮助的问题是在我对代码中的点进行排序之后,在对它们进行排序之后,玩家的名称不再与正确的人匹配。 我无法弄清楚如何在分类后再将玩家阵列与得分阵列配对。所以如果有人能看到我能做什么,或者任何提示会很棒。
此外,分数来自外部来源,因此每次运行此程序时我都会手动输入分数。
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <string>
const int MAX_NAMES = 41;
using namespace std;
int main()
{
int points[MAX_NAMES];
int j = 1;
// Array of names of each person on the leaderboard.
string names[]
{
"Austin ",
"Jarred ",
"Cameron ",
"Mike ",
"Blake ",
"Mitch ",
"Juan ",
"Justus ",
"Avery ",
"Nick ",
"Garrett ",
"Dillion ",
"Ryan ",
"Andrew ",
"Brendan ",
"Justin ",
"Jared ",
"Steve ",
"Dylan ",
"Kylor ",
"Ian ",
"Josh ",
"Jake ",
"Kevin ",
"Nick ",
"Marco ",
"Patrick ",
"Danny ",
"Jay ",
"Bryson ",
"Mitchell ",
"Noah ",
"Tyler ",
"Andrew ",
"Evan ",
"Casey ",
"Mikey ",
"Hunter ",
"Luke ",
"Colton ",
"Harbir ",
};
// 1. Manually input score for each person and saves it into array.
cout << right << setw(50) << "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << right << setw(55) << "INPUT TOTAL BETA POINT SCORE" << endl;
cout << right << setw(50) << "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
for (int i = 0; i < MAX_NAMES; i++)
{
cout << right << setw(40) << names[i] << " : ";
cin >> points[i];
}
// 2. organizes from highest to lowest
for (int k = 40; k >= 0; k--)
{
for (int x = 0; x < MAX_NAMES; x++)
{
if (points[x] < points[x + 1])
{
int temp = points[x + 1];
points[x + 1] = points[x];
points[x] = temp;
}
}
}
cout << right << setw(50) << "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << right << setw(35) << "SORTED" << endl;
cout << right << setw(50) << "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
for (int i = 1; i < MAX_NAMES; i++)
{
cout << i << ") " << points[i] << endl;
}
// 3. Output totals into a html formatted file.
//ofstream outfile;
//outfile.open("total.txt")
system("pause");
return 0;
}
答案 0 :(得分:2)
这个问题的一个解决方案是创建一个pair<int, string>
来将得分和玩家名称存储在同一个数据元素中,然后将它们存储在适合你的任何数组类型中(我建议std::vector ,但我将在我的示例中使用您选择的简单数组)。如previous answers中所述,pair<T1, T2>
定义了一个重载operator<
,首先比较第一个元素,然后比较第二个元素。 std::sort
将利用这一点:
#include<utility> // for pair
#include<algorithm> // for sort
#include<string>
#include<iostream>
int main() {
int MAX_NAMES = 3; // example
std::pair<int, std::string> scoreboard[MAX_NAMES] = {
{22, "Anna"}, {11, "Bo"}, {33, "Clare"} // using c++11 inline initialization
};
std::sort(scoreboard, scoreboard + MAX_NAMES); // sorts in place using operator<
for (int i = 0; i < MAX_NAMES; ++i) {
std::cout << i << ") " << scoreboard[i].second << " has " << scoreboard[i].first << " points" << std::endl;
}
return 0;
}
结果:
0) Bo has 11 points
1) Anna has 22 points
2) Clare has 33 points
您可以通过向后遍历scoreboard
来反转此列表。您可以看到一个有效的示例here。
答案 1 :(得分:1)
考虑到项目的未来,你应该依赖封装。使用属性名称和点创建一个Player类,将来您可能希望为玩家添加更多功能!并且您不想破坏您的代码,因此封装是可行的方法。
您应该尝试使用算法库,它会使您的代码更具表现力,从而更易于维护。
尝试使用标准容器来管理内存。通常的建议是使用矢量来动态记忆。
这里有一个简单实现这些技巧的例子,试试你自己!
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
class Player {
std::string name;
int points;
public:
Player(std::string name, int points) : name(name), points(points) {}
bool operator<(const Player &rhs) const {return points < rhs.points;}
std::string get_name() const {return name;}
int get_points() const {return points;}
};
int main() {
std::vector<Player> players;
players.push_back(Player("Pedro",50));
players.push_back(Player("Andres",20));
players.push_back(Player("Santiago",57));
std::sort(players.begin(),players.end());
for (const auto& player : players) {
std::cout << player.get_name() << ": " << player.get_points() << "\n";
}
}
这里我使用排序算法对向量中的玩家进行排序。 Sort使用运算符&lt;,这就是您在Player类中看到运算符重载的原因。这告诉了(player1&lt; player2)应该如何表现(在我们的例子中,它只是比较他们的分数。但你可以做任何事情,比如在玩家类中添加奖励属性)
另一个建议是将玩家的类别分成不同的文件,以使事情更有条理。
答案 2 :(得分:0)
您需要同时对列表进行排序以维护相对顺序。例如,
int temp = points[x + 1]; points[x + 1] = points[x]; points[x] = temp; string temp_name = names[x + 1]; names[x + 1] = names[x]; names[x] = temp_name;