【发布时间】:2022-01-24 19:56:31
【问题描述】:
我应该创建一个程序,让用户输入跑步者的姓名和时间。当用户输入DONE时,用户将开始输入跑步者的时间,以-1结尾。
程序最终应该打印出所有按照跑者个人最快时间排序的跑者 (首先打印时间最快的跑步者,其次是时间第二快的跑步者,依此类推)。还 必须打印跑者自己的时间,首先打印最快的时间,其次是第二快的 时间等打印的时间必须用一个空格隔开。
为了清楚起见,在终端中,它应该如下所示:
Enter participants:
Kalle Svensson Glommen IK
Anna Nilsson Glommen IK
Per-Erik Jonsson Tuna OK
DONE
Times Kalle: 12.34 10.01 -1.00
Times Anna: 8.05 9.57 10.00 12.34 -1.00
Times Per-Erik: 10.44 -1.00
Surname First name Club: Times
==========================================
Nilsson Anna Glommen IK: 8.05 9.57 10.00 12.34
Svensson Kalle Glommen IK: 10.01 12.34
Jonsson Per-Erik Tuna OK: 10.44
当我编译并运行我的程序时,我的终端将如下所示:
Enter participants:
Kalle Svensson Glommen IK
Anna Nilsson Glommen IK
Per-Erik Jonsson Tuna OK
DONE
Times Kalle: 12.34 10.01 -1.00
Times Anna: 8.05 9.57 10.00 12.34 -1.00
Times Per-Erik: 10.44 -1.00
Surname First name Club: Times
==========================================
Svensson Kalle Glommen IK 12.34 10.01
Nilsson Anna Glommen IK 8.05 9.57 10 12.34
Jonsson Per-Erik Tuna OK 10.44
如您所见,它应该按时间对跑步者进行排序。最好的跑者应该放在第一位,他的所有时间都应该按顺序排列。这不会发生在这里,我不知道如何解决它。
这是我的代码:
include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Runner_Type {
string first_name;
string surname;
string club;
string club_last;
vector<double> time;
};
using Many_Runners_Type = vector<Runner_Type>;
void print(Runner_Type const & runner) {
cout << setw(9) << runner.surname << setw(10) << runner.first_name << setw(13) << runner.club << setw(3) << runner.club_last;
for (double const tid : runner.time) {
cout << ' ' << tid;
}
}
void print(Many_Runners_Type const & many_runners) {
for (Runner_Type const & runner : many_runners) {
print(runner);
cout << endl;
}
}
bool operator<(Runner_Type const & lhs, Runner_Type const & rhs) {
for (int j {}; j < static_cast<int>(lhs.time.size()); ++j) {
if (lhs.time.at(j) < rhs.time.at(j)) {
return true;
}
else if (lhs.time.at(j) > rhs.time.at(j)) {
return false;
}
}
return true;
}
int main() {
Runner_Type runner {};
Many_Runners_Type many_runners {};
string name {};
double tid {};
cout << "Enter participants: " << endl;
while (true) {
cin >> name;
if (name == "DONE") {
break;
}
runner.first_name = name;
cin >> runner.surname >> runner.club >> runner.club_last;
many_runners.push_back(runner);
}
for (size_t i {}; i < many_runners.size(); ++i) {
cout << "Times " << many_runners.at(i).first_name << ": ";
while (cin >> tid && tid != -1.0) {
many_runners[i].time.push_back(tid);
}
}
cout << "Surname" << setw(11) << "First name" << setw(23) << "Club: Times" << endl;
cout << "==========================================" << endl;
// sort(begin(many_runners), end(many_runners));
sort(begin(runner.time), end(runner.time));
print(many_runners);
cout << endl;
return 0;
}
我相信这是一个小问题,但我似乎无法解决它。当我尝试在 void print(Many_Runners_Type const & many_runners)子程序的 for 循环中执行 sort(begin(runner.time), end(runner.time)); 时,我会看到大量包含大量错误消息的页面。
所以我的问题是;如何对我的跑步者时间进行排序,以使其满足给定的要求?非常感谢您的帮助。
【问题讨论】:
-
你能把这个减少到minimal reproducible example吗?这里有很多只是噪音,有些人(我)很难读懂。在我的脑海中,您的比较运算符可能不会强加严格的弱排序。
-
标题中问题的规范答案是:
std::sort(vector.begin(), vector.end()) -
我看到你在使用
std::cin >> some_variable; use(some_variable);:如果读取操作成功,你需要总是检查after尝试读取!不检查输入是否成功是一个巨大的错误来源。 -
@DietmarKühl 将输入的责任转移给用户是有效的,尤其是对于学校问题。您并不总是需要检查。
-
@JohnFilleau:我不同意,因为即使在专业代码中,我也总是看到这个不正确的代码!也就是说,需要从一开始就教正确阅读输入。