2016-08-01 5 views
-3

Приложение C++, которое я создаю, позволяет пользователю добавлять или удалять свои любимые игры в список.Создание списка моих избранных

Я хочу, чтобы список был заказан.

  1. Легенда о Zelda
  2. Contra
  3. GTA V

Я знаю, что нужно будет использовать время/цикл, однако я использую вектор (ы), который я новичок , и я не знаю, где разместить цикл while/for в моем коде.

То, что я пытался до сих пор:

неудачная попытка 1 - Вложенный цикл:

for (gameInter = list.begin(); gameInter != list.end(); gameInter++) { 
     for (int listNum = 1; listNum < list.size(); listNum++) { 
      cout << listNum << ". " << *gameInter << endl; 
     } 
    } 

неудачная попытка 2 - Через некоторое время цикла:

case 1: 
     while(listNum < list.size()) { 
      cout << "Type the game title to add: \n"; 
      cin.get(); 
      getline(cin, addGame); 
       list.push_back(addGame); 
       sort(list.begin(), list.end()); 
       cin.clear(); 
       cin.sync(); 
       cout << "\nYour game was successfully added.\n"; 
       listNum++; 
     } 
      break; 

Полный код:

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <string> 

using namespace std; 

int main() 
{ 

    int userSelection = 0; 
    int listNum = 1; 

    string addGame, removeGame; 

    vector<string> list; 
    vector<string>::iterator gameInter; 

    while (userSelection != 4) { 

     cout << "Type 1 to add a game to your list\n"; 
     cout << "Type 2 to remove a game from your list\n"; 
     cout << "Type 3 to list all games\n"; 
     cout << "Type 4 to quit\n"; 

     cin >> userSelection; 

     switch (userSelection) { 
     case 1: 
      cout << "Type the game title to add: \n"; 
      cin.get(); 
      getline(cin, addGame); 
       list.push_back(addGame); 
       sort(list.begin(), list.end()); 
       cin.clear(); 
       cin.sync(); 
       cout << "\nYour game was successfully added.\n"; 
      break; 
     case 2: 
      cout << "Type the game title to remove: \n"; 
      cin.get(); 
      getline(cin, removeGame); 
      gameInter = find(list.begin(), list.end(), removeGame); 
      if (*gameInter == removeGame) { 
       cout << "Title " << removeGame << " found\n"; 
       list.erase(gameInter); 
       cout << "Title " << removeGame << " has been removed!\n"; 
      } 
      else 
      { 
       cout << "Title " << removeGame << " cannot be found!\n"; 
      } 
      break; 
     case 3: 
      cout << "\nYour Favorite Games Are: \n"; 

       for (gameInter = list.begin(); gameInter != list.end(); gameInter++) { 
        cout << listNum << ". " << *gameInter << endl; 
      } 
      break; 
     case 4: 
      cout << "Thank You for your input! Goodbye\n"; 
      //userSelection = 4; 
      break; 
     default: 
      cout << "That is not a valid option\n"; 
      break; 
     } 
    } 
    system("pause"); 
    return false; 
} 
+3

1) И поэтому не следует использовать 'using namespace std' в глобальной области:' vector list; '. То есть не называйте ваши переменные такими же, как типы STL. 2) Каковы ошибки, с которыми вы сталкиваетесь? –

+0

Проголосовавшие: прокомментируйте! –

+0

В соответствии с комментарием №1 и «Неудачная попытка» - _what_ не удалось? Вы не можете просто сказать «Это не работает» и ожидать решения без описания проблемы. Популярность этого подхода никогда не перестает удивлять меня: как люди ожидают, что это сработает? Во всяком случае, вы, вероятно, просто избавитесь от необходимости повторного использования колес вручную, когда stdlib предоставляет фантастические функции для случаев точно так же, как, например, 'std :: set >', который автоматически упорядочивается в соответствии с рангом в 'pair :: first' (и, если существуют какие-либо связи, то имя в' pair :: second'). –

ответ

0

Пожалуйста, рассмотрите возможность использования специализированных контейнеров, предоставляемых стандартной библиотекой, чтобы облегчить вашу жизнь. Они существуют, чтобы избежать необходимости кропотливо изобретать колесо, чтобы вы могли сосредоточиться на том, что вам нужно делать, а не на скучных деталях и лесах вокруг него! Не поймите меня неправильно: использование vector ставит вас впереди многих - не вручную выделяя свой собственный массив, но мы можем сделать лучше.

Например, чтобы создать группу игр, с званиями и титулами, которые будут автоматически отсортированной по их рядам (и если возникает связь, их название):

#include <iostream> 
#include <set> 
#include <string> 
#include <tuple> // pair 

// Represent a game by its rank and title (typedef) 
using game_type = std::pair<unsigned, std::string>; 

// Create an ordered set of games 
std::set<game_type> games; 
// Populate it. You could do this from standard input. 
games.emplace(3, "GTA V"); // constructs element in-place 
games.emplace(1, "Legend Of Zelda"); 
games.emplace(2, "Contra"); 

// Verify that std::pair sorts by .first (and then .second) 
for (auto const &it: games) { // tidy C++11 iteration syntax 
    std::cout << it.first << ": " << it.second << std::endl; 
} 

Выход, что вы хочу:

1: Legend of Zelda 
2: Contra 
3: GTA V 

Хотите, чтобы заполнить map из пользовательского ввода вместо этого? Конечно. Просто возьмите ранг и заголовок во временные переменные, затем emplace(theRank, theTitle).

Затем вы можете начать думать о том, как стереть по рангам, и довольно быстро найти ответ в документации std::set или <algorithm>. Вижу, вы уже уже посмотрели на последнего. Замечательно! Это помогает нам помочь, но иногда их пропускают. Или люди используют свои функции, но не #include и полагаются на косвенное включение в другое место ...

В любом случае. Может быть, теперь вам нужны/нужны ранги, чтобы быть уникальными, и нужно поймать ситуации, когда пользователь вводит дубликат? Затем проверьте std::map.

И так далее. В стандартной библиотеке так много возможностей. Было бы позором, если бы вы пропустили тех, у кого также возникали головные боли от неосознанно, пытаясь изобретать их самостоятельно. ;-)