我有一个文本文件,存储一个棒球运动员ID和玩家rbi(运行击球)总数。 ID都是四位数,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;
}
答案 0 :(得分:3)
我认为他们希望您将结果存储在std :: map中。它是C ++(std :: pair)中键值对的容器。您可以使用以下语法将值插入地图:map[key] = value;
例如。
std::map<int, int> baseball_players;
for (...)
{
// Calculate average
baseball_players[player] = average;
}
答案 1 :(得分:2)
首先,我想与您分享一些您可能觉得有用的代码说明。
从文件中读取数据时使用冗余括号:
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,平均打点),您可以使用 std::map
。
假设玩家ID存储在int
s中,平均值为double
s中的RBI,则可以使用:
std::map<int, double> result;
(更优雅的解决方案可能是使用typedef
而非“原始”类型,例如typedef int PlayerID;
和std::map<PlayerID, ...
。)
此外,要计算平均值,请将值存储在std::multiset
中。通常,如果要存储一系列值,首选应该是简单的 std::vector
;您可以使用其push_back()
方法向其添加数据,并且矢量将自动调整大小以适应新数据。
但在这种情况下,您不需要将读取数据存储在某处(然后使用读取数据丢弃容器):您只需要计算平均值。所以你只需要在 total 中累积读取数据,然后用除法计算平均值。
根据上述说明,可能会重写您的代码:
#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 --------