2014-01-20 2 views
0

Я новичок в C++, поэтому извините свои ошибки; Я пытаюсь создать программу, которая просит пользователя указать, сколько у них братьев и сестер, и на основе их ввода они записывают родной возраст сестры (Age of Gender) (разделенный пробелом).Как получить определенные элементы в C++

std::string name, age, gender; 
int n; 
std::vector<str::string> siblings; 

std::cout << "How many siblings do you have? "; 
std::cin >> n; 

for (int a=0;a<n;a++){ 
    std::string x; 
    std::cout << "Please enter info for sibling #" << (a+1) << ": "; 
    std::cin >> name; 
    std::cin >> age; 
    std::cin >> gender; 
    x += " " + name; 
    x += " " + age; 
    x += " " + gender; 
    siblings.emplace_back(x) 
} 

Допустим, что пользователь, введенный «3» братьев и сестер с информацией:

Michael 14 Male 
Sam 20 Female 
Anna 8 Female 

Как получить доступ к возрасту первого братьев и сестер, возраст второго братьев и сестер, возраст третьего братьев и сестер? То же самое с именем? Пол?

Я пытался делать

std::cout << age 

Но это только дает мне один результат.

+0

Сохраняя каждое значение в массиве, а не просто помешивая все это в строку. – John3136

ответ

3

Хранить данные в структуры или класса, например:

struct PeopleStats 
{ 
    std::string name, age, gender; 
}; 

Затем создать вектор объектов этого класса, а вектор строк:

std::vector<PeopleStats> siblings; 

Тогда ваш входной цикл, вместо того, чтобы забивать все данные вместе в строке, хранить их в одном из этих объектов, а затем помещать этот объект в вектор.

for (int a=0;a<n;a++){ 
    PeopleStats x; 
    std::cout << "Please enter info for sibling #" << (a+1) << ": "; 
    std::cin >> x.name; 
    std::cin >> x.age; 
    std::cin >> x.gender;  
    siblings.emplace_back(x) 
} 

Тогда можно отобразить, например, возраст каждого, как это:

for (auto const & sibling : siblings) 
    std::cout << sibling.age << '\n'; 
1

Вам необходимо создать массив динамически на основе входного номера «n» и сохранить данные каждого брата и сестры.

Вы также можете использовать вектор. В настоящее время вы используете только строку, чтобы получить возраст, имя и т. Д. Следовательно, вы видите только один вывод.

1
std::vector<std::string> names, ages, genders; 
.. 
for (int a=0;a<n;a++){ 
    std::string x; 
    std::cout << "Please enter info for sibling #" << (a+1) << ": "; 
    std::cin >> name; 
    std::cin >> age; 
    std::cin >> gender; 
    names.push_back(name); 
    ages.push_back(age); 
    genders.push_back(gender); 
} 
std::cout << names[0] << " " << names[1] ... and so on 
+0

В чем разница между push_back и emplace_back? – Kara

+0

@Lalala: http://stackoverflow.com/questions/4303513/push-back-vs-emplace-back - Это немного продвинутый, но, возможно, вы можете это понять. –

+0

Что делать, если я хотел добавить другую информацию к родному брату с помощью «Fav Food: Pasta» Как это будет работать? Потому что пустое пространство отделяет все. – Kara

1

Как вы обнаружили, что вы перезаписать предыдущие входы на каждой итерации цикла. Поэтому вам нужно сохранить данные для каждого брата по отдельности, и вы не знаете, сколько братьев и сестер должно начаться. Это идеальный вариант использования для vector. И давайте создадим struct с именем sibling, который будет хранить данные для каждого брата.

struct sibling 
{ 
    std::string name, age, gender; 
}; 

int n; 
std::vector<sibling> siblings; 

std::cout << "How many siblings do you have? "; 
if((std::cin >> n) && (n >= 0)) { // always perform error checking 
    siblings.reserve(n);   // not necessary, but pre-allocates storage 
    for (int a=0;a<n;a++){ 
    sibling s; 
    std::cout << "Please enter info for sibling #" << (a+1) << ": "; 
    std::cin >> s.name; 
    std::cin >> s.age; 
    std::cin >> s.gender; 

    // you should perform error checking for the inputs above too 
    siblings.push_back(std::move(s)); 
    } 
} 
Смежные вопросы