【问题标题】:Creating a leader board, need help pairing an array of total points to the "player" array创建排行榜,需要帮助将总分数组与“玩家”数组配对
【发布时间】:2018-01-16 06:47:18
【问题描述】:

正如标题所说,我正在尝试为我制作的网站创建排行榜。我的 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;
}

【问题讨论】:

    标签: c++ arrays sorting


    【解决方案1】:

    这个问题的一个解决方案是创建一个pair&lt;int, string&gt; 来将分数和玩家姓名存储在同一个数据元素中,然后将它们存储在适合您的任何数组类型中(我会推荐std::vector,但我会在我的示例中使用您选择的简单数组)。如previous answers 中所述,pair&lt;T1, T2&gt; 定义了一个重载的operator&lt;,它首先比较第一个元素,然后是第二个元素。 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

    【讨论】:

      【解决方案2】:

      考虑项目的未来,您应该依赖封装。使用属性名称和点创建一个 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";
          }
      }
      

      这里我使用排序算法对向量中的玩家进行排序。排序使用运算符

      另一个建议是将 Player 的类分开到一个不同的文件中,以使事情更有条理。

      【讨论】:

        【解决方案3】:

        您需要同时对列表进行排序以保持相对顺序。例如,

                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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-08
          • 1970-01-01
          • 2011-04-15
          • 2015-06-28
          • 1970-01-01
          • 2014-06-29
          • 1970-01-01
          • 2021-10-03
          相关资源
          最近更新 更多