Кин на неизвестное количество предметов?

Для проекта мне нужно создать очередь, в которой будут указаны имена людей, количество желаемых ими служб и список каждой желаемой услуги. одна и та же услуга может быть запрошена более одного раза.

в основном это вход будет выглядеть следующим образом.

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

«.» обозначает конец всех моих входов. Неважно, когда называется прогулка, когда они гуляют, они больше не хотят ничего делать и уходят. так что в случае с Сарой, она идет в спа 2 раза, затем идет и уходит. она не добирается до своей сауны.

моя проблема в том, что я понятия не имею, как я на самом деле собирал информацию. я предполагаю, что у меня есть класс, который обозначает людей, но я не знаю, как сделать так, чтобы они могли разместить случайное количество людей. если бы это было всего 3 человека, я бы использовал цикл for и сохранял каждый из них в отдельном месте в массиве.

Есть ли способ просто сделать это?

0

Решение

У вас есть специальный символ для завершения ввода пользователя, поэтому вы можете запрашивать ввод, пока не получите этот символ («.»). Код может быть таким:

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) и считываю из нее информацию о пользователе.

1

Другие решения

прочитайте имя, как только они введут количество действий, которые они будут выполнять, проходя через это число. создайте постоянный символ, представляющий каждое из возможных мест (из того, что я понимаю, есть определенные места, которые они могут посетить). Если следующее чтение — это прогулка, завершите цикл. Вот очень грубый набросок вашего кода (учитывая мое понимание), это было сделано в спешке, чтобы проверить мои ошибки

    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 actionsdisplay output
0

По вопросам рекламы [email protected]