Указатель и структура C ++ - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно выполнить следующие задачи:

  1. Считать информацию об отдельных лицах в файле person.txt (см. Ниже) и сохранить в массиве p.Установите указатель супруга (супруги) для каждого человека на NULL значение вначале.
  2. Выполните операцию по браку для Mary и Tom.Вы можете жениться на двух людях, установив указатель на супруга (супруга), чтобы они указывали друг на друга (сохраняйте адреса друг друга).
  3. Распечатывайте содержимое в массиве p, где вам нужно напечатать каждую переменную, указанную в массиве p.Если указатель супруга (супруга) имеет значение NULL, выведите Not Married, иначе выведите имя супруга (супруги).Вывод программы показан ниже.Убедитесь, что ваш вывод совпадает.

Я могу сделать (1), прочитайте текстовый файл person.txt, который имеет следующее содержание:

Mary        012-35678905    20000
John        010-87630221    16000
Alice       012-90028765    9000
Tom         019-76239028    30000
Pam         017-32237609    32000

Но я нене знаю, как это сделать (2) и (3).

Это то, что я сделал до сих пор, основываясь на шаблоне, поставленном с вопросом, и который я не должен менять:

#include <iostream>    //>>>>>>> This part is the template given >>>>>>>
#include <cstdlib>     //
#include <fstream>     //
                       //
using namespace std;   //
                       //
struct person          //
{                      //
char name[30];         //
char phone[15];        //
double money;          //
person *spouse;        //
};                     //
                       //
int main()             //
{                      //
person *p[10];         //<<<<<<<< This is the end of the template part <<<  

ifstream inFile;
inFile.open("person.txt");

if (inFile.fail())
{
    cout << "Error in opening the file!" << endl;
    exit(1);
}

char name[30], phone[15];
int money;
int number = 5;

for (int i = 0; i < number; i++)
{
    inFile >> name >> phone >> money;
    cout << "Name:" << name << endl;
    cout << "Phone:" << phone << endl;
    cout << "Money:" << money << endl;
    cout << "Spouse Name:" << endl;
    cout << endl;
}

cin.get();

system("pause");
return 0;
}

Ожидаемый результат должен быть таким:

Name: Mary
Phone Number:012-35678905
Money: 20000
Spouse Name:Tom

Name: John
Phone Number:010-87630221
Money: 16000
Spouse Name: Not Married

...

1 Ответ

0 голосов
/ 10 февраля 2019

Имейте в виду, что это упражнение показывает устаревшее использование 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 каждый раз, но останавливайте, если чтение невозможно, или если достигнут максимальный размер массива.

...