1

对于一个项目,我必须创建一个队列,其中包含人员姓名、他们想要的服务数量以及他们想要的每项服务的列表。可以多次要求相同的服务。

基本上它的输入看起来像这样。

Dave 3 spa sauna pedicure
sarah 4 spa spa walk sauna
jim 1 walk
.

这 ”。” 表示我所有输入的结束。无论何时调用 walk ,一旦他们行走,他们就不再想做其他任何事情并离开。所以在莎拉的情况下,她去了两次水疗中心,然后走路离开。她没有去她的桑拿浴室。

我的问题是我不知道我将如何实际输入信息。我假设我有一个表示人的类,但我不知道如何制作它,以便他们可以放置随机数量的人。如果只有 3 个人,我会使用 for 循环并将每个人保存到数组中的不同位置。

有没有办法简单地做到这一点?

4

3 回答 3

1

您拥有最终用户输入的特殊符号,因此您可以要求输入,直到获得此符号(“。”)。代码可以是这样的:

while(true)
{
    std::string name;
    std::cin >> name;

    if(name == ".")
        break;

    // number of services
    size_t n = 0;
    std::cin >> n;

    // list of services
    std::vector<std::string> services(n);
    for(size_t i = 0; i < n; ++i)
        std::cin >> services[i];

    // Here you can process user
    // You know user's name and have std::vector of his services
}

此代码无限循环,直到用户名等于“.”。

如果要输出所有用户或在列表中处理它们,则必须将它们存储在向量中。

struct User
{
    User(const std::string& _name):
        name(_name)
    {
    }

    std::string name;
    std::vector<std::string> services;
};

std::vector<User> users;

int main( )
{
    std::vector<User> users;

    while(true)
    {
        std::string name;
        std::cin >> name;
        if(name == ".")
            break;

        users.push_back(User(name));

        size_t n = 0;
        std::cin >> n;

        for(size_t i = 0; i < n; ++i)
        {
            std::string serviceName;
            std::cin >> serviceName;

            users.back().services.push_back(serviceName);
        }
    }

    for(size_t n = users.size(), i = 0; i < n; ++i)
    {
        std::cout << users[i].name;
        std::cout << " ";
        std::cout << users[i].services.size();
        std::cout << " ";
        for(size_t s = users[i].services.size(), j = 0; j < s; ++j)
            std::cout << users[i].services[j] << " ";
        std::cout << std::endl;
    }

    return 0;
}

此代码读取用户及其服务,然后将其打印回来。

如果您知道每个用户都在不同的行上,则可以有另一种方式来读取每个用户。

std::string l;
std::getline(std::cin, l);

std::istringstream ss(l);

std::string name;
ss >> name;
if(name == ".")
    break;

users.push_back(User(name));

size_t n = 0;
ss >> n;

for(size_t i = 0; i < n; ++i)
{
    std::string serviceName;
    ss >> serviceName;

    users.back().services.push_back(serviceName);
}

我正在从输入流(cin)中读取整行,然后创建字符串流(ss)并从中读取用户信息。

于 2012-10-16T03:03:51.237 回答
0

读入名称,一旦他们输入动作的数量,他们将通过该数字执行循环。创建一个常量字符来表示每个可能的位置(据我所知,他们可以访问指定的位置)。如果下一次读取是步行,则结束循环。这是您代码的非常粗略的大纲(根据我的理解),这是为了检查我的任何错误而匆忙完成的

    Declare consts ex:
        const string SPA = "spa";
        const string PEDICURE = "pedicure";
        //etc..etc..

    Decalre vars ex:
        int actions; //amount of actions
        //etc...e

tc..
WHILE name is not the dot

    prompt user for name
    read in name

    prompt user for amount of actions
    read in actions

    DO THIS
        prompt user for action
        read in action into string

        convert to lowercase(optional)
        compare action to possible places
            increment chosen place
        increment counter var(s)
    WHILE input is not walk and actions does not exceed max actions


display output
于 2012-10-16T03:04:33.243 回答
0

对于getline很容易:

string line;
while(getline(cin,line))
{
    if (line.empty())
       break;
    file.push_back(line);
}

但是cin objects我找到了一种在最后打破的方法,而不需要任何打破字符。您必须使用相同的变量来 cin 所有对象。使用后,您需要将其设置为默认退出值。然后检查下一个cin之后你的变量是否相同。例子:

string o;
while(true){
    cin>>o;
    if (o.compare("tmp")==0)
        break;
    // your normal code
    o="tmp";
}
于 2019-01-23T13:29:13.977 回答