首先,我想与您分享一些您可能会觉得有用的代码注释。
从文件中读取数据时使用多余的括号:
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 存储在int
s 中,平均 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
--------