2012-10-16 33 views
0

對於一個項目,我必須創建一個隊列,它可以列出人名,他們想要的服務數量以及他們想要的每個服務的列表。相同的服務可以被要求多次。cin對於未知數量的對象?

基本上它的輸入看起來是這樣的。

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

「。」表示我所有輸入的結束。不管什麼時候走路,一旦走路,他們就不再想做其他事情而離開了。所以在莎拉的情況下,她去水療2次,然後走路和離開。她沒有去她的桑拿浴室。

我的問題是我不知道我會如何cin信息。我假設我有一個表示人的類,但是我不知道如何製作它,以便他們可以放置隨機數量的人。如果只有3人,我會使用for循環並將每個保存到數組中的不同位置。

有沒有辦法簡單地做到這一點?

+0

你可以殺死服務的一部分的數量,使用'getline'每個輸入行,提取名稱,並使用容器的兩個迭代器構造函數來初始化它們所需的服務。然後可以用size()來訪問這個數字。 – chris

回答

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)並從中讀取用戶信息。

+0

謝謝。我不確定我是如何處理輸入的,但這看起來像他們將要做的那樣。我不知道如何顯示每個切斷,但這很好。 –

+0

我很高興我能幫到你。 –

+0

@ T.J.Williams歡迎來到SO。如果這解決了你的問題,你應該接受答案。如果它仍然有用,你應該注意。使用答題面板左側的按鈕。 – fayyazkl

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 
+0

完美謝謝! –