【问题标题】:Simple program that prints out runners, names and time打印跑步者、姓名和时间的简单程序
【发布时间】:2022-01-24 01:35: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

我的代码如下所示:

#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;
}

void print(Many_Runners_Type const & many_runners)
{
    for (Runner_Type const & runners : many_runners)
    {      
        print(runners);
        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;
    }
}
    
// void participants ()
// {
//     Runner_Type runner;
//     Many_Runners_Type many_runners;
//     string name;
// }
    
int main()
{
    Runner_Type runner {};
    Many_Runners_Type many_runners {};
    string name {};
    double runner_time {};

    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 (int i {}; i < many_runners.size(); ++i)
    {
        cout << "Times " << many_runners.at(i).first_name << ": ";
    
        while (runner_time != -1.0)
        {
            cin >> runner_time;
            runner.time.push_back(tid);
        }
    }
    
    //runner.time.pop_back();

    cout << "Surname" << setw(11) << "First name" << setw(23) << "Club: Times" << endl;
    cout << "==========================================" << endl;

    sort(begin(many_runners), end(many_runners));
    print(many_runners);
    cout << endl;

    return 0;
}

这些是我从编译器得到的警告(观察我的程序运行,但我得到的是警告,而不是错误):

CppO3.cpp:104:21: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<Runner_Type>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  104 |   for (int i = 1; i < many_runners.size(); ++i)
      |                   ~~^~~~~~~~~~~~~~~~~~~~~
CppO3.cpp: In function ‘bool operator<(const Runner_Type&, const Runner_Type&)’:
CppO3.cpp:59:1: warning: control reaches end of non-void function [-Wreturn-type]
   59 | }
      | ^

当我运行我的程序时,这是我得到的输出:

Enter participants: 
Kalle Svensson Glommen IK
Anna Nilsson Glommen IK
Per-Erik Jonsson Tuna OK
DONE
Times Anna: 12.24 10.01 -1.00
Times Per-Erik: Surname   First name         Club: Times
==========================================
 Svensson     Kalle      Glommen IK
  Nilsson      Anna      Glommen IK
  Jonsson  Per-Erik         Tuna OK

有什么解决办法吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    警告是不言自明的。

    第一个警告告诉您for 循环正在比较 signed intunsigned long。使用size_t 而不是int,甚至是std::vector&lt;Runner_Type&gt;::size_typesize() 实际返回的内容)。或者更好的是,改用range-for 循环。

    第二个警告告诉您operator&lt; 中有一个流路径导致它在没有return 值的情况下退出(即,如果由于lhs.time 为空而未进入外部for 循环)。你最后的return true; 放错地方了。


    话虽如此,您的代码还有许多其他问题。

    代码甚至没有编译,因为tidrunner.time.push_back(tid); 上是未知的,它应该推送runner_time

    另外,while 循环无论如何都是错误的,原因有两个:

    1. 这个逻辑:

      while (runner_time != -1.0)
      {
          cin >> runner_time;
          ...
      }
      

      应该是这样的:

      while (cin >> runner_time && runner_time != -1.0)
      {
          ...
      }
      
    2. 它甚至没有将runner_time 推入正确的vector 开始。您正在推入由前一个 while (true) 循环填充的最后一个 runnertime 向量。您需要改为推入many_runners[i]time 向量(这并不重要,因为无论如何print() 不会尝试输出每个跑步者的time 值)。

    另外,您的operator&lt; 使用了错误的排序逻辑。您的示例跑步者没有相同的次数,但您的运营商希望他们这样做。因此,您可能会在访问 time.at(j) 时遇到运行时错误。由于您想按跑步者的最快时间对跑步者进行排序,因此您应该在输入跑步者后sort() 他们的时间,这将简化operator&lt; 所需的逻辑,因为它需要查看的唯一time 值将是@每个跑者的987654356@。

    最后,您用于设置输出列的setw()s 在main()print() 之间不一致。

    说了这么多,试试这样的:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <numeric>
    
    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 << left << setw(9) << runner.surname << setw(11) << runner.first_name << setw(13) << runner.club << setw(2) << runner.club_last << ":";
        for(double runner_time: runner.time) {
            cout << " " << runner_time;
        }
        cout << endl;
    }
    
    void print(Many_Runners_Type const & many_runners)
    {
        for (Runner_Type const & runner : many_runners)
        {      
            print(runner);
        }
    }
        
    bool operator < (Runner_Type const & lhs,
                     Runner_Type const & rhs)
    {
        if (!lhs.time.empty()) {
            return rhs.time.empty() || lhs.time[0] < rhs.time[0];
        }
        else {
            return rhs.time.empty();
        }
    }
        
    int main()
    {
        Runner_Type runner {};
        Many_Runners_Type many_runners {};
        string name {};
        double runner_time {};
    
        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[i].first_name << ": ";
        
            while (cin >> runner_time && runner_time != -1.0)
            {
                many_runners[i].time.push_back(runner_time);
            }
    
            sort(begin(many_runners[i].time), end(many_runners[i].time));
        }
    
        cout << endl;
        cout << left << setw(9) << "Surname" << setw(11) << "First name" << setw(17) << "Club" << "Times" << endl;
        cout << "==========================================" << endl;
    
        sort(begin(many_runners), end(many_runners));
        print(many_runners);
        cout << endl;
    
        return 0;
    }
    

    Online Demo

    【讨论】:

    • 我修复了警告,但它仍然会像以前一样输入相同的内容,这是错误的。我该如何解决?您可以在我的终端中看到它的外观。我在问题中向您展示了它。
    • "它仍然会像以前一样输入相同的内容,这是错误的" - 错误到底是怎么回事?你需要更具体。你可以从我的example demo 看到这段代码打印出你要求的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多