1

プロジェクトでは、人の名前、必要なサービスの数、必要な各サービスのリストを並べたキューを作成する必要があります。同じサービスを複数回要求できます。

基本的に、入力は次のようになります。

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

「。」すべての入力の終わりを示します。walk がいつ呼び出されても、一度歩くと、他のことをしたくなくなり、立ち去ります。サラの場合、彼女は 2 回スパに行き、歩いて去ります。彼女はサウナに行きません。

私の問題は、実際にどのように情報を収集するのか見当がつかないことです。人を表すクラスがあると思いますが、ランダムな人数の人を配置できるようにする方法がわかりません。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) から行全体を読み取ってから、stringstream (ss) を作成し、そこからユーザー情報を読み取ります。

于 2012-10-16T03:03:51.237 に答える
0

名前を読み取り、アクションの数を入力すると、その数をループして実行します。可能な場所のそれぞれを表す定数文字を作成します(私が理解していることから、訪問できる場所が指定されています)。次の読み取りが walk の場合、ループを終了します。これはあなたのコードの大まかな概要です(私の理解では)、これは私のエラーをチェックするために急いで行われました

    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 に答える