我必须执行以下任务:
person.txt
中有关个人的信息(请参见下文),并存储到数组p
中。首先将每个人的配偶指针设置为NULL
值。Mary
和Tom
执行结婚操作。您可以通过将他们的配偶指针设置为彼此指向来结婚(彼此的存储地址)。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
...
答案 0 :(得分:1)
首先进入您忘记使用的数组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];
)spouse1->spouse=spouse2; spouse2->spouse=spouse1;
最后,在结束程序之前,您需要释放数组中的所有指针(使用向量,则不必担心)。
您仍然需要改善阅读循环,使其更具动态性。因为实际上,您不知道文本文件中有多少行。因此,从number=0
开始,并尽可能长时间地读取数据,每次都递增number
,但是如果不再可能读取,或者如果达到数组的最大大小,则停止。