3

我有一个文本文件,其中存储了棒球运动员的 id 和球员的 rbi(击球次数)总数。ids 都是四位数字,rbis 范围从 60 到 110。看起来像这样。

5554 102 87 63 90 5553 66 68 90 102 等...

我编写了一些代码来将 id 存储在一个集合中,从文本文件中计算四个 rbi 总数的平均值,并将结果输出到控制台。我的家庭作业说我必须将玩家 id 和 rbi 平均值存储到一对地图,而不是一组。我以为我读到了映射对的语法是

typedef pair<const Key, T> value_type;

但我无法用映射对重写此代码。有什么想法吗?

 #include <iostream>
 #include <fstream>
 #include <set>

 using namespace std;
 int main() 
 {
    ifstream input("filepath\\*.txt");
    multiset<int> values;

    // Read data from file 
    for(unsigned int j = 1; j <= 4; j++)
    {
    int player;
    (input >> player);

    int rbi;
    double total = 0.0;
    double average = 0.0;
        for(unsigned int i = 1; i <= 4; i++)
        {
        // Compute the average. 
        (input >> rbi);
        values.insert(rbi);
        total += rbi;
        average = total/4;
        }

    //Output totals to console
    cout << player;
    cout << " " << average << endl;
    }

 system("Pause");
 return 0;
 }
4

2 回答 2

3

我认为他们希望您将结果存储在 std::map 中。它是 C++ 中键值对的容器(std::pair)。您可以使用以下语法将值插入地图:map[key] = value;

例如。

std::map<int, int> baseball_players;
for (...)
{
    // Calculate average
    baseball_players[player] = average;
}
于 2013-05-02T07:54:46.303 回答
3

首先,我想与您分享一些您可能会觉得有用的代码注释。

从文件中读取数据时使用多余的括号:

int player
(input >> player);

但是下面的就好了:

int player;
input >> player; // No need for (...)

此外,您可能想要修复缩进样式。代替:

int rbi; 
double total = 0.0; 
double average = 0.0;
    for(unsigned int i = 1; i <= 4; i++)
    {
    // Compute the average. 
    (input >> rbi);
    values.insert(rbi);
    total += rbi;
    average = total/4;
    }

做了:

int rbi;
double total = 0.0;
double average = 0.0;
for (unsigned int i = 1; i <= 4; i++)
{
    // <--------- Indent here, INSIDE loop body

    // Compute the average. 
    input >> rbi;
    values.insert(rbi);
    total += rbi;
    average = total/4;
}

此外,不要使用类似的“幻数”4 ,而是考虑使用类似的常量kPlayerCount。这将使您的代码更易于阅读和维护。


关于您的特定问题,如果您想存储成对的(玩家 ID,平均 RBI),您可以使用std::map.
假设玩家 ID 存储在ints 中,平均 RBI存储在 s 中double,您可以使用:

std::map<int, double> result; 

(一个更优雅的解决方案可能是使用typedef而不是“原始”类型,例如typedef int PlayerID;and std::map<PlayerID, ...。)

此外,要计算平均值,您将值存储在 a 中std::multiset。一般来说,如果要存储一系列值,首选应该是简单的std::vector; 您可以使用它的push_back()方法向其中添加数据,向量将自动调整大小以适应新数据。

但是在这种情况下,您不需要将读取的数据存储在某处(然后将带有读取数据的容器丢弃):您只需要计算平均值。所以你只需要将读取的数据累加起来然后用除法计算平均值。

以下是您的代码的可能重写,遵循上述说明:

#include <fstream>
#include <iostream>
#include <map>

using namespace std;

int main() 
{
    static const int kPlayerCount = 4;
    static const int kRbiCount = 4;

    // Store pairs (PlayerID, RBI average)
    map<int, double> result; 

    // Read data from file 
    ifstream input("data.txt");
    for (int currPlayer = 1; currPlayer <= kPlayerCount; currPlayer++)
    {
        int playerId;
        input >> playerId;

        // Read RBIs and compute average
        int rbi;
        input >> rbi;
        double total = rbi;
        for (int i = 2; i <= kRbiCount; i++)
        {
            input >> rbi;
            total += rbi;
        }
        const double average = total / kRbiCount;

        // Store player ID and RBI average in the map
        result[playerId] = average;
    }


    // Output results to console
    for (auto it = result.begin(); it != result.end(); ++it)
    {
        cout << "Player: "      << it->first  << endl;
        cout << "Average RBI: " << it->second << endl;
        cout << "--------" << endl;        
    }
}

使用包含此数据的输入文件:

5554 102 87 63 90 5553 66 68 90 102 5560 67 77 99 100 5540 88 77 100 102

输出是:

Player: 5540
Average RBI: 91.75
--------
Player: 5553
Average RBI: 81.5
--------
Player: 5554
Average RBI: 85.5
--------
Player: 5560
Average RBI: 85.75
--------
于 2013-05-02T09:44:51.570 回答