Имейте в виду, что это упражнение показывает устаревшее использование C ++
Сначала в вашем массиве p
, который вы несколько забыли использовать.p[10]
это массив из 10. Но из 10 что?person*
, так указателей на людей.
Это очень старомодный C ++.Если вы пройдете курс в Интернете, смените его немедленно, потому что в настоящее время мы будем использовать vector<person>
, string
и nullptr
.Если это учебный курс, у вас нет выбора, так что давайте продолжим ...
Некоторые подсказки, основанные на том, что вы уже сделали
Сначала упростите цикл чтения и не забывайтеустановить указатель на NULL, как и было задано в вопросе:
for (int i = 0; i < number; i++)
{
person *r = new person; // allocate a new person
inFile >> r->name >> r->phone >> r->money; // read data into the new person
r->spouse = NULL; // initialize the poitner
p[i] = r; // store the pointer in the array
}
У вас уже почти есть печатная часть (3).Вам просто нужно переместить его из цикла чтения в новый цикл, распечатать из массива и заняться особым случаем женатых людей:
for (int i = 0; i < number; i++)
{
cout << "Name:" << p[i]->name << endl;
cout << "Phone:" << p[i]->phone << endl;
cout << "Money:" << p[i]->money << endl;
cout << "Spouse:" ;
if (p[i]->spouse==NULL) {
cout << "Not married" <<endl;
}
else {
cout << p[i]->spouse->name <<endl;
}
cout << endl;
}
Теперь что-то делать самостоятельно
Теперь о женитьбе и браке с Томом в (2).Это более деликатно.Я не буду делать это для вас, потому что теперь у вас есть все, что вам нужно, чтобы закончить домашнюю работу.Но общий принцип:
- Создайте два указателя
spouse1
и spouse2
и инициализируйте их в NULL. - Выполните цикл по массиву, чтобы найти, какой человек является
Tom
, а какой Marry
, и обновите соответствующий указатель (например, spouse1 = p[i];
) - В конце цикла,проверьте, что мы нашли обоих супругов (оба указателя больше не равны NULL, и оба указателя различны, потому что вы не можете жениться на ком-то с приветом)
- Если все в порядке, просто женитесь на них:
spouse1->spouse=spouse2; spouse2->spouse=spouse1;
Наконец, прежде чем завершить программу, вам нужно освободить все указатели в массиве (с векторами вам не нужно об этом заботиться).
Далеенеобходимы улучшения
Вам все еще нужно улучшить цикл чтения, чтобы сделать его более динамичным.Потому что на самом деле вы не знаете, сколько строк в текстовом файле.Так что начните с number=0
и считывайте данные как можно дольше, увеличивая number
каждый раз, но останавливайте, если чтение невозможно, или если достигнут максимальный размер массива.